@almadar/shell-runtime 0.0.0-stage → 1.0.0
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/chunk-4SEK5ER2.js +8 -0
- package/dist/chunk-57SBCUSM.js +62 -0
- package/dist/chunk-625EP7W2.js +108 -0
- package/dist/chunk-64IH2SMY.js +22 -0
- package/dist/chunk-7SDV3QWR.js +67 -0
- package/dist/chunk-7WB6VWRK.js +798 -0
- package/dist/chunk-A2JJT4GA.js +56 -0
- package/dist/chunk-BAS26HBN.js +10 -0
- package/dist/chunk-BOVU4TCQ.js +65 -0
- package/dist/chunk-BY5G4225.js +6 -0
- package/dist/chunk-DFDNHVDW.js +284 -0
- package/dist/chunk-ELBLT2HZ.js +1 -0
- package/dist/chunk-EZZYLTWY.js +1 -0
- package/dist/chunk-FWA5K7Q2.js +48 -0
- package/dist/chunk-HC6ERSAH.js +55 -0
- package/dist/chunk-HLOUDLPI.js +48 -0
- package/dist/chunk-I3TKINSO.js +398 -0
- package/dist/chunk-IOPUS6Q5.js +15 -0
- package/dist/chunk-LKWYCYX5.js +22 -0
- package/dist/chunk-LYFIQPXX.js +1 -0
- package/dist/chunk-LZIOTBFX.js +1 -0
- package/dist/chunk-MU335ZA4.js +63 -0
- package/dist/chunk-MZKIL5IN.js +74 -0
- package/dist/chunk-N7HYNKK6.js +83 -0
- package/dist/chunk-NTFQ36UN.js +52 -0
- package/dist/chunk-NU6LVKGS.js +15 -0
- package/dist/chunk-O57GKTYU.js +30 -0
- package/dist/chunk-P2N6K2IV.js +20 -0
- package/dist/chunk-P53CKOME.js +1 -0
- package/dist/chunk-QCJWPXLH.js +40 -0
- package/dist/chunk-SKLMWHQD.js +109 -0
- package/dist/chunk-SOQDEPME.js +131 -0
- package/dist/chunk-UBN5JJKZ.js +26 -0
- package/dist/chunk-UD2CXYSJ.js +244 -0
- package/dist/chunk-UP6GGGAN.js +34 -0
- package/dist/chunk-V4EMDPCO.js +33 -0
- package/dist/chunk-VNGXRYFF.js +9 -0
- package/dist/chunk-WGCWJOT2.js +21 -0
- package/dist/chunk-X6W44WHO.js +26 -0
- package/dist/chunk-XXWNMJI6.js +15 -0
- package/dist/chunk-ZUSM4VW4.js +197 -0
- package/dist/client/EventTransport.d.ts +147 -0
- package/dist/client/EventTransport.js +1 -0
- package/dist/client/awaiting.d.ts +28 -0
- package/dist/client/awaiting.js +1 -0
- package/dist/client/channel-transport.d.ts +69 -0
- package/dist/client/channel-transport.js +1 -0
- package/dist/client/circuit-store.d.ts +87 -0
- package/dist/client/circuit-store.js +3 -0
- package/dist/client/client-kernel.d.ts +134 -0
- package/dist/client/client-kernel.js +1 -0
- package/dist/client/declared-input-dispatch.d.ts +22 -0
- package/dist/client/declared-input-dispatch.js +1 -0
- package/dist/client/inbound-dispatch.d.ts +24 -0
- package/dist/client/inbound-dispatch.js +1 -0
- package/dist/client/local-fold.d.ts +33 -0
- package/dist/client/local-fold.js +1 -0
- package/dist/client/render-sigils.d.ts +24 -0
- package/dist/client/render-sigils.js +1 -0
- package/dist/client/state-book.d.ts +30 -0
- package/dist/client/state-book.js +1 -0
- package/dist/client/trait-mount-error.d.ts +9 -0
- package/dist/client/trait-mount-error.js +1 -0
- package/dist/client/trait-types.d.ts +67 -0
- package/dist/client/trait-types.js +1 -0
- package/dist/credentials/env-vars.d.ts +18 -0
- package/dist/credentials/env-vars.js +1 -0
- package/dist/credentials/scope.d.ts +51 -0
- package/dist/credentials/scope.js +1 -0
- package/dist/credentials/vault.d.ts +142 -0
- package/dist/credentials/vault.js +1 -0
- package/dist/effects/in-flight-calls.d.ts +36 -0
- package/dist/effects/in-flight-calls.js +1 -0
- package/dist/effects/on-device-model.d.ts +22 -0
- package/dist/effects/on-device-model.js +1 -0
- package/dist/events/EventBus.d.ts +87 -0
- package/dist/events/EventBus.js +1 -0
- package/dist/events/emit-stamp.d.ts +47 -0
- package/dist/events/emit-stamp.js +1 -0
- package/dist/index.d.ts +43 -0
- package/dist/index.js +41 -0
- package/dist/kernel/decode.d.ts +13 -0
- package/dist/kernel/decode.js +1 -0
- package/dist/kernel/engine.d.ts +195 -0
- package/dist/kernel/engine.js +9 -0
- package/dist/kernel/frame-applier.d.ts +44 -0
- package/dist/kernel/frame-applier.js +1 -0
- package/dist/kernel/host.d.ts +206 -0
- package/dist/kernel/host.js +6 -0
- package/dist/kernel/lane.d.ts +7 -0
- package/dist/kernel/lane.js +1 -0
- package/dist/kernel/os-fetch-port.d.ts +7 -0
- package/dist/kernel/os-fetch-port.js +3 -0
- package/dist/kernel/os-port.d.ts +155 -0
- package/dist/kernel/os-port.js +1 -0
- package/dist/kernel/program-effects.d.ts +48 -0
- package/dist/kernel/program-effects.js +1 -0
- package/dist/kernel/secret-ports.d.ts +139 -0
- package/dist/kernel/secret-ports.js +2 -0
- package/dist/kernel/wire.d.ts +104 -0
- package/dist/kernel/wire.js +1 -0
- package/dist/loader/fetch-loader.d.ts +26 -0
- package/dist/loader/fetch-loader.js +1 -0
- package/dist/loader/lazy-page.d.ts +12 -0
- package/dist/loader/lazy-page.js +1 -0
- package/dist/loader/schema-loader.d.ts +144 -0
- package/dist/loader/schema-loader.js +1 -0
- package/dist/persistence/native-memory.d.ts +28 -0
- package/dist/persistence/native-memory.js +1 -0
- package/dist/runtime/entities/declaredCollections.d.ts +6 -0
- package/dist/runtime/entities/declaredCollections.js +1 -0
- package/dist/runtime/evaluation/local-store-transport.d.ts +59 -0
- package/dist/runtime/evaluation/local-store-transport.js +14 -0
- package/dist/runtime/evaluation/residence-transport.d.ts +15 -0
- package/dist/runtime/evaluation/residence-transport.js +1 -0
- package/dist/runtime/evaluation/routed-persistence.d.ts +9 -0
- package/dist/runtime/evaluation/routed-persistence.js +1 -0
- package/dist/runtime/events/identity/routing.d.ts +33 -0
- package/dist/runtime/events/identity/routing.js +1 -0
- package/dist/runtime/types.d.ts +374 -0
- package/dist/runtime/types.js +1 -0
- package/dist/service/default-call-service.d.ts +23 -0
- package/dist/service/default-call-service.js +2 -0
- package/dist/service/service-provider.d.ts +37 -0
- package/dist/service/service-provider.js +1 -0
- package/package.json +49 -3
- package/README.md +0 -3
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { callRegisteredService } from './chunk-UBN5JJKZ.js';
|
|
2
|
+
|
|
3
|
+
// src/service/default-call-service.ts
|
|
4
|
+
function defaultCallService(service, action, params, context) {
|
|
5
|
+
return callRegisteredService(service, action, params, context);
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export { defaultCallService };
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
// src/loader/fetch-loader.ts
|
|
2
|
+
var FetchSchemaLoader = class {
|
|
3
|
+
/** `base`: the URL relative imports resolve against when no importer is named (the page's own URL by default). */
|
|
4
|
+
constructor(base) {
|
|
5
|
+
this.base = base;
|
|
6
|
+
}
|
|
7
|
+
base;
|
|
8
|
+
cache = /* @__PURE__ */ new Map();
|
|
9
|
+
resolvePath(importPath, fromPath) {
|
|
10
|
+
try {
|
|
11
|
+
return { success: true, data: new URL(importPath, new URL(fromPath ?? this.base, this.base)).href };
|
|
12
|
+
} catch (error) {
|
|
13
|
+
return { success: false, error: `Cannot resolve ${importPath}${fromPath !== void 0 ? ` from ${fromPath}` : ""}: ${error instanceof Error ? error.message : String(error)}` };
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
load(importPath, fromPath) {
|
|
17
|
+
const resolved = this.resolvePath(importPath, fromPath);
|
|
18
|
+
if (!resolved.success) return Promise.resolve(resolved);
|
|
19
|
+
const url = resolved.data;
|
|
20
|
+
const held = this.cache.get(url);
|
|
21
|
+
if (held !== void 0) return held;
|
|
22
|
+
const loading = fetchSchema(url, importPath);
|
|
23
|
+
loading.then((result) => {
|
|
24
|
+
if (!result.success) this.cache.delete(url);
|
|
25
|
+
}, () => this.cache.delete(url));
|
|
26
|
+
this.cache.set(url, loading);
|
|
27
|
+
return loading;
|
|
28
|
+
}
|
|
29
|
+
async loadOrbital(importPath, orbitalName, fromPath) {
|
|
30
|
+
const loaded = await this.load(importPath, fromPath);
|
|
31
|
+
if (!loaded.success) return loaded;
|
|
32
|
+
const { schema, sourcePath } = loaded.data;
|
|
33
|
+
const orbital = orbitalName === void 0 ? schema.orbitals[0] : schema.orbitals.find((o) => o.name === orbitalName);
|
|
34
|
+
if (orbital === void 0) {
|
|
35
|
+
return { success: false, error: `${sourcePath} has no orbital ${orbitalName ?? "(none)"}; found: ${schema.orbitals.map((o) => o.name).join(", ")}` };
|
|
36
|
+
}
|
|
37
|
+
return { success: true, data: { orbital, orbitals: schema.orbitals, sourcePath, importPath } };
|
|
38
|
+
}
|
|
39
|
+
clearCache() {
|
|
40
|
+
this.cache.clear();
|
|
41
|
+
}
|
|
42
|
+
getCacheStats() {
|
|
43
|
+
return { size: this.cache.size };
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
async function fetchSchema(url, importPath) {
|
|
47
|
+
let response;
|
|
48
|
+
try {
|
|
49
|
+
response = await fetch(url);
|
|
50
|
+
} catch (error) {
|
|
51
|
+
return { success: false, error: `${url}: ${error instanceof Error ? error.message : String(error)}` };
|
|
52
|
+
}
|
|
53
|
+
if (!response.ok) return { success: false, error: `${url}: ${response.status} ${response.statusText}` };
|
|
54
|
+
try {
|
|
55
|
+
const schema = await response.json();
|
|
56
|
+
return { success: true, data: { schema, sourcePath: url, importPath } };
|
|
57
|
+
} catch (error) {
|
|
58
|
+
return { success: false, error: `${url} is not a program: ${error instanceof Error ? error.message : String(error)}` };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export { FetchSchemaLoader };
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { base64Standard } from './chunk-ZUSM4VW4.js';
|
|
2
|
+
|
|
3
|
+
// src/kernel/os-fetch-port.ts
|
|
4
|
+
var isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
|
|
5
|
+
var fail = (kind, message) => ({ error: { kind, message: `os/fetch: ${message}` } });
|
|
6
|
+
function bytesOf(base64) {
|
|
7
|
+
const text = atob(base64);
|
|
8
|
+
const bytes = new Uint8Array(text.length);
|
|
9
|
+
for (let i = 0; i < text.length; i += 1) bytes[i] = text.charCodeAt(i);
|
|
10
|
+
return bytes;
|
|
11
|
+
}
|
|
12
|
+
function headersOf(value) {
|
|
13
|
+
const headers = new Headers();
|
|
14
|
+
if (value === void 0) return headers;
|
|
15
|
+
if (!Array.isArray(value)) return "headers must be a list of { name, value }";
|
|
16
|
+
for (const header of value) {
|
|
17
|
+
if (!isRecord(header) || typeof header.name !== "string" || typeof header.value !== "string") return "headers must be a list of { name, value }";
|
|
18
|
+
headers.append(header.name, header.value);
|
|
19
|
+
}
|
|
20
|
+
return headers;
|
|
21
|
+
}
|
|
22
|
+
var failed = (kind, op, message) => ({ error: { kind, message: `${op}: ${message}` } });
|
|
23
|
+
function createFetchOsHost(performFetch) {
|
|
24
|
+
const pending = /* @__PURE__ */ new Set();
|
|
25
|
+
const bodies = /* @__PURE__ */ new Map();
|
|
26
|
+
let nextHandle = 1;
|
|
27
|
+
const openOf = (op, handle) => {
|
|
28
|
+
const open = typeof handle === "number" ? bodies.get(handle) : void 0;
|
|
29
|
+
return open ?? failed("closed", op, "the handle is not an open streamed response");
|
|
30
|
+
};
|
|
31
|
+
async function receive(args) {
|
|
32
|
+
const open = openOf("os/recv", args[0]);
|
|
33
|
+
if (!("reader" in open)) return open;
|
|
34
|
+
const count = args[1];
|
|
35
|
+
if (typeof count !== "number" || !Number.isInteger(count) || count < 1) return failed("invalid", "os/recv", "the count must be a positive integer");
|
|
36
|
+
try {
|
|
37
|
+
if (open.held.length === 0) {
|
|
38
|
+
const next = await open.reader.read();
|
|
39
|
+
if (next.done) return { ok: { data: base64Standard(new Uint8Array(0)), eof: true } };
|
|
40
|
+
open.held = next.value;
|
|
41
|
+
}
|
|
42
|
+
const data = open.held.subarray(0, count);
|
|
43
|
+
open.held = open.held.subarray(count);
|
|
44
|
+
return { ok: { data: base64Standard(data), eof: false } };
|
|
45
|
+
} catch (raised) {
|
|
46
|
+
return failed("io", "os/recv", raised instanceof Error ? raised.message : "the response body failed");
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function release(args) {
|
|
50
|
+
const open = openOf("os/close", args[0]);
|
|
51
|
+
if (!("reader" in open)) return open;
|
|
52
|
+
if (typeof args[0] === "number") bodies.delete(args[0]);
|
|
53
|
+
pending.delete(open.control);
|
|
54
|
+
open.control.abort();
|
|
55
|
+
await open.reader.cancel().catch(() => void 0);
|
|
56
|
+
return { ok: {} };
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
async answer(op, args) {
|
|
60
|
+
if (op === "os/recv") return receive(args);
|
|
61
|
+
if (op === "os/close") return release(args);
|
|
62
|
+
if (op !== "os/fetch") return { error: { kind: "unsupported", message: `${op}: a browser host answers only os/fetch, and os/recv and os/close on the handle of a streamed one` } };
|
|
63
|
+
const [method, url, request] = args;
|
|
64
|
+
if (typeof method !== "string" || typeof url !== "string") return fail("invalid", "the method and the url must be text");
|
|
65
|
+
if (request !== void 0 && !isRecord(request)) return fail("invalid", "the request must be { headers?, body?, timeoutMs?, stream? }");
|
|
66
|
+
const headers = headersOf(request?.headers);
|
|
67
|
+
if (typeof headers === "string") return fail("invalid", headers);
|
|
68
|
+
const body = request?.body;
|
|
69
|
+
if (body !== void 0 && typeof body !== "string") return fail("invalid", "the body must be bytes");
|
|
70
|
+
const timeoutMs = request?.timeoutMs;
|
|
71
|
+
if (timeoutMs !== void 0 && (typeof timeoutMs !== "number" || !(timeoutMs > 0))) return fail("invalid", "timeoutMs must be a positive number");
|
|
72
|
+
const stream = request?.stream;
|
|
73
|
+
if (stream !== void 0 && typeof stream !== "boolean") return fail("invalid", "stream must be a boolean");
|
|
74
|
+
const control = new AbortController();
|
|
75
|
+
pending.add(control);
|
|
76
|
+
const timer = typeof timeoutMs === "number" ? setTimeout(() => control.abort(), timeoutMs) : void 0;
|
|
77
|
+
let kept = false;
|
|
78
|
+
try {
|
|
79
|
+
const response = await performFetch(url, { method, headers, signal: control.signal, ...body !== void 0 ? { body: bytesOf(body) } : {} });
|
|
80
|
+
const received = [];
|
|
81
|
+
response.headers.forEach((value, name) => received.push({ name, value }));
|
|
82
|
+
if (stream === true) {
|
|
83
|
+
const handle = nextHandle;
|
|
84
|
+
nextHandle += 1;
|
|
85
|
+
const reader = (response.body ?? new ReadableStream({ start: (sink) => sink.close() })).getReader();
|
|
86
|
+
bodies.set(handle, { reader, control, held: new Uint8Array(0) });
|
|
87
|
+
kept = true;
|
|
88
|
+
return { ok: { status: response.status, headers: received, body: base64Standard(new Uint8Array(0)), handle } };
|
|
89
|
+
}
|
|
90
|
+
return { ok: { status: response.status, headers: received, body: base64Standard(new Uint8Array(await response.arrayBuffer())) } };
|
|
91
|
+
} catch (raised) {
|
|
92
|
+
if (control.signal.aborted) return fail("timeout", `no answer within ${String(timeoutMs)} ms`);
|
|
93
|
+
return fail("io", raised instanceof Error ? raised.message : "the fetch failed");
|
|
94
|
+
} finally {
|
|
95
|
+
if (timer !== void 0) clearTimeout(timer);
|
|
96
|
+
if (!kept) pending.delete(control);
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
close() {
|
|
100
|
+
for (const control of pending) control.abort();
|
|
101
|
+
pending.clear();
|
|
102
|
+
for (const open of bodies.values()) void open.reader.cancel().catch(() => void 0);
|
|
103
|
+
bodies.clear();
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
export { createFetchOsHost };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
// src/events/emit-stamp.ts
|
|
2
|
+
function stampEmitSource(source, identity) {
|
|
3
|
+
const stamp = source ?? {
|
|
4
|
+
orbital: identity.orbitalName,
|
|
5
|
+
trait: identity.traitName
|
|
6
|
+
};
|
|
7
|
+
if (stamp.orbitalId === void 0 && identity.orbitalId !== void 0) {
|
|
8
|
+
stamp.orbitalId = identity.orbitalId;
|
|
9
|
+
}
|
|
10
|
+
if (stamp.traitId === void 0 && identity.traitId !== void 0) {
|
|
11
|
+
stamp.traitId = identity.traitId;
|
|
12
|
+
}
|
|
13
|
+
if (stamp.eventId === void 0 && identity.emitContractEventId !== void 0) {
|
|
14
|
+
stamp.eventId = identity.emitContractEventId;
|
|
15
|
+
}
|
|
16
|
+
if (identity.originClientId !== void 0 && stamp.originClientId === void 0) {
|
|
17
|
+
stamp.originClientId = identity.originClientId;
|
|
18
|
+
}
|
|
19
|
+
return stamp;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export { stampEmitSource };
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { EntityRowSchema, RowWriteOutcomeSchema, RowQueryPageSchema, RowIdPageSchema, QueryCapabilitiesSchema, WriteCapabilitiesSchema, JsonValueSchema, isJsonObject } from '@almadar/core';
|
|
2
|
+
|
|
3
|
+
// src/persistence/native-memory.ts
|
|
4
|
+
var NativeMemoryWriteError = class extends Error {
|
|
5
|
+
constructor(outcome) {
|
|
6
|
+
super(`native memory update failed: ${outcome.kind}`);
|
|
7
|
+
this.outcome = outcome;
|
|
8
|
+
this.name = "NativeMemoryWriteError";
|
|
9
|
+
}
|
|
10
|
+
outcome;
|
|
11
|
+
};
|
|
12
|
+
var NativeMemoryPersistenceAdapter = class {
|
|
13
|
+
constructor(store) {
|
|
14
|
+
this.store = store;
|
|
15
|
+
}
|
|
16
|
+
store;
|
|
17
|
+
async getById(entityType, id) {
|
|
18
|
+
return EntityRowSchema.nullable().parse(JSON.parse(this.store.getById(entityType, id)));
|
|
19
|
+
}
|
|
20
|
+
async list(entityType) {
|
|
21
|
+
return EntityRowSchema.array().parse(JSON.parse(this.store.list(entityType)));
|
|
22
|
+
}
|
|
23
|
+
// The kernel's plain create merges a supplied existing id; writeWhere exposes strict create and replacement upsert.
|
|
24
|
+
async create(entityType, data) {
|
|
25
|
+
const row = EntityRowSchema.parse(JSON.parse(this.store.create(entityType, JSON.stringify(data))));
|
|
26
|
+
if (typeof row.id !== "string") throw new Error("native memory create returned a row without an id");
|
|
27
|
+
return { id: row.id };
|
|
28
|
+
}
|
|
29
|
+
async update(entityType, id, data) {
|
|
30
|
+
const outcome = RowWriteOutcomeSchema.parse(JSON.parse(this.store.update(entityType, id, JSON.stringify(data))));
|
|
31
|
+
if (outcome.kind !== "updated") throw new NativeMemoryWriteError(outcome);
|
|
32
|
+
}
|
|
33
|
+
async delete(entityType, id) {
|
|
34
|
+
this.store.delete(entityType, id);
|
|
35
|
+
}
|
|
36
|
+
async queryPage(entityType, query) {
|
|
37
|
+
return RowQueryPageSchema.parse(JSON.parse(this.store.queryPage(entityType, JSON.stringify(query))));
|
|
38
|
+
}
|
|
39
|
+
async queryIds(entityType, query) {
|
|
40
|
+
return RowIdPageSchema.parse(JSON.parse(this.store.queryIds(entityType, JSON.stringify(query))));
|
|
41
|
+
}
|
|
42
|
+
queryCapabilities(_entityType) {
|
|
43
|
+
return QueryCapabilitiesSchema.parse(JSON.parse(this.store.queryCapabilities()));
|
|
44
|
+
}
|
|
45
|
+
async writeWhere(op) {
|
|
46
|
+
return RowWriteOutcomeSchema.parse(JSON.parse(this.store.writeWhere(JSON.stringify(op))));
|
|
47
|
+
}
|
|
48
|
+
async writeBatch(batch) {
|
|
49
|
+
return RowWriteOutcomeSchema.array().parse(JSON.parse(this.store.writeBatch(JSON.stringify(batch))));
|
|
50
|
+
}
|
|
51
|
+
writeCapabilities(_entityType) {
|
|
52
|
+
return WriteCapabilitiesSchema.parse(JSON.parse(this.store.writeCapabilities()));
|
|
53
|
+
}
|
|
54
|
+
bindCollection(entityType, collection) {
|
|
55
|
+
this.store.bindCollection(entityType, collection);
|
|
56
|
+
}
|
|
57
|
+
clear() {
|
|
58
|
+
this.store.clear();
|
|
59
|
+
}
|
|
60
|
+
snapshot() {
|
|
61
|
+
const value = JsonValueSchema.parse(JSON.parse(this.store.snapshot()));
|
|
62
|
+
if (!isJsonObject(value)) throw new Error("native memory snapshot returned a non-object");
|
|
63
|
+
return Object.fromEntries(Object.entries(value).map(([key, rows]) => [key, EntityRowSchema.array().parse(rows)]));
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export { NativeMemoryPersistenceAdapter, NativeMemoryWriteError };
|