@ricsam/quickjs-core 0.2.0 → 0.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/dist/cjs/blob.cjs +197 -0
  2. package/dist/cjs/blob.cjs.map +10 -0
  3. package/dist/cjs/class-builder.cjs +244 -0
  4. package/dist/cjs/class-builder.cjs.map +10 -0
  5. package/dist/cjs/dom-exception.cjs +95 -0
  6. package/dist/cjs/dom-exception.cjs.map +10 -0
  7. package/dist/cjs/file.cjs +234 -0
  8. package/dist/cjs/file.cjs.map +10 -0
  9. package/dist/cjs/function-builder.cjs +70 -0
  10. package/dist/cjs/function-builder.cjs.map +10 -0
  11. package/dist/cjs/index.cjs +22 -22
  12. package/dist/cjs/index.cjs.map +2 -2
  13. package/dist/cjs/marshal.cjs +191 -0
  14. package/dist/cjs/marshal.cjs.map +10 -0
  15. package/dist/cjs/package.json +1 -1
  16. package/dist/cjs/readable-stream.cjs +588 -0
  17. package/dist/cjs/readable-stream.cjs.map +10 -0
  18. package/dist/cjs/scope.cjs +76 -0
  19. package/dist/cjs/scope.cjs.map +10 -0
  20. package/dist/cjs/transform-stream.cjs +152 -0
  21. package/dist/cjs/transform-stream.cjs.map +10 -0
  22. package/dist/cjs/types.cjs +39 -0
  23. package/dist/cjs/types.cjs.map +10 -0
  24. package/dist/cjs/unmarshal.cjs +254 -0
  25. package/dist/cjs/unmarshal.cjs.map +10 -0
  26. package/dist/cjs/url-search-params.cjs +165 -0
  27. package/dist/cjs/url-search-params.cjs.map +10 -0
  28. package/dist/cjs/url.cjs +183 -0
  29. package/dist/cjs/url.cjs.map +10 -0
  30. package/dist/cjs/writable-stream.cjs +513 -0
  31. package/dist/cjs/writable-stream.cjs.map +10 -0
  32. package/dist/mjs/blob.mjs +166 -0
  33. package/dist/mjs/blob.mjs.map +10 -0
  34. package/dist/mjs/class-builder.mjs +213 -0
  35. package/dist/mjs/class-builder.mjs.map +10 -0
  36. package/dist/mjs/dom-exception.mjs +64 -0
  37. package/dist/mjs/dom-exception.mjs.map +10 -0
  38. package/dist/mjs/file.mjs +203 -0
  39. package/dist/mjs/file.mjs.map +10 -0
  40. package/dist/mjs/function-builder.mjs +39 -0
  41. package/dist/mjs/function-builder.mjs.map +10 -0
  42. package/dist/mjs/index.mjs +22 -22
  43. package/dist/mjs/index.mjs.map +2 -2
  44. package/dist/mjs/marshal.mjs +160 -0
  45. package/dist/mjs/marshal.mjs.map +10 -0
  46. package/dist/mjs/package.json +1 -1
  47. package/dist/mjs/readable-stream.mjs +557 -0
  48. package/dist/mjs/readable-stream.mjs.map +10 -0
  49. package/dist/mjs/scope.mjs +45 -0
  50. package/dist/mjs/scope.mjs.map +10 -0
  51. package/dist/mjs/transform-stream.mjs +121 -0
  52. package/dist/mjs/transform-stream.mjs.map +10 -0
  53. package/dist/mjs/types.mjs +8 -0
  54. package/dist/mjs/types.mjs.map +10 -0
  55. package/dist/mjs/unmarshal.mjs +223 -0
  56. package/dist/mjs/unmarshal.mjs.map +10 -0
  57. package/dist/mjs/url-search-params.mjs +134 -0
  58. package/dist/mjs/url-search-params.mjs.map +10 -0
  59. package/dist/mjs/url.mjs +152 -0
  60. package/dist/mjs/url.mjs.map +10 -0
  61. package/dist/mjs/writable-stream.mjs +482 -0
  62. package/dist/mjs/writable-stream.mjs.map +10 -0
  63. package/package.json +1 -1
