-
-
Notifications
You must be signed in to change notification settings - Fork 43
/
FileSystemWritableFileStream.js
81 lines (66 loc) · 2.05 KB
/
FileSystemWritableFileStream.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
import config from './config.js'
const { WritableStream } = config
class FileSystemWritableFileStream extends WritableStream {
#writer
constructor (writer) {
super(writer)
this.#writer = writer
// Stupid Safari hack to extend native classes
// https://bugs.webkit.org/show_bug.cgi?id=226201
Object.setPrototypeOf(this, FileSystemWritableFileStream.prototype)
/** @private */
this._closed = false
}
async close () {
this._closed = true
const w = this.getWriter()
const p = w.close()
w.releaseLock()
return p
// return super.close ? super.close() : this.getWriter().close()
}
/** @param {number} position */
seek (position) {
return this.write({ type: 'seek', position })
}
/** @param {number} size */
truncate (size) {
return this.write({ type: 'truncate', size })
}
// The write(data) method steps are:
write (data) {
if (this._closed) {
return Promise.reject(new TypeError('Cannot write to a CLOSED writable stream'))
}
// 1. Let writer be the result of getting a writer for this.
const writer = this.getWriter()
// 2. Let result be the result of writing a chunk to writer given data.
const result = writer.write(data)
// 3. Release writer.
writer.releaseLock()
// 4. Return result.
return result
}
}
Object.defineProperty(FileSystemWritableFileStream.prototype, Symbol.toStringTag, {
value: 'FileSystemWritableFileStream',
writable: false,
enumerable: false,
configurable: true
})
Object.defineProperties(FileSystemWritableFileStream.prototype, {
close: { enumerable: true },
seek: { enumerable: true },
truncate: { enumerable: true },
write: { enumerable: true }
})
// Safari safari doesn't support writable streams yet.
if (
globalThis.FileSystemFileHandle &&
!globalThis.FileSystemFileHandle.prototype.createWritable &&
!globalThis.FileSystemWritableFileStream
) {
globalThis.FileSystemWritableFileStream = FileSystemWritableFileStream
}
export default FileSystemWritableFileStream
export { FileSystemWritableFileStream }