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.
Files changed (157) hide show
  1. package/README.md +254 -40
  2. package/knitting.d.ts +7 -797
  3. package/knitting.js +6 -9780
  4. package/map.md +31 -15
  5. package/package.json +20 -6
  6. package/process-shared-buffer.d.ts +1 -0
  7. package/process-shared-buffer.js +1 -0
  8. package/scripts/build-compiled-worker.ts +276 -0
  9. package/scripts/compiled-worker/porffor.d.ts +5 -0
  10. package/scripts/compiled-worker/runtime.ts +529 -0
  11. package/scripts/compiled-worker/task-shim.ts +32 -0
  12. package/shared-memory.d.ts +1 -155
  13. package/shared-memory.js +1 -1342
  14. package/src/api.d.ts +92 -0
  15. package/src/api.js +798 -0
  16. package/src/common/envelope.d.ts +17 -0
  17. package/src/common/envelope.js +22 -0
  18. package/src/common/module-url.d.ts +2 -0
  19. package/src/common/module-url.js +52 -0
  20. package/src/common/node-compat.d.ts +22 -0
  21. package/src/common/node-compat.js +24 -0
  22. package/src/common/path-canonical.d.ts +6 -0
  23. package/src/common/path-canonical.js +55 -0
  24. package/src/common/runtime.d.ts +16 -0
  25. package/src/common/runtime.js +105 -0
  26. package/src/common/shared-buffer-region.d.ts +11 -0
  27. package/src/common/shared-buffer-region.js +21 -0
  28. package/src/common/shared-buffer-text.d.ts +16 -0
  29. package/src/common/shared-buffer-text.js +65 -0
  30. package/src/common/task-source.d.ts +5 -0
  31. package/src/common/task-source.js +100 -0
  32. package/src/common/task-symbol.d.ts +1 -0
  33. package/src/common/task-symbol.js +1 -0
  34. package/src/common/with-resolvers.d.ts +9 -0
  35. package/src/common/with-resolvers.js +23 -0
  36. package/src/common/worker-runtime.d.ts +42 -0
  37. package/src/common/worker-runtime.js +70 -0
  38. package/src/connections/buffer-reference-native.d.ts +56 -0
  39. package/src/connections/buffer-reference-native.js +241 -0
  40. package/src/connections/buffer-reference.d.ts +99 -0
  41. package/src/connections/buffer-reference.js +575 -0
  42. package/src/connections/bun.d.ts +22 -0
  43. package/src/connections/bun.js +225 -0
  44. package/src/connections/deno.d.ts +24 -0
  45. package/src/connections/deno.js +226 -0
  46. package/src/connections/external-array-buffer.d.ts +2 -0
  47. package/src/connections/external-array-buffer.js +33 -0
  48. package/src/connections/file-descriptor.d.ts +39 -0
  49. package/src/connections/file-descriptor.js +161 -0
  50. package/src/connections/index.d.ts +4 -0
  51. package/src/connections/index.js +4 -0
  52. package/src/connections/node-addons.d.ts +16 -0
  53. package/src/connections/node-addons.js +92 -0
  54. package/src/connections/node-buffer-pointer.d.ts +20 -0
  55. package/src/connections/node-buffer-pointer.js +16 -0
  56. package/src/connections/node-ffi-api.d.ts +19 -0
  57. package/src/connections/node-ffi-api.js +28 -0
  58. package/src/connections/node-ffi.d.ts +27 -0
  59. package/src/connections/node-ffi.js +262 -0
  60. package/src/connections/node.d.ts +30 -0
  61. package/src/connections/node.js +62 -0
  62. package/src/connections/numeric-array.d.ts +5 -0
  63. package/src/connections/numeric-array.js +17 -0
  64. package/src/connections/package-assets.d.ts +2 -0
  65. package/src/connections/package-assets.js +55 -0
  66. package/src/connections/posix.d.ts +74 -0
  67. package/src/connections/posix.js +178 -0
  68. package/src/connections/process-shared-buffer.d.ts +76 -0
  69. package/src/connections/process-shared-buffer.js +245 -0
  70. package/src/connections/shared-array-buffer-payload.d.ts +36 -0
  71. package/src/connections/shared-array-buffer-payload.js +235 -0
  72. package/src/connections/types.d.ts +54 -0
  73. package/src/connections/types.js +37 -0
  74. package/src/connections/windows.d.ts +37 -0
  75. package/src/connections/windows.js +245 -0
  76. package/src/debug/env-diff.d.ts +26 -0
  77. package/src/debug/env-diff.js +49 -0
  78. package/src/debug/gate.d.ts +18 -0
  79. package/src/debug/gate.js +69 -0
  80. package/src/debug/handle.d.ts +23 -0
  81. package/src/debug/handle.js +48 -0
  82. package/src/error.d.ts +14 -0
  83. package/src/error.js +50 -0
  84. package/src/ipc/tools/ring-queue.d.ts +33 -0
  85. package/src/ipc/tools/ring-queue.js +159 -0
  86. package/src/ipc/transport/shared-memory.d.ts +23 -0
  87. package/src/ipc/transport/shared-memory.js +35 -0
  88. package/src/memory/byte-carpet.d.ts +73 -0
  89. package/src/memory/byte-carpet.js +157 -0
  90. package/src/memory/lock.d.ts +213 -0
  91. package/src/memory/lock.js +760 -0
  92. package/src/memory/payload-config.d.ts +31 -0
  93. package/src/memory/payload-config.js +67 -0
  94. package/src/memory/payloadCodec.d.ts +55 -0
  95. package/src/memory/payloadCodec.js +1473 -0
  96. package/src/memory/regionRegistry.d.ts +17 -0
  97. package/src/memory/regionRegistry.js +285 -0
  98. package/src/memory/shared-buffer-io.d.ts +55 -0
  99. package/src/memory/shared-buffer-io.js +403 -0
  100. package/src/permission/compatibility.d.ts +28 -0
  101. package/src/permission/compatibility.js +239 -0
  102. package/src/permission/index.d.ts +4 -0
  103. package/src/permission/index.js +3 -0
  104. package/src/permission/protocol.d.ts +167 -0
  105. package/src/permission/protocol.js +690 -0
  106. package/src/runtime/balancer.d.ts +19 -0
  107. package/src/runtime/balancer.js +149 -0
  108. package/src/runtime/compiled-artifact.d.ts +21 -0
  109. package/src/runtime/compiled-artifact.js +260 -0
  110. package/src/runtime/compiled-builder.d.ts +8 -0
  111. package/src/runtime/compiled-builder.js +42 -0
  112. package/src/runtime/compiled-worker.d.ts +27 -0
  113. package/src/runtime/compiled-worker.js +562 -0
  114. package/src/runtime/dispatcher.d.ts +40 -0
  115. package/src/runtime/dispatcher.js +142 -0
  116. package/src/runtime/inline-executor.d.ts +10 -0
  117. package/src/runtime/inline-executor.js +294 -0
  118. package/src/runtime/pool.d.ts +44 -0
  119. package/src/runtime/pool.js +472 -0
  120. package/src/runtime/process-worker.d.ts +92 -0
  121. package/src/runtime/process-worker.js +713 -0
  122. package/src/runtime/tx-queue.d.ts +28 -0
  123. package/src/runtime/tx-queue.js +158 -0
  124. package/src/shared/abortSignal.d.ts +23 -0
  125. package/src/shared/abortSignal.js +134 -0
  126. package/src/types.d.ts +399 -0
  127. package/src/types.js +2 -0
  128. package/src/utils/http.d.ts +29 -0
  129. package/src/utils/http.js +100 -0
  130. package/src/worker/bootstrap.d.ts +5 -0
  131. package/src/worker/bootstrap.js +78 -0
  132. package/src/worker/composable-runners.d.ts +12 -0
  133. package/src/worker/composable-runners.js +98 -0
  134. package/src/worker/loop.d.ts +3 -0
  135. package/src/worker/loop.js +395 -0
  136. package/src/worker/process-worker-bootstrap.d.ts +8 -0
  137. package/src/worker/process-worker-bootstrap.js +160 -0
  138. package/src/worker/rx-queue.d.ts +25 -0
  139. package/src/worker/rx-queue.js +173 -0
  140. package/src/worker/safety/index.d.ts +4 -0
  141. package/src/worker/safety/index.js +4 -0
  142. package/src/worker/safety/performance.d.ts +1 -0
  143. package/src/worker/safety/performance.js +17 -0
  144. package/src/worker/safety/process.d.ts +2 -0
  145. package/src/worker/safety/process.js +79 -0
  146. package/src/worker/safety/startup.d.ts +16 -0
  147. package/src/worker/safety/startup.js +30 -0
  148. package/src/worker/safety/worker-data.d.ts +2 -0
  149. package/src/worker/safety/worker-data.js +36 -0
  150. package/src/worker/task-loader.d.ts +28 -0
  151. package/src/worker/task-loader.js +76 -0
  152. package/src/worker/timers.d.ts +18 -0
  153. package/src/worker/timers.js +118 -0
  154. package/unsafe.d.ts +1 -71
  155. package/unsafe.js +1 -878
  156. package/utils.d.ts +1 -31
  157. package/utils.js +1 -116
