knitting 0.1.55 → 0.1.60
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 +254 -40
- package/knitting.d.ts +7 -797
- package/knitting.js +6 -9780
- package/map.md +31 -15
- package/package.json +20 -6
- package/process-shared-buffer.d.ts +1 -0
- package/process-shared-buffer.js +1 -0
- package/scripts/build-compiled-worker.ts +276 -0
- package/scripts/compiled-worker/porffor.d.ts +5 -0
- package/scripts/compiled-worker/runtime.ts +529 -0
- package/scripts/compiled-worker/task-shim.ts +32 -0
- package/shared-memory.d.ts +1 -155
- package/shared-memory.js +1 -1342
- package/src/api.d.ts +92 -0
- package/src/api.js +798 -0
- package/src/common/envelope.d.ts +17 -0
- package/src/common/envelope.js +22 -0
- package/src/common/module-url.d.ts +2 -0
- package/src/common/module-url.js +52 -0
- package/src/common/node-compat.d.ts +22 -0
- package/src/common/node-compat.js +24 -0
- package/src/common/path-canonical.d.ts +6 -0
- package/src/common/path-canonical.js +55 -0
- package/src/common/runtime.d.ts +16 -0
- package/src/common/runtime.js +105 -0
- package/src/common/shared-buffer-region.d.ts +11 -0
- package/src/common/shared-buffer-region.js +21 -0
- package/src/common/shared-buffer-text.d.ts +16 -0
- package/src/common/shared-buffer-text.js +65 -0
- package/src/common/task-source.d.ts +5 -0
- package/src/common/task-source.js +100 -0
- package/src/common/task-symbol.d.ts +1 -0
- package/src/common/task-symbol.js +1 -0
- package/src/common/with-resolvers.d.ts +9 -0
- package/src/common/with-resolvers.js +23 -0
- package/src/common/worker-runtime.d.ts +42 -0
- package/src/common/worker-runtime.js +70 -0
- package/src/connections/buffer-reference-native.d.ts +56 -0
- package/src/connections/buffer-reference-native.js +241 -0
- package/src/connections/buffer-reference.d.ts +99 -0
- package/src/connections/buffer-reference.js +575 -0
- package/src/connections/bun.d.ts +22 -0
- package/src/connections/bun.js +225 -0
- package/src/connections/deno.d.ts +24 -0
- package/src/connections/deno.js +226 -0
- package/src/connections/external-array-buffer.d.ts +2 -0
- package/src/connections/external-array-buffer.js +33 -0
- package/src/connections/file-descriptor.d.ts +39 -0
- package/src/connections/file-descriptor.js +161 -0
- package/src/connections/index.d.ts +4 -0
- package/src/connections/index.js +4 -0
- package/src/connections/node-addons.d.ts +16 -0
- package/src/connections/node-addons.js +92 -0
- package/src/connections/node-buffer-pointer.d.ts +20 -0
- package/src/connections/node-buffer-pointer.js +16 -0
- package/src/connections/node-ffi-api.d.ts +19 -0
- package/src/connections/node-ffi-api.js +28 -0
- package/src/connections/node-ffi.d.ts +27 -0
- package/src/connections/node-ffi.js +262 -0
- package/src/connections/node.d.ts +30 -0
- package/src/connections/node.js +62 -0
- package/src/connections/numeric-array.d.ts +5 -0
- package/src/connections/numeric-array.js +17 -0
- package/src/connections/package-assets.d.ts +2 -0
- package/src/connections/package-assets.js +55 -0
- package/src/connections/posix.d.ts +74 -0
- package/src/connections/posix.js +178 -0
- package/src/connections/process-shared-buffer.d.ts +76 -0
- package/src/connections/process-shared-buffer.js +245 -0
- package/src/connections/shared-array-buffer-payload.d.ts +36 -0
- package/src/connections/shared-array-buffer-payload.js +235 -0
- package/src/connections/types.d.ts +54 -0
- package/src/connections/types.js +37 -0
- package/src/connections/windows.d.ts +37 -0
- package/src/connections/windows.js +245 -0
- package/src/debug/env-diff.d.ts +26 -0
- package/src/debug/env-diff.js +49 -0
- package/src/debug/gate.d.ts +18 -0
- package/src/debug/gate.js +69 -0
- package/src/debug/handle.d.ts +23 -0
- package/src/debug/handle.js +48 -0
- package/src/error.d.ts +14 -0
- package/src/error.js +50 -0
- package/src/ipc/tools/ring-queue.d.ts +33 -0
- package/src/ipc/tools/ring-queue.js +159 -0
- package/src/ipc/transport/shared-memory.d.ts +23 -0
- package/src/ipc/transport/shared-memory.js +35 -0
- package/src/memory/byte-carpet.d.ts +73 -0
- package/src/memory/byte-carpet.js +157 -0
- package/src/memory/lock.d.ts +213 -0
- package/src/memory/lock.js +760 -0
- package/src/memory/payload-config.d.ts +31 -0
- package/src/memory/payload-config.js +67 -0
- package/src/memory/payloadCodec.d.ts +55 -0
- package/src/memory/payloadCodec.js +1473 -0
- package/src/memory/regionRegistry.d.ts +17 -0
- package/src/memory/regionRegistry.js +285 -0
- package/src/memory/shared-buffer-io.d.ts +55 -0
- package/src/memory/shared-buffer-io.js +403 -0
- package/src/permission/compatibility.d.ts +28 -0
- package/src/permission/compatibility.js +239 -0
- package/src/permission/index.d.ts +4 -0
- package/src/permission/index.js +3 -0
- package/src/permission/protocol.d.ts +167 -0
- package/src/permission/protocol.js +690 -0
- package/src/runtime/balancer.d.ts +19 -0
- package/src/runtime/balancer.js +149 -0
- package/src/runtime/compiled-artifact.d.ts +21 -0
- package/src/runtime/compiled-artifact.js +260 -0
- package/src/runtime/compiled-builder.d.ts +8 -0
- package/src/runtime/compiled-builder.js +42 -0
- package/src/runtime/compiled-worker.d.ts +27 -0
- package/src/runtime/compiled-worker.js +562 -0
- package/src/runtime/dispatcher.d.ts +40 -0
- package/src/runtime/dispatcher.js +142 -0
- package/src/runtime/inline-executor.d.ts +10 -0
- package/src/runtime/inline-executor.js +294 -0
- package/src/runtime/pool.d.ts +44 -0
- package/src/runtime/pool.js +472 -0
- package/src/runtime/process-worker.d.ts +92 -0
- package/src/runtime/process-worker.js +713 -0
- package/src/runtime/tx-queue.d.ts +28 -0
- package/src/runtime/tx-queue.js +158 -0
- package/src/shared/abortSignal.d.ts +23 -0
- package/src/shared/abortSignal.js +134 -0
- package/src/types.d.ts +399 -0
- package/src/types.js +2 -0
- package/src/utils/http.d.ts +29 -0
- package/src/utils/http.js +100 -0
- package/src/worker/bootstrap.d.ts +5 -0
- package/src/worker/bootstrap.js +78 -0
- package/src/worker/composable-runners.d.ts +12 -0
- package/src/worker/composable-runners.js +98 -0
- package/src/worker/loop.d.ts +3 -0
- package/src/worker/loop.js +395 -0
- package/src/worker/process-worker-bootstrap.d.ts +8 -0
- package/src/worker/process-worker-bootstrap.js +160 -0
- package/src/worker/rx-queue.d.ts +25 -0
- package/src/worker/rx-queue.js +173 -0
- package/src/worker/safety/index.d.ts +4 -0
- package/src/worker/safety/index.js +4 -0
- package/src/worker/safety/performance.d.ts +1 -0
- package/src/worker/safety/performance.js +17 -0
- package/src/worker/safety/process.d.ts +2 -0
- package/src/worker/safety/process.js +79 -0
- package/src/worker/safety/startup.d.ts +16 -0
- package/src/worker/safety/startup.js +30 -0
- package/src/worker/safety/worker-data.d.ts +2 -0
- package/src/worker/safety/worker-data.js +36 -0
- package/src/worker/task-loader.d.ts +28 -0
- package/src/worker/task-loader.js +76 -0
- package/src/worker/timers.d.ts +18 -0
- package/src/worker/timers.js +118 -0
- package/unsafe.d.ts +1 -71
- package/unsafe.js +1 -878
- package/utils.d.ts +1 -31
- package/utils.js +1 -116
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { FileDescriptor, } from "./file-descriptor.js";
|
|
2
|
+
import { RUNTIME } from "../common/runtime.js";
|
|
3
|
+
import { createBunConnectionPrimitives } from "./bun.js";
|
|
4
|
+
import { createDenoConnectionPrimitives } from "./deno.js";
|
|
5
|
+
import { createNodeConnectionPrimitives } from "./node.js";
|
|
6
|
+
export const PROCESS_SHARED_BUFFER_BRAND = Symbol.for("knitting.processSharedBuffer");
|
|
7
|
+
export const PROCESS_SHARED_BUFFER_NUMERIC_TRANSFER = Symbol.for("knitting.processSharedBuffer.numericTransfer");
|
|
8
|
+
const EXTERNAL_PAYLOAD_BRAND = Symbol.for("knitting.payloadCodec");
|
|
9
|
+
const PROCESS_SHARED_BUFFER_CODEC_ID = "knitting.processSharedBuffer";
|
|
10
|
+
const isRecord = (value) => typeof value === "object" && value !== null;
|
|
11
|
+
const NUMERIC_SENTINEL = 0xffffffff;
|
|
12
|
+
const RUNTIME_NODE = 1;
|
|
13
|
+
const RUNTIME_DENO = 2;
|
|
14
|
+
const RUNTIME_BUN = 3;
|
|
15
|
+
const KIND_SHARED_ARRAY_BUFFER = 1;
|
|
16
|
+
const KIND_EXTERNAL_ARRAY_BUFFER = 2;
|
|
17
|
+
const decodeRuntime = (value) => {
|
|
18
|
+
switch (value) {
|
|
19
|
+
case RUNTIME_NODE:
|
|
20
|
+
return "node";
|
|
21
|
+
case RUNTIME_DENO:
|
|
22
|
+
return "deno";
|
|
23
|
+
case RUNTIME_BUN:
|
|
24
|
+
return "bun";
|
|
25
|
+
default:
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const decodeKind = (value) => {
|
|
30
|
+
switch (value) {
|
|
31
|
+
case KIND_SHARED_ARRAY_BUFFER:
|
|
32
|
+
return "shared-array-buffer";
|
|
33
|
+
case KIND_EXTERNAL_ARRAY_BUFFER:
|
|
34
|
+
return "external-array-buffer";
|
|
35
|
+
default:
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
let defaultPrimitives;
|
|
40
|
+
const processSharedBufferInstances = new WeakSet();
|
|
41
|
+
const createDefaultPrimitives = () => {
|
|
42
|
+
if (RUNTIME === "bun")
|
|
43
|
+
return createBunConnectionPrimitives();
|
|
44
|
+
if (RUNTIME === "deno")
|
|
45
|
+
return createDenoConnectionPrimitives();
|
|
46
|
+
if (RUNTIME === "node")
|
|
47
|
+
return createNodeConnectionPrimitives();
|
|
48
|
+
throw new TypeError("ProcessSharedBuffer needs connection primitives in this runtime");
|
|
49
|
+
};
|
|
50
|
+
export const setDefaultProcessSharedBufferPrimitives = (primitives) => {
|
|
51
|
+
defaultPrimitives = primitives;
|
|
52
|
+
};
|
|
53
|
+
export const getDefaultProcessSharedBufferPrimitives = () => {
|
|
54
|
+
defaultPrimitives ??= createDefaultPrimitives();
|
|
55
|
+
return defaultPrimitives;
|
|
56
|
+
};
|
|
57
|
+
const expectNonNegativeInteger = (value, label) => {
|
|
58
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
59
|
+
throw new RangeError(`${label} must be a non-negative integer`);
|
|
60
|
+
}
|
|
61
|
+
return value;
|
|
62
|
+
};
|
|
63
|
+
const readOptionalNonNegativeInteger = (value, label) => {
|
|
64
|
+
if (value === undefined)
|
|
65
|
+
return undefined;
|
|
66
|
+
if (typeof value !== "number") {
|
|
67
|
+
throw new TypeError(`${label} must be a number`);
|
|
68
|
+
}
|
|
69
|
+
return expectNonNegativeInteger(value, label);
|
|
70
|
+
};
|
|
71
|
+
const expectRange = (byteOffset, byteLength, availableByteLength) => {
|
|
72
|
+
expectNonNegativeInteger(byteOffset, "process shared buffer byteOffset");
|
|
73
|
+
if (byteOffset > availableByteLength) {
|
|
74
|
+
throw new RangeError("process shared buffer byteOffset is out of bounds");
|
|
75
|
+
}
|
|
76
|
+
expectNonNegativeInteger(byteLength, "process shared buffer byteLength");
|
|
77
|
+
if (byteLength > availableByteLength - byteOffset) {
|
|
78
|
+
throw new RangeError("process shared buffer byteLength is out of bounds");
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
/**
|
|
82
|
+
* Zero-copy shared bytes for process workers.
|
|
83
|
+
*
|
|
84
|
+
* Use this when the boundary is a separate process, container, or sandbox.
|
|
85
|
+
* For thread workers, `SharedArrayBuffer` or `BufferReference` can be cheaper.
|
|
86
|
+
*/
|
|
87
|
+
export class ProcessSharedBuffer {
|
|
88
|
+
[PROCESS_SHARED_BUFFER_BRAND] = true;
|
|
89
|
+
[EXTERNAL_PAYLOAD_BRAND] = PROCESS_SHARED_BUFFER_CODEC_ID;
|
|
90
|
+
descriptor;
|
|
91
|
+
byteOffset;
|
|
92
|
+
byteLength;
|
|
93
|
+
constructor(descriptor, range = {}) {
|
|
94
|
+
const byteOffset = range.byteOffset ?? 0;
|
|
95
|
+
const byteLength = range.byteLength ??
|
|
96
|
+
descriptor.byteLength - byteOffset;
|
|
97
|
+
expectRange(byteOffset, byteLength, descriptor.byteLength);
|
|
98
|
+
this.descriptor = descriptor;
|
|
99
|
+
this.byteOffset = byteOffset;
|
|
100
|
+
this.byteLength = byteLength;
|
|
101
|
+
processSharedBufferInstances.add(this);
|
|
102
|
+
}
|
|
103
|
+
static create(options, creator = getDefaultProcessSharedBufferPrimitives()) {
|
|
104
|
+
return ProcessSharedBuffer.fromMapping(creator.createSharedMemory(options));
|
|
105
|
+
}
|
|
106
|
+
static fromMapping(mapping) {
|
|
107
|
+
return new ProcessSharedBuffer(FileDescriptor.fromMapping(mapping));
|
|
108
|
+
}
|
|
109
|
+
static fromDescriptor(descriptor, range = {}) {
|
|
110
|
+
return new ProcessSharedBuffer(descriptor, range);
|
|
111
|
+
}
|
|
112
|
+
static fromMetadata(metadata) {
|
|
113
|
+
const parsed = parseProcessSharedBufferMetadata(metadata);
|
|
114
|
+
return new ProcessSharedBuffer(FileDescriptor.fromMetadata(parsed.descriptor), {
|
|
115
|
+
byteOffset: parsed.byteOffset,
|
|
116
|
+
byteLength: parsed.byteLength,
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
static parse(serialized) {
|
|
120
|
+
return ProcessSharedBuffer.fromMetadata(serialized);
|
|
121
|
+
}
|
|
122
|
+
// Rebuilds from the 8 raw words (no name -> no JSON):
|
|
123
|
+
// fd, size, descByteLength, byteOffset, byteLength, runtime, kind, baseAddressMod64
|
|
124
|
+
static [PROCESS_SHARED_BUFFER_NUMERIC_TRANSFER](metadata) {
|
|
125
|
+
const [fd, size, descriptorByteLength, byteOffset, byteLength, runtime, kind, baseAddressMod64,] = metadata;
|
|
126
|
+
return new ProcessSharedBuffer(new FileDescriptor({
|
|
127
|
+
version: 1,
|
|
128
|
+
fd,
|
|
129
|
+
size,
|
|
130
|
+
byteLength: descriptorByteLength,
|
|
131
|
+
runtime: decodeRuntime(runtime),
|
|
132
|
+
kind: decodeKind(kind),
|
|
133
|
+
baseAddressMod64: baseAddressMod64 === NUMERIC_SENTINEL
|
|
134
|
+
? undefined
|
|
135
|
+
: baseAddressMod64,
|
|
136
|
+
}), {
|
|
137
|
+
byteOffset,
|
|
138
|
+
byteLength,
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
get fd() {
|
|
142
|
+
return this.descriptor.fd;
|
|
143
|
+
}
|
|
144
|
+
get size() {
|
|
145
|
+
return this.descriptor.size;
|
|
146
|
+
}
|
|
147
|
+
subbuffer(byteOffset, byteLength) {
|
|
148
|
+
const relativeByteOffset = expectNonNegativeInteger(byteOffset, "process shared buffer subbuffer byteOffset");
|
|
149
|
+
const relativeByteLength = byteLength === undefined
|
|
150
|
+
? this.byteLength - relativeByteOffset
|
|
151
|
+
: expectNonNegativeInteger(byteLength, "process shared buffer subbuffer byteLength");
|
|
152
|
+
expectRange(relativeByteOffset, relativeByteLength, this.byteLength);
|
|
153
|
+
return new ProcessSharedBuffer(this.descriptor, {
|
|
154
|
+
byteOffset: this.byteOffset + relativeByteOffset,
|
|
155
|
+
byteLength: relativeByteLength,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
getSharedArrayBuffer(mapper) {
|
|
159
|
+
return this.descriptor.getSAB(mapper ??
|
|
160
|
+
(this.descriptor.mapping?.sab === undefined
|
|
161
|
+
? getDefaultProcessSharedBufferPrimitives()
|
|
162
|
+
: undefined));
|
|
163
|
+
}
|
|
164
|
+
getSAB(mapper) {
|
|
165
|
+
return this.getSharedArrayBuffer(mapper);
|
|
166
|
+
}
|
|
167
|
+
getBuffer(mapper) {
|
|
168
|
+
return this.descriptor.getBuffer(mapper ??
|
|
169
|
+
(this.descriptor.mapping?.buffer === undefined
|
|
170
|
+
? getDefaultProcessSharedBufferPrimitives()
|
|
171
|
+
: undefined));
|
|
172
|
+
}
|
|
173
|
+
getRegion(mapper) {
|
|
174
|
+
return {
|
|
175
|
+
sab: this.getBuffer(mapper),
|
|
176
|
+
byteOffset: this.byteOffset,
|
|
177
|
+
byteLength: this.byteLength,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
view(constructor, mapper) {
|
|
181
|
+
const bytesPerElement = constructor.BYTES_PER_ELEMENT;
|
|
182
|
+
if (this.byteOffset % bytesPerElement !== 0) {
|
|
183
|
+
throw new RangeError("process shared buffer byteOffset is not aligned for this view");
|
|
184
|
+
}
|
|
185
|
+
if (this.byteLength % bytesPerElement !== 0) {
|
|
186
|
+
throw new RangeError("process shared buffer byteLength is not aligned for this view");
|
|
187
|
+
}
|
|
188
|
+
return new constructor(this.getBuffer(mapper), this.byteOffset, this.byteLength / bytesPerElement);
|
|
189
|
+
}
|
|
190
|
+
bytes(mapper) {
|
|
191
|
+
return this.view(Uint8Array, mapper);
|
|
192
|
+
}
|
|
193
|
+
dataView(mapper) {
|
|
194
|
+
return new DataView(this.getBuffer(mapper), this.byteOffset, this.byteLength);
|
|
195
|
+
}
|
|
196
|
+
toMetadata() {
|
|
197
|
+
return {
|
|
198
|
+
version: 1,
|
|
199
|
+
descriptor: this.descriptor.toMetadata(),
|
|
200
|
+
byteOffset: this.byteOffset,
|
|
201
|
+
byteLength: this.byteLength,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
toJSON() {
|
|
205
|
+
return this.toMetadata();
|
|
206
|
+
}
|
|
207
|
+
stringify() {
|
|
208
|
+
return JSON.stringify(this.toMetadata());
|
|
209
|
+
}
|
|
210
|
+
stringifyMetadata() {
|
|
211
|
+
return this.stringify();
|
|
212
|
+
}
|
|
213
|
+
toString() {
|
|
214
|
+
return this.stringify();
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
export const isProcessSharedBufferValue = (value) => value !== null &&
|
|
218
|
+
typeof value === "object" &&
|
|
219
|
+
processSharedBufferInstances.has(value);
|
|
220
|
+
export const parseProcessSharedBufferMetadata = (input) => {
|
|
221
|
+
const value = typeof input === "string" ? JSON.parse(input) : input;
|
|
222
|
+
if (!isRecord(value)) {
|
|
223
|
+
throw new TypeError("process shared buffer metadata must be an object");
|
|
224
|
+
}
|
|
225
|
+
if (value.version !== 1) {
|
|
226
|
+
throw new TypeError("unsupported process shared buffer metadata version");
|
|
227
|
+
}
|
|
228
|
+
const descriptor = FileDescriptor.fromMetadata(value.descriptor);
|
|
229
|
+
const byteOffset = readOptionalNonNegativeInteger(value.byteOffset, "process shared buffer byteOffset") ?? 0;
|
|
230
|
+
const byteLength = readOptionalNonNegativeInteger(value.byteLength, "process shared buffer byteLength") ?? descriptor.byteLength - byteOffset;
|
|
231
|
+
expectRange(byteOffset, byteLength, descriptor.byteLength);
|
|
232
|
+
return {
|
|
233
|
+
version: 1,
|
|
234
|
+
descriptor: descriptor.toMetadata(),
|
|
235
|
+
byteOffset,
|
|
236
|
+
byteLength,
|
|
237
|
+
};
|
|
238
|
+
};
|
|
239
|
+
const processSharedBufferGlobal = globalThis;
|
|
240
|
+
const codecs = processSharedBufferGlobal.__KNITTING_PAYLOAD_CODECS__ ??= Object
|
|
241
|
+
.create(null);
|
|
242
|
+
codecs[PROCESS_SHARED_BUFFER_CODEC_ID] = {
|
|
243
|
+
decode: (metadata) => ProcessSharedBuffer.fromMetadata(metadata),
|
|
244
|
+
decodeNumeric: (metadata) => ProcessSharedBuffer[PROCESS_SHARED_BUFFER_NUMERIC_TRANSFER](metadata),
|
|
245
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export declare const SHARED_ARRAY_BUFFER_CODEC_ID: "knitting.sharedArrayBuffer";
|
|
2
|
+
export declare const SHARED_ARRAY_BUFFER_NUMERIC_TRANSFER: unique symbol;
|
|
3
|
+
export declare const SHARED_ARRAY_BUFFER_NUMERIC_WORDS = 8;
|
|
4
|
+
declare const EXTERNAL_PAYLOAD_BRAND: unique symbol;
|
|
5
|
+
type SharedArrayBufferMetadata = {
|
|
6
|
+
readonly kind: typeof SHARED_ARRAY_BUFFER_CODEC_ID;
|
|
7
|
+
readonly origin: string;
|
|
8
|
+
readonly runtime: string;
|
|
9
|
+
readonly pointer: string;
|
|
10
|
+
readonly token: string;
|
|
11
|
+
readonly byteLength: number;
|
|
12
|
+
};
|
|
13
|
+
type SharedArrayBufferNumericMetadata = readonly [
|
|
14
|
+
tokenLow: number,
|
|
15
|
+
tokenHigh: number,
|
|
16
|
+
pointerLow: number,
|
|
17
|
+
pointerHigh: number,
|
|
18
|
+
byteLength: number,
|
|
19
|
+
runtime: number,
|
|
20
|
+
originPid: number,
|
|
21
|
+
mode: number
|
|
22
|
+
];
|
|
23
|
+
type SharedArrayBufferTokenNumericMetadata = readonly [
|
|
24
|
+
tokenLow: number,
|
|
25
|
+
tokenHigh: number
|
|
26
|
+
];
|
|
27
|
+
type SharedArrayBufferPayload = {
|
|
28
|
+
readonly [EXTERNAL_PAYLOAD_BRAND]: typeof SHARED_ARRAY_BUFFER_CODEC_ID;
|
|
29
|
+
readonly toMetadata: () => SharedArrayBufferMetadata;
|
|
30
|
+
readonly [SHARED_ARRAY_BUFFER_NUMERIC_TRANSFER]: (transportKey?: object) => SharedArrayBufferNumericMetadata | SharedArrayBufferTokenNumericMetadata | undefined;
|
|
31
|
+
};
|
|
32
|
+
export declare const isSharedArrayBufferValue: (value: unknown) => value is SharedArrayBuffer;
|
|
33
|
+
/** Wrap a SAB as external payload; GC-managed pins mean no settle finalizer. */
|
|
34
|
+
export declare const wrapSharedArrayBufferPayload: (sab: SharedArrayBuffer) => SharedArrayBufferPayload;
|
|
35
|
+
export declare const getSharedArrayBufferPayload: (value: object) => SharedArrayBufferPayload | undefined;
|
|
36
|
+
export {};
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { RUNTIME } from "../common/runtime.js";
|
|
2
|
+
import { getNodeProcess } from "../common/node-compat.js";
|
|
3
|
+
import { getBufferReferenceCapabilities } from "./buffer-reference-native.js";
|
|
4
|
+
// Thread-worker SharedArrayBuffer transport by process-local pointer.
|
|
5
|
+
// SABs are shared, not moved or detached; process workers reject them.
|
|
6
|
+
export const SHARED_ARRAY_BUFFER_CODEC_ID = "knitting.sharedArrayBuffer";
|
|
7
|
+
export const SHARED_ARRAY_BUFFER_NUMERIC_TRANSFER = Symbol.for("knitting.sharedArrayBuffer.numericTransfer");
|
|
8
|
+
export const SHARED_ARRAY_BUFFER_NUMERIC_WORDS = 8;
|
|
9
|
+
const SHARED_ARRAY_BUFFER_TOKEN_NUMERIC_WORDS = 2;
|
|
10
|
+
const EXTERNAL_PAYLOAD_BRAND = Symbol.for("knitting.payloadCodec");
|
|
11
|
+
const getProcessId = () => {
|
|
12
|
+
const proc = getNodeProcess();
|
|
13
|
+
if (proc !== undefined && typeof proc.pid === "number")
|
|
14
|
+
return proc.pid;
|
|
15
|
+
const deno = globalThis.Deno;
|
|
16
|
+
if (typeof deno?.pid === "number")
|
|
17
|
+
return deno.pid;
|
|
18
|
+
return 0;
|
|
19
|
+
};
|
|
20
|
+
const PROCESS_ORIGIN = `${RUNTIME}:${getProcessId()}`;
|
|
21
|
+
const hasSharedArrayBuffer = typeof SharedArrayBuffer === "function";
|
|
22
|
+
export const isSharedArrayBufferValue = (value) => hasSharedArrayBuffer && value instanceof SharedArrayBuffer;
|
|
23
|
+
const pinnedBySab = new WeakMap();
|
|
24
|
+
const payloadBySharedBuffer = new WeakMap();
|
|
25
|
+
const warmedTokensByTransport = new WeakMap();
|
|
26
|
+
const cachedSharedBuffersByToken = new Map();
|
|
27
|
+
const pinFinalizer = typeof FinalizationRegistry === "function"
|
|
28
|
+
? new FinalizationRegistry((token) => {
|
|
29
|
+
try {
|
|
30
|
+
getBufferReferenceCapabilities().releaseShared(token);
|
|
31
|
+
}
|
|
32
|
+
catch {
|
|
33
|
+
// best effort
|
|
34
|
+
}
|
|
35
|
+
})
|
|
36
|
+
: undefined;
|
|
37
|
+
const splitU64 = (value) => [
|
|
38
|
+
Number(value & 0xffffffffn) >>> 0,
|
|
39
|
+
Number((value >> 32n) & 0xffffffffn) >>> 0,
|
|
40
|
+
];
|
|
41
|
+
const joinU64 = (low, high) => (BigInt(high >>> 0) << 32n) | BigInt(low >>> 0);
|
|
42
|
+
const encodeRuntime = (runtime) => {
|
|
43
|
+
switch (runtime) {
|
|
44
|
+
case "node":
|
|
45
|
+
return 1;
|
|
46
|
+
case "deno":
|
|
47
|
+
return 2;
|
|
48
|
+
case "bun":
|
|
49
|
+
return 3;
|
|
50
|
+
default:
|
|
51
|
+
return 0;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
const decodeRuntime = (value) => {
|
|
55
|
+
switch (value) {
|
|
56
|
+
case 1:
|
|
57
|
+
return "node";
|
|
58
|
+
case 2:
|
|
59
|
+
return "deno";
|
|
60
|
+
case 3:
|
|
61
|
+
return "bun";
|
|
62
|
+
default:
|
|
63
|
+
return undefined;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
const getWarmTokens = (transportKey) => {
|
|
67
|
+
if (transportKey === undefined)
|
|
68
|
+
return undefined;
|
|
69
|
+
let warmTokens = warmedTokensByTransport.get(transportKey);
|
|
70
|
+
if (warmTokens === undefined) {
|
|
71
|
+
warmTokens = new Set();
|
|
72
|
+
warmedTokensByTransport.set(transportKey, warmTokens);
|
|
73
|
+
}
|
|
74
|
+
return warmTokens;
|
|
75
|
+
};
|
|
76
|
+
const pinSab = (sab) => {
|
|
77
|
+
let pin = pinnedBySab.get(sab);
|
|
78
|
+
if (pin === undefined) {
|
|
79
|
+
const produced = getBufferReferenceCapabilities().produceShared(sab);
|
|
80
|
+
pin = {
|
|
81
|
+
token: produced.token,
|
|
82
|
+
pointer: produced.pointer,
|
|
83
|
+
byteLength: produced.byteLength,
|
|
84
|
+
};
|
|
85
|
+
pinnedBySab.set(sab, pin);
|
|
86
|
+
pinFinalizer?.register(sab, pin.token);
|
|
87
|
+
}
|
|
88
|
+
return pin;
|
|
89
|
+
};
|
|
90
|
+
const makeMetadata = (pin) => ({
|
|
91
|
+
kind: SHARED_ARRAY_BUFFER_CODEC_ID,
|
|
92
|
+
origin: PROCESS_ORIGIN,
|
|
93
|
+
runtime: RUNTIME,
|
|
94
|
+
pointer: pin.pointer.toString(),
|
|
95
|
+
token: pin.token.toString(),
|
|
96
|
+
byteLength: pin.byteLength,
|
|
97
|
+
});
|
|
98
|
+
const makeFullNumericMetadata = (pin) => {
|
|
99
|
+
if (pin.byteLength > 0xffffffff)
|
|
100
|
+
return undefined;
|
|
101
|
+
const [tokenLow, tokenHigh] = splitU64(pin.token);
|
|
102
|
+
const [pointerLow, pointerHigh] = splitU64(pin.pointer);
|
|
103
|
+
return [
|
|
104
|
+
tokenLow,
|
|
105
|
+
tokenHigh,
|
|
106
|
+
pointerLow,
|
|
107
|
+
pointerHigh,
|
|
108
|
+
pin.byteLength >>> 0,
|
|
109
|
+
encodeRuntime(RUNTIME),
|
|
110
|
+
getProcessId() >>> 0,
|
|
111
|
+
0,
|
|
112
|
+
];
|
|
113
|
+
};
|
|
114
|
+
const makeTokenNumericMetadata = (pin) => {
|
|
115
|
+
const [tokenLow, tokenHigh] = splitU64(pin.token);
|
|
116
|
+
return [tokenLow, tokenHigh];
|
|
117
|
+
};
|
|
118
|
+
/** Wrap a SAB as external payload; GC-managed pins mean no settle finalizer. */
|
|
119
|
+
export const wrapSharedArrayBufferPayload = (sab) => {
|
|
120
|
+
let payload = payloadBySharedBuffer.get(sab);
|
|
121
|
+
if (payload !== undefined)
|
|
122
|
+
return payload;
|
|
123
|
+
const pin = pinSab(sab);
|
|
124
|
+
payload = createSharedArrayBufferPayload(sab, pin, makeMetadata(pin));
|
|
125
|
+
return payload;
|
|
126
|
+
};
|
|
127
|
+
const createSharedArrayBufferPayload = (buffer, pin, metadata) => {
|
|
128
|
+
let payload = payloadBySharedBuffer.get(buffer);
|
|
129
|
+
if (payload !== undefined)
|
|
130
|
+
return payload;
|
|
131
|
+
const fullNumeric = makeFullNumericMetadata(pin);
|
|
132
|
+
const tokenOnlyNumeric = makeTokenNumericMetadata(pin);
|
|
133
|
+
payload = {
|
|
134
|
+
[EXTERNAL_PAYLOAD_BRAND]: SHARED_ARRAY_BUFFER_CODEC_ID,
|
|
135
|
+
toMetadata: () => metadata,
|
|
136
|
+
[SHARED_ARRAY_BUFFER_NUMERIC_TRANSFER]: (transportKey) => {
|
|
137
|
+
if (fullNumeric === undefined) {
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
const warmTokens = getWarmTokens(transportKey);
|
|
141
|
+
if (warmTokens === undefined)
|
|
142
|
+
return fullNumeric;
|
|
143
|
+
if (warmTokens.has(pin.token))
|
|
144
|
+
return tokenOnlyNumeric;
|
|
145
|
+
warmTokens.add(pin.token);
|
|
146
|
+
return fullNumeric;
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
payloadBySharedBuffer.set(buffer, payload);
|
|
150
|
+
return payload;
|
|
151
|
+
};
|
|
152
|
+
export const getSharedArrayBufferPayload = (value) => {
|
|
153
|
+
if (isSharedArrayBufferValue(value))
|
|
154
|
+
return wrapSharedArrayBufferPayload(value);
|
|
155
|
+
return payloadBySharedBuffer.get(value);
|
|
156
|
+
};
|
|
157
|
+
const isSharedArrayBufferMetadata = (value) => {
|
|
158
|
+
if (value === null || typeof value !== "object")
|
|
159
|
+
return false;
|
|
160
|
+
const meta = value;
|
|
161
|
+
return (meta.kind === SHARED_ARRAY_BUFFER_CODEC_ID &&
|
|
162
|
+
typeof meta.origin === "string" &&
|
|
163
|
+
typeof meta.runtime === "string" &&
|
|
164
|
+
typeof meta.pointer === "string" &&
|
|
165
|
+
typeof meta.token === "string" &&
|
|
166
|
+
typeof meta.byteLength === "number" &&
|
|
167
|
+
Number.isInteger(meta.byteLength) &&
|
|
168
|
+
meta.byteLength >= 0);
|
|
169
|
+
};
|
|
170
|
+
const materializeSharedBuffer = (metadata, warmOnly) => {
|
|
171
|
+
if (metadata.origin !== PROCESS_ORIGIN) {
|
|
172
|
+
throw new Error(`SharedArrayBuffer cannot cross a process boundary (origin ${metadata.origin} ` +
|
|
173
|
+
`!= ${PROCESS_ORIGIN}); it is shared by reference to thread workers only.`);
|
|
174
|
+
}
|
|
175
|
+
const token = BigInt(metadata.token);
|
|
176
|
+
const cached = cachedSharedBuffersByToken.get(token);
|
|
177
|
+
if (cached !== undefined)
|
|
178
|
+
return cached;
|
|
179
|
+
if (warmOnly) {
|
|
180
|
+
throw new TypeError("SharedArrayBuffer cache miss for warm token payload");
|
|
181
|
+
}
|
|
182
|
+
const region = getBufferReferenceCapabilities().adoptShared({
|
|
183
|
+
token,
|
|
184
|
+
pointer: BigInt(metadata.pointer),
|
|
185
|
+
byteOffset: 0,
|
|
186
|
+
byteLength: metadata.byteLength,
|
|
187
|
+
});
|
|
188
|
+
cachedSharedBuffersByToken.set(token, region.buffer);
|
|
189
|
+
createSharedArrayBufferPayload(region.buffer, {
|
|
190
|
+
token,
|
|
191
|
+
pointer: BigInt(metadata.pointer),
|
|
192
|
+
byteLength: metadata.byteLength,
|
|
193
|
+
}, metadata);
|
|
194
|
+
return region.buffer;
|
|
195
|
+
};
|
|
196
|
+
const decode = (metadata) => {
|
|
197
|
+
if (!isSharedArrayBufferMetadata(metadata)) {
|
|
198
|
+
throw new TypeError("Invalid SharedArrayBuffer payload metadata");
|
|
199
|
+
}
|
|
200
|
+
return materializeSharedBuffer(metadata, false);
|
|
201
|
+
};
|
|
202
|
+
const decodeNumeric = (words) => {
|
|
203
|
+
if (words.length === SHARED_ARRAY_BUFFER_TOKEN_NUMERIC_WORDS) {
|
|
204
|
+
const token = joinU64(words[0] ?? 0, words[1] ?? 0);
|
|
205
|
+
const cached = cachedSharedBuffersByToken.get(token);
|
|
206
|
+
if (cached !== undefined)
|
|
207
|
+
return cached;
|
|
208
|
+
throw new TypeError("SharedArrayBuffer cache miss for warm token payload");
|
|
209
|
+
}
|
|
210
|
+
const runtime = decodeRuntime(words[5] ?? 0);
|
|
211
|
+
if (runtime === undefined) {
|
|
212
|
+
throw new TypeError("Invalid SharedArrayBuffer numeric runtime");
|
|
213
|
+
}
|
|
214
|
+
const originPid = words[6];
|
|
215
|
+
if (originPid === undefined ||
|
|
216
|
+
!Number.isInteger(originPid) ||
|
|
217
|
+
originPid < 0) {
|
|
218
|
+
throw new TypeError("Invalid SharedArrayBuffer numeric origin");
|
|
219
|
+
}
|
|
220
|
+
if (words.length !== SHARED_ARRAY_BUFFER_NUMERIC_WORDS) {
|
|
221
|
+
throw new TypeError("Invalid SharedArrayBuffer numeric word count");
|
|
222
|
+
}
|
|
223
|
+
const metadata = {
|
|
224
|
+
kind: SHARED_ARRAY_BUFFER_CODEC_ID,
|
|
225
|
+
origin: `${runtime}:${originPid >>> 0}`,
|
|
226
|
+
runtime,
|
|
227
|
+
pointer: joinU64(words[2] ?? 0, words[3] ?? 0).toString(),
|
|
228
|
+
token: joinU64(words[0] ?? 0, words[1] ?? 0).toString(),
|
|
229
|
+
byteLength: words[4] ?? 0,
|
|
230
|
+
};
|
|
231
|
+
return materializeSharedBuffer(metadata, false);
|
|
232
|
+
};
|
|
233
|
+
const codecGlobal = globalThis;
|
|
234
|
+
const codecs = codecGlobal.__KNITTING_PAYLOAD_CODECS__ ??= Object.create(null);
|
|
235
|
+
codecs[SHARED_ARRAY_BUFFER_CODEC_ID] = { decode, decodeNumeric };
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export declare const CACHE_LINE_SIZE = 64;
|
|
2
|
+
export type ConnectionRuntime = "node" | "deno" | "bun";
|
|
3
|
+
export type SharedMemoryBuffer = ArrayBuffer | SharedArrayBuffer;
|
|
4
|
+
export type SharedMemoryBufferKind = "shared-array-buffer" | "external-array-buffer";
|
|
5
|
+
export type SharedMemoryCreateMode = "anonymous" | "create" | "open";
|
|
6
|
+
export type SharedMemoryMapping<Buffer extends SharedMemoryBuffer = SharedMemoryBuffer> = {
|
|
7
|
+
runtime: ConnectionRuntime;
|
|
8
|
+
fd: number;
|
|
9
|
+
name?: string;
|
|
10
|
+
size: number;
|
|
11
|
+
byteLength: number;
|
|
12
|
+
buffer: Buffer;
|
|
13
|
+
kind: SharedMemoryBufferKind;
|
|
14
|
+
sab?: SharedArrayBuffer;
|
|
15
|
+
arrayBuffer?: ArrayBuffer;
|
|
16
|
+
baseAddressMod64?: number;
|
|
17
|
+
unsafePointer?: unknown;
|
|
18
|
+
close?: () => void;
|
|
19
|
+
};
|
|
20
|
+
export type CreateSharedMemoryOptions = {
|
|
21
|
+
size: number;
|
|
22
|
+
/**
|
|
23
|
+
* `anonymous` keeps the current fd-backed private mapping behavior.
|
|
24
|
+
* `create` and `open` use a named shared-memory object so independent
|
|
25
|
+
* processes can rendezvous by name.
|
|
26
|
+
*/
|
|
27
|
+
mode?: SharedMemoryCreateMode;
|
|
28
|
+
name?: string;
|
|
29
|
+
};
|
|
30
|
+
export type MapSharedMemoryOptions = {
|
|
31
|
+
fd: number;
|
|
32
|
+
name?: string;
|
|
33
|
+
size: number;
|
|
34
|
+
/**
|
|
35
|
+
* When false, map the supplied descriptor directly. Ownership transfers to
|
|
36
|
+
* the returned mapping only after mapping succeeds; failures leave it open.
|
|
37
|
+
*/
|
|
38
|
+
duplicateFd?: boolean;
|
|
39
|
+
};
|
|
40
|
+
export type SharedMemoryConnectionPrimitives<Mapping extends SharedMemoryMapping = SharedMemoryMapping> = {
|
|
41
|
+
runtime: ConnectionRuntime;
|
|
42
|
+
createSharedMemory: (options: number | CreateSharedMemoryOptions) => Mapping;
|
|
43
|
+
mapSharedMemory: (options: MapSharedMemoryOptions) => Mapping;
|
|
44
|
+
unlinkSharedMemory?: (name: string) => boolean;
|
|
45
|
+
};
|
|
46
|
+
export declare const alignToCacheLine: (size: number) => number;
|
|
47
|
+
export declare const readCreateSize: (options: number | CreateSharedMemoryOptions) => number;
|
|
48
|
+
export declare const readCreateName: (options: number | CreateSharedMemoryOptions, fallback: string) => string;
|
|
49
|
+
export declare const readCreateMode: (options: number | CreateSharedMemoryOptions) => SharedMemoryCreateMode;
|
|
50
|
+
export declare const expectSharedMemoryName: (name: string) => string;
|
|
51
|
+
export declare const readRequiredCreateName: (options: number | CreateSharedMemoryOptions) => string;
|
|
52
|
+
export declare const expectPositiveSize: (size: number) => number;
|
|
53
|
+
export declare const expectFd: (fd: number) => number;
|
|
54
|
+
export declare const requireSharedArrayBuffer: (mapping: SharedMemoryMapping) => SharedArrayBuffer;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export const CACHE_LINE_SIZE = 64;
|
|
2
|
+
export const alignToCacheLine = (size) => size + ((CACHE_LINE_SIZE - (size % CACHE_LINE_SIZE)) % CACHE_LINE_SIZE);
|
|
3
|
+
export const readCreateSize = (options) => typeof options === "number" ? options : options.size;
|
|
4
|
+
export const readCreateName = (options, fallback) => typeof options === "number" ? fallback : options.name ?? fallback;
|
|
5
|
+
export const readCreateMode = (options) => typeof options === "number" ? "anonymous" : options.mode ?? "anonymous";
|
|
6
|
+
export const expectSharedMemoryName = (name) => {
|
|
7
|
+
if (typeof name !== "string" || name.length === 0) {
|
|
8
|
+
throw new TypeError("shared memory name must be a non-empty string");
|
|
9
|
+
}
|
|
10
|
+
if (name.includes("\0")) {
|
|
11
|
+
throw new TypeError("shared memory name must not contain NUL bytes");
|
|
12
|
+
}
|
|
13
|
+
return name;
|
|
14
|
+
};
|
|
15
|
+
export const readRequiredCreateName = (options) => {
|
|
16
|
+
if (typeof options === "number" || options.name === undefined) {
|
|
17
|
+
throw new TypeError("named shared memory requires a name");
|
|
18
|
+
}
|
|
19
|
+
return expectSharedMemoryName(options.name);
|
|
20
|
+
};
|
|
21
|
+
export const expectPositiveSize = (size) => {
|
|
22
|
+
if (!Number.isFinite(size) || size <= 0) {
|
|
23
|
+
throw new RangeError("shared memory size must be positive");
|
|
24
|
+
}
|
|
25
|
+
return alignToCacheLine(Math.trunc(size));
|
|
26
|
+
};
|
|
27
|
+
export const expectFd = (fd) => {
|
|
28
|
+
if (!Number.isInteger(fd) || fd < 0) {
|
|
29
|
+
throw new RangeError("shared memory fd must be non-negative");
|
|
30
|
+
}
|
|
31
|
+
return fd;
|
|
32
|
+
};
|
|
33
|
+
export const requireSharedArrayBuffer = (mapping) => {
|
|
34
|
+
if (mapping.sab !== undefined)
|
|
35
|
+
return mapping.sab;
|
|
36
|
+
throw new TypeError(`${mapping.runtime} mapping is ${mapping.kind}; a native SAB wrapper is required`);
|
|
37
|
+
};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { type NodeFfiLibrary } from "./node-ffi-api.js";
|
|
2
|
+
import { type CreateSharedMemoryOptions, type MapSharedMemoryOptions, type SharedMemoryConnectionPrimitives, type SharedMemoryMapping } from "./types.js";
|
|
3
|
+
declare const WINDOWS_CREATE_SHARED_MEMORY = "knitting_windows_create_shared_memory";
|
|
4
|
+
declare const WINDOWS_MAP_SHARED_MEMORY = "knitting_windows_map_shared_memory";
|
|
5
|
+
declare const WINDOWS_CLOSE_SHARED_MEMORY = "knitting_windows_close_shared_memory";
|
|
6
|
+
type WindowsSharedMemorySymbols = {
|
|
7
|
+
[WINDOWS_CREATE_SHARED_MEMORY]: (size: bigint, name: Uint16Array, mode: number, out: Uint8Array) => number;
|
|
8
|
+
[WINDOWS_MAP_SHARED_MEMORY]: (handle: bigint, size: bigint, name: Uint16Array, out: Uint8Array) => number;
|
|
9
|
+
[WINDOWS_CLOSE_SHARED_MEMORY]: (mapping: Uint8Array) => number;
|
|
10
|
+
};
|
|
11
|
+
type DenoWindowsLibrary = {
|
|
12
|
+
symbols: WindowsSharedMemorySymbols;
|
|
13
|
+
close: () => void;
|
|
14
|
+
};
|
|
15
|
+
type BunWindowsLibrary = {
|
|
16
|
+
symbols: WindowsSharedMemorySymbols;
|
|
17
|
+
};
|
|
18
|
+
type NodeWindowsLibrary = {
|
|
19
|
+
functions: WindowsSharedMemorySymbols;
|
|
20
|
+
lib: NodeFfiLibrary;
|
|
21
|
+
};
|
|
22
|
+
export declare const isWindowsRuntime: () => boolean;
|
|
23
|
+
export declare const windowsSharedMemoryPrebuildPath: () => string;
|
|
24
|
+
export declare const makeWindowsAnonymousSharedMemoryName: (runtime: string) => string;
|
|
25
|
+
export declare const openDenoWindowsSharedMemoryLibrary: () => DenoWindowsLibrary;
|
|
26
|
+
export declare const openBunWindowsSharedMemoryLibrary: () => BunWindowsLibrary;
|
|
27
|
+
export declare const openNodeWindowsSharedMemoryLibrary: () => NodeWindowsLibrary;
|
|
28
|
+
export declare const createDenoWindowsSharedMemory: (options: number | CreateSharedMemoryOptions, lib?: DenoWindowsLibrary) => SharedMemoryMapping<ArrayBuffer>;
|
|
29
|
+
export declare const mapDenoWindowsSharedMemory: (options: MapSharedMemoryOptions, lib?: DenoWindowsLibrary) => SharedMemoryMapping<ArrayBuffer>;
|
|
30
|
+
export declare const createDenoWindowsConnectionPrimitives: (lib?: DenoWindowsLibrary) => SharedMemoryConnectionPrimitives<SharedMemoryMapping<ArrayBuffer>>;
|
|
31
|
+
export declare const createBunWindowsSharedMemory: (options: number | CreateSharedMemoryOptions, lib?: BunWindowsLibrary) => SharedMemoryMapping<ArrayBuffer>;
|
|
32
|
+
export declare const mapBunWindowsSharedMemory: (options: MapSharedMemoryOptions, lib?: BunWindowsLibrary) => SharedMemoryMapping<ArrayBuffer>;
|
|
33
|
+
export declare const createBunWindowsConnectionPrimitives: (lib?: BunWindowsLibrary) => SharedMemoryConnectionPrimitives<SharedMemoryMapping<ArrayBuffer>>;
|
|
34
|
+
export declare const createNodeWindowsSharedMemory: (options: number | CreateSharedMemoryOptions, lib?: NodeWindowsLibrary) => SharedMemoryMapping<ArrayBuffer>;
|
|
35
|
+
export declare const mapNodeWindowsSharedMemory: (options: MapSharedMemoryOptions, lib?: NodeWindowsLibrary) => SharedMemoryMapping<ArrayBuffer>;
|
|
36
|
+
export declare const createNodeWindowsConnectionPrimitives: (lib?: NodeWindowsLibrary) => SharedMemoryConnectionPrimitives<SharedMemoryMapping<ArrayBuffer>>;
|
|
37
|
+
export {};
|