@atolljs/core 0.1.6 → 0.1.7

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/dist/index7.js CHANGED
@@ -1,21 +1,510 @@
1
- import { fluent as e, z as t } from "./index3.js";
2
- //#region src/contract/reef.ts
3
- var n = new TextEncoder(), r = {
4
- i8: () => e(t.number().check(t.int(), t.gte(-128), t.lte(127))),
5
- u8: () => e(t.number().check(t.int(), t.gte(0), t.lte(255))),
6
- i16: () => e(t.number().check(t.int(), t.gte(-32768), t.lte(32767))),
7
- u16: () => e(t.number().check(t.int(), t.gte(0), t.lte(65535))),
8
- i32: () => e(t.int32()),
9
- u32: () => e(t.uint32()),
10
- f32: () => e(t.float32()),
11
- f64: () => e(t.float64()),
12
- i64: () => e(t.int64()),
13
- u64: () => e(t.uint64()),
14
- int: (n, r) => e(t.number().check(t.int(), t.gte(n), t.lte(r))),
15
- boolean: () => e(t.boolean()),
16
- string: (r) => e(t.string().check(t.refine((e) => n.encode(e).byteLength <= r, `exceeds ${r} UTF-8 bytes`)).register(t.globalRegistry, { bytes: r })),
17
- object: (n) => e(t.object(n)),
18
- array: (n) => e(t.array(n))
1
+ import { msgpackrCodec as e } from "./index2.js";
2
+ import { fluent as t, z as n } from "./index3.js";
3
+ import { memberToSpec as r, zodArrayInfo as i, zodObjectShape as a, zodStringBytes as o } from "./index4.js";
4
+ import { devtoolsEnabled as s, emitDevtools as c } from "./index5.js";
5
+ import { fmtBytes as l, scoped as u } from "./index6.js";
6
+ //#region src/contract/sharedMemory.ts
7
+ var d = u("memory"), f = 8, p = (e, t) => e + t - 1 & ~(t - 1), m = (e) => p(e, f), h = (e) => typeof e == "object" && !!e && typeof e.kind == "string" && typeof e.byteLength == "number";
8
+ function g(e) {
9
+ let t = [];
10
+ for (let [n, r] of Object.entries(e)) if (h(r)) t.push({
11
+ path: n,
12
+ descriptor: r
13
+ });
14
+ else for (let [e, i] of Object.entries(r)) {
15
+ if (!h(i)) throw TypeError(`shared memory "${n}.${e}" is not a field descriptor — intent groups nest one level only`);
16
+ t.push({
17
+ path: `${n}.${e}`,
18
+ descriptor: i
19
+ });
20
+ }
21
+ return t;
22
+ }
23
+ var _ = new TextEncoder(), v = new TextDecoder(), y = {
24
+ encode: (e) => _.encode(JSON.stringify(e)),
25
+ decode: (e) => JSON.parse(v.decode(e))
26
+ }, b = /* @__PURE__ */ new Map();
27
+ function x(e, t) {
28
+ b.set(e, t);
29
+ }
30
+ var S = {
31
+ i8: 1,
32
+ u8: 1,
33
+ i16: 2,
34
+ u16: 2,
35
+ i32: 4,
36
+ u32: 4,
37
+ f32: 4,
38
+ f64: 8,
39
+ i64: 8,
40
+ u64: 8
41
+ }, C = (e) => typeof e == "string" ? S[e] : "string" in e ? e.string : 1, w = (e) => typeof e == "string" ? S[e] : 1;
42
+ function T(e) {
43
+ let t = {}, n = {}, i = 0;
44
+ for (let a of Object.keys(e)) {
45
+ let o = r(e[a], String(a));
46
+ n[a] = o, i = p(i, w(o)), t[a] = i, i += C(o);
47
+ }
48
+ return {
49
+ layout: n,
50
+ offsets: t,
51
+ recordSize: m(i)
52
+ };
53
+ }
54
+ var E = {
55
+ number: () => ({
56
+ kind: "number",
57
+ byteLength: 8
58
+ }),
59
+ boolean: () => ({
60
+ kind: "boolean",
61
+ byteLength: 8
62
+ }),
63
+ string: (e) => {
64
+ let { schema: t, maxBytes: n } = e;
65
+ if (n !== void 0) return {
66
+ kind: "string",
67
+ byteLength: 4 + n,
68
+ schema: t
69
+ };
70
+ let r = t ? o(t) : null;
71
+ if (r !== null) return {
72
+ kind: "string",
73
+ byteLength: 4 + r,
74
+ schema: t
75
+ };
76
+ throw TypeError("field.string: pass { maxBytes } or a schema carrying a byte budget — reef.string(n) / z.string().meta({ bytes: n })");
77
+ },
78
+ object: (e) => {
79
+ let { schema: t, maxBytes: n } = e;
80
+ if (n === void 0 && t) {
81
+ let e = a(t);
82
+ if (e) {
83
+ let { layout: n, offsets: r, recordSize: i } = T(e);
84
+ return {
85
+ kind: "object",
86
+ byteLength: 8 + i,
87
+ schema: t,
88
+ layout: n,
89
+ offsets: r,
90
+ recordSize: i
91
+ };
92
+ }
93
+ throw TypeError("field.object: schema can't derive a fixed byte width (not a zod object of fixed-width members) — pass { maxBytes } for codec-encoded storage");
94
+ }
95
+ if (n === void 0) throw TypeError("field.object: pass { schema } for a fixed-layout field or { maxBytes } for a codec-encoded field");
96
+ return {
97
+ kind: "object",
98
+ byteLength: 4 + n,
99
+ schema: t
100
+ };
101
+ },
102
+ array: (e) => {
103
+ let { schema: t, maxBytes: n } = e;
104
+ if (n === void 0 && t) {
105
+ let e = i(t);
106
+ if (e) {
107
+ if (e.capacity === null) throw TypeError("field.array: z.array() needs .max(n) or .length(n) — bounded arrays are fixed-width");
108
+ let n;
109
+ try {
110
+ n = r(e.element, "array element");
111
+ } catch (e) {
112
+ throw TypeError(`field.array: element isn't a fixed-width member — use field.list for arrays of records (${e.message})`);
113
+ }
114
+ let i = p(C(n), w(n));
115
+ return {
116
+ kind: "array",
117
+ byteLength: 8 + e.capacity * i,
118
+ schema: t,
119
+ element: n,
120
+ elementStride: i,
121
+ capacity: e.capacity
122
+ };
123
+ }
124
+ throw TypeError("field.array: schema can't derive a fixed byte width (not a bounded zod array) — pass { maxBytes } for codec-encoded storage");
125
+ }
126
+ if (n === void 0) throw TypeError("field.array: pass { schema } for a fixed-layout field or { maxBytes } for a codec-encoded field");
127
+ return {
128
+ kind: "array",
129
+ byteLength: 4 + n,
130
+ schema: t
131
+ };
132
+ },
133
+ int32Array: ({ length: e }) => ({
134
+ kind: "Int32",
135
+ byteLength: e * 4
136
+ }),
137
+ float64Array: ({ length: e }) => ({
138
+ kind: "Float64",
139
+ byteLength: e * 8
140
+ }),
141
+ bigInt64Array: ({ length: e }) => ({
142
+ kind: "BigInt64",
143
+ byteLength: e * 8
144
+ }),
145
+ uint8Array: ({ length: e }) => ({
146
+ kind: "Uint8",
147
+ byteLength: e
148
+ }),
149
+ list: ({ schema: e, count: t }) => {
150
+ let n = a(e);
151
+ if (!n) throw TypeError("field.list: schema must be a reef.object() of fixed-width members");
152
+ let { layout: r, offsets: i, recordSize: o } = T(n);
153
+ return {
154
+ kind: "list",
155
+ byteLength: o * t,
156
+ schema: e,
157
+ layout: r,
158
+ offsets: i,
159
+ recordSize: o,
160
+ count: t
161
+ };
162
+ }
163
+ }, D = {
164
+ Int32: Int32Array,
165
+ Float64: Float64Array,
166
+ BigInt64: BigInt64Array,
167
+ Uint8: Uint8Array
19
168
  };
169
+ x("number", (e, t, n) => {
170
+ let r = new Float64Array(t.buffer, n, 1);
171
+ return {
172
+ byteOffset: n,
173
+ byteLength: e.byteLength,
174
+ read: () => r[0],
175
+ write: (e) => {
176
+ r[0] = e;
177
+ }
178
+ };
179
+ }), x("boolean", (e, t, n) => {
180
+ let r = new Uint8Array(t.buffer, n, 1);
181
+ return {
182
+ byteOffset: n,
183
+ byteLength: e.byteLength,
184
+ read: () => r[0] === 1,
185
+ write: (e) => {
186
+ r[0] = +!!e;
187
+ }
188
+ };
189
+ });
190
+ for (let e of Object.keys(D)) x(e, (t, n, r) => {
191
+ let i = D[e], a = new i(n.buffer, r, t.byteLength / i.BYTES_PER_ELEMENT);
192
+ return {
193
+ byteOffset: r,
194
+ byteLength: t.byteLength,
195
+ read: () => a,
196
+ write: (e) => a.set(e)
197
+ };
198
+ });
199
+ x("string", (e, t, n) => {
200
+ let r = new TextEncoder(), i = new TextDecoder(), a = e.byteLength - 4, o = new Uint32Array(t.buffer, n, 1), s = (e) => {
201
+ if (e.byteLength > a) throw Error(`Encoded value of ${e.byteLength} bytes exceeds field capacity of ${a} bytes at offset ${n}`);
202
+ o[0] = e.byteLength, new Uint8Array(t.buffer, n + 4, e.byteLength).set(e);
203
+ }, c = () => new Uint8Array(t.buffer, n + 4, o[0]).slice();
204
+ return {
205
+ byteOffset: n,
206
+ byteLength: e.byteLength,
207
+ read: () => i.decode(c()),
208
+ write: (t) => s(r.encode(e.schema ? e.schema.parse(t) : t))
209
+ };
210
+ });
211
+ function O(e) {
212
+ let t = new DataView(e.buffer), n = new Uint8Array(e.buffer), r = new TextEncoder(), i = new TextDecoder(), a = {
213
+ i8: {
214
+ get: (e) => t.getInt8(e),
215
+ set: (e, n) => t.setInt8(e, n)
216
+ },
217
+ u8: {
218
+ get: (e) => t.getUint8(e),
219
+ set: (e, n) => t.setUint8(e, n)
220
+ },
221
+ i16: {
222
+ get: (e) => t.getInt16(e),
223
+ set: (e, n) => t.setInt16(e, n)
224
+ },
225
+ u16: {
226
+ get: (e) => t.getUint16(e),
227
+ set: (e, n) => t.setUint16(e, n)
228
+ },
229
+ i32: {
230
+ get: (e) => t.getInt32(e),
231
+ set: (e, n) => t.setInt32(e, n)
232
+ },
233
+ u32: {
234
+ get: (e) => t.getUint32(e),
235
+ set: (e, n) => t.setUint32(e, n)
236
+ },
237
+ f32: {
238
+ get: (e) => t.getFloat32(e),
239
+ set: (e, n) => t.setFloat32(e, n)
240
+ },
241
+ f64: {
242
+ get: (e) => t.getFloat64(e),
243
+ set: (e, n) => t.setFloat64(e, n)
244
+ },
245
+ i64: {
246
+ get: (e) => t.getBigInt64(e),
247
+ set: (e, n) => t.setBigInt64(e, n)
248
+ },
249
+ u64: {
250
+ get: (e) => t.getBigUint64(e),
251
+ set: (e, n) => t.setBigUint64(e, n)
252
+ }
253
+ }, o = (e, t) => {
254
+ let r = n.indexOf(0, e), a = r === -1 || r - e >= t ? t : r - e;
255
+ return i.decode(n.slice(e, e + a));
256
+ }, s = /* @__PURE__ */ new Uint8Array(64), c = (e, t, i) => {
257
+ s.length < t && (s = new Uint8Array(t));
258
+ let { read: a, written: o } = r.encodeInto(i, s);
259
+ if (a < i.length || o > t) throw Error(`String exceeds inline field capacity of ${t} bytes`);
260
+ n.set(s.subarray(0, o), e), o < t && n.fill(0, e + o, e + t);
261
+ }, l = (e) => {
262
+ if (typeof e == "string") {
263
+ let t = a[e];
264
+ return {
265
+ get: (e) => t.get(e),
266
+ set: (e, n) => t.set(e, n)
267
+ };
268
+ }
269
+ return "bool" in e ? {
270
+ get: (e) => !!t.getUint8(e),
271
+ set: (e, n) => t.setUint8(e, +!!n)
272
+ } : {
273
+ get: (t) => o(t, e.string),
274
+ set: (t, n) => c(t, e.string, n)
275
+ };
276
+ };
277
+ return {
278
+ ops: l,
279
+ compile: (e, t) => {
280
+ let n = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map();
281
+ for (let i of Object.keys(e)) {
282
+ let { get: a, set: o } = l(e[i]), s = t[i];
283
+ n.set(i, (e, t) => {
284
+ t[i] = a(e + s);
285
+ }), r.set(i, (e, t) => o(e + s, t[i]));
286
+ }
287
+ let i = [...n.values()], a = [...r.values()];
288
+ return {
289
+ read(e, t = {}, r) {
290
+ if (r) for (let i of r) n.get(i)(e, t);
291
+ else for (let n of i) n(e, t);
292
+ return t;
293
+ },
294
+ write(e, t, n) {
295
+ if (n) for (let i of n) r.get(i)(e, t);
296
+ else for (let n of a) n(e, t);
297
+ }
298
+ };
299
+ }
300
+ };
301
+ }
302
+ var k = (e, t, n) => {
303
+ let { schema: r, byteLength: i, kind: a } = e, o = e;
304
+ if (o.layout && o.offsets && o.recordSize !== void 0) {
305
+ let e = new Uint32Array(t.buffer, n, 2), a = n + 8, s = O(t).compile(o.layout, o.offsets);
306
+ return {
307
+ byteOffset: n,
308
+ byteLength: i,
309
+ read: () => e[0] ? s.read(a, {}) : void 0,
310
+ write: (t) => {
311
+ s.write(a, r ? r.parse(t) : t), e[0] = 1;
312
+ }
313
+ };
314
+ }
315
+ if (o.element !== void 0 && o.elementStride !== void 0 && o.capacity !== void 0) {
316
+ let e = new Uint32Array(t.buffer, n, 1), a = new Uint32Array(t.buffer, n + 4, 1), s = O(t).ops(o.element), c = o.elementStride, l = o.capacity, u = n + 8;
317
+ return {
318
+ byteOffset: n,
319
+ byteLength: i,
320
+ read: () => {
321
+ if (!e[0]) return;
322
+ let t = a[0];
323
+ return Array.from({ length: t }, (e, t) => s.get(u + t * c));
324
+ },
325
+ write: (t) => {
326
+ let n = r ? r.parse(t) : t;
327
+ if (n.length > l) throw Error(`${n.length} elements exceeds array capacity of ${l}`);
328
+ n.forEach((e, t) => s.set(u + t * c, e)), a[0] = n.length, e[0] = 1;
329
+ }
330
+ };
331
+ }
332
+ let s = i - 4, c = new Uint32Array(t.buffer, n, 1), l = (e) => {
333
+ if (e.byteLength > s) throw Error(`Encoded value of ${e.byteLength} bytes exceeds field capacity of ${s} bytes at offset ${n}`);
334
+ c[0] = e.byteLength, new Uint8Array(t.buffer, n + 4, e.byteLength).set(e);
335
+ }, u = () => new Uint8Array(t.buffer, n + 4, c[0]).slice();
336
+ return {
337
+ byteOffset: n,
338
+ byteLength: i,
339
+ read: () => {
340
+ let e = u();
341
+ if (e.byteLength === 0) return;
342
+ let n = t.codec.decode(e);
343
+ return r ? r.parse(n) : n;
344
+ },
345
+ write: (e) => l(t.codec.encode(r ? r.parse(e) : e))
346
+ };
347
+ };
348
+ x("object", k), x("array", k);
349
+ function A(e, t, n) {
350
+ let r = e, { offsets: i, recordSize: a, count: o } = r, l = O(t).compile(r.layout, i), u = (e) => {
351
+ if (e < 0 || e >= o) throw RangeError(`Record index ${e} out of bounds (0..${o - 1})`);
352
+ }, d = (e, t = {}, r) => (u(e), l.read(n + e * a, t, r)), f = (e, t, r) => {
353
+ u(e), l.write(n + e * a, t, r);
354
+ };
355
+ return {
356
+ byteOffset: n,
357
+ byteLength: e.byteLength,
358
+ recordCount: o,
359
+ recordSize: a,
360
+ readAt: d,
361
+ writeAt: f,
362
+ commit: () => {
363
+ if (t.version) {
364
+ let e = Atomics.add(t.version.view, t.version.index, 1);
365
+ Atomics.notify(t.version.view, t.version.index), t.path && s() && c({
366
+ type: "memory:write",
367
+ path: t.path,
368
+ version: e + 1
369
+ });
370
+ }
371
+ },
372
+ read: () => Array.from({ length: o }, (e, t) => d(t)),
373
+ write: (e) => {
374
+ if (e.length > o) throw Error(`${e.length} records exceeds list array capacity of ${o}`);
375
+ e.forEach((e, t) => f(t, e));
376
+ }
377
+ };
378
+ }
379
+ x("list", A);
380
+ var j = [];
381
+ function M(e) {
382
+ let t = {};
383
+ for (let [n, r] of Object.entries(e)) t[n] = h(r) ? N(r) : Object.fromEntries(Object.entries(r).map(([e, t]) => [e, N(t)]));
384
+ return t;
385
+ }
386
+ function N(e) {
387
+ if (e.schema) return e.schema;
388
+ switch (e.kind) {
389
+ case "number": return t(n.number());
390
+ case "boolean": return t(n.boolean());
391
+ case "string": return t(n.string());
392
+ case "Int32": return t(n.instanceof(Int32Array));
393
+ case "Float64": return t(n.instanceof(Float64Array));
394
+ case "BigInt64": return t(n.instanceof(BigInt64Array));
395
+ case "Uint8": return t(n.instanceof(Uint8Array));
396
+ default: return t(n.unknown());
397
+ }
398
+ }
399
+ var P = class {
400
+ totalBytes;
401
+ spec;
402
+ schemas;
403
+ codec;
404
+ plugins;
405
+ entries;
406
+ offsets = /* @__PURE__ */ new Map();
407
+ versionOffset;
408
+ connectors = /* @__PURE__ */ new Map();
409
+ boundListeners = /* @__PURE__ */ new Set();
410
+ isBound = !1;
411
+ boundBuffer;
412
+ constructor(t, n = {}) {
413
+ this.spec = t, this.codec = n.codec ?? e, this.plugins = n.plugins, this.entries = g(t), this.schemas = M(t);
414
+ let r = 0;
415
+ for (let { path: e, descriptor: t } of this.entries) r = m(r), this.offsets.set(e, r), r += t.byteLength;
416
+ this.versionOffset = m(r), this.totalBytes = this.versionOffset + m(this.entries.length * 4), j.push(this), d.info(`contract defined: ${this.entries.length} field(s), ${l(this.totalBytes)}`, {
417
+ fields: Object.fromEntries(this.entries.map((e) => [e.path, `${e.descriptor.kind}@${this.offsets.get(e.path)?.toLocaleString()}+${l(e.descriptor.byteLength)}`])),
418
+ pluginOverrides: Object.keys(this.plugins ?? {})
419
+ });
420
+ }
421
+ bind(e) {
422
+ this.connectors.clear();
423
+ let t = new Int32Array(e, this.versionOffset, this.entries.length);
424
+ this.entries.forEach(({ path: n, descriptor: r }, i) => {
425
+ let a = this.plugins?.[r.kind] ?? b.get(r.kind);
426
+ if (!a) throw Error(`Unknown shared memory field kind: ${r.kind}`);
427
+ d.debug(`bind "${n}" (${r.kind}, ${l(r.byteLength)}) via ${this.plugins?.[r.kind] ? "plugin" : "built-in"} factory`);
428
+ let o = a(r, {
429
+ buffer: e,
430
+ codec: this.codec,
431
+ version: {
432
+ view: t,
433
+ index: i
434
+ },
435
+ path: n
436
+ }, this.offsets.get(n));
437
+ this.connectors.set(n, {
438
+ ...o,
439
+ write: (e) => {
440
+ o.write(e);
441
+ let r = Atomics.add(t, i, 1);
442
+ Atomics.notify(t, i), s() && c({
443
+ type: "memory:write",
444
+ path: n,
445
+ version: r + 1
446
+ });
447
+ },
448
+ _version: {
449
+ view: t,
450
+ index: i
451
+ }
452
+ });
453
+ }), s() && c({
454
+ type: "memory:bind",
455
+ fields: this.entries.map((e, t) => [t, e.path]),
456
+ totalBytes: this.totalBytes
457
+ }), this.isBound = !0, this.boundBuffer = e;
458
+ for (let e of [...this.boundListeners]) e();
459
+ }
460
+ get bound() {
461
+ return this.isBound;
462
+ }
463
+ get buffer() {
464
+ if (!this.boundBuffer) throw Error("Shared memory contract is not bound to a buffer on this thread.");
465
+ return this.boundBuffer;
466
+ }
467
+ fields() {
468
+ return this.entries.map(({ path: e, descriptor: t }) => ({
469
+ path: e,
470
+ byteOffset: this.offsets.get(e),
471
+ byteLength: t.byteLength
472
+ }));
473
+ }
474
+ onBound(e) {
475
+ return this.isBound ? (e(), () => {}) : (this.boundListeners.add(e), () => this.boundListeners.delete(e));
476
+ }
477
+ connector(e) {
478
+ let t = String(e), n = this.connectors.get(t);
479
+ if (!n) throw Error(`Shared memory field "${t}" was accessed before the buffer was bound on this thread.`);
480
+ return n;
481
+ }
482
+ };
483
+ function F(e, t = {}) {
484
+ let n = new P(e, t);
485
+ for (let [t, r] of Object.entries(e)) if (h(r)) Object.defineProperty(n, t, {
486
+ enumerable: !0,
487
+ get: () => n.connector(t)
488
+ });
489
+ else {
490
+ let e = {};
491
+ for (let i of Object.keys(r)) Object.defineProperty(e, i, {
492
+ enumerable: !0,
493
+ get: () => n.connector(`${t}.${i}`)
494
+ });
495
+ Object.defineProperty(n, t, {
496
+ enumerable: !0,
497
+ get: () => e
498
+ });
499
+ }
500
+ return n;
501
+ }
502
+ function I(e) {
503
+ for (let t of j) t.bind(e);
504
+ d.info(`bound ${j.length} contract(s) — ${l(e.byteLength)} buffer`);
505
+ }
506
+ function L() {
507
+ return j.length;
508
+ }
20
509
  //#endregion
21
- export { r as reef };
510
+ export { P as SharedMemory, I as bindSharedMemories, F as defineSharedMemory, E as field, L as getDefinedSharedMemoryCount, y as jsonCodec, x as registerConnectorFactory };
package/dist/index8.js CHANGED
@@ -1,35 +1,21 @@
1
- //#region src/pool/memory.ts
2
- var e = class {
3
- memory;
4
- maxPages;
5
- constructor(e = {}) {
6
- let t = e.initialPages ?? 16;
7
- this.maxPages = e.maximumPages ?? 16384, this.memory = new WebAssembly.Memory({
8
- initial: t,
9
- maximum: this.maxPages,
10
- shared: !0
11
- });
12
- }
13
- ensureCapacity(e) {
14
- let t = this.memory.buffer.byteLength;
15
- if (t >= e) return;
16
- let n = e - t, r = Math.ceil(n / 65536);
17
- if (this.memory.buffer.byteLength / 65536 + r > this.maxPages) throw Error(`Cannot grow memory: exceeds maximum page limit of ${this.maxPages}`);
18
- this.memory.grow(r);
19
- }
20
- getView(e, t = 0, n) {
21
- let r = this.memory.buffer;
22
- switch (e) {
23
- case "Int32": return new Int32Array(r, t, n);
24
- case "Float64": return new Float64Array(r, t, n);
25
- case "BigInt64": return new BigInt64Array(r, t, n);
26
- case "Uint8": return new Uint8Array(r, t, n);
27
- default: throw Error(`Unsupported view type: ${e}`);
28
- }
29
- }
30
- getBuffer() {
31
- return this.memory.buffer;
32
- }
1
+ import { fluent as e, z as t } from "./index3.js";
2
+ //#region src/contract/reef.ts
3
+ var n = new TextEncoder(), r = {
4
+ i8: () => e(t.number().check(t.int(), t.gte(-128), t.lte(127))),
5
+ u8: () => e(t.number().check(t.int(), t.gte(0), t.lte(255))),
6
+ i16: () => e(t.number().check(t.int(), t.gte(-32768), t.lte(32767))),
7
+ u16: () => e(t.number().check(t.int(), t.gte(0), t.lte(65535))),
8
+ i32: () => e(t.int32()),
9
+ u32: () => e(t.uint32()),
10
+ f32: () => e(t.float32()),
11
+ f64: () => e(t.float64()),
12
+ i64: () => e(t.int64()),
13
+ u64: () => e(t.uint64()),
14
+ int: (n, r) => e(t.number().check(t.int(), t.gte(n), t.lte(r))),
15
+ boolean: () => e(t.boolean()),
16
+ string: (r) => e(t.string().check(t.refine((e) => n.encode(e).byteLength <= r, `exceeds ${r} UTF-8 bytes`)).register(t.globalRegistry, { bytes: r })),
17
+ object: (n) => e(t.object(n)),
18
+ array: (n) => e(t.array(n))
33
19
  };
34
20
  //#endregion
35
- export { e as MemoryManager };
21
+ export { r as reef };
package/dist/index9.js CHANGED
@@ -1,20 +1,35 @@
1
- //#region src/pool/errors.ts
2
- var e = class extends Error {
3
- constructor(e = "WorkerPool task queue is full") {
4
- super(e), this.name = "PoolQueueFullError";
1
+ //#region src/pool/memory.ts
2
+ var e = class {
3
+ memory;
4
+ maxPages;
5
+ constructor(e = {}) {
6
+ let t = e.initialPages ?? 16;
7
+ this.maxPages = e.maximumPages ?? 16384, this.memory = new WebAssembly.Memory({
8
+ initial: t,
9
+ maximum: this.maxPages,
10
+ shared: !0
11
+ });
5
12
  }
6
- }, t = class extends Error {
7
- constructor(e = "task aborted") {
8
- super(e), this.name = "AbortError";
13
+ ensureCapacity(e) {
14
+ let t = this.memory.buffer.byteLength;
15
+ if (t >= e) return;
16
+ let n = e - t, r = Math.ceil(n / 65536);
17
+ if (this.memory.buffer.byteLength / 65536 + r > this.maxPages) throw Error(`Cannot grow memory: exceeds maximum page limit of ${this.maxPages}`);
18
+ this.memory.grow(r);
9
19
  }
10
- }, n = class extends Error {
11
- constructor(e = "task timed out") {
12
- super(e), this.name = "TaskTimeoutError";
20
+ getView(e, t = 0, n) {
21
+ let r = this.memory.buffer;
22
+ switch (e) {
23
+ case "Int32": return new Int32Array(r, t, n);
24
+ case "Float64": return new Float64Array(r, t, n);
25
+ case "BigInt64": return new BigInt64Array(r, t, n);
26
+ case "Uint8": return new Uint8Array(r, t, n);
27
+ default: throw Error(`Unsupported view type: ${e}`);
28
+ }
13
29
  }
14
- }, r = class extends Error {
15
- constructor(e = "worker crashed") {
16
- super(e), this.name = "WorkerCrashedError";
30
+ getBuffer() {
31
+ return this.memory.buffer;
17
32
  }
18
33
  };
19
34
  //#endregion
20
- export { e as PoolQueueFullError, t as TaskAbortedError, n as TaskTimeoutError, r as WorkerCrashedError };
35
+ export { e as MemoryManager };
@@ -37,6 +37,8 @@ export interface ConnectWorkerConfig<S extends SharedSpec> {
37
37
  */
38
38
  worker: (() => Worker) | URL;
39
39
  poolSize?: number | 'auto';
40
+ /** Display label for devtools/dashboards — falls back to a generated id. */
41
+ name?: string;
40
42
  memory?: MemoryConfig;
41
43
  /** Max in-flight tasks per worker (default 1); excess calls queue FIFO. */
42
44
  concurrency?: number;
@@ -52,6 +52,10 @@ declare class WorkerPoolImpl<S extends SharedSpec = SharedSpec> {
52
52
  private closed;
53
53
  private drainWaiters;
54
54
  private statsAgg;
55
+ /** Devtools correlation id ('pool-N') — stamped on every event this pool emits. */
56
+ readonly poolId: string;
57
+ private readonly label?;
58
+ private nextCallId;
55
59
  readonly sharedMemory: (SharedMemory<S> & SharedAccess<S>) | undefined;
56
60
  /** The attached memory-persistence adapter, if the config supplied one. */
57
61
  readonly persistence: MemoryPersistence | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atolljs/core",
3
- "version": "0.1.6",
3
+ "version": "0.1.7",
4
4
  "description": "Typed shared-memory worker pools — defineWorker/connectWorker, SharedArrayBuffer contracts, cross-thread reactivity",
5
5
  "homepage": "https://jwhenry3.github.io/atolljs/consumer/quickstart/",
6
6
  "type": "module",