@@ -0,0 +1,225 @@
1
+ import { assertNamedSharedMemoryIsReopenable, checkPosixResult, DARWIN_O_CREAT, DARWIN_O_EXCL, DARWIN_SHM_MODE, detectPosixPlatform, encodeCString, getPosixLibcPath, LINUX_O_CREAT, LINUX_O_EXCL, makeDarwinSharedMemoryName, MAP_SHARED, O_RDWR, POSIX_SHM_MODE, posixError, PROT_READ, PROT_WRITE, setCloseOnExec, SHM_OPEN_STACK_PAD, shmOpenModeIsStackPassed, toPosixSharedMemoryName, } from "./posix.js";
2
+ import { expectFd, expectPositiveSize, readCreateMode, readCreateName, readCreateSize, readRequiredCreateName, } from "./types.js";
3
+ import { createBunWindowsConnectionPrimitives, isWindowsRuntime, } from "./windows.js";
4
+ const FFIType = {
5
+ i32: 5,
6
+ i64: 7,
7
+ u32: 6,
8
+ usize: 8,
9
+ ptr: 12,
10
+ };
11
+ const getBunFFI = () => {
12
+ const ffi = globalThis.Bun?.FFI;
13
+ if (typeof ffi?.dlopen !== "function" ||
14
+ typeof ffi?.toArrayBuffer !== "function") {
15
+ throw new Error("Bun FFI is not available in this runtime");
16
+ }
17
+ return ffi;
18
+ };
19
+ export const openBunLibc = () => getBunFFI().dlopen(getPosixLibcPath(), {
20
+ ...getBunCreateSymbols(),
21
+ ftruncate: {
22
+ args: [FFIType.i32, FFIType.i64],
23
+ returns: FFIType.i32,
24
+ },
25
+ dup: {
26
+ args: [FFIType.i32],
27
+ returns: FFIType.i32,
28
+ },
29
+ fcntl: {
30
+ args: [FFIType.i32, FFIType.i32, FFIType.i32],
31
+ returns: FFIType.i32,
32
+ },
33
+ mmap: {
34
+ args: [
35
+ FFIType.ptr,
36
+ FFIType.usize,
37
+ FFIType.i32,
38
+ FFIType.i32,
39
+ FFIType.i32,
40
+ FFIType.i64,
41
+ ],
42
+ returns: FFIType.ptr,
43
+ },
44
+ munmap: {
45
+ args: [FFIType.ptr, FFIType.usize],
46
+ returns: FFIType.i32,
47
+ },
48
+ close: {
49
+ args: [FFIType.i32],
50
+ returns: FFIType.i32,
51
+ },
52
+ });
53
+ const getBunCreateSymbols = (platform = detectPosixPlatform()) => platform === "darwin"
54
+ ? {
55
+ shm_open: {
56
+ args: shmOpenModeIsStackPassed(platform)
57
+ ? [
58
+ FFIType.ptr,
59
+ FFIType.i32,
60
+ ...SHM_OPEN_STACK_PAD.map(() => FFIType.i32),
61
+ FFIType.u32,
62
+ ]
63
+ : [FFIType.ptr, FFIType.i32, FFIType.u32],
64
+ returns: FFIType.i32,
65
+ },
66
+ shm_unlink: {
67
+ args: [FFIType.ptr],
68
+ returns: FFIType.i32,
69
+ },
70
+ }
71
+ : {
72
+ memfd_create: {
73
+ args: [FFIType.ptr, FFIType.u32],
74
+ returns: FFIType.i32,
75
+ },
76
+ shm_open: {
77
+ args: [FFIType.ptr, FFIType.i32, FFIType.u32],
78
+ returns: FFIType.i32,
79
+ },
80
+ shm_unlink: {
81
+ args: [FFIType.ptr],
82
+ returns: FFIType.i32,
83
+ },
84
+ };
85
+ const callShmOpen = (shmOpen, name, flags, mode, platform) => shmOpenModeIsStackPassed(platform)
86
+ ? shmOpen(name, flags, ...SHM_OPEN_STACK_PAD, mode)
87
+ : shmOpen(name, flags, mode);
88
+ const isBunMmapFailed = (pointer) => !pointer || pointer < 0 || pointer >= Number.MAX_SAFE_INTEGER;
89
+ const createBunSharedMemoryFd = (name, platform, libc) => {
90
+ if (platform === "darwin") {
91
+ const shmOpen = libc.symbols.shm_open;
92
+ const shmUnlink = libc.symbols.shm_unlink;
93
+ if (shmOpen === undefined || shmUnlink === undefined) {
94
+ throw new Error("shm_open symbols are not available");
95
+ }
96
+ const shmName = encodeCString(makeDarwinSharedMemoryName(name, "bun"));
97
+ const fd = checkPosixResult(callShmOpen(shmOpen, shmName, O_RDWR | DARWIN_O_CREAT | DARWIN_O_EXCL, DARWIN_SHM_MODE, platform), "shm_open failed");
98
+ shmUnlink(shmName);
99
+ try {
100
+ return setCloseOnExec(libc, fd);
101
+ }
102
+ catch (error) {
103
+ libc.symbols.close(fd);
104
+ throw error;
105
+ }
106
+ }
107
+ const memfdCreate = libc.symbols.memfd_create;
108
+ if (memfdCreate === undefined) {
109
+ throw new Error("memfd_create symbol is not available");
110
+ }
111
+ const fd = checkPosixResult(memfdCreate(encodeCString(name), 0), "memfd_create failed");
112
+ try {
113
+ return setCloseOnExec(libc, fd);
114
+ }
115
+ catch (error) {
116
+ libc.symbols.close(fd);
117
+ throw error;
118
+ }
119
+ };
120
+ const createNamedBunSharedMemoryFd = (name, mode, platform, libc) => {
121
+ const shmOpen = libc.symbols.shm_open;
122
+ if (shmOpen === undefined) {
123
+ throw new Error("shm_open symbol is not available");
124
+ }
125
+ const createFlags = platform === "darwin" ? DARWIN_O_CREAT : LINUX_O_CREAT;
126
+ const exclusiveFlags = platform === "darwin" ? DARWIN_O_EXCL : LINUX_O_EXCL;
127
+ const flags = mode === "create"
128
+ ? O_RDWR | createFlags | exclusiveFlags
129
+ : O_RDWR;
130
+ const shmMode = platform === "darwin" ? DARWIN_SHM_MODE : POSIX_SHM_MODE;
131
+ const shmName = encodeCString(toPosixSharedMemoryName(name));
132
+ const fd = checkPosixResult(callShmOpen(shmOpen, shmName, flags, shmMode, platform), "shm_open failed");
133
+ if (mode === "create") {
134
+ assertNamedSharedMemoryIsReopenable(platform, fd, () => callShmOpen(shmOpen, shmName, O_RDWR, shmMode, platform), libc.symbols.close);
135
+ }
136
+ try {
137
+ return setCloseOnExec(libc, fd);
138
+ }
139
+ catch (error) {
140
+ libc.symbols.close(fd);
141
+ throw error;
142
+ }
143
+ };
144
+ export const mapBunSharedMemory = (options, libc = openBunLibc()) => {
145
+ const sourceFd = options.name === undefined ? expectFd(options.fd) : -1;
146
+ const size = expectPositiveSize(options.size);
147
+ let fd = sourceFd;
148
+ if (options.name !== undefined) {
149
+ fd = createNamedBunSharedMemoryFd(options.name, "open", detectPosixPlatform(), libc);
150
+ }
151
+ else if (options.duplicateFd !== false) {
152
+ fd = checkPosixResult(libc.symbols.dup(sourceFd), "dup(fd) failed");
153
+ try {
154
+ setCloseOnExec(libc, fd);
155
+ }
156
+ catch (error) {
157
+ libc.symbols.close(fd);
158
+ throw error;
159
+ }
160
+ }
161
+ const pointer = libc.symbols.mmap(null, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0n);
162
+ if (isBunMmapFailed(pointer)) {
163
+ const error = posixError("mmap failed");
164
+ if (options.duplicateFd !== false)
165
+ libc.symbols.close(fd);
166
+ throw error;
167
+ }
168
+ const arrayBuffer = getBunFFI().toArrayBuffer(pointer, 0, size);
169
+ return {
170
+ runtime: "bun",
171
+ fd,
172
+ name: options.name,
173
+ size,
174
+ byteLength: arrayBuffer.byteLength,
175
+ buffer: arrayBuffer,
176
+ kind: "external-array-buffer",
177
+ arrayBuffer,
178
+ unsafePointer: pointer,
179
+ close: () => {
180
+ libc.symbols.munmap(pointer, size);
181
+ libc.symbols.close(fd);
182
+ },
183
+ };
184
+ };
185
+ export const createBunSharedMemory = (options, libc = openBunLibc()) => {
186
+ const size = expectPositiveSize(readCreateSize(options));
187
+ const mode = readCreateMode(options);
188
+ const name = mode === "anonymous"
189
+ ? readCreateName(options, "knitting_shared_memory")
190
+ : readRequiredCreateName(options);
191
+ const platform = detectPosixPlatform();
192
+ const fd = mode === "anonymous"
193
+ ? createBunSharedMemoryFd(name, platform, libc)
194
+ : createNamedBunSharedMemoryFd(name, mode, platform, libc);
195
+ try {
196
+ if (mode !== "open") {
197
+ checkPosixResult(libc.symbols.ftruncate(fd, BigInt(size)), "ftruncate failed");
198
+ }
199
+ const mapping = mapBunSharedMemory({ fd, size, duplicateFd: false }, libc);
200
+ if (mode !== "anonymous") {
201
+ return { ...mapping, name };
202
+ }
203
+ return mapping;
204
+ }
205
+ catch (error) {
206
+ libc.symbols.close(fd);
207
+ throw error;
208
+ }
209
+ };
210
+ export const unlinkBunSharedMemory = (name, libc = openBunLibc()) => {
211
+ const shmUnlink = libc.symbols.shm_unlink;
212
+ if (shmUnlink === undefined) {
213
+ throw new Error("shm_unlink symbol is not available");
214
+ }
215
+ return shmUnlink(encodeCString(toPosixSharedMemoryName(name))) === 0;
216
+ };
217
+ export const createBunPosixConnectionPrimitives = (libc = openBunLibc()) => ({
218
+ runtime: "bun",
219
+ createSharedMemory: (options) => createBunSharedMemory(options, libc),
220
+ mapSharedMemory: (options) => mapBunSharedMemory(options, libc),
221
+ unlinkSharedMemory: (name) => unlinkBunSharedMemory(name, libc),
222
+ });
223
+ export const createBunConnectionPrimitives = (libc) => isWindowsRuntime()
224
+ ? createBunWindowsConnectionPrimitives()
225
+ : createBunPosixConnectionPrimitives(libc);
@@ -0,0 +1,24 @@
1
+ import { type CreateSharedMemoryOptions, type MapSharedMemoryOptions, type SharedMemoryConnectionPrimitives, type SharedMemoryMapping } from "./types.js";
2
+ type DenoLibc = {
3
+ symbols: {
4
+ memfd_create?: (name: Uint8Array, flags: number) => number;
5
+ shm_open?: (name: Uint8Array, flags: number, ...rest: number[]) => number;
6
+ shm_unlink?: (name: Uint8Array) => number;
7
+ __error?: () => unknown;
8
+ __errno_location?: () => unknown;
9
+ ftruncate: (fd: number, length: bigint) => number;
10
+ dup: (fd: number) => number;
11
+ fcntl: (fd: number, cmd: number, arg: number) => number;
12
+ mmap: (address: null, length: number, protection: number, flags: number, fd: number, offset: bigint) => unknown;
13
+ munmap: (address: unknown, length: number) => number;
14
+ close: (fd: number) => number;
15
+ };
16
+ close: () => void;
17
+ };
18
+ export declare const openDenoLibc: () => DenoLibc;
19
+ export declare const mapDenoSharedMemory: (options: MapSharedMemoryOptions, libc?: DenoLibc) => SharedMemoryMapping<ArrayBuffer>;
20
+ export declare const createDenoSharedMemory: (options: number | CreateSharedMemoryOptions, libc?: DenoLibc) => SharedMemoryMapping<ArrayBuffer>;
21
+ export declare const unlinkDenoSharedMemory: (name: string, libc?: DenoLibc) => boolean;
22
+ export declare const createDenoPosixConnectionPrimitives: (libc?: DenoLibc) => SharedMemoryConnectionPrimitives<SharedMemoryMapping<ArrayBuffer>>;
23
+ export declare const createDenoConnectionPrimitives: (libc?: DenoLibc) => SharedMemoryConnectionPrimitives<SharedMemoryMapping<ArrayBuffer>>;
24
+ export {};
@@ -0,0 +1,226 @@
1
+ import { assertNamedSharedMemoryIsReopenable, checkPosixResult, DARWIN_O_CREAT, DARWIN_O_EXCL, DARWIN_SHM_MODE, detectPosixPlatform, encodeCString, getErrnoSymbolName, getPosixLibcPath, LINUX_O_CREAT, LINUX_O_EXCL, makeDarwinSharedMemoryName, makeErrnoReader, MAP_SHARED, O_RDWR, POSIX_SHM_MODE, posixError, PROT_READ, PROT_WRITE, setCloseOnExec, SHM_OPEN_STACK_PAD, shmOpenModeIsStackPassed, toPosixSharedMemoryName, } from "./posix.js";
2
+ import { expectFd, expectPositiveSize, readCreateMode, readCreateName, readCreateSize, readRequiredCreateName, } from "./types.js";
3
+ import { createDenoWindowsConnectionPrimitives, isWindowsRuntime, } from "./windows.js";
4
+ const getDeno = () => {
5
+ const deno = globalThis.Deno;
6
+ if (deno === undefined) {
7
+ throw new Error("Deno shared memory primitives can only run in Deno");
8
+ }
9
+ return deno;
10
+ };
11
+ const getDenoErrnoSymbols = (platform = detectPosixPlatform()) => ({
12
+ [getErrnoSymbolName(platform)]: {
13
+ parameters: [],
14
+ result: "pointer",
15
+ },
16
+ });
17
+ export const openDenoLibc = () => getDeno().dlopen(getPosixLibcPath(), {
18
+ ...getDenoCreateSymbols(),
19
+ ...getDenoErrnoSymbols(),
20
+ ftruncate: {
21
+ parameters: ["i32", "i64"],
22
+ result: "i32",
23
+ },
24
+ dup: {
25
+ parameters: ["i32"],
26
+ result: "i32",
27
+ },
28
+ fcntl: {
29
+ parameters: ["i32", "i32", "i32"],
30
+ result: "i32",
31
+ },
32
+ mmap: {
33
+ parameters: ["pointer", "usize", "i32", "i32", "i32", "i64"],
34
+ result: "pointer",
35
+ },
36
+ munmap: {
37
+ parameters: ["pointer", "usize"],
38
+ result: "i32",
39
+ },
40
+ close: {
41
+ parameters: ["i32"],
42
+ result: "i32",
43
+ },
44
+ });
45
+ const getDenoCreateSymbols = (platform = detectPosixPlatform()) => platform === "darwin"
46
+ ? {
47
+ shm_open: {
48
+ parameters: shmOpenModeIsStackPassed(platform)
49
+ ? [
50
+ "buffer",
51
+ "i32",
52
+ ...SHM_OPEN_STACK_PAD.map(() => "i32"),
53
+ "u32",
54
+ ]
55
+ : ["buffer", "i32", "u32"],
56
+ result: "i32",
57
+ },
58
+ shm_unlink: {
59
+ parameters: ["buffer"],
60
+ result: "i32",
61
+ },
62
+ }
63
+ : {
64
+ memfd_create: {
65
+ parameters: ["buffer", "u32"],
66
+ result: "i32",
67
+ },
68
+ shm_open: {
69
+ parameters: ["buffer", "i32", "u32"],
70
+ result: "i32",
71
+ },
72
+ shm_unlink: {
73
+ parameters: ["buffer"],
74
+ result: "i32",
75
+ },
76
+ };
77
+ const callShmOpen = (shmOpen, name, flags, mode, platform) => shmOpenModeIsStackPassed(platform)
78
+ ? shmOpen(name, flags, ...SHM_OPEN_STACK_PAD, mode)
79
+ : shmOpen(name, flags, mode);
80
+ const errnoOf = (libc, platform = detectPosixPlatform()) => makeErrnoReader(platform === "darwin"
81
+ ? libc.symbols.__error
82
+ : libc.symbols.__errno_location, (pointer) => new Int32Array(new (getDeno().UnsafePointerView)(pointer).getArrayBuffer(4))[0]);
83
+ const isDenoMmapFailed = (pointer) => {
84
+ if (pointer === null)
85
+ return true;
86
+ const value = getDeno().UnsafePointer?.value(pointer);
87
+ return value === -1n || value === BigInt.asUintN(64, -1n);
88
+ };
89
+ const createDenoSharedMemoryFd = (name, platform, libc) => {
90
+ if (platform === "darwin") {
91
+ const shmOpen = libc.symbols.shm_open;
92
+ const shmUnlink = libc.symbols.shm_unlink;
93
+ if (shmOpen === undefined || shmUnlink === undefined) {
94
+ throw new Error("shm_open symbols are not available");
95
+ }
96
+ const shmName = encodeCString(makeDarwinSharedMemoryName(name, "deno"));
97
+ const fd = checkPosixResult(callShmOpen(shmOpen, shmName, O_RDWR | DARWIN_O_CREAT | DARWIN_O_EXCL, DARWIN_SHM_MODE, platform), "shm_open failed", errnoOf(libc, platform), platform);
98
+ shmUnlink(shmName);
99
+ try {
100
+ return setCloseOnExec(libc, fd);
101
+ }
102
+ catch (error) {
103
+ libc.symbols.close(fd);
104
+ throw error;
105
+ }
106
+ }
107
+ const memfdCreate = libc.symbols.memfd_create;
108
+ if (memfdCreate === undefined) {
109
+ throw new Error("memfd_create symbol is not available");
110
+ }
111
+ const fd = checkPosixResult(memfdCreate(encodeCString(name), 0), "memfd_create failed", errnoOf(libc, platform), platform);
112
+ try {
113
+ return setCloseOnExec(libc, fd);
114
+ }
115
+ catch (error) {
116
+ libc.symbols.close(fd);
117
+ throw error;
118
+ }
119
+ };
120
+ const createNamedDenoSharedMemoryFd = (name, mode, platform, libc) => {
121
+ const shmOpen = libc.symbols.shm_open;
122
+ if (shmOpen === undefined) {
123
+ throw new Error("shm_open symbol is not available");
124
+ }
125
+ const createFlags = platform === "darwin" ? DARWIN_O_CREAT : LINUX_O_CREAT;
126
+ const exclusiveFlags = platform === "darwin" ? DARWIN_O_EXCL : LINUX_O_EXCL;
127
+ const flags = mode === "create"
128
+ ? O_RDWR | createFlags | exclusiveFlags
129
+ : O_RDWR;
130
+ const shmMode = platform === "darwin" ? DARWIN_SHM_MODE : POSIX_SHM_MODE;
131
+ const shmName = encodeCString(toPosixSharedMemoryName(name));
132
+ const fd = checkPosixResult(callShmOpen(shmOpen, shmName, flags, shmMode, platform), "shm_open failed", errnoOf(libc, platform), platform);
133
+ if (mode === "create") {
134
+ assertNamedSharedMemoryIsReopenable(platform, fd, () => callShmOpen(shmOpen, shmName, O_RDWR, shmMode, platform), libc.symbols.close, errnoOf(libc, platform));
135
+ }
136
+ try {
137
+ return setCloseOnExec(libc, fd);
138
+ }
139
+ catch (error) {
140
+ libc.symbols.close(fd);
141
+ throw error;
142
+ }
143
+ };
144
+ export const mapDenoSharedMemory = (options, libc = openDenoLibc()) => {
145
+ const sourceFd = options.name === undefined ? expectFd(options.fd) : -1;
146
+ const size = expectPositiveSize(options.size);
147
+ let fd = sourceFd;
148
+ if (options.name !== undefined) {
149
+ fd = createNamedDenoSharedMemoryFd(options.name, "open", detectPosixPlatform(), libc);
150
+ }
151
+ else if (options.duplicateFd !== false) {
152
+ fd = checkPosixResult(libc.symbols.dup(sourceFd), "dup(fd) failed", errnoOf(libc));
153
+ try {
154
+ setCloseOnExec(libc, fd);
155
+ }
156
+ catch (error) {
157
+ libc.symbols.close(fd);
158
+ throw error;
159
+ }
160
+ }
161
+ const pointer = libc.symbols.mmap(null, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0n);
162
+ if (isDenoMmapFailed(pointer)) {
163
+ const error = posixError("mmap failed", errnoOf(libc));
164
+ if (options.duplicateFd !== false)
165
+ libc.symbols.close(fd);
166
+ throw error;
167
+ }
168
+ const arrayBuffer = new (getDeno().UnsafePointerView)(pointer)
169
+ .getArrayBuffer(size);
170
+ return {
171
+ runtime: "deno",
172
+ fd,
173
+ name: options.name,
174
+ size,
175
+ byteLength: arrayBuffer.byteLength,
176
+ buffer: arrayBuffer,
177
+ kind: "external-array-buffer",
178
+ arrayBuffer,
179
+ unsafePointer: pointer,
180
+ close: () => {
181
+ libc.symbols.munmap(pointer, size);
182
+ libc.symbols.close(fd);
183
+ },
184
+ };
185
+ };
186
+ export const createDenoSharedMemory = (options, libc = openDenoLibc()) => {
187
+ const size = expectPositiveSize(readCreateSize(options));
188
+ const mode = readCreateMode(options);
189
+ const name = mode === "anonymous"
190
+ ? readCreateName(options, "knitting_shared_memory")
191
+ : readRequiredCreateName(options);
192
+ const platform = detectPosixPlatform();
193
+ const fd = mode === "anonymous"
194
+ ? createDenoSharedMemoryFd(name, platform, libc)
195
+ : createNamedDenoSharedMemoryFd(name, mode, platform, libc);
196
+ try {
197
+ if (mode !== "open") {
198
+ checkPosixResult(libc.symbols.ftruncate(fd, BigInt(size)), "ftruncate failed", errnoOf(libc, platform), platform);
199
+ }
200
+ const mapping = mapDenoSharedMemory({ fd, size, duplicateFd: false }, libc);
201
+ if (mode !== "anonymous") {
202
+ return { ...mapping, name };
203
+ }
204
+ return mapping;
205
+ }
206
+ catch (error) {
207
+ libc.symbols.close(fd);
208
+ throw error;
209
+ }
210
+ };
211
+ export const unlinkDenoSharedMemory = (name, libc = openDenoLibc()) => {
212
+ const shmUnlink = libc.symbols.shm_unlink;
213
+ if (shmUnlink === undefined) {
214
+ throw new Error("shm_unlink symbol is not available");
215
+ }
216
+ return shmUnlink(encodeCString(toPosixSharedMemoryName(name))) === 0;
217
+ };
218
+ export const createDenoPosixConnectionPrimitives = (libc = openDenoLibc()) => ({
219
+ runtime: "deno",
220
+ createSharedMemory: (options) => createDenoSharedMemory(options, libc),
221
+ mapSharedMemory: (options) => mapDenoSharedMemory(options, libc),
222
+ unlinkSharedMemory: (name) => unlinkDenoSharedMemory(name, libc),
223
+ });
224
+ export const createDenoConnectionPrimitives = (libc) => isWindowsRuntime()
225
+ ? createDenoWindowsConnectionPrimitives()
226
+ : createDenoPosixConnectionPrimitives(libc);
@@ -0,0 +1,2 @@
1
+ export declare const detachExternalArrayBuffer: (buffer: ArrayBuffer) => boolean;
2
+ export declare const requireDetachedExternalArrayBuffer: (buffer: ArrayBuffer) => void;
@@ -0,0 +1,33 @@
1
+ export const detachExternalArrayBuffer = (buffer) => {
2
+ if (buffer.byteLength === 0)
3
+ return true;
4
+ const detachable = buffer;
5
+ try {
6
+ if (typeof detachable.transferToFixedLength === "function") {
7
+ detachable.transferToFixedLength(0);
8
+ return buffer.byteLength === 0;
9
+ }
10
+ }
11
+ catch {
12
+ }
13
+ try {
14
+ if (typeof detachable.transfer === "function") {
15
+ detachable.transfer(0);
16
+ return buffer.byteLength === 0;
17
+ }
18
+ }
19
+ catch {
20
+ }
21
+ try {
22
+ structuredClone(buffer, { transfer: [buffer] });
23
+ return buffer.byteLength === 0;
24
+ }
25
+ catch {
26
+ return false;
27
+ }
28
+ };
29
+ export const requireDetachedExternalArrayBuffer = (buffer) => {
30
+ if (detachExternalArrayBuffer(buffer))
31
+ return;
32
+ throw new Error("knitting: could not detach external ArrayBuffer; refusing to unmap memory still reachable from JavaScript");
33
+ };
@@ -0,0 +1,39 @@
1
+ import { type ConnectionRuntime, type SharedMemoryBuffer, type SharedMemoryConnectionPrimitives, type SharedMemoryMapping } from "./types.js";
2
+ export type FileDescriptorMetadata = {
3
+ version: 1;
4
+ fd: number;
5
+ name?: string;
6
+ size: number;
7
+ byteLength: number;
8
+ runtime?: ConnectionRuntime;
9
+ kind?: SharedMemoryMapping["kind"];
10
+ baseAddressMod64?: number;
11
+ };
12
+ type FileDescriptorMapper = Pick<SharedMemoryConnectionPrimitives, "mapSharedMemory">;
13
+ export declare class FileDescriptor {
14
+ #private;
15
+ readonly fd: number;
16
+ readonly name?: string;
17
+ readonly size: number;
18
+ readonly byteLength: number;
19
+ readonly runtime?: ConnectionRuntime;
20
+ readonly kind?: SharedMemoryMapping["kind"];
21
+ readonly baseAddressMod64?: number;
22
+ constructor(metadata: FileDescriptorMetadata, mapping?: SharedMemoryMapping);
23
+ static fromMapping(mapping: SharedMemoryMapping): FileDescriptor;
24
+ static fromMetadata(metadata: unknown): FileDescriptor;
25
+ static parse(serialized: string): FileDescriptor;
26
+ toMetadata(): FileDescriptorMetadata;
27
+ toJSON(): FileDescriptorMetadata;
28
+ stringify(): string;
29
+ stringifyMetadata(): string;
30
+ toString(): string;
31
+ attach(mapping: SharedMemoryMapping): this;
32
+ get mapping(): SharedMemoryMapping | undefined;
33
+ map(mapper: FileDescriptorMapper): SharedMemoryMapping;
34
+ getBuffer(mapper?: FileDescriptorMapper): SharedMemoryBuffer;
35
+ getSharedArrayBuffer(mapper?: FileDescriptorMapper): SharedArrayBuffer;
36
+ getSAB(mapper?: FileDescriptorMapper): SharedArrayBuffer;
37
+ }
38
+ export declare const parseFileDescriptorMetadata: (input: unknown) => FileDescriptorMetadata;
39
+ export {};