@@ -0,0 +1,152 @@
1
+ // @bun
2
+ // packages/core/src/url.ts
3
+ import { defineClass } from "./class-builder.mjs";
4
+ function createURLClass(context, stateMap) {
5
+ return defineClass(context, stateMap, {
6
+ name: "URL",
7
+ construct: (args) => {
8
+ const urlString = args[0];
9
+ const base = args[1];
10
+ if (urlString === undefined) {
11
+ throw new TypeError("Failed to construct 'URL': 1 argument required, but only 0 present.");
12
+ }
13
+ let parsed;
14
+ try {
15
+ if (base !== undefined) {
16
+ const baseStr = typeof base === "object" && base !== null && "href" in base ? base.href : String(base);
17
+ parsed = new globalThis.URL(String(urlString), baseStr);
18
+ } else {
19
+ parsed = new globalThis.URL(String(urlString));
20
+ }
21
+ } catch (e) {
22
+ throw new TypeError(`Failed to construct 'URL': Invalid URL`);
23
+ }
24
+ return {
25
+ hash: parsed.hash,
26
+ host: parsed.host,
27
+ hostname: parsed.hostname,
28
+ href: parsed.href,
29
+ origin: parsed.origin,
30
+ password: parsed.password,
31
+ pathname: parsed.pathname,
32
+ port: parsed.port,
33
+ protocol: parsed.protocol,
34
+ search: parsed.search,
35
+ username: parsed.username
36
+ };
37
+ },
38
+ properties: {
39
+ hash: {
40
+ get() {
41
+ return this.hash;
42
+ }
43
+ },
44
+ host: {
45
+ get() {
46
+ return this.host;
47
+ }
48
+ },
49
+ hostname: {
50
+ get() {
51
+ return this.hostname;
52
+ }
53
+ },
54
+ href: {
55
+ get() {
56
+ return this.href;
57
+ }
58
+ },
59
+ origin: {
60
+ get() {
61
+ return this.origin;
62
+ }
63
+ },
64
+ password: {
65
+ get() {
66
+ return this.password;
67
+ }
68
+ },
69
+ pathname: {
70
+ get() {
71
+ return this.pathname;
72
+ }
73
+ },
74
+ port: {
75
+ get() {
76
+ return this.port;
77
+ }
78
+ },
79
+ protocol: {
80
+ get() {
81
+ return this.protocol;
82
+ }
83
+ },
84
+ search: {
85
+ get() {
86
+ return this.search;
87
+ }
88
+ },
89
+ username: {
90
+ get() {
91
+ return this.username;
92
+ }
93
+ }
94
+ },
95
+ methods: {
96
+ toString() {
97
+ return this.href;
98
+ },
99
+ toJSON() {
100
+ return this.href;
101
+ },
102
+ __getSearch__() {
103
+ return this.search;
104
+ }
105
+ },
106
+ staticMethods: {
107
+ canParse(url, base) {
108
+ try {
109
+ if (base !== undefined) {
110
+ new globalThis.URL(String(url), String(base));
111
+ } else {
112
+ new globalThis.URL(String(url));
113
+ }
114
+ return true;
115
+ } catch {
116
+ return false;
117
+ }
118
+ }
119
+ }
120
+ });
121
+ }
122
+ function addURLSearchParamsGetter(context) {
123
+ const result = context.evalCode(`
124
+ (function() {
125
+ const searchParamsCache = new Map();
126
+
127
+ Object.defineProperty(URL.prototype, 'searchParams', {
128
+ get: function() {
129
+ const instanceId = this.__instanceId__;
130
+ if (!searchParamsCache.has(instanceId)) {
131
+ searchParamsCache.set(instanceId, new URLSearchParams(this.__getSearch__()));
132
+ }
133
+ return searchParamsCache.get(instanceId);
134
+ },
135
+ enumerable: true,
136
+ configurable: true
137
+ });
138
+ })();
139
+ `);
140
+ if (result.error) {
141
+ const err = context.dump(result.error);
142
+ result.error.dispose();
143
+ throw new Error(`Failed to add searchParams getter: ${JSON.stringify(err)}`);
144
+ }
145
+ result.value.dispose();
146
+ }
147
+ export {
148
+ createURLClass,
149
+ addURLSearchParamsGetter
150
+ };
151
+
152
+ //# debugId=8408820A4441CF3264756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/url.ts"],
4
+ "sourcesContent": [
5
+ "import type { QuickJSContext, QuickJSHandle } from \"quickjs-emscripten\";\nimport type { StateMap } from \"./types.mjs\";\nimport { defineClass } from \"./class-builder.mjs\";\n\n/**\n * Internal state for URL\n */\nexport interface URLState {\n hash: string;\n host: string;\n hostname: string;\n href: string;\n origin: string;\n password: string;\n pathname: string;\n port: string;\n protocol: string;\n search: string;\n username: string;\n}\n\n/**\n * Create the URL class for QuickJS\n *\n * Note: The searchParams property is added separately via evalCode\n * after this class is registered, as it needs to return a URLSearchParams instance.\n */\nexport function createURLClass(\n context: QuickJSContext,\n stateMap: StateMap\n): QuickJSHandle {\n return defineClass<URLState>(context, stateMap, {\n name: \"URL\",\n construct: (args) => {\n const urlString = args[0];\n const base = args[1];\n\n if (urlString === undefined) {\n throw new TypeError(\"Failed to construct 'URL': 1 argument required, but only 0 present.\");\n }\n\n let parsed: globalThis.URL;\n try {\n if (base !== undefined) {\n // Handle base URL\n const baseStr = typeof base === \"object\" && base !== null && \"href\" in base\n ? (base as URLState).href\n : String(base);\n parsed = new globalThis.URL(String(urlString), baseStr);\n } else {\n parsed = new globalThis.URL(String(urlString));\n }\n } catch (e) {\n throw new TypeError(`Failed to construct 'URL': Invalid URL`);\n }\n\n return {\n hash: parsed.hash,\n host: parsed.host,\n hostname: parsed.hostname,\n href: parsed.href,\n origin: parsed.origin,\n password: parsed.password,\n pathname: parsed.pathname,\n port: parsed.port,\n protocol: parsed.protocol,\n search: parsed.search,\n username: parsed.username,\n };\n },\n properties: {\n hash: {\n get(this: URLState) {\n return this.hash;\n },\n },\n host: {\n get(this: URLState) {\n return this.host;\n },\n },\n hostname: {\n get(this: URLState) {\n return this.hostname;\n },\n },\n href: {\n get(this: URLState) {\n return this.href;\n },\n },\n origin: {\n get(this: URLState) {\n return this.origin;\n },\n },\n password: {\n get(this: URLState) {\n return this.password;\n },\n },\n pathname: {\n get(this: URLState) {\n return this.pathname;\n },\n },\n port: {\n get(this: URLState) {\n return this.port;\n },\n },\n protocol: {\n get(this: URLState) {\n return this.protocol;\n },\n },\n search: {\n get(this: URLState) {\n return this.search;\n },\n },\n username: {\n get(this: URLState) {\n return this.username;\n },\n },\n },\n methods: {\n toString(this: URLState): string {\n return this.href;\n },\n toJSON(this: URLState): string {\n return this.href;\n },\n // Private method to get search for URLSearchParams creation\n __getSearch__(this: URLState): string {\n return this.search;\n },\n },\n staticMethods: {\n canParse(url: unknown, base?: unknown): boolean {\n try {\n if (base !== undefined) {\n new globalThis.URL(String(url), String(base));\n } else {\n new globalThis.URL(String(url));\n }\n return true;\n } catch {\n return false;\n }\n },\n },\n });\n}\n\n/**\n * Add searchParams getter to URL prototype using evalCode\n * This must be called after both URL and URLSearchParams are registered as globals\n */\nexport function addURLSearchParamsGetter(context: QuickJSContext): void {\n // Use a WeakMap-like pattern with a Map keyed by instance ID\n // Each URL instance will cache its URLSearchParams\n const result = context.evalCode(`\n (function() {\n const searchParamsCache = new Map();\n\n Object.defineProperty(URL.prototype, 'searchParams', {\n get: function() {\n const instanceId = this.__instanceId__;\n if (!searchParamsCache.has(instanceId)) {\n searchParamsCache.set(instanceId, new URLSearchParams(this.__getSearch__()));\n }\n return searchParamsCache.get(instanceId);\n },\n enumerable: true,\n configurable: true\n });\n })();\n `);\n\n if (result.error) {\n const err = context.dump(result.error);\n result.error.dispose();\n throw new Error(`Failed to add searchParams getter: ${JSON.stringify(err)}`);\n }\n result.value.dispose();\n}\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "8408820A4441CF3264756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,482 @@
1
+ // @bun
2
+ // packages/core/src/streams/writable-stream.ts
3
+ import { defineClass, getInstanceStateById } from "../class-builder.mjs";
4
+ import { marshal } from "../marshal.mjs";
5
+ import { unmarshal } from "../unmarshal.mjs";
6
+ function createWritableStreamDefaultWriterClass(context, stateMap) {
7
+ return defineClass(context, stateMap, {
8
+ name: "WritableStreamDefaultWriter",
9
+ construct: () => {
10
+ let resolveClosedPromise;
11
+ let rejectClosedPromise;
12
+ let resolveReadyPromise;
13
+ let rejectReadyPromise;
14
+ const state = {
15
+ stream: null,
16
+ closedPromiseResolvers: {
17
+ resolve: () => resolveClosedPromise?.(),
18
+ reject: (e) => rejectClosedPromise?.(e)
19
+ },
20
+ readyPromiseResolvers: {
21
+ resolve: () => resolveReadyPromise?.(),
22
+ reject: (e) => rejectReadyPromise?.(e)
23
+ }
24
+ };
25
+ Object.defineProperty(state, "_closedPromise", {
26
+ value: undefined,
27
+ writable: true,
28
+ enumerable: false
29
+ });
30
+ Object.defineProperty(state, "_readyPromise", {
31
+ value: undefined,
32
+ writable: true,
33
+ enumerable: false
34
+ });
35
+ Object.defineProperty(state, "getClosedPromise", {
36
+ value: function() {
37
+ if (!this._closedPromise) {
38
+ this._closedPromise = new Promise((resolve, reject) => {
39
+ resolveClosedPromise = resolve;
40
+ rejectClosedPromise = reject;
41
+ });
42
+ }
43
+ return this._closedPromise;
44
+ },
45
+ enumerable: false
46
+ });
47
+ Object.defineProperty(state, "getReadyPromise", {
48
+ value: function() {
49
+ if (!this._readyPromise) {
50
+ this._readyPromise = new Promise((resolve, reject) => {
51
+ resolveReadyPromise = resolve;
52
+ rejectReadyPromise = reject;
53
+ });
54
+ }
55
+ return this._readyPromise;
56
+ },
57
+ enumerable: false
58
+ });
59
+ return state;
60
+ },
61
+ properties: {
62
+ closed: {
63
+ get() {
64
+ return this.getClosedPromise();
65
+ }
66
+ },
67
+ ready: {
68
+ get() {
69
+ return this.getReadyPromise();
70
+ }
71
+ },
72
+ desiredSize: {
73
+ get() {
74
+ if (!this.stream)
75
+ return null;
76
+ if (this.stream.errored)
77
+ return null;
78
+ if (this.stream.closeRequested)
79
+ return 0;
80
+ return 1 - this.stream.writeRequests.length;
81
+ }
82
+ }
83
+ },
84
+ methods: {
85
+ write(chunk) {
86
+ if (!this.stream) {
87
+ return Promise.reject(new TypeError("Writer has no stream"));
88
+ }
89
+ if (this.stream.errored) {
90
+ return Promise.reject(this.stream.errorValue);
91
+ }
92
+ if (this.stream.closeRequested || this.stream.closed) {
93
+ return Promise.reject(new TypeError("Cannot write to a closed stream"));
94
+ }
95
+ const self = this;
96
+ return new Promise((resolve, reject) => {
97
+ self.stream.writeRequests.push({ chunk, resolve, reject });
98
+ processWriteRequests.call(self);
99
+ });
100
+ },
101
+ close() {
102
+ if (!this.stream) {
103
+ return Promise.reject(new TypeError("Writer has no stream"));
104
+ }
105
+ if (this.stream.closeRequested || this.stream.closed) {
106
+ return Promise.reject(new TypeError("Stream is already closing or closed"));
107
+ }
108
+ this.stream.closeRequested = true;
109
+ return new Promise((resolve, reject) => {
110
+ const checkWritesComplete = () => {
111
+ if (this.stream.writeRequests.length === 0 && !this.stream.inFlightWriteRequest) {
112
+ if (this.stream.sink?.close) {
113
+ try {
114
+ const result = this.stream.sink.close();
115
+ if (result instanceof Promise) {
116
+ result.then(() => {
117
+ this.stream.closed = true;
118
+ this.closedPromiseResolvers.resolve();
119
+ resolve();
120
+ }).catch((e) => {
121
+ this.stream.errored = true;
122
+ this.stream.errorValue = e;
123
+ this.closedPromiseResolvers.reject(e);
124
+ reject(e);
125
+ });
126
+ return;
127
+ }
128
+ } catch (e) {
129
+ this.stream.errored = true;
130
+ this.stream.errorValue = e;
131
+ this.closedPromiseResolvers.reject(e);
132
+ reject(e);
133
+ return;
134
+ }
135
+ }
136
+ this.stream.closed = true;
137
+ this.closedPromiseResolvers.resolve();
138
+ resolve();
139
+ } else {
140
+ setTimeout(checkWritesComplete, 0);
141
+ }
142
+ };
143
+ checkWritesComplete();
144
+ });
145
+ },
146
+ abort(reason) {
147
+ if (!this.stream) {
148
+ return Promise.reject(new TypeError("Writer has no stream"));
149
+ }
150
+ return new Promise((resolve, reject) => {
151
+ try {
152
+ this.stream.writeRequests.forEach((req) => req.reject(reason));
153
+ this.stream.writeRequests = [];
154
+ if (this.stream.sink?.abort) {
155
+ const result = this.stream.sink.abort(reason);
156
+ if (result instanceof Promise) {
157
+ result.then(resolve).catch(reject);
158
+ return;
159
+ }
160
+ }
161
+ this.stream.errored = true;
162
+ this.stream.errorValue = reason;
163
+ this.closedPromiseResolvers.reject(reason);
164
+ resolve();
165
+ } catch (e) {
166
+ reject(e);
167
+ }
168
+ });
169
+ },
170
+ releaseLock() {
171
+ if (!this.stream)
172
+ return;
173
+ this.stream.locked = false;
174
+ this.stream.writer = null;
175
+ }
176
+ }
177
+ });
178
+ }
179
+ function processWriteRequests() {
180
+ if (this.stream.inFlightWriteRequest || this.stream.writeRequests.length === 0 || !this.stream.started) {
181
+ return;
182
+ }
183
+ const request = this.stream.writeRequests.shift();
184
+ this.stream.inFlightWriteRequest = request;
185
+ if (this.stream.sink?.write) {
186
+ try {
187
+ const result = this.stream.sink.write(request.chunk, this.stream.controller);
188
+ if (result instanceof Promise) {
189
+ result.then(() => {
190
+ this.stream.inFlightWriteRequest = null;
191
+ request.resolve();
192
+ processWriteRequests.call(this);
193
+ }).catch((e) => {
194
+ this.stream.inFlightWriteRequest = null;
195
+ this.stream.errored = true;
196
+ this.stream.errorValue = e;
197
+ request.reject(e);
198
+ this.stream.writeRequests.forEach((req) => req.reject(e));
199
+ this.stream.writeRequests = [];
200
+ });
201
+ return;
202
+ }
203
+ } catch (e) {
204
+ this.stream.inFlightWriteRequest = null;
205
+ this.stream.errored = true;
206
+ this.stream.errorValue = e;
207
+ request.reject(e);
208
+ return;
209
+ }
210
+ }
211
+ this.stream.inFlightWriteRequest = null;
212
+ request.resolve();
213
+ processWriteRequests.call(this);
214
+ }
215
+ function createWritableStreamClass(context, stateMap, writerClass) {
216
+ const classHandle = defineClass(context, stateMap, {
217
+ name: "WritableStream",
218
+ construct: (args) => {
219
+ const underlyingSink = args[0];
220
+ const state = {
221
+ locked: false,
222
+ writer: null,
223
+ controller: null,
224
+ closed: false,
225
+ errored: false,
226
+ errorValue: undefined,
227
+ closeRequested: false,
228
+ inFlightWriteRequest: null,
229
+ writeRequests: [],
230
+ sink: underlyingSink,
231
+ started: false
232
+ };
233
+ state.controller = {
234
+ error(e) {
235
+ if (state.errored || state.closed)
236
+ return;
237
+ state.errored = true;
238
+ state.errorValue = e;
239
+ state.writeRequests.forEach((req) => req.reject(e));
240
+ state.writeRequests = [];
241
+ if (state.writer) {
242
+ state.writer.closedPromiseResolvers.reject(e);
243
+ state.writer.readyPromiseResolvers.reject(e);
244
+ }
245
+ }
246
+ };
247
+ if (underlyingSink?.start) {
248
+ try {
249
+ const startResult = underlyingSink.start(state.controller);
250
+ if (startResult instanceof Promise) {
251
+ startResult.then(() => {
252
+ state.started = true;
253
+ if (state.writer) {
254
+ state.writer.readyPromiseResolvers.resolve();
255
+ }
256
+ }).catch((e) => {
257
+ state.errored = true;
258
+ state.errorValue = e;
259
+ });
260
+ } else {
261
+ state.started = true;
262
+ }
263
+ } catch (e) {
264
+ state.errored = true;
265
+ state.errorValue = e;
266
+ }
267
+ } else {
268
+ state.started = true;
269
+ }
270
+ return state;
271
+ },
272
+ properties: {
273
+ locked: {
274
+ get() {
275
+ return this.locked;
276
+ }
277
+ }
278
+ },
279
+ methods: {
280
+ __linkWriter__(writerObj) {
281
+ if (this.locked) {
282
+ throw new TypeError("WritableStream is locked");
283
+ }
284
+ this.locked = true;
285
+ const writerId = writerObj.__instanceId__;
286
+ const writerState = getInstanceStateById(writerId);
287
+ if (!writerState) {
288
+ throw new Error("Writer instance state not found");
289
+ }
290
+ writerState.stream = this;
291
+ this.writer = writerState;
292
+ if (this.started) {
293
+ writerState.readyPromiseResolvers.resolve();
294
+ }
295
+ },
296
+ abort(reason) {
297
+ if (this.locked) {
298
+ return Promise.reject(new TypeError("Cannot abort a locked stream"));
299
+ }
300
+ return new Promise((resolve, reject) => {
301
+ try {
302
+ this.writeRequests.forEach((req) => req.reject(reason));
303
+ this.writeRequests = [];
304
+ if (this.sink?.abort) {
305
+ const result = this.sink.abort(reason);
306
+ if (result instanceof Promise) {
307
+ result.then(resolve).catch(reject);
308
+ return;
309
+ }
310
+ }
311
+ this.errored = true;
312
+ this.errorValue = reason;
313
+ resolve();
314
+ } catch (e) {
315
+ reject(e);
316
+ }
317
+ });
318
+ },
319
+ close() {
320
+ if (this.locked) {
321
+ return Promise.reject(new TypeError("Cannot close a locked stream"));
322
+ }
323
+ if (this.closeRequested || this.closed) {
324
+ return Promise.reject(new TypeError("Stream is already closing or closed"));
325
+ }
326
+ this.closeRequested = true;
327
+ return new Promise((resolve, reject) => {
328
+ if (this.sink?.close) {
329
+ try {
330
+ const result = this.sink.close();
331
+ if (result instanceof Promise) {
332
+ result.then(() => {
333
+ this.closed = true;
334
+ resolve();
335
+ }).catch(reject);
336
+ return;
337
+ }
338
+ } catch (e) {
339
+ reject(e);
340
+ return;
341
+ }
342
+ }
343
+ this.closed = true;
344
+ resolve();
345
+ });
346
+ }
347
+ }
348
+ });
349
+ const prototypeHandle = context.getProp(classHandle, "prototype");
350
+ const getWriterCode = `(function() {
351
+ const writer = new WritableStreamDefaultWriter();
352
+ this.__linkWriter__(writer);
353
+ return writer;
354
+ })`;
355
+ const getWriterResult = context.evalCode(getWriterCode);
356
+ if (!getWriterResult.error) {
357
+ context.setProp(prototypeHandle, "getWriter", getWriterResult.value);
358
+ getWriterResult.value.dispose();
359
+ } else {
360
+ getWriterResult.error.dispose();
361
+ }
362
+ prototypeHandle.dispose();
363
+ return classHandle;
364
+ }
365
+ function createWritableStream(context, stateMap, sink) {
366
+ const sinkObj = context.newObject();
367
+ if (sink.start) {
368
+ const startFn = context.newFunction("start", (controllerHandle) => {
369
+ const controller = {
370
+ signal: new AbortController().signal,
371
+ error: (e) => {
372
+ const errorFn = context.getProp(controllerHandle, "error");
373
+ const errorHandle = marshal(context, e);
374
+ context.callFunction(errorFn, controllerHandle, errorHandle);
375
+ errorHandle.dispose();
376
+ errorFn.dispose();
377
+ }
378
+ };
379
+ const result2 = sink.start(controller);
380
+ if (result2 instanceof Promise) {
381
+ const deferred = context.newPromise();
382
+ result2.then(() => {
383
+ deferred.resolve(context.undefined);
384
+ context.runtime.executePendingJobs();
385
+ }).catch((e) => {
386
+ deferred.reject(marshal(context, e));
387
+ context.runtime.executePendingJobs();
388
+ });
389
+ return deferred.handle;
390
+ }
391
+ return context.undefined;
392
+ });
393
+ context.setProp(sinkObj, "start", startFn);
394
+ startFn.dispose();
395
+ }
396
+ if (sink.write) {
397
+ const writeFn = context.newFunction("write", (chunkHandle, controllerHandle) => {
398
+ const chunk = unmarshal(context, chunkHandle);
399
+ const controller = {
400
+ signal: new AbortController().signal,
401
+ error: (e) => {
402
+ const errorFn = context.getProp(controllerHandle, "error");
403
+ const errorHandle = marshal(context, e);
404
+ context.callFunction(errorFn, controllerHandle, errorHandle);
405
+ errorHandle.dispose();
406
+ errorFn.dispose();
407
+ }
408
+ };
409
+ const result2 = sink.write(chunk, controller);
410
+ if (result2 instanceof Promise) {
411
+ const deferred = context.newPromise();
412
+ result2.then(() => {
413
+ deferred.resolve(context.undefined);
414
+ context.runtime.executePendingJobs();
415
+ }).catch((e) => {
416
+ deferred.reject(marshal(context, e));
417
+ context.runtime.executePendingJobs();
418
+ });
419
+ return deferred.handle;
420
+ }
421
+ return context.undefined;
422
+ });
423
+ context.setProp(sinkObj, "write", writeFn);
424
+ writeFn.dispose();
425
+ }
426
+ if (sink.close) {
427
+ const closeFn = context.newFunction("close", () => {
428
+ const result2 = sink.close();
429
+ if (result2 instanceof Promise) {
430
+ const deferred = context.newPromise();
431
+ result2.then(() => {
432
+ deferred.resolve(context.undefined);
433
+ context.runtime.executePendingJobs();
434
+ }).catch((e) => {
435
+ deferred.reject(marshal(context, e));
436
+ context.runtime.executePendingJobs();
437
+ });
438
+ return deferred.handle;
439
+ }
440
+ return context.undefined;
441
+ });
442
+ context.setProp(sinkObj, "close", closeFn);
443
+ closeFn.dispose();
444
+ }
445
+ if (sink.abort) {
446
+ const abortFn = context.newFunction("abort", (reasonHandle) => {
447
+ const reason = unmarshal(context, reasonHandle);
448
+ const result2 = sink.abort(reason);
449
+ if (result2 instanceof Promise) {
450
+ const deferred = context.newPromise();
451
+ result2.then(() => {
452
+ deferred.resolve(context.undefined);
453
+ context.runtime.executePendingJobs();
454
+ }).catch((e) => {
455
+ deferred.reject(marshal(context, e));
456
+ context.runtime.executePendingJobs();
457
+ });
458
+ return deferred.handle;
459
+ }
460
+ return context.undefined;
461
+ });
462
+ context.setProp(sinkObj, "abort", abortFn);
463
+ abortFn.dispose();
464
+ }
465
+ const WritableStreamConstructor = context.getProp(context.global, "WritableStream");
466
+ const result = context.callFunction(WritableStreamConstructor, context.undefined, sinkObj);
467
+ WritableStreamConstructor.dispose();
468
+ sinkObj.dispose();
469
+ if (result.error) {
470
+ const error = context.dump(result.error);
471
+ result.error.dispose();
472
+ throw new Error(`Failed to create WritableStream: ${error}`);
473
+ }
474
+ return result.value;
475
+ }
476
+ export {
477
+ createWritableStreamDefaultWriterClass,
478
+ createWritableStreamClass,
479
+ createWritableStream
480
+ };
481
+
482
+ //# debugId=4988BE2712D0F31C64756E2164756E21