Skip to content

Commit e4f71ad

Browse files
committed
fix: call each method from FileReader.prototype
1 parent 399e2ec commit e4f71ad

File tree

5 files changed

+50
-50
lines changed

5 files changed

+50
-50
lines changed

__tests__/readAs.test.ts

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,58 +1,68 @@
11
import './setup.ts'
22
import { assertEquals, assertInstanceOf } from 'std/assert/mod.ts'
3-
import { assertSpyCall, spy } from 'std/testing/mock.ts'
3+
import { assertSpyCall, Spy, spy } from 'std/testing/mock.ts'
4+
import { afterEach, describe, it } from 'std/testing/bdd.ts'
45
import { readAs } from '../mod.ts'
56

6-
Deno.test('read blob', async (t) => {
7+
describe('read blob', () => {
8+
let readAsSpy: Spy<FileReader, [blob: Blob, encoding?: string], void>
9+
10+
afterEach(() => {
11+
readAsSpy.restore()
12+
})
13+
714
const blob = new Blob(['foo'], { type: 'text/plain' })
815

9-
await t.step('as `ArrayBuffer`', async () => {
16+
it('as `ArrayBuffer`', async () => {
1017
const reader = new FileReader()
11-
const readAsArrayBufferSpy = spy(reader, 'readAsArrayBuffer')
18+
readAsSpy = spy(FileReader.prototype, 'readAsArrayBuffer')
1219
const result = await readAs(reader, blob, 'ArrayBuffer')
1320

1421
assertEquals(result, reader.result)
1522
assertInstanceOf(result, ArrayBuffer)
16-
assertSpyCall(readAsArrayBufferSpy, 0, {
23+
assertSpyCall(readAsSpy, 0, {
1724
self: reader,
1825
args: [blob, undefined],
1926
})
2027
})
2128

22-
await t.step('as `BinaryString`', async () => {
29+
it('as `BinaryString`', async () => {
2330
const reader = new FileReader()
24-
const readAsBinaryStringSpy = spy(reader, 'readAsBinaryString')
31+
readAsSpy = spy(
32+
FileReader.prototype,
33+
'readAsBinaryString',
34+
)
2535
const result = await readAs(reader, blob, 'BinaryString')
2636

2737
assertEquals(result, reader.result)
2838
assertEquals(result, 'foo')
29-
assertSpyCall(readAsBinaryStringSpy, 0, {
39+
assertSpyCall(readAsSpy, 0, {
3040
self: reader,
3141
args: [blob, undefined],
3242
})
3343
})
3444

35-
await t.step('as `DataURL`', async () => {
45+
it('as `DataURL`', async () => {
3646
const reader = new FileReader()
37-
const readAsDataURLSpy = spy(reader, 'readAsDataURL')
47+
readAsSpy = spy(FileReader.prototype, 'readAsDataURL')
3848
const result = await readAs(reader, blob, 'DataURL')
3949

4050
assertEquals(result, reader.result)
4151
assertEquals(result, 'data:text/plain;base64,Zm9v')
42-
assertSpyCall(readAsDataURLSpy, 0, {
52+
assertSpyCall(readAsSpy, 0, {
4353
self: reader,
4454
args: [blob, undefined],
4555
})
4656
})
4757

48-
await t.step('as `Text` with encoding utf-8', async () => {
58+
it('as `Text` with encoding utf-8', async () => {
4959
const reader = new FileReader()
50-
const readAsTextSpy = spy(reader, 'readAsText')
60+
readAsSpy = spy(FileReader.prototype, 'readAsText')
5161
const result = await readAs(reader, blob, 'Text', 'utf-8')
5262

5363
assertEquals(result, reader.result)
54-
assertEquals(typeof result, 'string')
55-
assertSpyCall(readAsTextSpy, 0, {
64+
assertEquals(result, 'foo')
65+
assertSpyCall(readAsSpy, 0, {
5666
self: reader,
5767
args: [blob, 'utf-8'],
5868
})

deno.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/FileReader.ts

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,19 @@
1-
import { promisifyReader } from './promisifyReader.ts'
1+
import { readAs } from './readAs.ts'
22

33
export class FileReader extends globalThis.FileReader {
4-
readAsArrayBuffer(blob: Blob): Promise<ArrayBuffer>
54
readAsArrayBuffer(blob: Blob) {
6-
super.readAsArrayBuffer(blob)
7-
return promisifyReader(this)
5+
return readAs(this, blob, 'ArrayBuffer')
86
}
97

10-
readAsBinaryString(blob: Blob): Promise<string>
118
readAsBinaryString(blob: Blob) {
12-
super.readAsBinaryString(blob)
13-
return promisifyReader(this)
9+
return readAs(this, blob, 'BinaryString')
1410
}
1511

16-
readAsDataURL(blob: Blob): Promise<string>
1712
readAsDataURL(blob: Blob) {
18-
super.readAsDataURL(blob)
19-
return promisifyReader(this)
13+
return readAs(this, blob, 'DataURL')
2014
}
2115

22-
readAsText(blob: Blob, encoding?: string): Promise<string>
2316
readAsText(blob: Blob, encoding?: string) {
24-
super.readAsText(blob, encoding)
25-
return promisifyReader(this)
17+
return readAs(this, blob, 'Text', encoding)
2618
}
2719
}

src/promisifyReader.ts

Lines changed: 0 additions & 18 deletions
This file was deleted.

src/readAs.ts

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import { promisifyReader } from './promisifyReader.ts'
2-
31
export function readAs(
42
reader: FileReader,
53
blob: Blob,
@@ -25,6 +23,22 @@ export function readAs(
2523
as: 'ArrayBuffer' | 'DataURL' | 'Text' | 'BinaryString',
2624
encoding?: string,
2725
) {
28-
reader[`readAs${as}`](blob, encoding)
29-
return promisifyReader(reader)
26+
return new Promise<FileReader['result']>((resolve, reject) => {
27+
reader.addEventListener('load', loadListener)
28+
reader.addEventListener('error', reject)
29+
reader.addEventListener('abort', reject)
30+
reader.addEventListener('loadend', removeEventListener)
31+
FileReader.prototype[`readAs${as}`].call(reader, blob, encoding)
32+
33+
function removeEventListener() {
34+
reader.removeEventListener('load', loadListener)
35+
reader.removeEventListener('error', reject)
36+
reader.removeEventListener('abort', reject)
37+
reader.removeEventListener('loadend', removeEventListener)
38+
}
39+
40+
function loadListener() {
41+
resolve(reader.result)
42+
}
43+
})
3044
}

0 commit comments

Comments
 (0)