@oliphaunt/wasix-ts 0.1.0

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 (169) hide show
  1. package/ARCHITECTURE.md +655 -0
  2. package/CHANGELOG.md +33 -0
  3. package/LICENSE +21 -0
  4. package/README.md +404 -0
  5. package/THIRD_PARTY_NOTICES.md +20 -0
  6. package/lib/archive.d.ts +21 -0
  7. package/lib/archive.js +336 -0
  8. package/lib/asset-source.d.ts +4 -0
  9. package/lib/asset-source.js +15 -0
  10. package/lib/byte-channel.d.ts +27 -0
  11. package/lib/byte-channel.js +170 -0
  12. package/lib/client-common.d.ts +6 -0
  13. package/lib/client-common.js +36 -0
  14. package/lib/client.d.ts +7 -0
  15. package/lib/client.js +24 -0
  16. package/lib/database-root.d.ts +19 -0
  17. package/lib/database-root.js +139 -0
  18. package/lib/database.d.ts +135 -0
  19. package/lib/database.js +1039 -0
  20. package/lib/descriptor-validation.d.ts +10 -0
  21. package/lib/descriptor-validation.js +75 -0
  22. package/lib/direct-client-common.d.ts +50 -0
  23. package/lib/direct-client-common.js +717 -0
  24. package/lib/direct-client.d.ts +4 -0
  25. package/lib/direct-client.js +13 -0
  26. package/lib/direct.node.d.ts +2 -0
  27. package/lib/direct.node.js +2 -0
  28. package/lib/errors.d.ts +25 -0
  29. package/lib/errors.js +34 -0
  30. package/lib/extension-descriptor.d.ts +14 -0
  31. package/lib/extension-descriptor.js +419 -0
  32. package/lib/extensions.d.ts +68 -0
  33. package/lib/extensions.js +769 -0
  34. package/lib/host/LICENSE +21 -0
  35. package/lib/host/index.d.mts +123 -0
  36. package/lib/host/index.mjs +11 -0
  37. package/lib/host/provenance.json +16 -0
  38. package/lib/host/wasmer_js_bg.wasm +0 -0
  39. package/lib/host/worker.mjs +11 -0
  40. package/lib/host-runtime.d.ts +5 -0
  41. package/lib/host-runtime.js +13 -0
  42. package/lib/icu-descriptor.d.ts +3 -0
  43. package/lib/icu-descriptor.js +92 -0
  44. package/lib/index.bun.d.ts +2 -0
  45. package/lib/index.bun.js +2 -0
  46. package/lib/index.d.ts +2 -0
  47. package/lib/index.deno.d.ts +2 -0
  48. package/lib/index.deno.js +2 -0
  49. package/lib/index.js +2 -0
  50. package/lib/index.node.d.ts +2 -0
  51. package/lib/index.node.js +2 -0
  52. package/lib/internal-common.d.ts +12 -0
  53. package/lib/internal-common.js +274 -0
  54. package/lib/internal.d.ts +5 -0
  55. package/lib/internal.js +42 -0
  56. package/lib/internal.node.d.ts +5 -0
  57. package/lib/internal.node.js +8 -0
  58. package/lib/native-addon.d.ts +111 -0
  59. package/lib/native-addon.js +223 -0
  60. package/lib/native-server.d.ts +21 -0
  61. package/lib/native-server.js +109 -0
  62. package/lib/native-session.d.ts +60 -0
  63. package/lib/native-session.js +565 -0
  64. package/lib/node-actor.d.ts +7 -0
  65. package/lib/node-actor.js +10 -0
  66. package/lib/node-client-common.d.ts +9 -0
  67. package/lib/node-client-common.js +35 -0
  68. package/lib/node-client.d.ts +4 -0
  69. package/lib/node-client.js +13 -0
  70. package/lib/node-direct.d.ts +7 -0
  71. package/lib/node-direct.js +10 -0
  72. package/lib/node-worker-options.d.ts +5 -0
  73. package/lib/node-worker-options.js +65 -0
  74. package/lib/node-worker-port.d.ts +4 -0
  75. package/lib/node-worker-port.js +116 -0
  76. package/lib/node-worker.d.ts +1 -0
  77. package/lib/node-worker.js +38 -0
  78. package/lib/pgwire-connection.d.ts +60 -0
  79. package/lib/pgwire-connection.js +528 -0
  80. package/lib/pgwire.d.ts +3 -0
  81. package/lib/pgwire.js +105 -0
  82. package/lib/physical-archive.d.ts +29 -0
  83. package/lib/physical-archive.js +527 -0
  84. package/lib/protocol.d.ts +1 -0
  85. package/lib/protocol.js +1 -0
  86. package/lib/public.d.ts +4 -0
  87. package/lib/public.js +3 -0
  88. package/lib/query.d.ts +1 -0
  89. package/lib/query.js +1 -0
  90. package/lib/rpc.d.ts +203 -0
  91. package/lib/rpc.js +84 -0
  92. package/lib/runtime-descriptor.d.ts +3 -0
  93. package/lib/runtime-descriptor.js +79 -0
  94. package/lib/server.node.d.ts +1 -0
  95. package/lib/server.node.js +1 -0
  96. package/lib/startup-config.d.ts +2 -0
  97. package/lib/startup-config.js +19 -0
  98. package/lib/storage/bun.d.ts +6 -0
  99. package/lib/storage/bun.js +6 -0
  100. package/lib/storage/deno.d.ts +7 -0
  101. package/lib/storage/deno.js +7 -0
  102. package/lib/storage/incremental-storage.d.ts +25 -0
  103. package/lib/storage/incremental-storage.js +154 -0
  104. package/lib/storage/indexed-db-provider.d.ts +40 -0
  105. package/lib/storage/indexed-db-provider.js +259 -0
  106. package/lib/storage/indexed-db.d.ts +9 -0
  107. package/lib/storage/indexed-db.js +11 -0
  108. package/lib/storage/node.d.ts +10 -0
  109. package/lib/storage/node.js +13 -0
  110. package/lib/storage/opfs-pool.d.ts +31 -0
  111. package/lib/storage/opfs-pool.js +1271 -0
  112. package/lib/storage/opfs-provider.d.ts +4 -0
  113. package/lib/storage/opfs-provider.js +257 -0
  114. package/lib/storage/opfs.d.ts +8 -0
  115. package/lib/storage/opfs.js +10 -0
  116. package/lib/storage/restore-cleanup.d.ts +4 -0
  117. package/lib/storage/restore-cleanup.js +22 -0
  118. package/lib/storage/web-lock.d.ts +2 -0
  119. package/lib/storage/web-lock.js +64 -0
  120. package/lib/storage-provider.d.ts +47 -0
  121. package/lib/storage-provider.js +141 -0
  122. package/lib/storage-snapshot.d.ts +44 -0
  123. package/lib/storage-snapshot.js +274 -0
  124. package/lib/storage.d.ts +46 -0
  125. package/lib/storage.js +83 -0
  126. package/lib/tool-runtime.d.ts +43 -0
  127. package/lib/tool-runtime.js +93 -0
  128. package/lib/tool-worker-common.d.ts +48 -0
  129. package/lib/tool-worker-common.js +97 -0
  130. package/lib/tool-worker.d.ts +1 -0
  131. package/lib/tool-worker.js +10 -0
  132. package/lib/types.d.ts +230 -0
  133. package/lib/types.js +1 -0
  134. package/lib/wasix-runtime.d.ts +24 -0
  135. package/lib/wasix-runtime.js +186 -0
  136. package/lib/worker-client.d.ts +4 -0
  137. package/lib/worker-client.js +45 -0
  138. package/lib/worker-dispatch.d.ts +11 -0
  139. package/lib/worker-dispatch.js +174 -0
  140. package/lib/worker-entry.bun.d.ts +2 -0
  141. package/lib/worker-entry.bun.js +2 -0
  142. package/lib/worker-entry.d.ts +2 -0
  143. package/lib/worker-entry.deno.d.ts +2 -0
  144. package/lib/worker-entry.deno.js +2 -0
  145. package/lib/worker-entry.js +2 -0
  146. package/lib/worker-entry.node.d.ts +2 -0
  147. package/lib/worker-entry.node.js +2 -0
  148. package/lib/worker-node-client.d.ts +4 -0
  149. package/lib/worker-node-client.js +55 -0
  150. package/lib/worker-rpc.d.ts +36 -0
  151. package/lib/worker-rpc.js +422 -0
  152. package/lib/worker-transfer.d.ts +6 -0
  153. package/lib/worker-transfer.js +11 -0
  154. package/lib/worker.d.ts +1 -0
  155. package/lib/worker.js +21 -0
  156. package/lib/zstd.d.ts +4 -0
  157. package/lib/zstd.js +12 -0
  158. package/node_modules/@oliphaunt/js-core/README.md +7 -0
  159. package/node_modules/@oliphaunt/js-core/dist/commonjs/protocol.d.ts +1 -0
  160. package/node_modules/@oliphaunt/js-core/dist/commonjs/protocol.js +22 -0
  161. package/node_modules/@oliphaunt/js-core/dist/commonjs/query.d.ts +255 -0
  162. package/node_modules/@oliphaunt/js-core/dist/commonjs/query.js +2068 -0
  163. package/node_modules/@oliphaunt/js-core/dist/module/package.json +3 -0
  164. package/node_modules/@oliphaunt/js-core/dist/module/protocol.d.ts +1 -0
  165. package/node_modules/@oliphaunt/js-core/dist/module/protocol.js +19 -0
  166. package/node_modules/@oliphaunt/js-core/dist/module/query.d.ts +255 -0
  167. package/node_modules/@oliphaunt/js-core/dist/module/query.js +2039 -0
  168. package/node_modules/@oliphaunt/js-core/package.json +21 -0
  169. package/package.json +122 -0
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Keep runtime configuration flags while removing invocation modes which
3
+ * replace a file-backed Worker program.
4
+ */
5
+ export function nodeWorkerExecArgv(execArgv = process.execArgv) {
6
+ const filtered = [];
7
+ for (let index = 0; index < execArgv.length; index += 1) {
8
+ const argument = execArgv[index];
9
+ if (argument === undefined)
10
+ break;
11
+ if (EXEC_MODE_WITH_VALUE.has(argument) || TEST_MODE_WITH_VALUE.has(argument)) {
12
+ index += 1;
13
+ continue;
14
+ }
15
+ if (EXEC_MODE_FLAGS.has(argument) ||
16
+ argument.startsWith('--input-type=') ||
17
+ argument.startsWith('--run=') ||
18
+ argument.startsWith('--watch-kill-signal=') ||
19
+ argument.startsWith('--watch-path=') ||
20
+ argument.startsWith('--experimental-test-isolation=') ||
21
+ argument === '--test' ||
22
+ argument.startsWith('--test-')) {
23
+ continue;
24
+ }
25
+ filtered.push(argument);
26
+ }
27
+ return filtered;
28
+ }
29
+ const EXEC_MODE_WITH_VALUE = new Set([
30
+ '--input-type',
31
+ '--eval',
32
+ '-e',
33
+ '--print',
34
+ '-p',
35
+ '--run',
36
+ '--watch-kill-signal',
37
+ '--watch-path',
38
+ ]);
39
+ const EXEC_MODE_FLAGS = new Set([
40
+ '--check',
41
+ '-c',
42
+ '--interactive',
43
+ '-i',
44
+ '--watch',
45
+ '--watch-preserve-output',
46
+ ]);
47
+ const TEST_MODE_WITH_VALUE = new Set([
48
+ '--experimental-test-isolation',
49
+ '--test-concurrency',
50
+ '--test-coverage-branches',
51
+ '--test-coverage-exclude',
52
+ '--test-coverage-functions',
53
+ '--test-coverage-include',
54
+ '--test-coverage-lines',
55
+ '--test-global-setup',
56
+ '--test-isolation',
57
+ '--test-name-pattern',
58
+ '--test-random-seed',
59
+ '--test-reporter',
60
+ '--test-reporter-destination',
61
+ '--test-rerun-failures',
62
+ '--test-shard',
63
+ '--test-skip-pattern',
64
+ '--test-timeout',
65
+ ]);
@@ -0,0 +1,4 @@
1
+ import type { Worker } from 'node:worker_threads';
2
+ import type { WasixWorkerPort } from './worker-rpc.js';
3
+ /** @internal Adapt Node-compatible Worker events to the shared RPC transport. */
4
+ export declare function nodeWorkerPort(worker: Worker, runtimeName?: string): WasixWorkerPort;
@@ -0,0 +1,116 @@
1
+ /** @internal Adapt Node-compatible Worker events to the shared RPC transport. */
2
+ export function nodeWorkerPort(worker, runtimeName = 'Node') {
3
+ let terminationRequested = false;
4
+ let selfExitExpected = false;
5
+ let selfExitResponseObserved = false;
6
+ let exited = false;
7
+ let messageListener;
8
+ let fatalListener;
9
+ let fatalError;
10
+ let fatalDelivered = false;
11
+ let exitFailure;
12
+ let resolveExit;
13
+ let rejectExit;
14
+ const exit = new Promise((resolve, reject) => {
15
+ resolveExit = resolve;
16
+ rejectExit = reject;
17
+ });
18
+ // An unexpected Worker may never have an orderly waiter. Keep its rejected
19
+ // exit promise observed while preserving it for expectSelfExit().
20
+ void exit.catch(() => undefined);
21
+ const fatal = (error) => {
22
+ if (terminationRequested || fatalError !== undefined)
23
+ return;
24
+ fatalError = error;
25
+ deliverFatal();
26
+ };
27
+ const deliverFatal = () => {
28
+ if (fatalDelivered || fatalError === undefined || fatalListener === undefined)
29
+ return;
30
+ fatalDelivered = true;
31
+ fatalListener(fatalError);
32
+ };
33
+ const failExpectedExit = (error) => {
34
+ if (exitFailure !== undefined || exited)
35
+ return;
36
+ exitFailure = error;
37
+ rejectExit(error);
38
+ };
39
+ worker.on('message', (message) => {
40
+ if (selfExitExpected)
41
+ selfExitResponseObserved = true;
42
+ messageListener?.(message);
43
+ });
44
+ worker.on('messageerror', (error) => {
45
+ const failure = error instanceof Error
46
+ ? error
47
+ : new Error(`Oliphaunt WASIX ${runtimeName} Worker returned an unreadable message`);
48
+ if (selfExitExpected) {
49
+ failExpectedExit(failure);
50
+ if (!selfExitResponseObserved)
51
+ fatal(failure);
52
+ }
53
+ else
54
+ fatal(failure);
55
+ });
56
+ worker.on('error', (error) => {
57
+ if (selfExitExpected) {
58
+ failExpectedExit(error);
59
+ if (!selfExitResponseObserved)
60
+ fatal(error);
61
+ }
62
+ else
63
+ fatal(error);
64
+ });
65
+ worker.on('exit', (code) => {
66
+ exited = true;
67
+ if (selfExitExpected) {
68
+ if (exitFailure !== undefined)
69
+ return;
70
+ if (code === 0 && selfExitResponseObserved)
71
+ resolveExit();
72
+ else {
73
+ const error = new Error(code === 0
74
+ ? `Oliphaunt WASIX ${runtimeName} Worker self-exited before its shutdown reply`
75
+ : `Oliphaunt WASIX ${runtimeName} Worker self-exited with code ${code}`);
76
+ rejectExit(error);
77
+ if (!selfExitResponseObserved)
78
+ fatal(error);
79
+ }
80
+ return;
81
+ }
82
+ if (terminationRequested) {
83
+ resolveExit();
84
+ return;
85
+ }
86
+ fatal(new Error(`Oliphaunt WASIX ${runtimeName} Worker exited unexpectedly with code ${code}`));
87
+ });
88
+ return {
89
+ supportsSharedMemory: true,
90
+ postMessage(message, transfer) {
91
+ if (exited)
92
+ throw new Error(`Oliphaunt WASIX ${runtimeName} Worker is closed`);
93
+ worker.postMessage(message, transfer);
94
+ },
95
+ expectSelfExit() {
96
+ selfExitExpected = true;
97
+ return exit;
98
+ },
99
+ async terminate() {
100
+ terminationRequested = true;
101
+ // An observed exit is the Node-compatible Worker's completed teardown
102
+ // contract. Bun 1.3 does not settle terminate() after that event, so
103
+ // reserve forced termination for startup/fatal cleanup before exit.
104
+ if (exited)
105
+ return;
106
+ await worker.terminate();
107
+ },
108
+ onMessage(listener) {
109
+ messageListener = listener;
110
+ },
111
+ onFatal(listener) {
112
+ fatalListener = listener;
113
+ deliverFatal();
114
+ },
115
+ };
116
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,38 @@
1
+ import { parentPort } from 'node:worker_threads';
2
+ import { hostRuntimeName } from './host-runtime.js';
3
+ import { openNodeDirectSession } from './node-direct.js';
4
+ import { restoreNativeWasixStorageDirect } from './native-session.js';
5
+ import { createWorkerSessionDispatcher } from './worker-dispatch.js';
6
+ if (parentPort === null) {
7
+ throw new Error(`@oliphaunt/wasix-ts ${hostRuntimeName()} host must run inside a Worker`);
8
+ }
9
+ const port = parentPort;
10
+ const runtimeName = hostRuntimeName();
11
+ const dispatch = createWorkerSessionDispatcher(openNodeDirectSession, respond, restoreNativeWasixStorageDirect, {
12
+ onQuiescentClose() {
13
+ // Run after the close reply and dispatcher frame have unwound. Release
14
+ // the parent port so the Worker exits naturally. Bun 1.3 hangs if its
15
+ // process exit follows MessagePort teardown, so use its Worker-local
16
+ // exit before touching the port. Deno omits close().
17
+ queueMicrotask(() => {
18
+ // Bun's process.exit exits only this Worker, not its parent process.
19
+ // Native close and the close reply have both completed before this
20
+ // quiescent callback runs.
21
+ if (runtimeName === 'Bun')
22
+ process.exit(0);
23
+ port.off('message', onMessage);
24
+ port.close?.();
25
+ port.unref();
26
+ // Some Worker hosts also expose the standard self-close hook; Node
27
+ // simply omits it.
28
+ globalThis.close?.();
29
+ });
30
+ },
31
+ });
32
+ function onMessage(request) {
33
+ void dispatch(request);
34
+ }
35
+ port.on('message', onMessage);
36
+ function respond(response, transfer = []) {
37
+ port.postMessage(response, [...transfer]);
38
+ }
@@ -0,0 +1,60 @@
1
+ import { type WasixByteChannel } from './byte-channel.js';
2
+ export type WasixProtocolConnection = Readonly<{
3
+ frontend: WasixByteChannel;
4
+ backend: WasixByteChannel;
5
+ }>;
6
+ export type WasixProtocolExecutor = Readonly<{
7
+ startupResponse: Uint8Array;
8
+ startupIdentity?: Readonly<{
9
+ username: string;
10
+ database: string;
11
+ }>;
12
+ execDuplex(input: Uint8Array, onRead: (maximumBytes: number) => Uint8Array, onWrite: (chunk: Uint8Array) => void): void;
13
+ publishIdle(): Promise<void>;
14
+ rollback(): Promise<void>;
15
+ }>;
16
+ export type SynchronousPgDumpExecutor = Readonly<{
17
+ startupResponse: Uint8Array;
18
+ startupIdentity: Readonly<{
19
+ username: string;
20
+ database: string;
21
+ }>;
22
+ exec(input: Uint8Array, onChunk: (chunk: Uint8Array) => void): void;
23
+ }>;
24
+ /** @internal Connect same-realm pg_dump to the already stepped PostgreSQL backend. */
25
+ export declare class SynchronousPgDumpConnection {
26
+ #private;
27
+ constructor(executor: SynchronousPgDumpExecutor);
28
+ get protocolStarted(): boolean;
29
+ write(input: Uint8Array): void;
30
+ read(maximumBytes: number): Uint8Array;
31
+ finish(): void;
32
+ }
33
+ /** @internal Serve one complete frontend connection over bounded byte channels. */
34
+ export declare function serveWasixProtocolConnection(connection: WasixProtocolConnection, executor: WasixProtocolExecutor): Promise<void>;
35
+ type FrontendKind = 'ssl' | 'cancel' | 'terminate' | 'startup' | 'protocol';
36
+ export declare function classifyFrontendFrame(frame: Uint8Array): FrontendKind;
37
+ /** @internal Parse the identity selected by a PostgreSQL v3 startup packet. */
38
+ export declare function parseStartupIdentity(frame: Uint8Array): Readonly<{
39
+ username: string;
40
+ database: string;
41
+ }>;
42
+ export declare class FrontendFrameReader {
43
+ #private;
44
+ append(input: Uint8Array): void;
45
+ shift(): Uint8Array | undefined;
46
+ /** Stream one frontend frame at a time to COPY's synchronous pull transport. */
47
+ readFrameChunk(maximumBytes: number, read: () => Uint8Array): Uint8Array;
48
+ finishPull(): void;
49
+ finish(): void;
50
+ }
51
+ /** @internal Hold only ReadyForQuery while streaming every preceding backend message. */
52
+ export declare class BackendResponseGate {
53
+ #private;
54
+ push(input: Uint8Array, write: (chunk: Uint8Array) => void): void;
55
+ finish(): Readonly<{
56
+ status: number;
57
+ frame: Uint8Array;
58
+ }> | undefined;
59
+ }
60
+ export {};