knitting 0.1.54 → 0.1.55
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.
- package/README.md +3 -3
- package/knitting.d.ts +797 -5
- package/knitting.js +9780 -5
- package/map.md +9 -12
- package/package.json +14 -13
- package/shared-memory.d.ts +155 -0
- package/shared-memory.js +1342 -0
- package/unsafe.d.ts +71 -1
- package/unsafe.js +878 -1
- package/utils.d.ts +31 -1
- package/utils.js +116 -1
- package/process-shared-buffer.d.ts +0 -1
- package/process-shared-buffer.js +0 -1
- package/src/api.d.ts +0 -69
- package/src/api.js +0 -627
- package/src/common/envelope.d.ts +0 -17
- package/src/common/envelope.js +0 -22
- package/src/common/module-url.d.ts +0 -1
- package/src/common/module-url.js +0 -24
- package/src/common/node-compat.d.ts +0 -20
- package/src/common/node-compat.js +0 -24
- package/src/common/path-canonical.d.ts +0 -6
- package/src/common/path-canonical.js +0 -41
- package/src/common/runtime.d.ts +0 -15
- package/src/common/runtime.js +0 -91
- package/src/common/shared-buffer-region.d.ts +0 -11
- package/src/common/shared-buffer-region.js +0 -21
- package/src/common/shared-buffer-text.d.ts +0 -16
- package/src/common/shared-buffer-text.js +0 -65
- package/src/common/task-source.d.ts +0 -3
- package/src/common/task-source.js +0 -84
- package/src/common/task-symbol.d.ts +0 -1
- package/src/common/task-symbol.js +0 -1
- package/src/common/with-resolvers.d.ts +0 -9
- package/src/common/with-resolvers.js +0 -23
- package/src/common/worker-runtime.d.ts +0 -42
- package/src/common/worker-runtime.js +0 -61
- package/src/connections/buffer-reference-native.d.ts +0 -56
- package/src/connections/buffer-reference-native.js +0 -217
- package/src/connections/buffer-reference.d.ts +0 -78
- package/src/connections/buffer-reference.js +0 -461
- package/src/connections/bun.d.ts +0 -22
- package/src/connections/bun.js +0 -214
- package/src/connections/deno.d.ts +0 -22
- package/src/connections/deno.js +0 -205
- package/src/connections/file-descriptor.d.ts +0 -39
- package/src/connections/file-descriptor.js +0 -161
- package/src/connections/index.d.ts +0 -4
- package/src/connections/index.js +0 -4
- package/src/connections/node-addons.d.ts +0 -5
- package/src/connections/node-addons.js +0 -43
- package/src/connections/node-buffer-pointer.d.ts +0 -20
- package/src/connections/node-buffer-pointer.js +0 -16
- package/src/connections/node.d.ts +0 -30
- package/src/connections/node.js +0 -62
- package/src/connections/posix.d.ts +0 -32
- package/src/connections/posix.js +0 -77
- package/src/connections/process-shared-buffer.d.ts +0 -75
- package/src/connections/process-shared-buffer.js +0 -279
- package/src/connections/shared-array-buffer-payload.d.ts +0 -36
- package/src/connections/shared-array-buffer-payload.js +0 -235
- package/src/connections/types.d.ts +0 -50
- package/src/connections/types.js +0 -37
- package/src/connections/windows.d.ts +0 -28
- package/src/connections/windows.js +0 -224
- package/src/debug/env-diff.d.ts +0 -26
- package/src/debug/env-diff.js +0 -49
- package/src/debug/gate.d.ts +0 -18
- package/src/debug/gate.js +0 -69
- package/src/debug/handle.d.ts +0 -23
- package/src/debug/handle.js +0 -48
- package/src/error.d.ts +0 -13
- package/src/error.js +0 -49
- package/src/ipc/tools/ring-queue.d.ts +0 -33
- package/src/ipc/tools/ring-queue.js +0 -159
- package/src/ipc/transport/shared-memory.d.ts +0 -23
- package/src/ipc/transport/shared-memory.js +0 -35
- package/src/memory/byte-carpet.d.ts +0 -73
- package/src/memory/byte-carpet.js +0 -157
- package/src/memory/lock.d.ts +0 -201
- package/src/memory/lock.js +0 -739
- package/src/memory/payload-config.d.ts +0 -31
- package/src/memory/payload-config.js +0 -67
- package/src/memory/payloadCodec.d.ts +0 -46
- package/src/memory/payloadCodec.js +0 -1334
- package/src/memory/regionRegistry.d.ts +0 -17
- package/src/memory/regionRegistry.js +0 -285
- package/src/memory/shared-buffer-io.d.ts +0 -55
- package/src/memory/shared-buffer-io.js +0 -403
- package/src/permission/index.d.ts +0 -2
- package/src/permission/index.js +0 -2
- package/src/permission/protocol.d.ts +0 -166
- package/src/permission/protocol.js +0 -650
- package/src/runtime/balancer.d.ts +0 -19
- package/src/runtime/balancer.js +0 -149
- package/src/runtime/dispatcher.d.ts +0 -40
- package/src/runtime/dispatcher.js +0 -142
- package/src/runtime/inline-executor.d.ts +0 -10
- package/src/runtime/inline-executor.js +0 -282
- package/src/runtime/pool.d.ts +0 -39
- package/src/runtime/pool.js +0 -404
- package/src/runtime/process-worker.d.ts +0 -92
- package/src/runtime/process-worker.js +0 -673
- package/src/runtime/tx-queue.d.ts +0 -26
- package/src/runtime/tx-queue.js +0 -155
- package/src/shared/abortSignal.d.ts +0 -23
- package/src/shared/abortSignal.js +0 -134
- package/src/types.d.ts +0 -357
- package/src/types.js +0 -2
- package/src/utils/http.d.ts +0 -29
- package/src/utils/http.js +0 -100
- package/src/worker/bootstrap.d.ts +0 -5
- package/src/worker/bootstrap.js +0 -78
- package/src/worker/composable-runners.d.ts +0 -12
- package/src/worker/composable-runners.js +0 -97
- package/src/worker/loop.d.ts +0 -2
- package/src/worker/loop.js +0 -382
- package/src/worker/process-worker-bootstrap.d.ts +0 -8
- package/src/worker/process-worker-bootstrap.js +0 -160
- package/src/worker/rx-queue.d.ts +0 -25
- package/src/worker/rx-queue.js +0 -173
- package/src/worker/safety/index.d.ts +0 -4
- package/src/worker/safety/index.js +0 -4
- package/src/worker/safety/performance.d.ts +0 -1
- package/src/worker/safety/performance.js +0 -17
- package/src/worker/safety/process.d.ts +0 -2
- package/src/worker/safety/process.js +0 -79
- package/src/worker/safety/startup.d.ts +0 -16
- package/src/worker/safety/startup.js +0 -30
- package/src/worker/safety/worker-data.d.ts +0 -2
- package/src/worker/safety/worker-data.js +0 -36
- package/src/worker/task-loader.d.ts +0 -27
- package/src/worker/task-loader.js +0 -78
- package/src/worker/timers.d.ts +0 -18
- package/src/worker/timers.js +0 -116
package/unsafe.js
CHANGED
|
@@ -1 +1,878 @@
|
|
|
1
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __returnValue = (v) => v;
|
|
3
|
+
function __exportSetter(name, newValue) {
|
|
4
|
+
this[name] = __returnValue.bind(null, newValue);
|
|
5
|
+
}
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, {
|
|
9
|
+
get: all[name],
|
|
10
|
+
enumerable: true,
|
|
11
|
+
configurable: true,
|
|
12
|
+
set: __exportSetter.bind(all, name)
|
|
13
|
+
});
|
|
14
|
+
};
|
|
15
|
+
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
16
|
+
|
|
17
|
+
// src/common/node-compat.ts
|
|
18
|
+
var nodeProcess = (() => {
|
|
19
|
+
const candidate = globalThis.process;
|
|
20
|
+
return typeof candidate?.versions?.node === "string" ? candidate : undefined;
|
|
21
|
+
})();
|
|
22
|
+
var getNodeProcess = () => nodeProcess;
|
|
23
|
+
var getNodeBuiltinModule = (specifier) => {
|
|
24
|
+
const getter = nodeProcess?.getBuiltinModule;
|
|
25
|
+
if (typeof getter !== "function")
|
|
26
|
+
return;
|
|
27
|
+
try {
|
|
28
|
+
return getter.call(nodeProcess, specifier);
|
|
29
|
+
} catch {}
|
|
30
|
+
if (!specifier.startsWith("node:"))
|
|
31
|
+
return;
|
|
32
|
+
try {
|
|
33
|
+
return getter.call(nodeProcess, specifier.slice(5));
|
|
34
|
+
} catch {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
// src/common/runtime.ts
|
|
40
|
+
var globals = globalThis;
|
|
41
|
+
var nodeProcess2 = getNodeProcess();
|
|
42
|
+
var IS_DENO = typeof globals.Deno?.version?.deno === "string";
|
|
43
|
+
var IS_BUN = typeof globals.Bun?.version === "string";
|
|
44
|
+
var IS_NODE = typeof nodeProcess2?.versions?.node === "string";
|
|
45
|
+
var RUNTIME = IS_DENO ? "deno" : IS_BUN ? "bun" : IS_NODE ? "node" : "unknown";
|
|
46
|
+
var SET_IMMEDIATE = typeof globals.setImmediate === "function" ? globals.setImmediate : undefined;
|
|
47
|
+
var WASM_MEMORY_PAGE_BYTES = 64 * 1024;
|
|
48
|
+
var wasmSharedBufferMemory = new WeakMap;
|
|
49
|
+
var wasmSharedBufferMaxByteLength = new WeakMap;
|
|
50
|
+
var hasSharedWasmMemory = (() => {
|
|
51
|
+
if (typeof WebAssembly?.Memory !== "function")
|
|
52
|
+
return false;
|
|
53
|
+
try {
|
|
54
|
+
new WebAssembly.Memory({ initial: 0, maximum: 1, shared: true });
|
|
55
|
+
return true;
|
|
56
|
+
} catch {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
})();
|
|
60
|
+
var roundupWasmPages = (byteLength) => Math.ceil(Math.max(0, byteLength) / WASM_MEMORY_PAGE_BYTES);
|
|
61
|
+
var createSharedWasmBuffer = (byteLength, maxByteLength) => {
|
|
62
|
+
const memory = new WebAssembly.Memory({
|
|
63
|
+
initial: roundupWasmPages(byteLength),
|
|
64
|
+
maximum: Math.max(roundupWasmPages(byteLength), roundupWasmPages(maxByteLength)),
|
|
65
|
+
shared: true
|
|
66
|
+
});
|
|
67
|
+
const buffer = memory.buffer;
|
|
68
|
+
wasmSharedBufferMemory.set(buffer, memory);
|
|
69
|
+
wasmSharedBufferMaxByteLength.set(buffer, maxByteLength);
|
|
70
|
+
return buffer;
|
|
71
|
+
};
|
|
72
|
+
var createWasmSharedArrayBuffer = (byteLength, maxByteLength = byteLength) => {
|
|
73
|
+
if (hasSharedWasmMemory) {
|
|
74
|
+
return createSharedWasmBuffer(byteLength, maxByteLength);
|
|
75
|
+
}
|
|
76
|
+
return new SharedArrayBuffer(byteLength);
|
|
77
|
+
};
|
|
78
|
+
var HAS_NATIVE_SAB_GROW = typeof SharedArrayBuffer === "function" && typeof SharedArrayBuffer.prototype.grow === "function";
|
|
79
|
+
var HAS_SAB_GROW = HAS_NATIVE_SAB_GROW || hasSharedWasmMemory;
|
|
80
|
+
var createSharedArrayBuffer = (byteLength, maxByteLength) => {
|
|
81
|
+
if (HAS_NATIVE_SAB_GROW && typeof maxByteLength === "number") {
|
|
82
|
+
return new SharedArrayBuffer(byteLength, { maxByteLength });
|
|
83
|
+
}
|
|
84
|
+
if (hasSharedWasmMemory && typeof maxByteLength === "number") {
|
|
85
|
+
return createSharedWasmBuffer(byteLength, maxByteLength);
|
|
86
|
+
}
|
|
87
|
+
return new SharedArrayBuffer(byteLength);
|
|
88
|
+
};
|
|
89
|
+
var isGrowableSharedArrayBuffer = (sab) => {
|
|
90
|
+
const value = sab;
|
|
91
|
+
return HAS_NATIVE_SAB_GROW && typeof value.grow === "function" && value.growable === true || wasmSharedBufferMemory.has(sab);
|
|
92
|
+
};
|
|
93
|
+
var sharedArrayBufferMaxByteLength = (sab) => {
|
|
94
|
+
const value = sab;
|
|
95
|
+
if (typeof value.maxByteLength === "number") {
|
|
96
|
+
return value.maxByteLength;
|
|
97
|
+
}
|
|
98
|
+
return wasmSharedBufferMaxByteLength.get(sab) ?? sab.byteLength;
|
|
99
|
+
};
|
|
100
|
+
var growSharedArrayBuffer = (sab, byteLength) => {
|
|
101
|
+
const native = sab;
|
|
102
|
+
if (typeof native.grow === "function") {
|
|
103
|
+
native.grow(byteLength);
|
|
104
|
+
return sab;
|
|
105
|
+
}
|
|
106
|
+
const memory = wasmSharedBufferMemory.get(sab);
|
|
107
|
+
if (memory == null) {
|
|
108
|
+
throw new TypeError("SharedArrayBuffer is not growable");
|
|
109
|
+
}
|
|
110
|
+
const currentBuffer = memory.buffer;
|
|
111
|
+
if (currentBuffer.byteLength >= byteLength) {
|
|
112
|
+
return currentBuffer;
|
|
113
|
+
}
|
|
114
|
+
const targetPages = roundupWasmPages(byteLength);
|
|
115
|
+
const currentPages = roundupWasmPages(currentBuffer.byteLength);
|
|
116
|
+
memory.grow(targetPages - currentPages);
|
|
117
|
+
const nextBuffer = memory.buffer;
|
|
118
|
+
const maxByteLength = wasmSharedBufferMaxByteLength.get(sab) ?? currentBuffer.byteLength;
|
|
119
|
+
wasmSharedBufferMemory.set(nextBuffer, memory);
|
|
120
|
+
wasmSharedBufferMaxByteLength.set(nextBuffer, maxByteLength);
|
|
121
|
+
return nextBuffer;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
// src/common/worker-runtime.ts
|
|
125
|
+
var RUNTIME_PROCESS_WORKER_ENV = "KNITTING_PROCESS_WORKER";
|
|
126
|
+
var RUNTIME_PROCESS_WORKER_BOOT_ENV = "KNITTING_PROCESS_WORKER_BOOT";
|
|
127
|
+
var RUNTIME_PROCESS_WORKER_BOOT_VERSION = 1;
|
|
128
|
+
var RUNTIME_POOL_DEPTH_ENV = "KNITTING_POOL_DEPTH";
|
|
129
|
+
var nodeProcess3 = getNodeProcess();
|
|
130
|
+
var RUNTIME_IS_PROCESS_WORKER = nodeProcess3?.env?.[RUNTIME_PROCESS_WORKER_ENV] === "1";
|
|
131
|
+
var readPoolDepth = () => {
|
|
132
|
+
const raw = nodeProcess3?.env?.[RUNTIME_POOL_DEPTH_ENV];
|
|
133
|
+
if (typeof raw !== "string")
|
|
134
|
+
return 0;
|
|
135
|
+
const parsed = Number.parseInt(raw, 10);
|
|
136
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;
|
|
137
|
+
};
|
|
138
|
+
var RUNTIME_POOL_DEPTH = readPoolDepth();
|
|
139
|
+
var workerThreads = getNodeBuiltinModule("node:worker_threads");
|
|
140
|
+
var isWorkerGlobalScope = () => {
|
|
141
|
+
const scopeCtor = globalThis.WorkerGlobalScope;
|
|
142
|
+
if (typeof scopeCtor !== "function")
|
|
143
|
+
return false;
|
|
144
|
+
try {
|
|
145
|
+
return globalThis instanceof scopeCtor;
|
|
146
|
+
} catch {
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
};
|
|
150
|
+
var RUNTIME_WORKER = workerThreads?.Worker ?? globalThis.Worker;
|
|
151
|
+
var RUNTIME_MESSAGE_CHANNEL = workerThreads?.MessageChannel ?? globalThis.MessageChannel;
|
|
152
|
+
var HAS_NODE_WORKER_THREADS = workerThreads != null;
|
|
153
|
+
var RUNTIME_IS_MAIN_THREAD = RUNTIME_IS_PROCESS_WORKER ? false : workerThreads?.isMainThread ?? !isWorkerGlobalScope();
|
|
154
|
+
var RUNTIME_WORKER_DATA = workerThreads?.workerData;
|
|
155
|
+
var RUNTIME_PARENT_PORT = workerThreads?.parentPort ?? (RUNTIME_IS_PROCESS_WORKER && typeof nodeProcess3?.send === "function" ? {
|
|
156
|
+
postMessage: (message) => nodeProcess3.send(message)
|
|
157
|
+
} : undefined);
|
|
158
|
+
var createRuntimeMessageChannel = () => {
|
|
159
|
+
if (typeof RUNTIME_MESSAGE_CHANNEL !== "function") {
|
|
160
|
+
throw new Error("MessageChannel is not available in this runtime");
|
|
161
|
+
}
|
|
162
|
+
return new RUNTIME_MESSAGE_CHANNEL;
|
|
163
|
+
};
|
|
164
|
+
var addRuntimeDataListener = (target, handler) => {
|
|
165
|
+
if (typeof target.on === "function") {
|
|
166
|
+
target.on("message", handler);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
if (typeof target.addEventListener === "function") {
|
|
170
|
+
target.addEventListener("message", (event) => handler(event?.data));
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
target.onmessage = (event) => handler(event?.data);
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
// src/connections/package-assets.ts
|
|
177
|
+
import { existsSync, statSync } from "node:fs";
|
|
178
|
+
import { dirname, join } from "node:path";
|
|
179
|
+
import { fileURLToPath } from "node:url";
|
|
180
|
+
var safeExists = (path) => {
|
|
181
|
+
try {
|
|
182
|
+
return existsSync(path);
|
|
183
|
+
} catch {
|
|
184
|
+
return false;
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
var safeIsDirectory = (path) => {
|
|
188
|
+
try {
|
|
189
|
+
return statSync(path).isDirectory();
|
|
190
|
+
} catch {
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
};
|
|
194
|
+
var moduleDirectory = (moduleUrl) => {
|
|
195
|
+
const path = fileURLToPath(moduleUrl);
|
|
196
|
+
return safeIsDirectory(path) ? path : dirname(path);
|
|
197
|
+
};
|
|
198
|
+
var isKnittingPackageRoot = (dir) => safeExists(join(dir, "package.json")) && (safeExists(join(dir, "prebuilds")) || safeExists(join(dir, "src")) || safeExists(join(dir, "build")));
|
|
199
|
+
var cachedPackageRoot;
|
|
200
|
+
var findKnittingPackageRoot = (moduleUrl = import.meta.url) => {
|
|
201
|
+
if (cachedPackageRoot !== undefined)
|
|
202
|
+
return cachedPackageRoot;
|
|
203
|
+
let current = moduleDirectory(moduleUrl);
|
|
204
|
+
while (true) {
|
|
205
|
+
if (isKnittingPackageRoot(current)) {
|
|
206
|
+
cachedPackageRoot = current;
|
|
207
|
+
return current;
|
|
208
|
+
}
|
|
209
|
+
const parent = dirname(current);
|
|
210
|
+
if (parent === current) {
|
|
211
|
+
throw new Error(`Could not locate knitting package root from ${moduleUrl}`);
|
|
212
|
+
}
|
|
213
|
+
current = parent;
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
var resolveKnittingPackageAsset = (...segments) => join(findKnittingPackageRoot(), ...segments);
|
|
217
|
+
|
|
218
|
+
// src/connections/node-addons.ts
|
|
219
|
+
var readNodePlatformInfo = () => {
|
|
220
|
+
const processLike = globalThis.process;
|
|
221
|
+
if (typeof processLike?.platform !== "string" || typeof processLike.arch !== "string") {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
return {
|
|
225
|
+
arch: processLike.arch,
|
|
226
|
+
modules: processLike.versions?.modules,
|
|
227
|
+
platform: processLike.platform
|
|
228
|
+
};
|
|
229
|
+
};
|
|
230
|
+
var nodeNativeAddonSpecifiers = (name) => {
|
|
231
|
+
const platformInfo = readNodePlatformInfo();
|
|
232
|
+
const fallback = resolveKnittingPackageAsset("build", "Release", `${name}.node`);
|
|
233
|
+
if (platformInfo === undefined)
|
|
234
|
+
return [fallback];
|
|
235
|
+
const nodeModuleAbi = platformInfo.modules;
|
|
236
|
+
if (typeof nodeModuleAbi === "string" && nodeModuleAbi.length > 0) {
|
|
237
|
+
return [
|
|
238
|
+
resolveKnittingPackageAsset("prebuilds", `${platformInfo.platform}-${platformInfo.arch}-node-${nodeModuleAbi}`, `${name}.node`),
|
|
239
|
+
fallback
|
|
240
|
+
];
|
|
241
|
+
}
|
|
242
|
+
return [
|
|
243
|
+
resolveKnittingPackageAsset("prebuilds", `${platformInfo.platform}-${platformInfo.arch}`, `${name}.node`),
|
|
244
|
+
fallback
|
|
245
|
+
];
|
|
246
|
+
};
|
|
247
|
+
var loadNodeNativeAddon = (require2, name, specifier) => {
|
|
248
|
+
if (specifier !== undefined)
|
|
249
|
+
return require2(specifier);
|
|
250
|
+
const errors = [];
|
|
251
|
+
for (const candidate of nodeNativeAddonSpecifiers(name)) {
|
|
252
|
+
try {
|
|
253
|
+
return require2(candidate);
|
|
254
|
+
} catch (error) {
|
|
255
|
+
errors.push(`${candidate}: ${String(error)}`);
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
throw new Error(`Could not load native addon ${name}. Tried:
|
|
259
|
+
${errors.join(`
|
|
260
|
+
`)}`);
|
|
261
|
+
};
|
|
262
|
+
|
|
263
|
+
// src/connections/node-buffer-pointer.ts
|
|
264
|
+
var cached;
|
|
265
|
+
var loadNodeBufferPointerAddon = (specifier) => {
|
|
266
|
+
if (specifier === undefined && cached !== undefined)
|
|
267
|
+
return cached;
|
|
268
|
+
const nodeModule = getNodeBuiltinModule("node:module");
|
|
269
|
+
if (nodeModule === undefined) {
|
|
270
|
+
throw new Error("Node buffer-pointer addon can only be loaded in Node");
|
|
271
|
+
}
|
|
272
|
+
const require2 = nodeModule.createRequire(import.meta.url);
|
|
273
|
+
const addon = loadNodeNativeAddon(require2, "knitting_buffer_pointer", specifier);
|
|
274
|
+
if (specifier === undefined)
|
|
275
|
+
cached = addon;
|
|
276
|
+
return addon;
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
// src/connections/buffer-reference-native.ts
|
|
280
|
+
var isSharedArrayBufferInstance = (value) => typeof SharedArrayBuffer === "function" && value instanceof SharedArrayBuffer;
|
|
281
|
+
var assertMovableSource = (source) => {
|
|
282
|
+
const buffer = ArrayBuffer.isView(source) ? source.buffer : source;
|
|
283
|
+
if (isSharedArrayBufferInstance(buffer)) {
|
|
284
|
+
throw new TypeError("BufferReference expects ArrayBuffer-backed views; SharedArrayBuffer is already " + "shared and cannot be moved");
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
var readSourceRegion = (source) => {
|
|
288
|
+
if (ArrayBuffer.isView(source)) {
|
|
289
|
+
return {
|
|
290
|
+
buffer: source.buffer,
|
|
291
|
+
byteOffset: source.byteOffset,
|
|
292
|
+
byteLength: source.byteLength
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
return { buffer: source, byteOffset: 0, byteLength: source.byteLength };
|
|
296
|
+
};
|
|
297
|
+
var detachIntoFixedLength = (buffer) => {
|
|
298
|
+
const transferable = buffer;
|
|
299
|
+
if (typeof transferable.transferToFixedLength === "function") {
|
|
300
|
+
return transferable.transferToFixedLength();
|
|
301
|
+
}
|
|
302
|
+
if (typeof transferable.transfer === "function") {
|
|
303
|
+
return transferable.transfer();
|
|
304
|
+
}
|
|
305
|
+
throw new TypeError("BufferReference requires ArrayBuffer.prototype.transfer to move a buffer in this runtime");
|
|
306
|
+
};
|
|
307
|
+
var ffiPinned = new Map;
|
|
308
|
+
var nextFfiToken = 1n;
|
|
309
|
+
var pinTransferred = (buffer) => {
|
|
310
|
+
const token = nextFfiToken++;
|
|
311
|
+
ffiPinned.set(token, buffer);
|
|
312
|
+
return token;
|
|
313
|
+
};
|
|
314
|
+
var pinShared = (sab) => {
|
|
315
|
+
const token = nextFfiToken++;
|
|
316
|
+
ffiPinned.set(token, sab);
|
|
317
|
+
return token;
|
|
318
|
+
};
|
|
319
|
+
var releaseFfi = (token) => {
|
|
320
|
+
ffiPinned.delete(token);
|
|
321
|
+
};
|
|
322
|
+
var produceSharedFfi = (sab, readPointer) => {
|
|
323
|
+
const pointer = readPointer(new Uint8Array(sab));
|
|
324
|
+
const token = pinShared(sab);
|
|
325
|
+
return { token, pointer, byteOffset: 0, byteLength: sab.byteLength };
|
|
326
|
+
};
|
|
327
|
+
var getDeno = () => {
|
|
328
|
+
const deno = globalThis.Deno;
|
|
329
|
+
if (deno?.UnsafePointer === undefined || deno.UnsafePointerView === undefined) {
|
|
330
|
+
throw new Error("Deno FFI (UnsafePointer) is not available in this runtime");
|
|
331
|
+
}
|
|
332
|
+
return deno;
|
|
333
|
+
};
|
|
334
|
+
var getBunFFI = () => {
|
|
335
|
+
const ffi = globalThis.Bun?.FFI;
|
|
336
|
+
if (typeof ffi?.ptr !== "function" || typeof ffi?.toArrayBuffer !== "function") {
|
|
337
|
+
throw new Error("Bun FFI (ptr/toArrayBuffer) is not available in this runtime");
|
|
338
|
+
}
|
|
339
|
+
return ffi;
|
|
340
|
+
};
|
|
341
|
+
var produceFfi = (source, readPointer) => {
|
|
342
|
+
assertMovableSource(source);
|
|
343
|
+
const { buffer, byteOffset, byteLength } = readSourceRegion(source);
|
|
344
|
+
const moved = detachIntoFixedLength(buffer);
|
|
345
|
+
const region = new Uint8Array(moved, byteOffset, byteLength);
|
|
346
|
+
const pointer = readPointer(region);
|
|
347
|
+
const token = pinTransferred(moved);
|
|
348
|
+
return { token, pointer, byteOffset, byteLength };
|
|
349
|
+
};
|
|
350
|
+
var finishAlias = (alias, copy) => {
|
|
351
|
+
if (copy) {
|
|
352
|
+
const owned = alias.slice(0);
|
|
353
|
+
return { buffer: owned, byteOffset: 0, byteLength: owned.byteLength };
|
|
354
|
+
}
|
|
355
|
+
return { buffer: alias, byteOffset: 0, byteLength: alias.byteLength };
|
|
356
|
+
};
|
|
357
|
+
var createDenoCapabilities = () => {
|
|
358
|
+
const deno = getDeno();
|
|
359
|
+
return {
|
|
360
|
+
runtime: "deno",
|
|
361
|
+
supportsOwningAdopt: false,
|
|
362
|
+
produce: (view) => produceFfi(view, (region) => deno.UnsafePointer.value(deno.UnsafePointer.of(region))),
|
|
363
|
+
adopt: ({ pointer, byteLength }, opts) => {
|
|
364
|
+
const alias = denoAlias(deno, pointer, byteLength);
|
|
365
|
+
return finishAlias(alias, opts?.copy);
|
|
366
|
+
},
|
|
367
|
+
release: releaseFfi,
|
|
368
|
+
supportsSharedAdopt: false,
|
|
369
|
+
produceShared: (sab) => produceSharedFfi(sab, (region) => deno.UnsafePointer.value(deno.UnsafePointer.of(region))),
|
|
370
|
+
adoptShared: ({ pointer, byteLength }) => {
|
|
371
|
+
const alias = denoAlias(deno, pointer, byteLength);
|
|
372
|
+
return { buffer: alias, byteOffset: 0, byteLength, isShared: false };
|
|
373
|
+
},
|
|
374
|
+
releaseShared: releaseFfi
|
|
375
|
+
};
|
|
376
|
+
};
|
|
377
|
+
var denoAlias = (deno, pointer, byteLength) => {
|
|
378
|
+
const handle = deno.UnsafePointer.create(pointer);
|
|
379
|
+
if (handle === null || handle === undefined) {
|
|
380
|
+
throw new Error("Deno.UnsafePointer.create returned null");
|
|
381
|
+
}
|
|
382
|
+
return new deno.UnsafePointerView(handle).getArrayBuffer(byteLength);
|
|
383
|
+
};
|
|
384
|
+
var createBunCapabilities = () => {
|
|
385
|
+
const ffi = getBunFFI();
|
|
386
|
+
return {
|
|
387
|
+
runtime: "bun",
|
|
388
|
+
supportsOwningAdopt: false,
|
|
389
|
+
produce: (view) => produceFfi(view, (region) => BigInt(ffi.ptr(region))),
|
|
390
|
+
adopt: ({ pointer, byteLength }, opts) => {
|
|
391
|
+
const alias = ffi.toArrayBuffer(Number(pointer), 0, byteLength);
|
|
392
|
+
return finishAlias(alias, opts?.copy);
|
|
393
|
+
},
|
|
394
|
+
release: releaseFfi,
|
|
395
|
+
supportsSharedAdopt: false,
|
|
396
|
+
produceShared: (sab) => produceSharedFfi(sab, (region) => BigInt(ffi.ptr(region))),
|
|
397
|
+
adoptShared: ({ pointer, byteLength }) => {
|
|
398
|
+
const alias = ffi.toArrayBuffer(Number(pointer), 0, byteLength);
|
|
399
|
+
return { buffer: alias, byteOffset: 0, byteLength, isShared: false };
|
|
400
|
+
},
|
|
401
|
+
releaseShared: releaseFfi
|
|
402
|
+
};
|
|
403
|
+
};
|
|
404
|
+
var createNodeCapabilities = () => {
|
|
405
|
+
const addon = loadNodeBufferPointerAddon();
|
|
406
|
+
const owning = typeof addon.retainBackingStore === "function" && typeof addon.adoptBackingStore === "function" && typeof addon.releaseBackingStore === "function";
|
|
407
|
+
const sharedCapabilities = {
|
|
408
|
+
supportsSharedAdopt: false,
|
|
409
|
+
produceShared: (sab) => produceSharedFfi(sab, (region) => addon.getPointer(region)),
|
|
410
|
+
adoptShared: ({ pointer, byteLength }) => {
|
|
411
|
+
const alias = addon.wrapPointer(pointer, byteLength);
|
|
412
|
+
return { buffer: alias, byteOffset: 0, byteLength, isShared: false };
|
|
413
|
+
},
|
|
414
|
+
releaseShared: releaseFfi
|
|
415
|
+
};
|
|
416
|
+
if (owning) {
|
|
417
|
+
return {
|
|
418
|
+
runtime: "node",
|
|
419
|
+
supportsOwningAdopt: true,
|
|
420
|
+
produce: (source) => {
|
|
421
|
+
assertMovableSource(source);
|
|
422
|
+
const r = addon.retainBackingStore(source);
|
|
423
|
+
return {
|
|
424
|
+
token: r.token,
|
|
425
|
+
pointer: r.pointer,
|
|
426
|
+
byteOffset: r.byteOffset,
|
|
427
|
+
byteLength: r.byteLength
|
|
428
|
+
};
|
|
429
|
+
},
|
|
430
|
+
adopt: ({ token, byteOffset, byteLength }, opts) => {
|
|
431
|
+
const buffer = addon.adoptBackingStore(token);
|
|
432
|
+
if (opts?.copy) {
|
|
433
|
+
const owned = buffer.slice(byteOffset, byteOffset + byteLength);
|
|
434
|
+
return { buffer: owned, byteOffset: 0, byteLength: owned.byteLength };
|
|
435
|
+
}
|
|
436
|
+
return { buffer, byteOffset, byteLength };
|
|
437
|
+
},
|
|
438
|
+
release: (token) => void addon.releaseBackingStore(token),
|
|
439
|
+
...sharedCapabilities
|
|
440
|
+
};
|
|
441
|
+
}
|
|
442
|
+
return {
|
|
443
|
+
runtime: "node",
|
|
444
|
+
supportsOwningAdopt: false,
|
|
445
|
+
produce: (source) => {
|
|
446
|
+
assertMovableSource(source);
|
|
447
|
+
const retained = addon.retainPointer(source);
|
|
448
|
+
const byteOffset = ArrayBuffer.isView(source) ? source.byteOffset : 0;
|
|
449
|
+
return {
|
|
450
|
+
token: retained.token,
|
|
451
|
+
pointer: retained.pointer,
|
|
452
|
+
byteOffset,
|
|
453
|
+
byteLength: retained.byteLength
|
|
454
|
+
};
|
|
455
|
+
},
|
|
456
|
+
adopt: ({ pointer, byteLength }, opts) => {
|
|
457
|
+
const alias = addon.wrapPointer(pointer, byteLength);
|
|
458
|
+
return finishAlias(alias, opts?.copy);
|
|
459
|
+
},
|
|
460
|
+
release: (token) => void addon.releasePointer(token),
|
|
461
|
+
...sharedCapabilities
|
|
462
|
+
};
|
|
463
|
+
};
|
|
464
|
+
var cached2;
|
|
465
|
+
var getBufferReferenceCapabilities = () => {
|
|
466
|
+
if (cached2 !== undefined)
|
|
467
|
+
return cached2;
|
|
468
|
+
switch (RUNTIME) {
|
|
469
|
+
case "node":
|
|
470
|
+
return cached2 = createNodeCapabilities();
|
|
471
|
+
case "deno":
|
|
472
|
+
return cached2 = createDenoCapabilities();
|
|
473
|
+
case "bun":
|
|
474
|
+
return cached2 = createBunCapabilities();
|
|
475
|
+
default:
|
|
476
|
+
throw new Error(`BufferReference cannot run in runtime "${RUNTIME}"`);
|
|
477
|
+
}
|
|
478
|
+
};
|
|
479
|
+
|
|
480
|
+
// src/connections/buffer-reference.ts
|
|
481
|
+
var BUFFER_REFERENCE_KIND = "knitting.bufferReference";
|
|
482
|
+
var BufferReferenceReturn = {
|
|
483
|
+
Copy: "copy",
|
|
484
|
+
Borrow: "borrow"
|
|
485
|
+
};
|
|
486
|
+
var BUFFER_REFERENCE_NUMERIC_TRANSFER = Symbol.for("knitting.bufferReference.numericTransfer");
|
|
487
|
+
var BUFFER_REFERENCE_RETURN_RELEASE_TOKEN = Symbol.for("knitting.bufferReference.returnReleaseToken");
|
|
488
|
+
var EXTERNAL_PAYLOAD_BRAND = Symbol.for("knitting.payloadCodec");
|
|
489
|
+
var BUFFER_REFERENCE_CODEC_ID = BUFFER_REFERENCE_KIND;
|
|
490
|
+
var BUFFER_REFERENCE_RETURN_RELEASE_MESSAGE_KEY = "__knittingBufferReferenceRelease";
|
|
491
|
+
var getRuntime = () => {
|
|
492
|
+
if (RUNTIME === "deno" || RUNTIME === "bun" || RUNTIME === "node") {
|
|
493
|
+
return RUNTIME;
|
|
494
|
+
}
|
|
495
|
+
throw new Error(`BufferReference cannot run in runtime "${RUNTIME}"`);
|
|
496
|
+
};
|
|
497
|
+
var getProcessId = () => {
|
|
498
|
+
const proc = getNodeProcess();
|
|
499
|
+
if (proc !== undefined && typeof proc.pid === "number")
|
|
500
|
+
return proc.pid;
|
|
501
|
+
const deno = globalThis.Deno;
|
|
502
|
+
if (typeof deno?.pid === "number")
|
|
503
|
+
return deno.pid;
|
|
504
|
+
return 0;
|
|
505
|
+
};
|
|
506
|
+
var PROCESS_ORIGIN = `${RUNTIME}:${getProcessId()}`;
|
|
507
|
+
var NUMERIC_WORD_MASK = 0xffffffffn;
|
|
508
|
+
var RUNTIME_NODE = 1;
|
|
509
|
+
var RUNTIME_DENO = 2;
|
|
510
|
+
var RUNTIME_BUN = 3;
|
|
511
|
+
var PAYLOAD_TRANSPORT_FINALIZER = Symbol.for("knitting.payloadCodec.transportFinalizer");
|
|
512
|
+
var currentReturnReleaser;
|
|
513
|
+
var encodeRuntime = (runtime) => {
|
|
514
|
+
switch (runtime) {
|
|
515
|
+
case "node":
|
|
516
|
+
return RUNTIME_NODE;
|
|
517
|
+
case "deno":
|
|
518
|
+
return RUNTIME_DENO;
|
|
519
|
+
case "bun":
|
|
520
|
+
return RUNTIME_BUN;
|
|
521
|
+
}
|
|
522
|
+
};
|
|
523
|
+
var decodeRuntime = (runtime) => {
|
|
524
|
+
switch (runtime) {
|
|
525
|
+
case RUNTIME_NODE:
|
|
526
|
+
return "node";
|
|
527
|
+
case RUNTIME_DENO:
|
|
528
|
+
return "deno";
|
|
529
|
+
case RUNTIME_BUN:
|
|
530
|
+
return "bun";
|
|
531
|
+
default:
|
|
532
|
+
return;
|
|
533
|
+
}
|
|
534
|
+
};
|
|
535
|
+
var splitU64 = (value) => [
|
|
536
|
+
Number(value & NUMERIC_WORD_MASK) >>> 0,
|
|
537
|
+
Number(value >> 32n & NUMERIC_WORD_MASK) >>> 0
|
|
538
|
+
];
|
|
539
|
+
var joinU64 = (low, high) => BigInt(high >>> 0) << 32n | BigInt(low >>> 0);
|
|
540
|
+
var readOriginPid = (origin) => {
|
|
541
|
+
const separator = origin.indexOf(":");
|
|
542
|
+
if (separator < 0)
|
|
543
|
+
return;
|
|
544
|
+
const pid = Number(origin.slice(separator + 1));
|
|
545
|
+
return Number.isInteger(pid) && pid >= 0 && pid <= 4294967295 ? pid >>> 0 : undefined;
|
|
546
|
+
};
|
|
547
|
+
var numericMetadataToMetadata = (words) => {
|
|
548
|
+
const runtime = decodeRuntime(words[6] ?? 0);
|
|
549
|
+
if (runtime === undefined) {
|
|
550
|
+
throw new TypeError("Invalid BufferReference numeric runtime");
|
|
551
|
+
}
|
|
552
|
+
const originPid = words[7];
|
|
553
|
+
if (originPid === undefined || !Number.isInteger(originPid) || originPid < 0) {
|
|
554
|
+
throw new TypeError("Invalid BufferReference numeric origin");
|
|
555
|
+
}
|
|
556
|
+
return {
|
|
557
|
+
kind: BUFFER_REFERENCE_KIND,
|
|
558
|
+
origin: `${runtime}:${originPid >>> 0}`,
|
|
559
|
+
runtime,
|
|
560
|
+
pointer: joinU64(words[0] ?? 0, words[1] ?? 0).toString(),
|
|
561
|
+
token: joinU64(words[2] ?? 0, words[3] ?? 0).toString(),
|
|
562
|
+
byteOffset: words[4] ?? 0,
|
|
563
|
+
byteLength: words[5] ?? 0
|
|
564
|
+
};
|
|
565
|
+
};
|
|
566
|
+
var withBufferReferenceReturnReleaser = (releaser, run) => {
|
|
567
|
+
if (releaser === undefined)
|
|
568
|
+
return run();
|
|
569
|
+
const previous = currentReturnReleaser;
|
|
570
|
+
currentReturnReleaser = releaser;
|
|
571
|
+
try {
|
|
572
|
+
return run();
|
|
573
|
+
} finally {
|
|
574
|
+
currentReturnReleaser = previous;
|
|
575
|
+
}
|
|
576
|
+
};
|
|
577
|
+
var createBufferReferenceReturnReleaseMessage = (token) => ({
|
|
578
|
+
[BUFFER_REFERENCE_RETURN_RELEASE_MESSAGE_KEY]: token.toString()
|
|
579
|
+
});
|
|
580
|
+
var readBufferReferenceReturnReleaseMessage = (value) => {
|
|
581
|
+
if (value === null || typeof value !== "object")
|
|
582
|
+
return;
|
|
583
|
+
const raw = value[BUFFER_REFERENCE_RETURN_RELEASE_MESSAGE_KEY];
|
|
584
|
+
if (typeof raw !== "string")
|
|
585
|
+
return;
|
|
586
|
+
try {
|
|
587
|
+
const token = BigInt(raw);
|
|
588
|
+
return token > 0n ? token : undefined;
|
|
589
|
+
} catch {
|
|
590
|
+
return;
|
|
591
|
+
}
|
|
592
|
+
};
|
|
593
|
+
var producerFinalizer = typeof FinalizationRegistry === "function" ? new FinalizationRegistry(({ token, release }) => {
|
|
594
|
+
try {
|
|
595
|
+
release(token);
|
|
596
|
+
} catch {}
|
|
597
|
+
}) : undefined;
|
|
598
|
+
var borrowedReturnFinalizer = typeof FinalizationRegistry === "function" ? new FinalizationRegistry(({ token, release }) => {
|
|
599
|
+
try {
|
|
600
|
+
release(token);
|
|
601
|
+
} catch {}
|
|
602
|
+
}) : undefined;
|
|
603
|
+
var isSharedArrayBufferInstance2 = (value) => typeof SharedArrayBuffer === "function" && value instanceof SharedArrayBuffer;
|
|
604
|
+
var assertMovableSource2 = (source) => {
|
|
605
|
+
if (isSharedArrayBufferInstance2(source)) {
|
|
606
|
+
throw new TypeError("BufferReference expects ArrayBuffer memory; SharedArrayBuffer is already shared and cannot be detached");
|
|
607
|
+
}
|
|
608
|
+
if (ArrayBuffer.isView(source)) {
|
|
609
|
+
if (isSharedArrayBufferInstance2(source.buffer)) {
|
|
610
|
+
throw new TypeError("BufferReference expects ArrayBuffer-backed views; SharedArrayBuffer is already shared and cannot be detached");
|
|
611
|
+
}
|
|
612
|
+
return;
|
|
613
|
+
}
|
|
614
|
+
if (!(source instanceof ArrayBuffer)) {
|
|
615
|
+
throw new TypeError("BufferReference expects an ArrayBuffer or typed-array view");
|
|
616
|
+
}
|
|
617
|
+
};
|
|
618
|
+
var isDetached = (buffer) => buffer.detached === true || buffer.byteLength === 0;
|
|
619
|
+
var detachArrayBufferBestEffort = (runtime, buffer) => {
|
|
620
|
+
if (isDetached(buffer))
|
|
621
|
+
return true;
|
|
622
|
+
if (runtime === "node") {
|
|
623
|
+
try {
|
|
624
|
+
return loadNodeBufferPointerAddon().detachArrayBuffer(buffer);
|
|
625
|
+
} catch {}
|
|
626
|
+
}
|
|
627
|
+
const transferable = buffer;
|
|
628
|
+
try {
|
|
629
|
+
if (typeof transferable.transferToFixedLength === "function") {
|
|
630
|
+
transferable.transferToFixedLength(0);
|
|
631
|
+
return isDetached(buffer);
|
|
632
|
+
}
|
|
633
|
+
if (typeof transferable.transfer === "function") {
|
|
634
|
+
transferable.transfer(0);
|
|
635
|
+
return isDetached(buffer);
|
|
636
|
+
}
|
|
637
|
+
} catch {}
|
|
638
|
+
try {
|
|
639
|
+
if (typeof structuredClone === "function") {
|
|
640
|
+
structuredClone(buffer, { transfer: [buffer] });
|
|
641
|
+
return isDetached(buffer);
|
|
642
|
+
}
|
|
643
|
+
} catch {}
|
|
644
|
+
return false;
|
|
645
|
+
};
|
|
646
|
+
var isBufferReferenceMetadata = (value) => {
|
|
647
|
+
if (value === null || typeof value !== "object")
|
|
648
|
+
return false;
|
|
649
|
+
const meta = value;
|
|
650
|
+
return meta.kind === BUFFER_REFERENCE_KIND && typeof meta.origin === "string" && (meta.runtime === "node" || meta.runtime === "deno" || meta.runtime === "bun") && typeof meta.pointer === "string" && typeof meta.token === "string" && typeof meta.byteOffset === "number" && Number.isInteger(meta.byteOffset) && meta.byteOffset >= 0 && typeof meta.byteLength === "number" && Number.isInteger(meta.byteLength) && meta.byteLength >= 0;
|
|
651
|
+
};
|
|
652
|
+
|
|
653
|
+
class BufferReference {
|
|
654
|
+
[EXTERNAL_PAYLOAD_BRAND] = BUFFER_REFERENCE_CODEC_ID;
|
|
655
|
+
runtime;
|
|
656
|
+
origin;
|
|
657
|
+
pointer;
|
|
658
|
+
byteOffset;
|
|
659
|
+
byteLength;
|
|
660
|
+
#token;
|
|
661
|
+
#isProducer;
|
|
662
|
+
#finalizerToken;
|
|
663
|
+
#materializedRegions;
|
|
664
|
+
#owned;
|
|
665
|
+
#borrowedReturnReleaser;
|
|
666
|
+
#borrowedReturnFinalizerToken;
|
|
667
|
+
#transportRefs = 0;
|
|
668
|
+
#released = false;
|
|
669
|
+
constructor(source, meta) {
|
|
670
|
+
if (meta !== undefined) {
|
|
671
|
+
this.runtime = meta.runtime;
|
|
672
|
+
this.origin = meta.origin;
|
|
673
|
+
this.pointer = BigInt(meta.pointer);
|
|
674
|
+
this.byteOffset = meta.byteOffset;
|
|
675
|
+
this.byteLength = meta.byteLength;
|
|
676
|
+
this.#token = BigInt(meta.token);
|
|
677
|
+
this.#isProducer = false;
|
|
678
|
+
return;
|
|
679
|
+
}
|
|
680
|
+
if (source === undefined) {
|
|
681
|
+
throw new TypeError("BufferReference requires a buffer source");
|
|
682
|
+
}
|
|
683
|
+
assertMovableSource2(source);
|
|
684
|
+
const caps = getBufferReferenceCapabilities();
|
|
685
|
+
const produced = caps.produce(source);
|
|
686
|
+
this.runtime = getRuntime();
|
|
687
|
+
this.origin = PROCESS_ORIGIN;
|
|
688
|
+
this.pointer = produced.pointer;
|
|
689
|
+
this.byteOffset = produced.byteOffset;
|
|
690
|
+
this.byteLength = produced.byteLength;
|
|
691
|
+
this.#token = produced.token;
|
|
692
|
+
this.#isProducer = true;
|
|
693
|
+
this.#finalizerToken = {};
|
|
694
|
+
producerFinalizer?.register(this, { token: this.#token, release: caps.release }, this.#finalizerToken);
|
|
695
|
+
}
|
|
696
|
+
static fromMetadata(meta) {
|
|
697
|
+
if (!isBufferReferenceMetadata(meta)) {
|
|
698
|
+
throw new TypeError("Invalid BufferReferenceMetadata");
|
|
699
|
+
}
|
|
700
|
+
return new BufferReference(undefined, meta);
|
|
701
|
+
}
|
|
702
|
+
toMetadata() {
|
|
703
|
+
this.#assertActive();
|
|
704
|
+
return {
|
|
705
|
+
kind: BUFFER_REFERENCE_KIND,
|
|
706
|
+
origin: this.origin,
|
|
707
|
+
runtime: this.runtime,
|
|
708
|
+
pointer: this.pointer.toString(),
|
|
709
|
+
token: this.#token.toString(),
|
|
710
|
+
byteOffset: this.byteOffset,
|
|
711
|
+
byteLength: this.byteLength
|
|
712
|
+
};
|
|
713
|
+
}
|
|
714
|
+
[BUFFER_REFERENCE_NUMERIC_TRANSFER]() {
|
|
715
|
+
this.#assertActive();
|
|
716
|
+
const originPid = readOriginPid(this.origin);
|
|
717
|
+
if (originPid === undefined || this.byteOffset > 4294967295 || this.byteLength > 4294967295) {
|
|
718
|
+
return;
|
|
719
|
+
}
|
|
720
|
+
const [pointerLow, pointerHigh] = splitU64(this.pointer);
|
|
721
|
+
const [tokenLow, tokenHigh] = splitU64(this.#token);
|
|
722
|
+
return [
|
|
723
|
+
pointerLow,
|
|
724
|
+
pointerHigh,
|
|
725
|
+
tokenLow,
|
|
726
|
+
tokenHigh,
|
|
727
|
+
this.byteOffset >>> 0,
|
|
728
|
+
this.byteLength >>> 0,
|
|
729
|
+
encodeRuntime(this.runtime),
|
|
730
|
+
originPid
|
|
731
|
+
];
|
|
732
|
+
}
|
|
733
|
+
get isLocal() {
|
|
734
|
+
return this.origin === PROCESS_ORIGIN && this.runtime === RUNTIME;
|
|
735
|
+
}
|
|
736
|
+
#assertLocal() {
|
|
737
|
+
if (this.origin !== PROCESS_ORIGIN) {
|
|
738
|
+
throw new Error(`BufferReference cannot cross a process boundary (origin ${this.origin} ` + `!= ${PROCESS_ORIGIN}). Use ProcessSharedBuffer for cross-process memory.`);
|
|
739
|
+
}
|
|
740
|
+
if (this.runtime !== RUNTIME) {
|
|
741
|
+
throw new Error(`BufferReference runtime mismatch: produced on ${this.runtime}, ` + `materializing on ${RUNTIME}.`);
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
#assertActive() {
|
|
745
|
+
if (this.#released) {
|
|
746
|
+
throw new Error("BufferReference has been released");
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
claimOwnership(releaser = currentReturnReleaser) {
|
|
750
|
+
if (this.#owned !== undefined || this.#borrowedReturnReleaser !== undefined || this.#released)
|
|
751
|
+
return this;
|
|
752
|
+
this.#assertLocal();
|
|
753
|
+
const caps = getBufferReferenceCapabilities();
|
|
754
|
+
const input = {
|
|
755
|
+
token: this.#token,
|
|
756
|
+
pointer: this.pointer,
|
|
757
|
+
byteOffset: this.byteOffset,
|
|
758
|
+
byteLength: this.byteLength
|
|
759
|
+
};
|
|
760
|
+
if (releaser !== undefined) {
|
|
761
|
+
this.#borrowedReturnReleaser = releaser;
|
|
762
|
+
this.#borrowedReturnFinalizerToken = {};
|
|
763
|
+
borrowedReturnFinalizer?.register(this, { token: this.#token, release: releaser }, this.#borrowedReturnFinalizerToken);
|
|
764
|
+
return this;
|
|
765
|
+
}
|
|
766
|
+
this.#owned = caps.adopt(input, caps.supportsOwningAdopt ? undefined : { copy: true });
|
|
767
|
+
return this;
|
|
768
|
+
}
|
|
769
|
+
#materialize() {
|
|
770
|
+
this.#assertActive();
|
|
771
|
+
if (this.#owned !== undefined)
|
|
772
|
+
return this.#owned;
|
|
773
|
+
this.#assertLocal();
|
|
774
|
+
const region = getBufferReferenceCapabilities().adopt({
|
|
775
|
+
token: this.#token,
|
|
776
|
+
pointer: this.pointer,
|
|
777
|
+
byteOffset: this.byteOffset,
|
|
778
|
+
byteLength: this.byteLength
|
|
779
|
+
});
|
|
780
|
+
if (this.#borrowedReturnReleaser !== undefined) {
|
|
781
|
+
this.#owned = region;
|
|
782
|
+
return region;
|
|
783
|
+
}
|
|
784
|
+
(this.#materializedRegions ??= []).push(region);
|
|
785
|
+
return region;
|
|
786
|
+
}
|
|
787
|
+
toArrayBuffer() {
|
|
788
|
+
const region = this.#materialize();
|
|
789
|
+
if (region.byteOffset === 0 && region.buffer.byteLength === region.byteLength) {
|
|
790
|
+
return region.buffer;
|
|
791
|
+
}
|
|
792
|
+
return region.buffer.slice(region.byteOffset, region.byteOffset + region.byteLength);
|
|
793
|
+
}
|
|
794
|
+
toUint8Array() {
|
|
795
|
+
const region = this.#materialize();
|
|
796
|
+
return new Uint8Array(region.buffer, region.byteOffset, region.byteLength);
|
|
797
|
+
}
|
|
798
|
+
get source() {
|
|
799
|
+
return;
|
|
800
|
+
}
|
|
801
|
+
release() {
|
|
802
|
+
if (this.#released)
|
|
803
|
+
return;
|
|
804
|
+
this.#released = true;
|
|
805
|
+
const regions = this.#materializedRegions;
|
|
806
|
+
this.#materializedRegions = undefined;
|
|
807
|
+
if (regions !== undefined) {
|
|
808
|
+
for (let i = 0;i < regions.length; i++) {
|
|
809
|
+
detachArrayBufferBestEffort(this.runtime, regions[i].buffer);
|
|
810
|
+
}
|
|
811
|
+
}
|
|
812
|
+
if (this.#borrowedReturnFinalizerToken !== undefined) {
|
|
813
|
+
borrowedReturnFinalizer?.unregister(this.#borrowedReturnFinalizerToken);
|
|
814
|
+
this.#borrowedReturnFinalizerToken = undefined;
|
|
815
|
+
}
|
|
816
|
+
const borrowedReturnReleaser = this.#borrowedReturnReleaser;
|
|
817
|
+
this.#borrowedReturnReleaser = undefined;
|
|
818
|
+
if (borrowedReturnReleaser !== undefined) {
|
|
819
|
+
const owned = this.#owned;
|
|
820
|
+
this.#owned = undefined;
|
|
821
|
+
if (owned !== undefined) {
|
|
822
|
+
detachArrayBufferBestEffort(this.runtime, owned.buffer);
|
|
823
|
+
}
|
|
824
|
+
try {
|
|
825
|
+
borrowedReturnReleaser(this.#token);
|
|
826
|
+
} catch {}
|
|
827
|
+
}
|
|
828
|
+
if (this.#finalizerToken !== undefined) {
|
|
829
|
+
producerFinalizer?.unregister(this.#finalizerToken);
|
|
830
|
+
this.#finalizerToken = undefined;
|
|
831
|
+
}
|
|
832
|
+
if (this.#isProducer) {
|
|
833
|
+
try {
|
|
834
|
+
getBufferReferenceCapabilities().release(this.#token);
|
|
835
|
+
} catch {}
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
[Symbol.dispose]() {
|
|
839
|
+
this.release();
|
|
840
|
+
}
|
|
841
|
+
[PAYLOAD_TRANSPORT_FINALIZER]() {
|
|
842
|
+
if (this.#released)
|
|
843
|
+
return;
|
|
844
|
+
this.#transportRefs++;
|
|
845
|
+
let finalized = false;
|
|
846
|
+
const finalizer = () => {
|
|
847
|
+
if (finalized)
|
|
848
|
+
return;
|
|
849
|
+
finalized = true;
|
|
850
|
+
this.#transportRefs--;
|
|
851
|
+
if (this.#transportRefs <= 0)
|
|
852
|
+
this.release();
|
|
853
|
+
};
|
|
854
|
+
if (this.#isProducer) {
|
|
855
|
+
finalizer[BUFFER_REFERENCE_RETURN_RELEASE_TOKEN] = this.#token;
|
|
856
|
+
}
|
|
857
|
+
return finalizer;
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
var codecGlobal = globalThis;
|
|
861
|
+
var codecs = codecGlobal.__KNITTING_PAYLOAD_CODECS__ ??= Object.create(null);
|
|
862
|
+
codecs[BUFFER_REFERENCE_CODEC_ID] = {
|
|
863
|
+
decode: (metadata) => {
|
|
864
|
+
const ref = BufferReference.fromMetadata(metadata);
|
|
865
|
+
return RUNTIME_IS_MAIN_THREAD ? ref.claimOwnership() : ref;
|
|
866
|
+
},
|
|
867
|
+
decodeNumeric: (metadata) => {
|
|
868
|
+
const ref = BufferReference.fromMetadata(numericMetadataToMetadata(metadata));
|
|
869
|
+
return RUNTIME_IS_MAIN_THREAD ? ref.claimOwnership() : ref;
|
|
870
|
+
}
|
|
871
|
+
};
|
|
872
|
+
export {
|
|
873
|
+
isBufferReferenceMetadata,
|
|
874
|
+
BufferReferenceReturn,
|
|
875
|
+
BufferReference,
|
|
876
|
+
BUFFER_REFERENCE_KIND,
|
|
877
|
+
BUFFER_REFERENCE_CODEC_ID
|
|
878
|
+
};
|