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/shared-memory.js
ADDED
|
@@ -0,0 +1,1342 @@
|
|
|
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/connections/types.ts
|
|
40
|
+
var CACHE_LINE_SIZE = 64;
|
|
41
|
+
var alignToCacheLine = (size) => size + (CACHE_LINE_SIZE - size % CACHE_LINE_SIZE) % CACHE_LINE_SIZE;
|
|
42
|
+
var readCreateSize = (options) => typeof options === "number" ? options : options.size;
|
|
43
|
+
var readCreateName = (options, fallback) => typeof options === "number" ? fallback : options.name ?? fallback;
|
|
44
|
+
var readCreateMode = (options) => typeof options === "number" ? "anonymous" : options.mode ?? "anonymous";
|
|
45
|
+
var expectSharedMemoryName = (name) => {
|
|
46
|
+
if (typeof name !== "string" || name.length === 0) {
|
|
47
|
+
throw new TypeError("shared memory name must be a non-empty string");
|
|
48
|
+
}
|
|
49
|
+
if (name.includes("\x00")) {
|
|
50
|
+
throw new TypeError("shared memory name must not contain NUL bytes");
|
|
51
|
+
}
|
|
52
|
+
return name;
|
|
53
|
+
};
|
|
54
|
+
var readRequiredCreateName = (options) => {
|
|
55
|
+
if (typeof options === "number" || options.name === undefined) {
|
|
56
|
+
throw new TypeError("named shared memory requires a name");
|
|
57
|
+
}
|
|
58
|
+
return expectSharedMemoryName(options.name);
|
|
59
|
+
};
|
|
60
|
+
var expectPositiveSize = (size) => {
|
|
61
|
+
if (!Number.isFinite(size) || size <= 0) {
|
|
62
|
+
throw new RangeError("shared memory size must be positive");
|
|
63
|
+
}
|
|
64
|
+
return alignToCacheLine(Math.trunc(size));
|
|
65
|
+
};
|
|
66
|
+
var expectFd = (fd) => {
|
|
67
|
+
if (!Number.isInteger(fd) || fd < 0) {
|
|
68
|
+
throw new RangeError("shared memory fd must be non-negative");
|
|
69
|
+
}
|
|
70
|
+
return fd;
|
|
71
|
+
};
|
|
72
|
+
var requireSharedArrayBuffer = (mapping) => {
|
|
73
|
+
if (mapping.sab !== undefined)
|
|
74
|
+
return mapping.sab;
|
|
75
|
+
throw new TypeError(`${mapping.runtime} mapping is ${mapping.kind}; a native SAB wrapper is required`);
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
// src/connections/file-descriptor.ts
|
|
79
|
+
var isRecord = (value) => typeof value === "object" && value !== null;
|
|
80
|
+
var readOptionalRuntime = (value) => {
|
|
81
|
+
if (value === undefined)
|
|
82
|
+
return;
|
|
83
|
+
if (value === "node" || value === "deno" || value === "bun")
|
|
84
|
+
return value;
|
|
85
|
+
throw new TypeError("file descriptor runtime is invalid");
|
|
86
|
+
};
|
|
87
|
+
var readOptionalKind = (value) => {
|
|
88
|
+
if (value === undefined)
|
|
89
|
+
return;
|
|
90
|
+
if (value === "shared-array-buffer" || value === "external-array-buffer") {
|
|
91
|
+
return value;
|
|
92
|
+
}
|
|
93
|
+
throw new TypeError("file descriptor buffer kind is invalid");
|
|
94
|
+
};
|
|
95
|
+
var readOptionalNumber = (value, label) => {
|
|
96
|
+
if (value === undefined)
|
|
97
|
+
return;
|
|
98
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
99
|
+
throw new TypeError(`file descriptor ${label} must be a finite number`);
|
|
100
|
+
}
|
|
101
|
+
return Math.trunc(value);
|
|
102
|
+
};
|
|
103
|
+
var readOptionalName = (value) => {
|
|
104
|
+
if (value === undefined)
|
|
105
|
+
return;
|
|
106
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
107
|
+
throw new TypeError("file descriptor name must be a non-empty string when provided");
|
|
108
|
+
}
|
|
109
|
+
if (value.includes("\x00")) {
|
|
110
|
+
throw new TypeError("file descriptor name must not contain NUL bytes");
|
|
111
|
+
}
|
|
112
|
+
return value;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
class FileDescriptor {
|
|
116
|
+
fd;
|
|
117
|
+
name;
|
|
118
|
+
size;
|
|
119
|
+
byteLength;
|
|
120
|
+
runtime;
|
|
121
|
+
kind;
|
|
122
|
+
baseAddressMod64;
|
|
123
|
+
#mapping;
|
|
124
|
+
constructor(metadata, mapping) {
|
|
125
|
+
this.fd = expectFd(metadata.fd);
|
|
126
|
+
this.name = metadata.name;
|
|
127
|
+
this.size = expectPositiveSize(metadata.size);
|
|
128
|
+
this.byteLength = expectPositiveSize(metadata.byteLength);
|
|
129
|
+
this.runtime = metadata.runtime;
|
|
130
|
+
this.kind = metadata.kind;
|
|
131
|
+
this.baseAddressMod64 = metadata.baseAddressMod64;
|
|
132
|
+
this.#mapping = mapping;
|
|
133
|
+
}
|
|
134
|
+
static fromMapping(mapping) {
|
|
135
|
+
return new FileDescriptor({
|
|
136
|
+
version: 1,
|
|
137
|
+
fd: mapping.fd,
|
|
138
|
+
name: mapping.name,
|
|
139
|
+
size: mapping.size,
|
|
140
|
+
byteLength: mapping.byteLength,
|
|
141
|
+
runtime: mapping.runtime,
|
|
142
|
+
kind: mapping.kind,
|
|
143
|
+
baseAddressMod64: mapping.baseAddressMod64
|
|
144
|
+
}, mapping);
|
|
145
|
+
}
|
|
146
|
+
static fromMetadata(metadata) {
|
|
147
|
+
return new FileDescriptor(parseFileDescriptorMetadata(metadata));
|
|
148
|
+
}
|
|
149
|
+
static parse(serialized) {
|
|
150
|
+
return FileDescriptor.fromMetadata(serialized);
|
|
151
|
+
}
|
|
152
|
+
toMetadata() {
|
|
153
|
+
const metadata = {
|
|
154
|
+
version: 1,
|
|
155
|
+
fd: this.fd,
|
|
156
|
+
size: this.size,
|
|
157
|
+
byteLength: this.byteLength,
|
|
158
|
+
runtime: this.runtime,
|
|
159
|
+
kind: this.kind,
|
|
160
|
+
baseAddressMod64: this.baseAddressMod64
|
|
161
|
+
};
|
|
162
|
+
if (this.name !== undefined)
|
|
163
|
+
metadata.name = this.name;
|
|
164
|
+
return metadata;
|
|
165
|
+
}
|
|
166
|
+
toJSON() {
|
|
167
|
+
return this.toMetadata();
|
|
168
|
+
}
|
|
169
|
+
stringify() {
|
|
170
|
+
return JSON.stringify(this.toMetadata());
|
|
171
|
+
}
|
|
172
|
+
stringifyMetadata() {
|
|
173
|
+
return this.stringify();
|
|
174
|
+
}
|
|
175
|
+
toString() {
|
|
176
|
+
return this.stringify();
|
|
177
|
+
}
|
|
178
|
+
attach(mapping) {
|
|
179
|
+
this.#mapping = mapping;
|
|
180
|
+
return this;
|
|
181
|
+
}
|
|
182
|
+
get mapping() {
|
|
183
|
+
return this.#mapping;
|
|
184
|
+
}
|
|
185
|
+
map(mapper) {
|
|
186
|
+
const options = {
|
|
187
|
+
fd: this.fd,
|
|
188
|
+
name: this.name,
|
|
189
|
+
size: this.size
|
|
190
|
+
};
|
|
191
|
+
this.#mapping = mapper.mapSharedMemory(options);
|
|
192
|
+
return this.#mapping;
|
|
193
|
+
}
|
|
194
|
+
getBuffer(mapper) {
|
|
195
|
+
if (this.#mapping?.buffer !== undefined)
|
|
196
|
+
return this.#mapping.buffer;
|
|
197
|
+
if (mapper === undefined) {
|
|
198
|
+
throw new TypeError("file descriptor is not attached to a shared memory mapping");
|
|
199
|
+
}
|
|
200
|
+
return this.map(mapper).buffer;
|
|
201
|
+
}
|
|
202
|
+
getSharedArrayBuffer(mapper) {
|
|
203
|
+
if (this.#mapping?.sab !== undefined)
|
|
204
|
+
return this.#mapping.sab;
|
|
205
|
+
if (mapper === undefined) {
|
|
206
|
+
throw new TypeError("file descriptor is not attached to a SharedArrayBuffer mapping");
|
|
207
|
+
}
|
|
208
|
+
return requireSharedArrayBuffer(this.map(mapper));
|
|
209
|
+
}
|
|
210
|
+
getSAB(mapper) {
|
|
211
|
+
return this.getSharedArrayBuffer(mapper);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
var parseFileDescriptorMetadata = (input) => {
|
|
215
|
+
const value = typeof input === "string" ? JSON.parse(input) : input;
|
|
216
|
+
if (!isRecord(value)) {
|
|
217
|
+
throw new TypeError("file descriptor metadata must be an object");
|
|
218
|
+
}
|
|
219
|
+
if (value.version !== 1) {
|
|
220
|
+
throw new TypeError("unsupported file descriptor metadata version");
|
|
221
|
+
}
|
|
222
|
+
const parsed = {
|
|
223
|
+
version: 1,
|
|
224
|
+
fd: expectFd(readOptionalNumber(value.fd, "fd") ?? -1),
|
|
225
|
+
size: expectPositiveSize(readOptionalNumber(value.size, "size") ?? 0),
|
|
226
|
+
byteLength: expectPositiveSize(readOptionalNumber(value.byteLength, "byteLength") ?? readOptionalNumber(value.size, "size") ?? 0),
|
|
227
|
+
runtime: readOptionalRuntime(value.runtime),
|
|
228
|
+
kind: readOptionalKind(value.kind),
|
|
229
|
+
baseAddressMod64: readOptionalNumber(value.baseAddressMod64, "baseAddressMod64")
|
|
230
|
+
};
|
|
231
|
+
const name = readOptionalName(value.name);
|
|
232
|
+
if (name !== undefined)
|
|
233
|
+
parsed.name = name;
|
|
234
|
+
return parsed;
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
// src/common/runtime.ts
|
|
238
|
+
var globals = globalThis;
|
|
239
|
+
var nodeProcess2 = getNodeProcess();
|
|
240
|
+
var IS_DENO = typeof globals.Deno?.version?.deno === "string";
|
|
241
|
+
var IS_BUN = typeof globals.Bun?.version === "string";
|
|
242
|
+
var IS_NODE = typeof nodeProcess2?.versions?.node === "string";
|
|
243
|
+
var RUNTIME = IS_DENO ? "deno" : IS_BUN ? "bun" : IS_NODE ? "node" : "unknown";
|
|
244
|
+
var SET_IMMEDIATE = typeof globals.setImmediate === "function" ? globals.setImmediate : undefined;
|
|
245
|
+
var WASM_MEMORY_PAGE_BYTES = 64 * 1024;
|
|
246
|
+
var wasmSharedBufferMemory = new WeakMap;
|
|
247
|
+
var wasmSharedBufferMaxByteLength = new WeakMap;
|
|
248
|
+
var hasSharedWasmMemory = (() => {
|
|
249
|
+
if (typeof WebAssembly?.Memory !== "function")
|
|
250
|
+
return false;
|
|
251
|
+
try {
|
|
252
|
+
new WebAssembly.Memory({ initial: 0, maximum: 1, shared: true });
|
|
253
|
+
return true;
|
|
254
|
+
} catch {
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
})();
|
|
258
|
+
var roundupWasmPages = (byteLength) => Math.ceil(Math.max(0, byteLength) / WASM_MEMORY_PAGE_BYTES);
|
|
259
|
+
var createSharedWasmBuffer = (byteLength, maxByteLength) => {
|
|
260
|
+
const memory = new WebAssembly.Memory({
|
|
261
|
+
initial: roundupWasmPages(byteLength),
|
|
262
|
+
maximum: Math.max(roundupWasmPages(byteLength), roundupWasmPages(maxByteLength)),
|
|
263
|
+
shared: true
|
|
264
|
+
});
|
|
265
|
+
const buffer = memory.buffer;
|
|
266
|
+
wasmSharedBufferMemory.set(buffer, memory);
|
|
267
|
+
wasmSharedBufferMaxByteLength.set(buffer, maxByteLength);
|
|
268
|
+
return buffer;
|
|
269
|
+
};
|
|
270
|
+
var createWasmSharedArrayBuffer = (byteLength, maxByteLength = byteLength) => {
|
|
271
|
+
if (hasSharedWasmMemory) {
|
|
272
|
+
return createSharedWasmBuffer(byteLength, maxByteLength);
|
|
273
|
+
}
|
|
274
|
+
return new SharedArrayBuffer(byteLength);
|
|
275
|
+
};
|
|
276
|
+
var HAS_NATIVE_SAB_GROW = typeof SharedArrayBuffer === "function" && typeof SharedArrayBuffer.prototype.grow === "function";
|
|
277
|
+
var HAS_SAB_GROW = HAS_NATIVE_SAB_GROW || hasSharedWasmMemory;
|
|
278
|
+
var createSharedArrayBuffer = (byteLength, maxByteLength) => {
|
|
279
|
+
if (HAS_NATIVE_SAB_GROW && typeof maxByteLength === "number") {
|
|
280
|
+
return new SharedArrayBuffer(byteLength, { maxByteLength });
|
|
281
|
+
}
|
|
282
|
+
if (hasSharedWasmMemory && typeof maxByteLength === "number") {
|
|
283
|
+
return createSharedWasmBuffer(byteLength, maxByteLength);
|
|
284
|
+
}
|
|
285
|
+
return new SharedArrayBuffer(byteLength);
|
|
286
|
+
};
|
|
287
|
+
var isGrowableSharedArrayBuffer = (sab) => {
|
|
288
|
+
const value = sab;
|
|
289
|
+
return HAS_NATIVE_SAB_GROW && typeof value.grow === "function" && value.growable === true || wasmSharedBufferMemory.has(sab);
|
|
290
|
+
};
|
|
291
|
+
var sharedArrayBufferMaxByteLength = (sab) => {
|
|
292
|
+
const value = sab;
|
|
293
|
+
if (typeof value.maxByteLength === "number") {
|
|
294
|
+
return value.maxByteLength;
|
|
295
|
+
}
|
|
296
|
+
return wasmSharedBufferMaxByteLength.get(sab) ?? sab.byteLength;
|
|
297
|
+
};
|
|
298
|
+
var growSharedArrayBuffer = (sab, byteLength) => {
|
|
299
|
+
const native = sab;
|
|
300
|
+
if (typeof native.grow === "function") {
|
|
301
|
+
native.grow(byteLength);
|
|
302
|
+
return sab;
|
|
303
|
+
}
|
|
304
|
+
const memory = wasmSharedBufferMemory.get(sab);
|
|
305
|
+
if (memory == null) {
|
|
306
|
+
throw new TypeError("SharedArrayBuffer is not growable");
|
|
307
|
+
}
|
|
308
|
+
const currentBuffer = memory.buffer;
|
|
309
|
+
if (currentBuffer.byteLength >= byteLength) {
|
|
310
|
+
return currentBuffer;
|
|
311
|
+
}
|
|
312
|
+
const targetPages = roundupWasmPages(byteLength);
|
|
313
|
+
const currentPages = roundupWasmPages(currentBuffer.byteLength);
|
|
314
|
+
memory.grow(targetPages - currentPages);
|
|
315
|
+
const nextBuffer = memory.buffer;
|
|
316
|
+
const maxByteLength = wasmSharedBufferMaxByteLength.get(sab) ?? currentBuffer.byteLength;
|
|
317
|
+
wasmSharedBufferMemory.set(nextBuffer, memory);
|
|
318
|
+
wasmSharedBufferMaxByteLength.set(nextBuffer, maxByteLength);
|
|
319
|
+
return nextBuffer;
|
|
320
|
+
};
|
|
321
|
+
|
|
322
|
+
// src/connections/posix.ts
|
|
323
|
+
var LINUX_LIBC_SO = "libc.so.6";
|
|
324
|
+
var DARWIN_LIBSYSTEM = "/usr/lib/libSystem.B.dylib";
|
|
325
|
+
var PROT_READ = 1;
|
|
326
|
+
var PROT_WRITE = 2;
|
|
327
|
+
var MAP_SHARED = 1;
|
|
328
|
+
var O_RDWR = 2;
|
|
329
|
+
var LINUX_O_CREAT = 64;
|
|
330
|
+
var LINUX_O_EXCL = 128;
|
|
331
|
+
var DARWIN_O_CREAT = 512;
|
|
332
|
+
var DARWIN_O_EXCL = 2048;
|
|
333
|
+
var DARWIN_SHM_MODE = 384;
|
|
334
|
+
var POSIX_SHM_MODE = 384;
|
|
335
|
+
var F_GETFD = 1;
|
|
336
|
+
var F_SETFD = 2;
|
|
337
|
+
var FD_CLOEXEC = 1;
|
|
338
|
+
var encodeCString = (value) => new TextEncoder().encode(`${value}\x00`);
|
|
339
|
+
var setCloseOnExec = (libc, fd) => {
|
|
340
|
+
const flags = libc.symbols.fcntl(fd, F_GETFD, 0);
|
|
341
|
+
if (flags < 0) {
|
|
342
|
+
throw new Error("fcntl(F_GETFD) failed");
|
|
343
|
+
}
|
|
344
|
+
const result = libc.symbols.fcntl(fd, F_SETFD, flags | FD_CLOEXEC);
|
|
345
|
+
if (result < 0) {
|
|
346
|
+
throw new Error("fcntl(F_SETFD) failed");
|
|
347
|
+
}
|
|
348
|
+
return fd;
|
|
349
|
+
};
|
|
350
|
+
var POSIX_SHM_MAX_NAME_LEN = 30;
|
|
351
|
+
var toPosixSharedMemoryName = (name) => {
|
|
352
|
+
if (name.length === 0) {
|
|
353
|
+
throw new TypeError("shared memory name must be non-empty");
|
|
354
|
+
}
|
|
355
|
+
if (name.includes("\x00")) {
|
|
356
|
+
throw new TypeError("shared memory name must not contain NUL bytes");
|
|
357
|
+
}
|
|
358
|
+
const out = name.startsWith("/") ? name : `/${name}`;
|
|
359
|
+
if (out.length < 2 || out.slice(1).includes("/")) {
|
|
360
|
+
throw new TypeError("POSIX shared memory name must not contain path separators");
|
|
361
|
+
}
|
|
362
|
+
if (out.length > POSIX_SHM_MAX_NAME_LEN + 1) {
|
|
363
|
+
throw new TypeError(`POSIX shared memory name must be at most ${POSIX_SHM_MAX_NAME_LEN} characters (macOS limit); got ${out.length - 1}`);
|
|
364
|
+
}
|
|
365
|
+
return out;
|
|
366
|
+
};
|
|
367
|
+
var detectPosixPlatform = () => {
|
|
368
|
+
const denoOs = globalThis.Deno?.build?.os;
|
|
369
|
+
if (denoOs === "darwin" || denoOs === "linux")
|
|
370
|
+
return denoOs;
|
|
371
|
+
const processPlatform = globalThis.process?.platform;
|
|
372
|
+
if (processPlatform === "darwin" || processPlatform === "linux") {
|
|
373
|
+
return processPlatform;
|
|
374
|
+
}
|
|
375
|
+
throw new Error("shared memory connections support Linux and macOS only");
|
|
376
|
+
};
|
|
377
|
+
var getPosixLibcPath = (platform = detectPosixPlatform()) => platform === "darwin" ? DARWIN_LIBSYSTEM : LINUX_LIBC_SO;
|
|
378
|
+
var makeDarwinSharedMemoryName = (_name, runtime) => {
|
|
379
|
+
const processId = globalThis.process?.pid ?? globalThis.Deno?.pid ?? 0;
|
|
380
|
+
const runtimeTag = runtime.slice(0, 1) || "x";
|
|
381
|
+
const pidTag = Math.abs(processId).toString(36).slice(-5);
|
|
382
|
+
const timeTag = Date.now().toString(36).slice(-6);
|
|
383
|
+
const nonce = Math.random().toString(36).slice(2, 6);
|
|
384
|
+
return `/knit_${runtimeTag}_${pidTag}_${timeTag}_${nonce}`;
|
|
385
|
+
};
|
|
386
|
+
|
|
387
|
+
// src/connections/package-assets.ts
|
|
388
|
+
import { existsSync, statSync } from "node:fs";
|
|
389
|
+
import { dirname, join } from "node:path";
|
|
390
|
+
import { fileURLToPath } from "node:url";
|
|
391
|
+
var safeExists = (path) => {
|
|
392
|
+
try {
|
|
393
|
+
return existsSync(path);
|
|
394
|
+
} catch {
|
|
395
|
+
return false;
|
|
396
|
+
}
|
|
397
|
+
};
|
|
398
|
+
var safeIsDirectory = (path) => {
|
|
399
|
+
try {
|
|
400
|
+
return statSync(path).isDirectory();
|
|
401
|
+
} catch {
|
|
402
|
+
return false;
|
|
403
|
+
}
|
|
404
|
+
};
|
|
405
|
+
var moduleDirectory = (moduleUrl) => {
|
|
406
|
+
const path = fileURLToPath(moduleUrl);
|
|
407
|
+
return safeIsDirectory(path) ? path : dirname(path);
|
|
408
|
+
};
|
|
409
|
+
var isKnittingPackageRoot = (dir) => safeExists(join(dir, "package.json")) && (safeExists(join(dir, "prebuilds")) || safeExists(join(dir, "src")) || safeExists(join(dir, "build")));
|
|
410
|
+
var cachedPackageRoot;
|
|
411
|
+
var findKnittingPackageRoot = (moduleUrl = import.meta.url) => {
|
|
412
|
+
if (cachedPackageRoot !== undefined)
|
|
413
|
+
return cachedPackageRoot;
|
|
414
|
+
let current = moduleDirectory(moduleUrl);
|
|
415
|
+
while (true) {
|
|
416
|
+
if (isKnittingPackageRoot(current)) {
|
|
417
|
+
cachedPackageRoot = current;
|
|
418
|
+
return current;
|
|
419
|
+
}
|
|
420
|
+
const parent = dirname(current);
|
|
421
|
+
if (parent === current) {
|
|
422
|
+
throw new Error(`Could not locate knitting package root from ${moduleUrl}`);
|
|
423
|
+
}
|
|
424
|
+
current = parent;
|
|
425
|
+
}
|
|
426
|
+
};
|
|
427
|
+
var resolveKnittingPackageAsset = (...segments) => join(findKnittingPackageRoot(), ...segments);
|
|
428
|
+
|
|
429
|
+
// src/connections/windows.ts
|
|
430
|
+
var WINDOWS_CREATE_MODE_CREATE = 1;
|
|
431
|
+
var WINDOWS_CREATE_MODE_OPEN = 2;
|
|
432
|
+
var WINDOWS_MAPPING_RECORD_BYTES = 32;
|
|
433
|
+
var POINTER_OFFSET = 0;
|
|
434
|
+
var HANDLE_OFFSET = 8;
|
|
435
|
+
var SIZE_OFFSET = 16;
|
|
436
|
+
var BASE_ADDRESS_MOD_64_OFFSET = 24;
|
|
437
|
+
var FFIType = {
|
|
438
|
+
i32: 5,
|
|
439
|
+
u32: 6,
|
|
440
|
+
i64: 7,
|
|
441
|
+
ptr: 12
|
|
442
|
+
};
|
|
443
|
+
var anonymousNameCounter = 0;
|
|
444
|
+
var getDeno = () => {
|
|
445
|
+
const deno = globalThis.Deno;
|
|
446
|
+
if (deno === undefined) {
|
|
447
|
+
throw new Error("Deno Windows shared memory primitives can only run in Deno");
|
|
448
|
+
}
|
|
449
|
+
return deno;
|
|
450
|
+
};
|
|
451
|
+
var getBunFFI = () => {
|
|
452
|
+
const ffi = globalThis.Bun?.FFI;
|
|
453
|
+
if (typeof ffi?.dlopen !== "function" || typeof ffi?.toArrayBuffer !== "function") {
|
|
454
|
+
throw new Error("Bun FFI is not available in this runtime");
|
|
455
|
+
}
|
|
456
|
+
return ffi;
|
|
457
|
+
};
|
|
458
|
+
var isWindowsRuntime = () => {
|
|
459
|
+
const denoOs = globalThis.Deno?.build?.os;
|
|
460
|
+
if (denoOs !== undefined)
|
|
461
|
+
return denoOs === "windows";
|
|
462
|
+
const processPlatform = globalThis.process?.platform;
|
|
463
|
+
return processPlatform === "win32";
|
|
464
|
+
};
|
|
465
|
+
var windowsArch = () => {
|
|
466
|
+
const denoArch = globalThis.Deno?.build?.arch;
|
|
467
|
+
if (denoArch === "x86_64")
|
|
468
|
+
return "x64";
|
|
469
|
+
const processArch = globalThis.process?.arch;
|
|
470
|
+
if (processArch === "x64")
|
|
471
|
+
return processArch;
|
|
472
|
+
throw new Error("Windows shared memory prebuilds support x64 only");
|
|
473
|
+
};
|
|
474
|
+
var windowsSharedMemoryPrebuildPath = () => resolveKnittingPackageAsset("prebuilds", `win32-${windowsArch()}`, "knitting_windows_shared_memory.dll");
|
|
475
|
+
var makeWindowsAnonymousSharedMemoryName = (runtime) => {
|
|
476
|
+
const processId = globalThis.process?.pid ?? globalThis.Deno?.pid ?? 0;
|
|
477
|
+
const next = anonymousNameCounter++;
|
|
478
|
+
const timeTag = Date.now().toString(36);
|
|
479
|
+
const randomTag = Math.random().toString(36).slice(2, 10);
|
|
480
|
+
const runtimeTag = runtime.replace(/[^a-z0-9_-]/gi, "").slice(0, 12) || "js";
|
|
481
|
+
return `Local\\knit_${runtimeTag}_${processId}_${timeTag}_${next}_${randomTag}`;
|
|
482
|
+
};
|
|
483
|
+
var readWindowsCreate = (options, runtime) => {
|
|
484
|
+
const mode = readCreateMode(options);
|
|
485
|
+
if (mode === "anonymous") {
|
|
486
|
+
return {
|
|
487
|
+
mode: WINDOWS_CREATE_MODE_CREATE,
|
|
488
|
+
name: makeWindowsAnonymousSharedMemoryName(runtime)
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
return {
|
|
492
|
+
mode: mode === "open" ? WINDOWS_CREATE_MODE_OPEN : WINDOWS_CREATE_MODE_CREATE,
|
|
493
|
+
name: readRequiredCreateName(options)
|
|
494
|
+
};
|
|
495
|
+
};
|
|
496
|
+
var encodeWideCString = (value) => {
|
|
497
|
+
const out = new Uint16Array((value?.length ?? 0) + 1);
|
|
498
|
+
if (value === undefined)
|
|
499
|
+
return out;
|
|
500
|
+
for (let index = 0;index < value.length; index += 1) {
|
|
501
|
+
out[index] = value.charCodeAt(index);
|
|
502
|
+
}
|
|
503
|
+
return out;
|
|
504
|
+
};
|
|
505
|
+
var readWindowsNativeMapping = (record) => {
|
|
506
|
+
const view = new DataView(record.buffer, record.byteOffset, record.byteLength);
|
|
507
|
+
const address = view.getBigUint64(POINTER_OFFSET, true);
|
|
508
|
+
const handle = view.getBigUint64(HANDLE_OFFSET, true);
|
|
509
|
+
const size = view.getBigUint64(SIZE_OFFSET, true);
|
|
510
|
+
if (address === 0n || handle === 0n) {
|
|
511
|
+
throw new Error("Windows shared memory backend returned an empty mapping");
|
|
512
|
+
}
|
|
513
|
+
if (size > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
514
|
+
throw new RangeError("Windows shared memory mapping is too large");
|
|
515
|
+
}
|
|
516
|
+
return {
|
|
517
|
+
address,
|
|
518
|
+
handle,
|
|
519
|
+
size: Number(size),
|
|
520
|
+
baseAddressMod64: view.getUint32(BASE_ADDRESS_MOD_64_OFFSET, true)
|
|
521
|
+
};
|
|
522
|
+
};
|
|
523
|
+
var fdFromHandle = (handle) => handle <= BigInt(Number.MAX_SAFE_INTEGER) ? Number(handle) : 0;
|
|
524
|
+
var checkWindowsResult = (result, message) => {
|
|
525
|
+
if (result !== 0) {
|
|
526
|
+
throw new Error(`${message} failed with Windows error ${result}`);
|
|
527
|
+
}
|
|
528
|
+
};
|
|
529
|
+
var createRecord = () => new Uint8Array(WINDOWS_MAPPING_RECORD_BYTES);
|
|
530
|
+
var openDenoWindowsSharedMemoryLibrary = () => getDeno().dlopen(windowsSharedMemoryPrebuildPath(), {
|
|
531
|
+
knitting_windows_create_shared_memory: {
|
|
532
|
+
parameters: ["u64", "buffer", "u32", "buffer"],
|
|
533
|
+
result: "i32"
|
|
534
|
+
},
|
|
535
|
+
knitting_windows_map_shared_memory: {
|
|
536
|
+
parameters: ["u64", "u64", "buffer", "buffer"],
|
|
537
|
+
result: "i32"
|
|
538
|
+
},
|
|
539
|
+
knitting_windows_close_shared_memory: {
|
|
540
|
+
parameters: ["buffer"],
|
|
541
|
+
result: "i32"
|
|
542
|
+
}
|
|
543
|
+
});
|
|
544
|
+
var openBunWindowsSharedMemoryLibrary = () => getBunFFI().dlopen(windowsSharedMemoryPrebuildPath(), {
|
|
545
|
+
knitting_windows_create_shared_memory: {
|
|
546
|
+
args: [FFIType.i64, FFIType.ptr, FFIType.u32, FFIType.ptr],
|
|
547
|
+
returns: FFIType.i32
|
|
548
|
+
},
|
|
549
|
+
knitting_windows_map_shared_memory: {
|
|
550
|
+
args: [FFIType.i64, FFIType.i64, FFIType.ptr, FFIType.ptr],
|
|
551
|
+
returns: FFIType.i32
|
|
552
|
+
},
|
|
553
|
+
knitting_windows_close_shared_memory: {
|
|
554
|
+
args: [FFIType.ptr],
|
|
555
|
+
returns: FFIType.i32
|
|
556
|
+
}
|
|
557
|
+
});
|
|
558
|
+
var closeWindowsMapping = (record, closeSharedMemory) => {
|
|
559
|
+
let closed = false;
|
|
560
|
+
return () => {
|
|
561
|
+
if (closed)
|
|
562
|
+
return;
|
|
563
|
+
closed = true;
|
|
564
|
+
checkWindowsResult(closeSharedMemory(record), "knitting_windows_close_shared_memory");
|
|
565
|
+
};
|
|
566
|
+
};
|
|
567
|
+
var fromDenoWindowsRecord = (record, name, lib) => {
|
|
568
|
+
const mapping = readWindowsNativeMapping(record);
|
|
569
|
+
const pointer = getDeno().UnsafePointer?.create(mapping.address);
|
|
570
|
+
if (pointer === undefined || pointer === null || typeof pointer !== "object") {
|
|
571
|
+
throw new Error("Deno UnsafePointer.create is not available");
|
|
572
|
+
}
|
|
573
|
+
const arrayBuffer = new (getDeno()).UnsafePointerView(pointer).getArrayBuffer(mapping.size);
|
|
574
|
+
return {
|
|
575
|
+
runtime: "deno",
|
|
576
|
+
fd: fdFromHandle(mapping.handle),
|
|
577
|
+
name,
|
|
578
|
+
size: mapping.size,
|
|
579
|
+
byteLength: arrayBuffer.byteLength,
|
|
580
|
+
buffer: arrayBuffer,
|
|
581
|
+
kind: "external-array-buffer",
|
|
582
|
+
arrayBuffer,
|
|
583
|
+
unsafePointer: pointer,
|
|
584
|
+
baseAddressMod64: mapping.baseAddressMod64,
|
|
585
|
+
close: closeWindowsMapping(record, lib.symbols.knitting_windows_close_shared_memory)
|
|
586
|
+
};
|
|
587
|
+
};
|
|
588
|
+
var fromBunWindowsRecord = (record, name, lib) => {
|
|
589
|
+
const mapping = readWindowsNativeMapping(record);
|
|
590
|
+
if (mapping.address > BigInt(Number.MAX_SAFE_INTEGER)) {
|
|
591
|
+
throw new RangeError("Windows mapping pointer is too large for Bun FFI");
|
|
592
|
+
}
|
|
593
|
+
const arrayBuffer = getBunFFI().toArrayBuffer(Number(mapping.address), 0, mapping.size);
|
|
594
|
+
return {
|
|
595
|
+
runtime: "bun",
|
|
596
|
+
fd: fdFromHandle(mapping.handle),
|
|
597
|
+
name,
|
|
598
|
+
size: mapping.size,
|
|
599
|
+
byteLength: arrayBuffer.byteLength,
|
|
600
|
+
buffer: arrayBuffer,
|
|
601
|
+
kind: "external-array-buffer",
|
|
602
|
+
arrayBuffer,
|
|
603
|
+
unsafePointer: Number(mapping.address),
|
|
604
|
+
baseAddressMod64: mapping.baseAddressMod64,
|
|
605
|
+
close: closeWindowsMapping(record, lib.symbols.knitting_windows_close_shared_memory)
|
|
606
|
+
};
|
|
607
|
+
};
|
|
608
|
+
var createDenoWindowsSharedMemory = (options, lib = openDenoWindowsSharedMemoryLibrary()) => {
|
|
609
|
+
const size = expectPositiveSize(readCreateSize(options));
|
|
610
|
+
const { mode, name } = readWindowsCreate(options, "deno");
|
|
611
|
+
const record = createRecord();
|
|
612
|
+
checkWindowsResult(lib.symbols.knitting_windows_create_shared_memory(BigInt(size), encodeWideCString(name), mode, record), "knitting_windows_create_shared_memory");
|
|
613
|
+
return fromDenoWindowsRecord(record, name, lib);
|
|
614
|
+
};
|
|
615
|
+
var mapDenoWindowsSharedMemory = (options, lib = openDenoWindowsSharedMemoryLibrary()) => {
|
|
616
|
+
const fd = expectFd(options.fd);
|
|
617
|
+
const size = expectPositiveSize(options.size);
|
|
618
|
+
const record = createRecord();
|
|
619
|
+
checkWindowsResult(lib.symbols.knitting_windows_map_shared_memory(BigInt(fd), BigInt(size), encodeWideCString(options.name), record), "knitting_windows_map_shared_memory");
|
|
620
|
+
return fromDenoWindowsRecord(record, options.name, lib);
|
|
621
|
+
};
|
|
622
|
+
var createDenoWindowsConnectionPrimitives = (lib = openDenoWindowsSharedMemoryLibrary()) => ({
|
|
623
|
+
runtime: "deno",
|
|
624
|
+
createSharedMemory: (options) => createDenoWindowsSharedMemory(options, lib),
|
|
625
|
+
mapSharedMemory: (options) => mapDenoWindowsSharedMemory(options, lib)
|
|
626
|
+
});
|
|
627
|
+
var createBunWindowsSharedMemory = (options, lib = openBunWindowsSharedMemoryLibrary()) => {
|
|
628
|
+
const size = expectPositiveSize(readCreateSize(options));
|
|
629
|
+
const { mode, name } = readWindowsCreate(options, "bun");
|
|
630
|
+
const record = createRecord();
|
|
631
|
+
checkWindowsResult(lib.symbols.knitting_windows_create_shared_memory(BigInt(size), encodeWideCString(name), mode, record), "knitting_windows_create_shared_memory");
|
|
632
|
+
return fromBunWindowsRecord(record, name, lib);
|
|
633
|
+
};
|
|
634
|
+
var mapBunWindowsSharedMemory = (options, lib = openBunWindowsSharedMemoryLibrary()) => {
|
|
635
|
+
const fd = expectFd(options.fd);
|
|
636
|
+
const size = expectPositiveSize(options.size);
|
|
637
|
+
const record = createRecord();
|
|
638
|
+
checkWindowsResult(lib.symbols.knitting_windows_map_shared_memory(BigInt(fd), BigInt(size), encodeWideCString(options.name), record), "knitting_windows_map_shared_memory");
|
|
639
|
+
return fromBunWindowsRecord(record, options.name, lib);
|
|
640
|
+
};
|
|
641
|
+
var createBunWindowsConnectionPrimitives = (lib = openBunWindowsSharedMemoryLibrary()) => ({
|
|
642
|
+
runtime: "bun",
|
|
643
|
+
createSharedMemory: (options) => createBunWindowsSharedMemory(options, lib),
|
|
644
|
+
mapSharedMemory: (options) => mapBunWindowsSharedMemory(options, lib)
|
|
645
|
+
});
|
|
646
|
+
|
|
647
|
+
// src/connections/bun.ts
|
|
648
|
+
var FFIType2 = {
|
|
649
|
+
i32: 5,
|
|
650
|
+
i64: 7,
|
|
651
|
+
u32: 6,
|
|
652
|
+
usize: 8,
|
|
653
|
+
ptr: 12
|
|
654
|
+
};
|
|
655
|
+
var getBunFFI2 = () => {
|
|
656
|
+
const ffi = globalThis.Bun?.FFI;
|
|
657
|
+
if (typeof ffi?.dlopen !== "function" || typeof ffi?.toArrayBuffer !== "function") {
|
|
658
|
+
throw new Error("Bun FFI is not available in this runtime");
|
|
659
|
+
}
|
|
660
|
+
return ffi;
|
|
661
|
+
};
|
|
662
|
+
var openBunLibc = () => getBunFFI2().dlopen(getPosixLibcPath(), {
|
|
663
|
+
...getBunCreateSymbols(),
|
|
664
|
+
ftruncate: {
|
|
665
|
+
args: [FFIType2.i32, FFIType2.i64],
|
|
666
|
+
returns: FFIType2.i32
|
|
667
|
+
},
|
|
668
|
+
dup: {
|
|
669
|
+
args: [FFIType2.i32],
|
|
670
|
+
returns: FFIType2.i32
|
|
671
|
+
},
|
|
672
|
+
fcntl: {
|
|
673
|
+
args: [FFIType2.i32, FFIType2.i32, FFIType2.i32],
|
|
674
|
+
returns: FFIType2.i32
|
|
675
|
+
},
|
|
676
|
+
mmap: {
|
|
677
|
+
args: [
|
|
678
|
+
FFIType2.ptr,
|
|
679
|
+
FFIType2.usize,
|
|
680
|
+
FFIType2.i32,
|
|
681
|
+
FFIType2.i32,
|
|
682
|
+
FFIType2.i32,
|
|
683
|
+
FFIType2.i64
|
|
684
|
+
],
|
|
685
|
+
returns: FFIType2.ptr
|
|
686
|
+
},
|
|
687
|
+
munmap: {
|
|
688
|
+
args: [FFIType2.ptr, FFIType2.usize],
|
|
689
|
+
returns: FFIType2.i32
|
|
690
|
+
},
|
|
691
|
+
close: {
|
|
692
|
+
args: [FFIType2.i32],
|
|
693
|
+
returns: FFIType2.i32
|
|
694
|
+
}
|
|
695
|
+
});
|
|
696
|
+
var getBunCreateSymbols = (platform = detectPosixPlatform()) => platform === "darwin" ? {
|
|
697
|
+
shm_open: {
|
|
698
|
+
args: [FFIType2.ptr, FFIType2.i32, FFIType2.u32],
|
|
699
|
+
returns: FFIType2.i32
|
|
700
|
+
},
|
|
701
|
+
shm_unlink: {
|
|
702
|
+
args: [FFIType2.ptr],
|
|
703
|
+
returns: FFIType2.i32
|
|
704
|
+
}
|
|
705
|
+
} : {
|
|
706
|
+
memfd_create: {
|
|
707
|
+
args: [FFIType2.ptr, FFIType2.u32],
|
|
708
|
+
returns: FFIType2.i32
|
|
709
|
+
},
|
|
710
|
+
shm_open: {
|
|
711
|
+
args: [FFIType2.ptr, FFIType2.i32, FFIType2.u32],
|
|
712
|
+
returns: FFIType2.i32
|
|
713
|
+
},
|
|
714
|
+
shm_unlink: {
|
|
715
|
+
args: [FFIType2.ptr],
|
|
716
|
+
returns: FFIType2.i32
|
|
717
|
+
}
|
|
718
|
+
};
|
|
719
|
+
var checkResult = (result, message) => {
|
|
720
|
+
if (result < 0)
|
|
721
|
+
throw new Error(message);
|
|
722
|
+
return result;
|
|
723
|
+
};
|
|
724
|
+
var isBunMmapFailed = (pointer) => !pointer || pointer < 0 || pointer >= Number.MAX_SAFE_INTEGER;
|
|
725
|
+
var createBunSharedMemoryFd = (name, platform, libc) => {
|
|
726
|
+
if (platform === "darwin") {
|
|
727
|
+
const shmOpen = libc.symbols.shm_open;
|
|
728
|
+
const shmUnlink = libc.symbols.shm_unlink;
|
|
729
|
+
if (shmOpen === undefined || shmUnlink === undefined) {
|
|
730
|
+
throw new Error("shm_open symbols are not available");
|
|
731
|
+
}
|
|
732
|
+
const shmName = encodeCString(makeDarwinSharedMemoryName(name, "bun"));
|
|
733
|
+
const fd2 = checkResult(shmOpen(shmName, O_RDWR | DARWIN_O_CREAT | DARWIN_O_EXCL, DARWIN_SHM_MODE), "shm_open failed");
|
|
734
|
+
shmUnlink(shmName);
|
|
735
|
+
try {
|
|
736
|
+
return setCloseOnExec(libc, fd2);
|
|
737
|
+
} catch (error) {
|
|
738
|
+
libc.symbols.close(fd2);
|
|
739
|
+
throw error;
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
const memfdCreate = libc.symbols.memfd_create;
|
|
743
|
+
if (memfdCreate === undefined) {
|
|
744
|
+
throw new Error("memfd_create symbol is not available");
|
|
745
|
+
}
|
|
746
|
+
const fd = checkResult(memfdCreate(encodeCString(name), 0), "memfd_create failed");
|
|
747
|
+
try {
|
|
748
|
+
return setCloseOnExec(libc, fd);
|
|
749
|
+
} catch (error) {
|
|
750
|
+
libc.symbols.close(fd);
|
|
751
|
+
throw error;
|
|
752
|
+
}
|
|
753
|
+
};
|
|
754
|
+
var createNamedBunSharedMemoryFd = (name, mode, platform, libc) => {
|
|
755
|
+
const shmOpen = libc.symbols.shm_open;
|
|
756
|
+
if (shmOpen === undefined) {
|
|
757
|
+
throw new Error("shm_open symbol is not available");
|
|
758
|
+
}
|
|
759
|
+
const createFlags = platform === "darwin" ? DARWIN_O_CREAT : LINUX_O_CREAT;
|
|
760
|
+
const exclusiveFlags = platform === "darwin" ? DARWIN_O_EXCL : LINUX_O_EXCL;
|
|
761
|
+
const flags = mode === "create" ? O_RDWR | createFlags | exclusiveFlags : O_RDWR;
|
|
762
|
+
const fd = checkResult(shmOpen(encodeCString(toPosixSharedMemoryName(name)), flags, platform === "darwin" ? DARWIN_SHM_MODE : POSIX_SHM_MODE), "shm_open failed");
|
|
763
|
+
try {
|
|
764
|
+
return setCloseOnExec(libc, fd);
|
|
765
|
+
} catch (error) {
|
|
766
|
+
libc.symbols.close(fd);
|
|
767
|
+
throw error;
|
|
768
|
+
}
|
|
769
|
+
};
|
|
770
|
+
var mapBunSharedMemory = (options, libc = openBunLibc()) => {
|
|
771
|
+
const sourceFd = options.name === undefined ? expectFd(options.fd) : -1;
|
|
772
|
+
const size = expectPositiveSize(options.size);
|
|
773
|
+
let fd = sourceFd;
|
|
774
|
+
if (options.name !== undefined) {
|
|
775
|
+
fd = createNamedBunSharedMemoryFd(options.name, "open", detectPosixPlatform(), libc);
|
|
776
|
+
} else if (options.duplicateFd !== false) {
|
|
777
|
+
fd = checkResult(libc.symbols.dup(sourceFd), "dup(fd) failed");
|
|
778
|
+
try {
|
|
779
|
+
setCloseOnExec(libc, fd);
|
|
780
|
+
} catch (error) {
|
|
781
|
+
libc.symbols.close(fd);
|
|
782
|
+
throw error;
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
const pointer = libc.symbols.mmap(null, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0n);
|
|
786
|
+
if (isBunMmapFailed(pointer)) {
|
|
787
|
+
if (options.duplicateFd !== false)
|
|
788
|
+
libc.symbols.close(fd);
|
|
789
|
+
throw new Error("mmap failed");
|
|
790
|
+
}
|
|
791
|
+
const arrayBuffer = getBunFFI2().toArrayBuffer(pointer, 0, size);
|
|
792
|
+
return {
|
|
793
|
+
runtime: "bun",
|
|
794
|
+
fd,
|
|
795
|
+
name: options.name,
|
|
796
|
+
size,
|
|
797
|
+
byteLength: arrayBuffer.byteLength,
|
|
798
|
+
buffer: arrayBuffer,
|
|
799
|
+
kind: "external-array-buffer",
|
|
800
|
+
arrayBuffer,
|
|
801
|
+
unsafePointer: pointer,
|
|
802
|
+
close: () => {
|
|
803
|
+
libc.symbols.munmap(pointer, size);
|
|
804
|
+
libc.symbols.close(fd);
|
|
805
|
+
}
|
|
806
|
+
};
|
|
807
|
+
};
|
|
808
|
+
var createBunSharedMemory = (options, libc = openBunLibc()) => {
|
|
809
|
+
const size = expectPositiveSize(readCreateSize(options));
|
|
810
|
+
const mode = readCreateMode(options);
|
|
811
|
+
const name = mode === "anonymous" ? readCreateName(options, "knitting_shared_memory") : readRequiredCreateName(options);
|
|
812
|
+
const platform = detectPosixPlatform();
|
|
813
|
+
const fd = mode === "anonymous" ? createBunSharedMemoryFd(name, platform, libc) : createNamedBunSharedMemoryFd(name, mode, platform, libc);
|
|
814
|
+
try {
|
|
815
|
+
if (mode !== "open") {
|
|
816
|
+
checkResult(libc.symbols.ftruncate(fd, BigInt(size)), "ftruncate failed");
|
|
817
|
+
}
|
|
818
|
+
const mapping = mapBunSharedMemory({ fd, size, duplicateFd: false }, libc);
|
|
819
|
+
if (mode !== "anonymous") {
|
|
820
|
+
return { ...mapping, name };
|
|
821
|
+
}
|
|
822
|
+
return mapping;
|
|
823
|
+
} catch (error) {
|
|
824
|
+
libc.symbols.close(fd);
|
|
825
|
+
throw error;
|
|
826
|
+
}
|
|
827
|
+
};
|
|
828
|
+
var unlinkBunSharedMemory = (name, libc = openBunLibc()) => {
|
|
829
|
+
const shmUnlink = libc.symbols.shm_unlink;
|
|
830
|
+
if (shmUnlink === undefined) {
|
|
831
|
+
throw new Error("shm_unlink symbol is not available");
|
|
832
|
+
}
|
|
833
|
+
return shmUnlink(encodeCString(toPosixSharedMemoryName(name))) === 0;
|
|
834
|
+
};
|
|
835
|
+
var createBunPosixConnectionPrimitives = (libc = openBunLibc()) => ({
|
|
836
|
+
runtime: "bun",
|
|
837
|
+
createSharedMemory: (options) => createBunSharedMemory(options, libc),
|
|
838
|
+
mapSharedMemory: (options) => mapBunSharedMemory(options, libc),
|
|
839
|
+
unlinkSharedMemory: (name) => unlinkBunSharedMemory(name, libc)
|
|
840
|
+
});
|
|
841
|
+
var createBunConnectionPrimitives = (libc) => isWindowsRuntime() ? createBunWindowsConnectionPrimitives() : createBunPosixConnectionPrimitives(libc);
|
|
842
|
+
|
|
843
|
+
// src/connections/deno.ts
|
|
844
|
+
var getDeno2 = () => {
|
|
845
|
+
const deno = globalThis.Deno;
|
|
846
|
+
if (deno === undefined) {
|
|
847
|
+
throw new Error("Deno shared memory primitives can only run in Deno");
|
|
848
|
+
}
|
|
849
|
+
return deno;
|
|
850
|
+
};
|
|
851
|
+
var openDenoLibc = () => getDeno2().dlopen(getPosixLibcPath(), {
|
|
852
|
+
...getDenoCreateSymbols(),
|
|
853
|
+
ftruncate: {
|
|
854
|
+
parameters: ["i32", "i64"],
|
|
855
|
+
result: "i32"
|
|
856
|
+
},
|
|
857
|
+
dup: {
|
|
858
|
+
parameters: ["i32"],
|
|
859
|
+
result: "i32"
|
|
860
|
+
},
|
|
861
|
+
fcntl: {
|
|
862
|
+
parameters: ["i32", "i32", "i32"],
|
|
863
|
+
result: "i32"
|
|
864
|
+
},
|
|
865
|
+
mmap: {
|
|
866
|
+
parameters: ["pointer", "usize", "i32", "i32", "i32", "i64"],
|
|
867
|
+
result: "pointer"
|
|
868
|
+
},
|
|
869
|
+
munmap: {
|
|
870
|
+
parameters: ["pointer", "usize"],
|
|
871
|
+
result: "i32"
|
|
872
|
+
},
|
|
873
|
+
close: {
|
|
874
|
+
parameters: ["i32"],
|
|
875
|
+
result: "i32"
|
|
876
|
+
}
|
|
877
|
+
});
|
|
878
|
+
var getDenoCreateSymbols = (platform = detectPosixPlatform()) => platform === "darwin" ? {
|
|
879
|
+
shm_open: {
|
|
880
|
+
parameters: ["buffer", "i32", "u32"],
|
|
881
|
+
result: "i32"
|
|
882
|
+
},
|
|
883
|
+
shm_unlink: {
|
|
884
|
+
parameters: ["buffer"],
|
|
885
|
+
result: "i32"
|
|
886
|
+
}
|
|
887
|
+
} : {
|
|
888
|
+
memfd_create: {
|
|
889
|
+
parameters: ["buffer", "u32"],
|
|
890
|
+
result: "i32"
|
|
891
|
+
},
|
|
892
|
+
shm_open: {
|
|
893
|
+
parameters: ["buffer", "i32", "u32"],
|
|
894
|
+
result: "i32"
|
|
895
|
+
},
|
|
896
|
+
shm_unlink: {
|
|
897
|
+
parameters: ["buffer"],
|
|
898
|
+
result: "i32"
|
|
899
|
+
}
|
|
900
|
+
};
|
|
901
|
+
var checkResult2 = (result, message) => {
|
|
902
|
+
if (result < 0)
|
|
903
|
+
throw new Error(message);
|
|
904
|
+
return result;
|
|
905
|
+
};
|
|
906
|
+
var isDenoMmapFailed = (pointer) => {
|
|
907
|
+
if (pointer === null)
|
|
908
|
+
return true;
|
|
909
|
+
const value = getDeno2().UnsafePointer?.value(pointer);
|
|
910
|
+
return value === -1n || value === BigInt.asUintN(64, -1n);
|
|
911
|
+
};
|
|
912
|
+
var createDenoSharedMemoryFd = (name, platform, libc) => {
|
|
913
|
+
if (platform === "darwin") {
|
|
914
|
+
const shmOpen = libc.symbols.shm_open;
|
|
915
|
+
const shmUnlink = libc.symbols.shm_unlink;
|
|
916
|
+
if (shmOpen === undefined || shmUnlink === undefined) {
|
|
917
|
+
throw new Error("shm_open symbols are not available");
|
|
918
|
+
}
|
|
919
|
+
const shmName = encodeCString(makeDarwinSharedMemoryName(name, "deno"));
|
|
920
|
+
const fd2 = checkResult2(shmOpen(shmName, O_RDWR | DARWIN_O_CREAT | DARWIN_O_EXCL, DARWIN_SHM_MODE), "shm_open failed");
|
|
921
|
+
shmUnlink(shmName);
|
|
922
|
+
try {
|
|
923
|
+
return setCloseOnExec(libc, fd2);
|
|
924
|
+
} catch (error) {
|
|
925
|
+
libc.symbols.close(fd2);
|
|
926
|
+
throw error;
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
const memfdCreate = libc.symbols.memfd_create;
|
|
930
|
+
if (memfdCreate === undefined) {
|
|
931
|
+
throw new Error("memfd_create symbol is not available");
|
|
932
|
+
}
|
|
933
|
+
const fd = checkResult2(memfdCreate(encodeCString(name), 0), "memfd_create failed");
|
|
934
|
+
try {
|
|
935
|
+
return setCloseOnExec(libc, fd);
|
|
936
|
+
} catch (error) {
|
|
937
|
+
libc.symbols.close(fd);
|
|
938
|
+
throw error;
|
|
939
|
+
}
|
|
940
|
+
};
|
|
941
|
+
var createNamedDenoSharedMemoryFd = (name, mode, platform, libc) => {
|
|
942
|
+
const shmOpen = libc.symbols.shm_open;
|
|
943
|
+
if (shmOpen === undefined) {
|
|
944
|
+
throw new Error("shm_open symbol is not available");
|
|
945
|
+
}
|
|
946
|
+
const createFlags = platform === "darwin" ? DARWIN_O_CREAT : LINUX_O_CREAT;
|
|
947
|
+
const exclusiveFlags = platform === "darwin" ? DARWIN_O_EXCL : LINUX_O_EXCL;
|
|
948
|
+
const flags = mode === "create" ? O_RDWR | createFlags | exclusiveFlags : O_RDWR;
|
|
949
|
+
const fd = checkResult2(shmOpen(encodeCString(toPosixSharedMemoryName(name)), flags, platform === "darwin" ? DARWIN_SHM_MODE : POSIX_SHM_MODE), "shm_open failed");
|
|
950
|
+
try {
|
|
951
|
+
return setCloseOnExec(libc, fd);
|
|
952
|
+
} catch (error) {
|
|
953
|
+
libc.symbols.close(fd);
|
|
954
|
+
throw error;
|
|
955
|
+
}
|
|
956
|
+
};
|
|
957
|
+
var mapDenoSharedMemory = (options, libc = openDenoLibc()) => {
|
|
958
|
+
const sourceFd = options.name === undefined ? expectFd(options.fd) : -1;
|
|
959
|
+
const size = expectPositiveSize(options.size);
|
|
960
|
+
let fd = sourceFd;
|
|
961
|
+
if (options.name !== undefined) {
|
|
962
|
+
fd = createNamedDenoSharedMemoryFd(options.name, "open", detectPosixPlatform(), libc);
|
|
963
|
+
} else if (options.duplicateFd !== false) {
|
|
964
|
+
fd = checkResult2(libc.symbols.dup(sourceFd), "dup(fd) failed");
|
|
965
|
+
try {
|
|
966
|
+
setCloseOnExec(libc, fd);
|
|
967
|
+
} catch (error) {
|
|
968
|
+
libc.symbols.close(fd);
|
|
969
|
+
throw error;
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
const pointer = libc.symbols.mmap(null, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0n);
|
|
973
|
+
if (isDenoMmapFailed(pointer)) {
|
|
974
|
+
if (options.duplicateFd !== false)
|
|
975
|
+
libc.symbols.close(fd);
|
|
976
|
+
throw new Error("mmap failed");
|
|
977
|
+
}
|
|
978
|
+
const arrayBuffer = new (getDeno2()).UnsafePointerView(pointer).getArrayBuffer(size);
|
|
979
|
+
return {
|
|
980
|
+
runtime: "deno",
|
|
981
|
+
fd,
|
|
982
|
+
name: options.name,
|
|
983
|
+
size,
|
|
984
|
+
byteLength: arrayBuffer.byteLength,
|
|
985
|
+
buffer: arrayBuffer,
|
|
986
|
+
kind: "external-array-buffer",
|
|
987
|
+
arrayBuffer,
|
|
988
|
+
unsafePointer: pointer,
|
|
989
|
+
close: () => {
|
|
990
|
+
libc.symbols.munmap(pointer, size);
|
|
991
|
+
libc.symbols.close(fd);
|
|
992
|
+
}
|
|
993
|
+
};
|
|
994
|
+
};
|
|
995
|
+
var createDenoSharedMemory = (options, libc = openDenoLibc()) => {
|
|
996
|
+
const size = expectPositiveSize(readCreateSize(options));
|
|
997
|
+
const mode = readCreateMode(options);
|
|
998
|
+
const name = mode === "anonymous" ? readCreateName(options, "knitting_shared_memory") : readRequiredCreateName(options);
|
|
999
|
+
const platform = detectPosixPlatform();
|
|
1000
|
+
const fd = mode === "anonymous" ? createDenoSharedMemoryFd(name, platform, libc) : createNamedDenoSharedMemoryFd(name, mode, platform, libc);
|
|
1001
|
+
try {
|
|
1002
|
+
if (mode !== "open") {
|
|
1003
|
+
checkResult2(libc.symbols.ftruncate(fd, BigInt(size)), "ftruncate failed");
|
|
1004
|
+
}
|
|
1005
|
+
const mapping = mapDenoSharedMemory({ fd, size, duplicateFd: false }, libc);
|
|
1006
|
+
if (mode !== "anonymous") {
|
|
1007
|
+
return { ...mapping, name };
|
|
1008
|
+
}
|
|
1009
|
+
return mapping;
|
|
1010
|
+
} catch (error) {
|
|
1011
|
+
libc.symbols.close(fd);
|
|
1012
|
+
throw error;
|
|
1013
|
+
}
|
|
1014
|
+
};
|
|
1015
|
+
var unlinkDenoSharedMemory = (name, libc = openDenoLibc()) => {
|
|
1016
|
+
const shmUnlink = libc.symbols.shm_unlink;
|
|
1017
|
+
if (shmUnlink === undefined) {
|
|
1018
|
+
throw new Error("shm_unlink symbol is not available");
|
|
1019
|
+
}
|
|
1020
|
+
return shmUnlink(encodeCString(toPosixSharedMemoryName(name))) === 0;
|
|
1021
|
+
};
|
|
1022
|
+
var createDenoPosixConnectionPrimitives = (libc = openDenoLibc()) => ({
|
|
1023
|
+
runtime: "deno",
|
|
1024
|
+
createSharedMemory: (options) => createDenoSharedMemory(options, libc),
|
|
1025
|
+
mapSharedMemory: (options) => mapDenoSharedMemory(options, libc),
|
|
1026
|
+
unlinkSharedMemory: (name) => unlinkDenoSharedMemory(name, libc)
|
|
1027
|
+
});
|
|
1028
|
+
var createDenoConnectionPrimitives = (libc) => isWindowsRuntime() ? createDenoWindowsConnectionPrimitives() : createDenoPosixConnectionPrimitives(libc);
|
|
1029
|
+
|
|
1030
|
+
// src/connections/node-addons.ts
|
|
1031
|
+
var readNodePlatformInfo = () => {
|
|
1032
|
+
const processLike = globalThis.process;
|
|
1033
|
+
if (typeof processLike?.platform !== "string" || typeof processLike.arch !== "string") {
|
|
1034
|
+
return;
|
|
1035
|
+
}
|
|
1036
|
+
return {
|
|
1037
|
+
arch: processLike.arch,
|
|
1038
|
+
modules: processLike.versions?.modules,
|
|
1039
|
+
platform: processLike.platform
|
|
1040
|
+
};
|
|
1041
|
+
};
|
|
1042
|
+
var nodeNativeAddonSpecifiers = (name) => {
|
|
1043
|
+
const platformInfo = readNodePlatformInfo();
|
|
1044
|
+
const fallback = resolveKnittingPackageAsset("build", "Release", `${name}.node`);
|
|
1045
|
+
if (platformInfo === undefined)
|
|
1046
|
+
return [fallback];
|
|
1047
|
+
const nodeModuleAbi = platformInfo.modules;
|
|
1048
|
+
if (typeof nodeModuleAbi === "string" && nodeModuleAbi.length > 0) {
|
|
1049
|
+
return [
|
|
1050
|
+
resolveKnittingPackageAsset("prebuilds", `${platformInfo.platform}-${platformInfo.arch}-node-${nodeModuleAbi}`, `${name}.node`),
|
|
1051
|
+
fallback
|
|
1052
|
+
];
|
|
1053
|
+
}
|
|
1054
|
+
return [
|
|
1055
|
+
resolveKnittingPackageAsset("prebuilds", `${platformInfo.platform}-${platformInfo.arch}`, `${name}.node`),
|
|
1056
|
+
fallback
|
|
1057
|
+
];
|
|
1058
|
+
};
|
|
1059
|
+
var loadNodeNativeAddon = (require2, name, specifier) => {
|
|
1060
|
+
if (specifier !== undefined)
|
|
1061
|
+
return require2(specifier);
|
|
1062
|
+
const errors = [];
|
|
1063
|
+
for (const candidate of nodeNativeAddonSpecifiers(name)) {
|
|
1064
|
+
try {
|
|
1065
|
+
return require2(candidate);
|
|
1066
|
+
} catch (error) {
|
|
1067
|
+
errors.push(`${candidate}: ${String(error)}`);
|
|
1068
|
+
}
|
|
1069
|
+
}
|
|
1070
|
+
throw new Error(`Could not load native addon ${name}. Tried:
|
|
1071
|
+
${errors.join(`
|
|
1072
|
+
`)}`);
|
|
1073
|
+
};
|
|
1074
|
+
|
|
1075
|
+
// src/connections/process-shared-buffer.ts
|
|
1076
|
+
var PROCESS_SHARED_BUFFER_BRAND = Symbol.for("knitting.processSharedBuffer");
|
|
1077
|
+
var PROCESS_SHARED_BUFFER_NUMERIC_TRANSFER = Symbol.for("knitting.processSharedBuffer.numericTransfer");
|
|
1078
|
+
var EXTERNAL_PAYLOAD_BRAND = Symbol.for("knitting.payloadCodec");
|
|
1079
|
+
var PROCESS_SHARED_BUFFER_CODEC_ID = "knitting.processSharedBuffer";
|
|
1080
|
+
var isRecord2 = (value) => typeof value === "object" && value !== null;
|
|
1081
|
+
var NUMERIC_SENTINEL = 4294967295;
|
|
1082
|
+
var RUNTIME_NODE = 1;
|
|
1083
|
+
var RUNTIME_DENO = 2;
|
|
1084
|
+
var RUNTIME_BUN = 3;
|
|
1085
|
+
var KIND_SHARED_ARRAY_BUFFER = 1;
|
|
1086
|
+
var KIND_EXTERNAL_ARRAY_BUFFER = 2;
|
|
1087
|
+
var decodeRuntime = (value) => {
|
|
1088
|
+
switch (value) {
|
|
1089
|
+
case RUNTIME_NODE:
|
|
1090
|
+
return "node";
|
|
1091
|
+
case RUNTIME_DENO:
|
|
1092
|
+
return "deno";
|
|
1093
|
+
case RUNTIME_BUN:
|
|
1094
|
+
return "bun";
|
|
1095
|
+
default:
|
|
1096
|
+
return;
|
|
1097
|
+
}
|
|
1098
|
+
};
|
|
1099
|
+
var decodeKind = (value) => {
|
|
1100
|
+
switch (value) {
|
|
1101
|
+
case KIND_SHARED_ARRAY_BUFFER:
|
|
1102
|
+
return "shared-array-buffer";
|
|
1103
|
+
case KIND_EXTERNAL_ARRAY_BUFFER:
|
|
1104
|
+
return "external-array-buffer";
|
|
1105
|
+
default:
|
|
1106
|
+
return;
|
|
1107
|
+
}
|
|
1108
|
+
};
|
|
1109
|
+
var defaultPrimitives;
|
|
1110
|
+
var fromDefaultNodeNativeMapping = (mapped) => {
|
|
1111
|
+
const mapping = {
|
|
1112
|
+
runtime: "node",
|
|
1113
|
+
fd: mapped.fd,
|
|
1114
|
+
size: mapped.size,
|
|
1115
|
+
byteLength: mapped.sab.byteLength,
|
|
1116
|
+
buffer: mapped.sab,
|
|
1117
|
+
kind: "shared-array-buffer",
|
|
1118
|
+
sab: mapped.sab,
|
|
1119
|
+
baseAddressMod64: mapped.baseAddressMod64
|
|
1120
|
+
};
|
|
1121
|
+
if (mapped.name !== undefined && mapped.name.length > 0) {
|
|
1122
|
+
mapping.name = mapped.name;
|
|
1123
|
+
}
|
|
1124
|
+
return mapping;
|
|
1125
|
+
};
|
|
1126
|
+
var createDefaultNodePrimitives = () => {
|
|
1127
|
+
const nodeModule = getNodeBuiltinModule("node:module");
|
|
1128
|
+
if (nodeModule === undefined) {
|
|
1129
|
+
throw new TypeError("ProcessSharedBuffer needs connection primitives in this runtime");
|
|
1130
|
+
}
|
|
1131
|
+
const require2 = nodeModule.createRequire(import.meta.url);
|
|
1132
|
+
const addon = loadNodeNativeAddon(require2, "knitting_shared_memory");
|
|
1133
|
+
return {
|
|
1134
|
+
createSharedMemory: (options) => {
|
|
1135
|
+
const size = expectPositiveSize(readCreateSize(options));
|
|
1136
|
+
const mode = readCreateMode(options);
|
|
1137
|
+
const name = mode === "anonymous" ? readCreateName(options, "knitting_shared_memory") : readRequiredCreateName(options);
|
|
1138
|
+
return fromDefaultNodeNativeMapping(addon.createSharedMemory(size, name, mode));
|
|
1139
|
+
},
|
|
1140
|
+
mapSharedMemory: (options) => {
|
|
1141
|
+
const fd = expectFd(options.fd);
|
|
1142
|
+
const size = expectPositiveSize(options.size);
|
|
1143
|
+
return fromDefaultNodeNativeMapping(addon.mapSharedMemory(fd, size, options.name));
|
|
1144
|
+
}
|
|
1145
|
+
};
|
|
1146
|
+
};
|
|
1147
|
+
var createDefaultPrimitives = () => {
|
|
1148
|
+
if (RUNTIME === "bun")
|
|
1149
|
+
return createBunConnectionPrimitives();
|
|
1150
|
+
if (RUNTIME === "deno")
|
|
1151
|
+
return createDenoConnectionPrimitives();
|
|
1152
|
+
return createDefaultNodePrimitives();
|
|
1153
|
+
};
|
|
1154
|
+
var setDefaultProcessSharedBufferPrimitives = (primitives) => {
|
|
1155
|
+
defaultPrimitives = primitives;
|
|
1156
|
+
};
|
|
1157
|
+
var getDefaultProcessSharedBufferPrimitives = () => {
|
|
1158
|
+
defaultPrimitives ??= createDefaultPrimitives();
|
|
1159
|
+
return defaultPrimitives;
|
|
1160
|
+
};
|
|
1161
|
+
var expectNonNegativeInteger = (value, label) => {
|
|
1162
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
1163
|
+
throw new RangeError(`${label} must be a non-negative integer`);
|
|
1164
|
+
}
|
|
1165
|
+
return value;
|
|
1166
|
+
};
|
|
1167
|
+
var readOptionalNonNegativeInteger = (value, label) => {
|
|
1168
|
+
if (value === undefined)
|
|
1169
|
+
return;
|
|
1170
|
+
if (typeof value !== "number") {
|
|
1171
|
+
throw new TypeError(`${label} must be a number`);
|
|
1172
|
+
}
|
|
1173
|
+
return expectNonNegativeInteger(value, label);
|
|
1174
|
+
};
|
|
1175
|
+
var expectRange = (byteOffset, byteLength, availableByteLength) => {
|
|
1176
|
+
expectNonNegativeInteger(byteOffset, "process shared buffer byteOffset");
|
|
1177
|
+
if (byteOffset > availableByteLength) {
|
|
1178
|
+
throw new RangeError("process shared buffer byteOffset is out of bounds");
|
|
1179
|
+
}
|
|
1180
|
+
expectNonNegativeInteger(byteLength, "process shared buffer byteLength");
|
|
1181
|
+
if (byteLength > availableByteLength - byteOffset) {
|
|
1182
|
+
throw new RangeError("process shared buffer byteLength is out of bounds");
|
|
1183
|
+
}
|
|
1184
|
+
};
|
|
1185
|
+
|
|
1186
|
+
class ProcessSharedBuffer {
|
|
1187
|
+
[PROCESS_SHARED_BUFFER_BRAND] = true;
|
|
1188
|
+
[EXTERNAL_PAYLOAD_BRAND] = PROCESS_SHARED_BUFFER_CODEC_ID;
|
|
1189
|
+
descriptor;
|
|
1190
|
+
byteOffset;
|
|
1191
|
+
byteLength;
|
|
1192
|
+
constructor(descriptor, range = {}) {
|
|
1193
|
+
const byteOffset = range.byteOffset ?? 0;
|
|
1194
|
+
const byteLength = range.byteLength ?? descriptor.byteLength - byteOffset;
|
|
1195
|
+
expectRange(byteOffset, byteLength, descriptor.byteLength);
|
|
1196
|
+
this.descriptor = descriptor;
|
|
1197
|
+
this.byteOffset = byteOffset;
|
|
1198
|
+
this.byteLength = byteLength;
|
|
1199
|
+
}
|
|
1200
|
+
static create(options, creator = getDefaultProcessSharedBufferPrimitives()) {
|
|
1201
|
+
return ProcessSharedBuffer.fromMapping(creator.createSharedMemory(options));
|
|
1202
|
+
}
|
|
1203
|
+
static fromMapping(mapping) {
|
|
1204
|
+
return new ProcessSharedBuffer(FileDescriptor.fromMapping(mapping));
|
|
1205
|
+
}
|
|
1206
|
+
static fromDescriptor(descriptor, range = {}) {
|
|
1207
|
+
return new ProcessSharedBuffer(descriptor, range);
|
|
1208
|
+
}
|
|
1209
|
+
static fromMetadata(metadata) {
|
|
1210
|
+
const parsed = parseProcessSharedBufferMetadata(metadata);
|
|
1211
|
+
return new ProcessSharedBuffer(FileDescriptor.fromMetadata(parsed.descriptor), {
|
|
1212
|
+
byteOffset: parsed.byteOffset,
|
|
1213
|
+
byteLength: parsed.byteLength
|
|
1214
|
+
});
|
|
1215
|
+
}
|
|
1216
|
+
static parse(serialized) {
|
|
1217
|
+
return ProcessSharedBuffer.fromMetadata(serialized);
|
|
1218
|
+
}
|
|
1219
|
+
static [PROCESS_SHARED_BUFFER_NUMERIC_TRANSFER](metadata) {
|
|
1220
|
+
const [
|
|
1221
|
+
fd,
|
|
1222
|
+
size,
|
|
1223
|
+
descriptorByteLength,
|
|
1224
|
+
byteOffset,
|
|
1225
|
+
byteLength,
|
|
1226
|
+
runtime,
|
|
1227
|
+
kind,
|
|
1228
|
+
baseAddressMod64
|
|
1229
|
+
] = metadata;
|
|
1230
|
+
return new ProcessSharedBuffer(new FileDescriptor({
|
|
1231
|
+
version: 1,
|
|
1232
|
+
fd,
|
|
1233
|
+
size,
|
|
1234
|
+
byteLength: descriptorByteLength,
|
|
1235
|
+
runtime: decodeRuntime(runtime),
|
|
1236
|
+
kind: decodeKind(kind),
|
|
1237
|
+
baseAddressMod64: baseAddressMod64 === NUMERIC_SENTINEL ? undefined : baseAddressMod64
|
|
1238
|
+
}), {
|
|
1239
|
+
byteOffset,
|
|
1240
|
+
byteLength
|
|
1241
|
+
});
|
|
1242
|
+
}
|
|
1243
|
+
get fd() {
|
|
1244
|
+
return this.descriptor.fd;
|
|
1245
|
+
}
|
|
1246
|
+
get size() {
|
|
1247
|
+
return this.descriptor.size;
|
|
1248
|
+
}
|
|
1249
|
+
subbuffer(byteOffset, byteLength) {
|
|
1250
|
+
const relativeByteOffset = expectNonNegativeInteger(byteOffset, "process shared buffer subbuffer byteOffset");
|
|
1251
|
+
const relativeByteLength = byteLength === undefined ? this.byteLength - relativeByteOffset : expectNonNegativeInteger(byteLength, "process shared buffer subbuffer byteLength");
|
|
1252
|
+
expectRange(relativeByteOffset, relativeByteLength, this.byteLength);
|
|
1253
|
+
return new ProcessSharedBuffer(this.descriptor, {
|
|
1254
|
+
byteOffset: this.byteOffset + relativeByteOffset,
|
|
1255
|
+
byteLength: relativeByteLength
|
|
1256
|
+
});
|
|
1257
|
+
}
|
|
1258
|
+
getSharedArrayBuffer(mapper) {
|
|
1259
|
+
return this.descriptor.getSAB(mapper ?? (this.descriptor.mapping?.sab === undefined ? getDefaultProcessSharedBufferPrimitives() : undefined));
|
|
1260
|
+
}
|
|
1261
|
+
getSAB(mapper) {
|
|
1262
|
+
return this.getSharedArrayBuffer(mapper);
|
|
1263
|
+
}
|
|
1264
|
+
getBuffer(mapper) {
|
|
1265
|
+
return this.descriptor.getBuffer(mapper ?? (this.descriptor.mapping?.buffer === undefined ? getDefaultProcessSharedBufferPrimitives() : undefined));
|
|
1266
|
+
}
|
|
1267
|
+
getRegion(mapper) {
|
|
1268
|
+
return {
|
|
1269
|
+
sab: this.getBuffer(mapper),
|
|
1270
|
+
byteOffset: this.byteOffset,
|
|
1271
|
+
byteLength: this.byteLength
|
|
1272
|
+
};
|
|
1273
|
+
}
|
|
1274
|
+
view(constructor, mapper) {
|
|
1275
|
+
const bytesPerElement = constructor.BYTES_PER_ELEMENT;
|
|
1276
|
+
if (this.byteOffset % bytesPerElement !== 0) {
|
|
1277
|
+
throw new RangeError("process shared buffer byteOffset is not aligned for this view");
|
|
1278
|
+
}
|
|
1279
|
+
if (this.byteLength % bytesPerElement !== 0) {
|
|
1280
|
+
throw new RangeError("process shared buffer byteLength is not aligned for this view");
|
|
1281
|
+
}
|
|
1282
|
+
return new constructor(this.getBuffer(mapper), this.byteOffset, this.byteLength / bytesPerElement);
|
|
1283
|
+
}
|
|
1284
|
+
bytes(mapper) {
|
|
1285
|
+
return this.view(Uint8Array, mapper);
|
|
1286
|
+
}
|
|
1287
|
+
dataView(mapper) {
|
|
1288
|
+
return new DataView(this.getBuffer(mapper), this.byteOffset, this.byteLength);
|
|
1289
|
+
}
|
|
1290
|
+
toMetadata() {
|
|
1291
|
+
return {
|
|
1292
|
+
version: 1,
|
|
1293
|
+
descriptor: this.descriptor.toMetadata(),
|
|
1294
|
+
byteOffset: this.byteOffset,
|
|
1295
|
+
byteLength: this.byteLength
|
|
1296
|
+
};
|
|
1297
|
+
}
|
|
1298
|
+
toJSON() {
|
|
1299
|
+
return this.toMetadata();
|
|
1300
|
+
}
|
|
1301
|
+
stringify() {
|
|
1302
|
+
return JSON.stringify(this.toMetadata());
|
|
1303
|
+
}
|
|
1304
|
+
stringifyMetadata() {
|
|
1305
|
+
return this.stringify();
|
|
1306
|
+
}
|
|
1307
|
+
toString() {
|
|
1308
|
+
return this.stringify();
|
|
1309
|
+
}
|
|
1310
|
+
}
|
|
1311
|
+
var parseProcessSharedBufferMetadata = (input) => {
|
|
1312
|
+
const value = typeof input === "string" ? JSON.parse(input) : input;
|
|
1313
|
+
if (!isRecord2(value)) {
|
|
1314
|
+
throw new TypeError("process shared buffer metadata must be an object");
|
|
1315
|
+
}
|
|
1316
|
+
if (value.version !== 1) {
|
|
1317
|
+
throw new TypeError("unsupported process shared buffer metadata version");
|
|
1318
|
+
}
|
|
1319
|
+
const descriptor = FileDescriptor.fromMetadata(value.descriptor);
|
|
1320
|
+
const byteOffset = readOptionalNonNegativeInteger(value.byteOffset, "process shared buffer byteOffset") ?? 0;
|
|
1321
|
+
const byteLength = readOptionalNonNegativeInteger(value.byteLength, "process shared buffer byteLength") ?? descriptor.byteLength - byteOffset;
|
|
1322
|
+
expectRange(byteOffset, byteLength, descriptor.byteLength);
|
|
1323
|
+
return {
|
|
1324
|
+
version: 1,
|
|
1325
|
+
descriptor: descriptor.toMetadata(),
|
|
1326
|
+
byteOffset,
|
|
1327
|
+
byteLength
|
|
1328
|
+
};
|
|
1329
|
+
};
|
|
1330
|
+
var processSharedBufferGlobal = globalThis;
|
|
1331
|
+
var codecs = processSharedBufferGlobal.__KNITTING_PAYLOAD_CODECS__ ??= Object.create(null);
|
|
1332
|
+
codecs[PROCESS_SHARED_BUFFER_CODEC_ID] = {
|
|
1333
|
+
decode: (metadata) => ProcessSharedBuffer.fromMetadata(metadata),
|
|
1334
|
+
decodeNumeric: (metadata) => ProcessSharedBuffer[PROCESS_SHARED_BUFFER_NUMERIC_TRANSFER](metadata)
|
|
1335
|
+
};
|
|
1336
|
+
export {
|
|
1337
|
+
setDefaultProcessSharedBufferPrimitives,
|
|
1338
|
+
parseProcessSharedBufferMetadata,
|
|
1339
|
+
getDefaultProcessSharedBufferPrimitives,
|
|
1340
|
+
ProcessSharedBuffer,
|
|
1341
|
+
PROCESS_SHARED_BUFFER_BRAND
|
|
1342
|
+
};
|