@superbee/core 0.1.6 → 0.2.0-pre.10
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 +127 -0
- package/dist/artifact-contract.d.ts +90 -0
- package/dist/artifact-contract.d.ts.map +1 -0
- package/dist/artifact-contract.js +205 -0
- package/dist/artifact-contract.js.map +1 -0
- package/dist/backend.d.ts +16 -1
- package/dist/backend.d.ts.map +1 -1
- package/dist/backend.js +112 -47
- package/dist/backend.js.map +1 -1
- package/dist/bundle-ops.d.ts +42 -0
- package/dist/bundle-ops.d.ts.map +1 -0
- package/dist/bundle-ops.js +88 -0
- package/dist/bundle-ops.js.map +1 -0
- package/dist/bundle.d.ts +10 -28
- package/dist/bundle.d.ts.map +1 -1
- package/dist/bundle.js +12 -69
- package/dist/bundle.js.map +1 -1
- package/dist/document-codec.d.ts +6 -1
- package/dist/document-codec.d.ts.map +1 -1
- package/dist/document-codec.js +8 -4
- package/dist/document-codec.js.map +1 -1
- package/dist/document-field-actions.d.ts +107 -0
- package/dist/document-field-actions.d.ts.map +1 -0
- package/dist/document-field-actions.js +302 -0
- package/dist/document-field-actions.js.map +1 -0
- package/dist/document-mutation.d.ts +61 -3
- package/dist/document-mutation.d.ts.map +1 -1
- package/dist/document-mutation.js +116 -25
- package/dist/document-mutation.js.map +1 -1
- package/dist/document-write-policy.d.ts +0 -1
- package/dist/document-write-policy.d.ts.map +1 -1
- package/dist/document-write-policy.js +7 -4
- package/dist/document-write-policy.js.map +1 -1
- package/dist/engine.d.ts +3 -1
- package/dist/engine.d.ts.map +1 -1
- package/dist/engine.js +6 -4
- package/dist/engine.js.map +1 -1
- package/dist/file-journaled-backend-internal.d.ts +19 -0
- package/dist/file-journaled-backend-internal.d.ts.map +1 -0
- package/dist/file-journaled-backend-internal.js +10 -0
- package/dist/file-journaled-backend-internal.js.map +1 -0
- package/dist/file-journaled-backend.d.ts +162 -0
- package/dist/file-journaled-backend.d.ts.map +1 -0
- package/dist/file-journaled-backend.js +1113 -0
- package/dist/file-journaled-backend.js.map +1 -0
- package/dist/filesystem-host.d.ts +15 -0
- package/dist/filesystem-host.d.ts.map +1 -0
- package/dist/filesystem-host.js +20 -0
- package/dist/filesystem-host.js.map +1 -0
- package/dist/filesystem-identity.d.ts +86 -4
- package/dist/filesystem-identity.d.ts.map +1 -1
- package/dist/filesystem-identity.js +338 -102
- package/dist/filesystem-identity.js.map +1 -1
- package/dist/filesystem-lock.d.ts +16 -3
- package/dist/filesystem-lock.d.ts.map +1 -1
- package/dist/filesystem-lock.js +323 -77
- package/dist/filesystem-lock.js.map +1 -1
- package/dist/filesystem-push-role.d.ts +77 -0
- package/dist/filesystem-push-role.d.ts.map +1 -0
- package/dist/filesystem-push-role.js +165 -0
- package/dist/filesystem-push-role.js.map +1 -0
- package/dist/filesystem.d.ts +17 -0
- package/dist/filesystem.d.ts.map +1 -0
- package/dist/filesystem.js +18 -0
- package/dist/filesystem.js.map +1 -0
- package/dist/freshness.d.ts +10 -7
- package/dist/freshness.d.ts.map +1 -1
- package/dist/freshness.js +14 -11
- package/dist/freshness.js.map +1 -1
- package/dist/frontmatter-contract.d.ts +2 -2
- package/dist/frontmatter-contract.js +2 -2
- package/dist/frontmatter.d.ts +11 -1
- package/dist/frontmatter.d.ts.map +1 -1
- package/dist/frontmatter.js +20 -7
- package/dist/frontmatter.js.map +1 -1
- package/dist/governed-body-write.d.ts +106 -0
- package/dist/governed-body-write.d.ts.map +1 -0
- package/dist/governed-body-write.js +251 -0
- package/dist/governed-body-write.js.map +1 -0
- package/dist/heads-digest.d.ts +32 -0
- package/dist/heads-digest.d.ts.map +1 -0
- package/dist/heads-digest.js +37 -0
- package/dist/heads-digest.js.map +1 -0
- package/dist/host-policy-snapshot.d.ts +9 -0
- package/dist/host-policy-snapshot.d.ts.map +1 -0
- package/dist/host-policy-snapshot.js +33 -0
- package/dist/host-policy-snapshot.js.map +1 -0
- package/dist/host-text.d.ts +31 -0
- package/dist/host-text.d.ts.map +1 -0
- package/dist/host-text.js +77 -0
- package/dist/host-text.js.map +1 -0
- package/dist/hosted-transport/answer-rows.d.ts +216 -0
- package/dist/hosted-transport/answer-rows.d.ts.map +1 -0
- package/dist/hosted-transport/answer-rows.js +396 -0
- package/dist/hosted-transport/answer-rows.js.map +1 -0
- package/dist/hosted-transport/carrier.d.ts +142 -0
- package/dist/hosted-transport/carrier.d.ts.map +1 -0
- package/dist/hosted-transport/carrier.js +241 -0
- package/dist/hosted-transport/carrier.js.map +1 -0
- package/dist/hosted-transport/history-pages.d.ts +55 -0
- package/dist/hosted-transport/history-pages.d.ts.map +1 -0
- package/dist/hosted-transport/history-pages.js +69 -0
- package/dist/hosted-transport/history-pages.js.map +1 -0
- package/dist/hosted-transport/index.d.ts +18 -0
- package/dist/hosted-transport/index.d.ts.map +1 -0
- package/dist/hosted-transport/index.js +18 -0
- package/dist/hosted-transport/index.js.map +1 -0
- package/dist/hosted-transport/operations.d.ts +85 -0
- package/dist/hosted-transport/operations.d.ts.map +1 -0
- package/dist/hosted-transport/operations.js +128 -0
- package/dist/hosted-transport/operations.js.map +1 -0
- package/dist/hosted-transport/paged-reads.d.ts +87 -0
- package/dist/hosted-transport/paged-reads.d.ts.map +1 -0
- package/dist/hosted-transport/paged-reads.js +238 -0
- package/dist/hosted-transport/paged-reads.js.map +1 -0
- package/dist/hosted-transport/read-adapter.d.ts +250 -0
- package/dist/hosted-transport/read-adapter.d.ts.map +1 -0
- package/dist/hosted-transport/read-adapter.js +557 -0
- package/dist/hosted-transport/read-adapter.js.map +1 -0
- package/dist/hosted-transport/root-write.d.ts +114 -0
- package/dist/hosted-transport/root-write.d.ts.map +1 -0
- package/dist/hosted-transport/root-write.js +171 -0
- package/dist/hosted-transport/root-write.js.map +1 -0
- package/dist/hosted-transport/whole-document-transport.d.ts +174 -0
- package/dist/hosted-transport/whole-document-transport.d.ts.map +1 -0
- package/dist/hosted-transport/whole-document-transport.js +411 -0
- package/dist/hosted-transport/whole-document-transport.js.map +1 -0
- package/dist/index.d.ts +29 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +26 -6
- package/dist/index.js.map +1 -1
- package/dist/indexeddb-backend.d.ts +197 -0
- package/dist/indexeddb-backend.d.ts.map +1 -0
- package/dist/indexeddb-backend.js +1183 -0
- package/dist/indexeddb-backend.js.map +1 -0
- package/dist/journaled-backend.d.ts +467 -0
- package/dist/journaled-backend.d.ts.map +1 -0
- package/dist/journaled-backend.js +389 -0
- package/dist/journaled-backend.js.map +1 -0
- package/dist/kind-coverage.d.ts +99 -0
- package/dist/kind-coverage.d.ts.map +1 -0
- package/dist/kind-coverage.js +186 -0
- package/dist/kind-coverage.js.map +1 -0
- package/dist/kind-field-mutation.d.ts +15 -0
- package/dist/kind-field-mutation.d.ts.map +1 -0
- package/dist/kind-field-mutation.js +160 -0
- package/dist/kind-field-mutation.js.map +1 -0
- package/dist/kinds.d.ts +31 -1
- package/dist/kinds.d.ts.map +1 -1
- package/dist/kinds.js +86 -17
- package/dist/kinds.js.map +1 -1
- package/dist/links.d.ts +1 -1
- package/dist/links.d.ts.map +1 -1
- package/dist/links.js +5 -10
- package/dist/links.js.map +1 -1
- package/dist/managed-document-metadata.d.ts +2 -0
- package/dist/managed-document-metadata.d.ts.map +1 -0
- package/dist/managed-document-metadata.js +9 -0
- package/dist/managed-document-metadata.js.map +1 -0
- package/dist/meaningful-change-time.d.ts +6 -6
- package/dist/meaningful-change-time.d.ts.map +1 -1
- package/dist/meaningful-change-time.js +12 -13
- package/dist/meaningful-change-time.js.map +1 -1
- package/dist/memory-backend.d.ts +2 -2
- package/dist/memory-backend.d.ts.map +1 -1
- package/dist/memory-backend.js +32 -16
- package/dist/memory-backend.js.map +1 -1
- package/dist/mutation.d.ts.map +1 -1
- package/dist/mutation.js +2 -2
- package/dist/mutation.js.map +1 -1
- package/dist/page.d.ts.map +1 -1
- package/dist/page.js +2 -1
- package/dist/page.js.map +1 -1
- package/dist/paths.d.ts +6 -2
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +35 -33
- package/dist/paths.js.map +1 -1
- package/dist/platform.d.ts +239 -0
- package/dist/platform.d.ts.map +1 -0
- package/dist/platform.js +82 -0
- package/dist/platform.js.map +1 -0
- package/dist/portable-export.d.ts +119 -0
- package/dist/portable-export.d.ts.map +1 -0
- package/dist/portable-export.js +501 -0
- package/dist/portable-export.js.map +1 -0
- package/dist/publication-filesystem.d.ts +1 -1
- package/dist/publication-filesystem.d.ts.map +1 -1
- package/dist/publication-filesystem.js +1 -1
- package/dist/publication-filesystem.js.map +1 -1
- package/dist/query-filter.d.ts +7 -2
- package/dist/query-filter.d.ts.map +1 -1
- package/dist/query-filter.js +24 -1
- package/dist/query-filter.js.map +1 -1
- package/dist/query-order.d.ts +22 -0
- package/dist/query-order.d.ts.map +1 -0
- package/dist/query-order.js +42 -0
- package/dist/query-order.js.map +1 -0
- package/dist/recipes.d.ts +3 -1
- package/dist/recipes.d.ts.map +1 -1
- package/dist/recipes.js +4 -4
- package/dist/recipes.js.map +1 -1
- package/dist/remote-backend.d.ts +114 -22
- package/dist/remote-backend.d.ts.map +1 -1
- package/dist/remote-backend.js +285 -44
- package/dist/remote-backend.js.map +1 -1
- package/dist/remote-document-codec.d.ts +15 -0
- package/dist/remote-document-codec.d.ts.map +1 -0
- package/dist/remote-document-codec.js +103 -0
- package/dist/remote-document-codec.js.map +1 -0
- package/dist/remote-error.d.ts +38 -0
- package/dist/remote-error.d.ts.map +1 -0
- package/dist/remote-error.js +59 -0
- package/dist/remote-error.js.map +1 -0
- package/dist/remote-operations.d.ts +63 -0
- package/dist/remote-operations.d.ts.map +1 -0
- package/dist/remote-operations.js +125 -0
- package/dist/remote-operations.js.map +1 -0
- package/dist/remote-parsers.d.ts +86 -0
- package/dist/remote-parsers.d.ts.map +1 -0
- package/dist/remote-parsers.js +181 -0
- package/dist/remote-parsers.js.map +1 -0
- package/dist/remote.d.ts +7 -2
- package/dist/remote.d.ts.map +1 -1
- package/dist/remote.js +6 -1
- package/dist/remote.js.map +1 -1
- package/dist/sha256.d.ts +21 -0
- package/dist/sha256.d.ts.map +1 -0
- package/dist/sha256.js +114 -0
- package/dist/sha256.js.map +1 -0
- package/dist/storage.d.ts +8 -2
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +11 -2
- package/dist/storage.js.map +1 -1
- package/dist/types.d.ts +40 -5
- package/dist/types.d.ts.map +1 -1
- package/dist/uncertain-write.d.ts +178 -0
- package/dist/uncertain-write.d.ts.map +1 -0
- package/dist/uncertain-write.js +198 -0
- package/dist/uncertain-write.js.map +1 -0
- package/dist/version-transport.d.ts +7 -0
- package/dist/version-transport.d.ts.map +1 -1
- package/dist/version-transport.js +9 -0
- package/dist/version-transport.js.map +1 -1
- package/dist/versioning.d.ts +18 -7
- package/dist/versioning.d.ts.map +1 -1
- package/dist/versioning.js +23 -14
- package/dist/versioning.js.map +1 -1
- package/package.json +75 -4
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The client side of the wire's heads and snapshot grammar (`docs/WIRE-PROTOCOL.md`, "Heads and
|
|
3
|
+
* snapshot"): what a heads answer must carry before its rows may be diffed as deletions, and
|
|
4
|
+
* how a snapshot body is read so that iterating it to completion is the completeness signal.
|
|
5
|
+
* {@link RemoteBackend.heads} and {@link RemoteBackend.snapshot} are thin callers over these
|
|
6
|
+
* two functions; a host that serves the same grammar through routes of its own validates the
|
|
7
|
+
* answers with the same functions rather than a second parser, since this grammar decides what
|
|
8
|
+
* a working copy deletes locally.
|
|
9
|
+
*
|
|
10
|
+
* Only `TextDecoder` and the Web Streams reader are used, so the same code runs in a browser, a
|
|
11
|
+
* Worker, and Node.
|
|
12
|
+
*/
|
|
13
|
+
import { headsDigest, isHeadsDigest } from "./heads-digest.js";
|
|
14
|
+
import { RemoteError, malformed } from "./remote-error.js";
|
|
15
|
+
/** A snapshot body that ended, or failed, before its terminator arrived with the announced count. */
|
|
16
|
+
export const SNAPSHOT_TRUNCATED = "SNAPSHOT_TRUNCATED";
|
|
17
|
+
/**
|
|
18
|
+
* A snapshot whose body arrived whole, with its terminator and the announced count, but whose
|
|
19
|
+
* rows digest to something other than the header announced. Not truncation: re-requesting will
|
|
20
|
+
* not necessarily repair it, since the authority contradicted itself. A consumer discards the
|
|
21
|
+
* documents' claim to the header digest either way.
|
|
22
|
+
*/
|
|
23
|
+
export const SNAPSHOT_DIGEST_MISMATCH = "SNAPSHOT_DIGEST_MISMATCH";
|
|
24
|
+
function isDocumentHead(value) {
|
|
25
|
+
if (typeof value !== "object" || value === null)
|
|
26
|
+
return false;
|
|
27
|
+
const head = value;
|
|
28
|
+
return typeof head.id === "string" && typeof head.version === "string";
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* The `200` body of `GET /heads`, admitted or refused as one: a well-formed digest, a `heads`
|
|
32
|
+
* array of `{ id, version }` rows, a `count` equal to the number of rows, and rows that digest
|
|
33
|
+
* by the documented recipe to the digest served. Anything else rejects as malformed (a
|
|
34
|
+
* {@link MalformedAnswer}, code `MALFORMED_ANSWER`) rather than being trusted. The
|
|
35
|
+
* recomputation is what stops a listing that is whole by its own count but not the state its
|
|
36
|
+
* digest names (a shortened listing under the real digest) from being diffed as a mass
|
|
37
|
+
* deletion. Rows keep the order served: the recipe sorts for itself, so order does not decide
|
|
38
|
+
* admission.
|
|
39
|
+
*/
|
|
40
|
+
export function parseHeadsAnswer(payload) {
|
|
41
|
+
const answer = payload;
|
|
42
|
+
if (!isHeadsDigest(answer?.digest))
|
|
43
|
+
throw malformed("wire heads answered without a well-formed digest");
|
|
44
|
+
if (!Array.isArray(answer.heads) || !answer.heads.every(isDocumentHead)) {
|
|
45
|
+
throw malformed("wire heads answered without a heads array of { id, version } rows");
|
|
46
|
+
}
|
|
47
|
+
if (answer.count !== answer.heads.length) {
|
|
48
|
+
throw malformed(`wire heads count ${String(answer.count)} disagrees with its ${answer.heads.length} row(s)`);
|
|
49
|
+
}
|
|
50
|
+
const heads = answer.heads.map(({ id, version }) => ({ id, version }));
|
|
51
|
+
const recomputed = headsDigest(heads);
|
|
52
|
+
if (recomputed !== answer.digest) {
|
|
53
|
+
throw malformed(`wire heads served digest ${answer.digest}, but its ${heads.length} row(s) digest to ${recomputed}`);
|
|
54
|
+
}
|
|
55
|
+
return { digest: answer.digest, heads };
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Split a response body into its NDJSON lines as they arrive, decoding UTF-8 across chunk
|
|
59
|
+
* boundaries. A partial trailing line at the end of the body is a cut line and is not yielded; a
|
|
60
|
+
* transport failure while reading is reported as truncation, since either way the terminator
|
|
61
|
+
* never arrived. Leaving the loop early cancels the reader so the connection is released.
|
|
62
|
+
*/
|
|
63
|
+
async function* ndjsonLines(body, status) {
|
|
64
|
+
const reader = body.getReader();
|
|
65
|
+
const decoder = new TextDecoder();
|
|
66
|
+
let buffered = "";
|
|
67
|
+
try {
|
|
68
|
+
for (;;) {
|
|
69
|
+
let chunk;
|
|
70
|
+
try {
|
|
71
|
+
chunk = await reader.read();
|
|
72
|
+
}
|
|
73
|
+
catch (cause) {
|
|
74
|
+
throw new RemoteError("snapshot body failed before its end line arrived", SNAPSHOT_TRUNCATED, status, cause);
|
|
75
|
+
}
|
|
76
|
+
buffered += decoder.decode(chunk.value, { stream: !chunk.done });
|
|
77
|
+
let start = 0;
|
|
78
|
+
for (let newline = buffered.indexOf("\n"); newline !== -1; newline = buffered.indexOf("\n", start)) {
|
|
79
|
+
yield buffered.slice(start, newline);
|
|
80
|
+
start = newline + 1;
|
|
81
|
+
}
|
|
82
|
+
buffered = buffered.slice(start);
|
|
83
|
+
if (chunk.done)
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
finally {
|
|
88
|
+
await reader.cancel().catch(() => undefined);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function parseSnapshotLine(line) {
|
|
92
|
+
let record;
|
|
93
|
+
try {
|
|
94
|
+
record = JSON.parse(line);
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
throw malformed("snapshot line is not JSON");
|
|
98
|
+
}
|
|
99
|
+
if (typeof record !== "object" || record === null)
|
|
100
|
+
throw malformed("snapshot line is not a JSON object");
|
|
101
|
+
return record;
|
|
102
|
+
}
|
|
103
|
+
function parseSnapshotHeader(line) {
|
|
104
|
+
const record = parseSnapshotLine(line);
|
|
105
|
+
if (record.kind !== "snapshot")
|
|
106
|
+
throw malformed("snapshot did not begin with its header line");
|
|
107
|
+
if (typeof record.count !== "number" || !Number.isInteger(record.count) || record.count < 0) {
|
|
108
|
+
throw malformed("snapshot header carries no document count");
|
|
109
|
+
}
|
|
110
|
+
if (!isHeadsDigest(record.digest))
|
|
111
|
+
throw malformed("snapshot header carries no well-formed digest");
|
|
112
|
+
return { count: record.count, digest: record.digest };
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* The document lines of a snapshot, ending normally only at an `end` line whose count equals
|
|
116
|
+
* both the header's announcement and the documents actually seen, and only when the digest
|
|
117
|
+
* recomputed over the received heads equals the header's. Anything else is a rejection: a body
|
|
118
|
+
* that ends first is `SNAPSHOT_TRUNCATED`; a whole body whose heads digest differently is
|
|
119
|
+
* `SNAPSHOT_DIGEST_MISMATCH`; a line the contract does not admit is malformed. The digest is the
|
|
120
|
+
* client's own check of the listing it is about to trust: a count and a terminator say the body
|
|
121
|
+
* is whole, only the recipe says it is the state the header named.
|
|
122
|
+
*/
|
|
123
|
+
async function* snapshotDocuments(lines, header, status) {
|
|
124
|
+
let seen = 0;
|
|
125
|
+
const received = [];
|
|
126
|
+
for await (const line of lines) {
|
|
127
|
+
const record = parseSnapshotLine(line);
|
|
128
|
+
if (record.kind === "doc") {
|
|
129
|
+
if (typeof record.id !== "string" || typeof record.version !== "string" || typeof record.body !== "string") {
|
|
130
|
+
throw malformed("snapshot doc line lacks id, version, or body");
|
|
131
|
+
}
|
|
132
|
+
if (typeof record.frontmatter !== "object" || record.frontmatter === null || Array.isArray(record.frontmatter)) {
|
|
133
|
+
throw malformed("snapshot doc line lacks a frontmatter object");
|
|
134
|
+
}
|
|
135
|
+
seen += 1;
|
|
136
|
+
if (seen > header.count)
|
|
137
|
+
throw malformed(`snapshot delivered more than the ${header.count} announced document(s)`);
|
|
138
|
+
received.push({ id: record.id, version: record.version });
|
|
139
|
+
yield { id: record.id, version: record.version, frontmatter: record.frontmatter, body: record.body };
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
if (record.kind === "end") {
|
|
143
|
+
if (record.count !== seen || seen !== header.count) {
|
|
144
|
+
throw new RemoteError(`snapshot end line counts ${String(record.count)} document(s), but ${seen} of ${header.count} announced arrived`, SNAPSHOT_TRUNCATED, status);
|
|
145
|
+
}
|
|
146
|
+
const recomputed = headsDigest(received);
|
|
147
|
+
if (recomputed !== header.digest) {
|
|
148
|
+
throw new RemoteError(`snapshot header announced digest ${header.digest}, but its ${seen} document(s) digest to ${recomputed}`, SNAPSHOT_DIGEST_MISMATCH, status);
|
|
149
|
+
}
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
throw malformed(`snapshot line has unexpected kind ${JSON.stringify(record.kind)}`);
|
|
153
|
+
}
|
|
154
|
+
throw new RemoteError(`snapshot ended after ${seen} of ${header.count} document(s) without its end line`, SNAPSHOT_TRUNCATED, status);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Read a `GET /snapshot` body by the documented grammar. The header line is parsed before this
|
|
158
|
+
* resolves, so a body that ends before it rejects here with `SNAPSHOT_TRUNCATED` and a first
|
|
159
|
+
* line that is not the header rejects as malformed; the documents then stream through
|
|
160
|
+
* {@link RemoteSnapshot.docs}, which ends normally only for a whole body whose rows digest to
|
|
161
|
+
* the header's announcement (see {@link RemoteSnapshot}). Obtaining the response, checking its
|
|
162
|
+
* status, and re-requesting a truncated snapshot are the caller's: this function reads one body
|
|
163
|
+
* once and cancels the reader when the iteration is abandoned or fails.
|
|
164
|
+
*/
|
|
165
|
+
export async function readSnapshotStream(body, options = {}) {
|
|
166
|
+
const status = options.status ?? 200;
|
|
167
|
+
const lines = ndjsonLines(body, status);
|
|
168
|
+
const first = await lines.next();
|
|
169
|
+
if (first.done)
|
|
170
|
+
throw new RemoteError("snapshot ended before its header line", SNAPSHOT_TRUNCATED, status);
|
|
171
|
+
let header;
|
|
172
|
+
try {
|
|
173
|
+
header = parseSnapshotHeader(first.value);
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
await lines.return(undefined);
|
|
177
|
+
throw err;
|
|
178
|
+
}
|
|
179
|
+
return { header, docs: snapshotDocuments(lines, header, status) };
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=remote-parsers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-parsers.js","sourceRoot":"","sources":["../src/remote-parsers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAqB,MAAM,mBAAmB,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG3D,qGAAqG;AACrG,MAAM,CAAC,MAAM,kBAAkB,GAAG,oBAAoB,CAAC;AACvD;;;;;GAKG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,0BAA0B,CAAC;AAgDnE,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC9D,MAAM,IAAI,GAAG,KAA4C,CAAC;IAC1D,OAAO,OAAO,IAAI,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC;AACzE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,MAAM,MAAM,GAAG,OAAwE,CAAC;IACxF,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC;QAAE,MAAM,SAAS,CAAC,kDAAkD,CAAC,CAAC;IACxG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC;QACxE,MAAM,SAAS,CAAC,mEAAmE,CAAC,CAAC;IACvF,CAAC;IACD,IAAI,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QACzC,MAAM,SAAS,CAAC,oBAAoB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,uBAAuB,MAAM,CAAC,KAAK,CAAC,MAAM,SAAS,CAAC,CAAC;IAC/G,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACtC,IAAI,UAAU,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,SAAS,CAAC,4BAA4B,MAAM,CAAC,MAAM,aAAa,KAAK,CAAC,MAAM,qBAAqB,UAAU,EAAE,CAAC,CAAC;IACvH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;AAC1C,CAAC;AAED;;;;;GAKG;AACH,KAAK,SAAS,CAAC,CAAC,WAAW,CAAC,IAAgC,EAAE,MAAc;IAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,CAAC;QACH,SAAS,CAAC;YACR,IAAI,KAA8C,CAAC;YACnD,IAAI,CAAC;gBACH,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YAC9B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,IAAI,WAAW,CAAC,kDAAkD,EAAE,kBAAkB,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;YAC/G,CAAC;YACD,QAAQ,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;YACjE,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,IAAI,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,CAAC,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;gBACnG,MAAM,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBACrC,KAAK,GAAG,OAAO,GAAG,CAAC,CAAC;YACtB,CAAC;YACD,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACjC,IAAI,KAAK,CAAC,IAAI;gBAAE,OAAO;QACzB,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACrC,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,SAAS,CAAC,2BAA2B,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI;QAAE,MAAM,SAAS,CAAC,oCAAoC,CAAC,CAAC;IACzG,OAAO,MAAsD,CAAC;AAChE,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,IAAI,KAAK,UAAU;QAAE,MAAM,SAAS,CAAC,6CAA6C,CAAC,CAAC;IAC/F,IAAI,OAAO,MAAM,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC;QAC5F,MAAM,SAAS,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,MAAM,CAAC;QAAE,MAAM,SAAS,CAAC,+CAA+C,CAAC,CAAC;IACpG,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACxD,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,SAAS,CAAC,CAAC,iBAAiB,CAAC,KAA6B,EAAE,MAAsB,EAAE,MAAc;IACrG,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QAC/B,MAAM,MAAM,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC1B,IAAI,OAAO,MAAM,CAAC,EAAE,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC3G,MAAM,SAAS,CAAC,8CAA8C,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,IAAI,MAAM,CAAC,WAAW,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;gBAC/G,MAAM,SAAS,CAAC,8CAA8C,CAAC,CAAC;YAClE,CAAC;YACD,IAAI,IAAI,CAAC,CAAC;YACV,IAAI,IAAI,GAAG,MAAM,CAAC,KAAK;gBAAE,MAAM,SAAS,CAAC,oCAAoC,MAAM,CAAC,KAAK,wBAAwB,CAAC,CAAC;YACnH,QAAQ,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;YAC1D,MAAM,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAA0B,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;YACpH,SAAS;QACX,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YAC1B,IAAI,MAAM,CAAC,KAAK,KAAK,IAAI,IAAI,IAAI,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;gBACnD,MAAM,IAAI,WAAW,CACnB,4BAA4B,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,IAAI,OAAO,MAAM,CAAC,KAAK,oBAAoB,EAChH,kBAAkB,EAClB,MAAM,CACP,CAAC;YACJ,CAAC;YACD,MAAM,UAAU,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;YACzC,IAAI,UAAU,KAAK,MAAM,CAAC,MAAM,EAAE,CAAC;gBACjC,MAAM,IAAI,WAAW,CACnB,oCAAoC,MAAM,CAAC,MAAM,aAAa,IAAI,0BAA0B,UAAU,EAAE,EACxG,wBAAwB,EACxB,MAAM,CACP,CAAC;YACJ,CAAC;YACD,OAAO;QACT,CAAC;QACD,MAAM,SAAS,CAAC,qCAAqC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,IAAI,WAAW,CACnB,wBAAwB,IAAI,OAAO,MAAM,CAAC,KAAK,mCAAmC,EAClF,kBAAkB,EAClB,MAAM,CACP,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,IAAgC,EAAE,UAAqC,EAAE;IAChH,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC;IACrC,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACxC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,IAAI,EAAE,CAAC;IACjC,IAAI,KAAK,CAAC,IAAI;QAAE,MAAM,IAAI,WAAW,CAAC,uCAAuC,EAAE,kBAAkB,EAAE,MAAM,CAAC,CAAC;IAC3G,IAAI,MAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,mBAAmB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC9B,MAAM,GAAG,CAAC;IACZ,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;AACpE,CAAC"}
|
package/dist/remote.d.ts
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
/** Browser-safe client adapter for the Superbee wire protocol. */
|
|
2
|
-
export { RemoteBackend
|
|
3
|
-
export type { FetchLike, RemoteBackendOptions } from "./remote-backend.js";
|
|
2
|
+
export { RemoteBackend } from "./remote-backend.js";
|
|
3
|
+
export type { FetchLike, HeadsOptions, RemoteBackendOptions, WireCapabilities } from "./remote-backend.js";
|
|
4
|
+
export { RemoteError } from "./remote-error.js";
|
|
5
|
+
export { SNAPSHOT_DIGEST_MISMATCH, SNAPSHOT_TRUNCATED, parseHeadsAnswer, readSnapshotStream } from "./remote-parsers.js";
|
|
6
|
+
export type { HeadsResult, ReadSnapshotStreamOptions, RemoteSnapshot, SnapshotDocument, SnapshotHeader } from "./remote-parsers.js";
|
|
7
|
+
export { headsDigest, isHeadsDigest, sortHeads } from "./heads-digest.js";
|
|
8
|
+
export type { DocumentHead } from "./heads-digest.js";
|
|
4
9
|
//# sourceMappingURL=remote.d.ts.map
|
package/dist/remote.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAElE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"remote.d.ts","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC3G,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAGhD,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzH,YAAY,EAAE,WAAW,EAAE,yBAAyB,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACpI,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC1E,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/remote.js
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
1
|
/** Browser-safe client adapter for the Superbee wire protocol. */
|
|
2
|
-
export { RemoteBackend
|
|
2
|
+
export { RemoteBackend } from "./remote-backend.js";
|
|
3
|
+
export { RemoteError } from "./remote-error.js";
|
|
4
|
+
// The heads and snapshot grammar's reference validators, for a host that serves the same grammar
|
|
5
|
+
// through routes of its own; `RemoteBackend.heads` and `RemoteBackend.snapshot` call these.
|
|
6
|
+
export { SNAPSHOT_DIGEST_MISMATCH, SNAPSHOT_TRUNCATED, parseHeadsAnswer, readSnapshotStream } from "./remote-parsers.js";
|
|
7
|
+
export { headsDigest, isHeadsDigest, sortHeads } from "./heads-digest.js";
|
|
3
8
|
//# sourceMappingURL=remote.js.map
|
package/dist/remote.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAElE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"remote.js","sourceRoot":"","sources":["../src/remote.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,iGAAiG;AACjG,4FAA4F;AAC5F,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzH,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/sha256.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synchronous SHA-256 (FIPS 180-4) with no runtime dependency.
|
|
3
|
+
*
|
|
4
|
+
* Version tokens are minted by {@link contentVersion}, {@link versionOfBytes} and
|
|
5
|
+
* {@link blobVersion} in `versioning.ts`, and every host that holds a working copy of a
|
|
6
|
+
* bundle must mint byte-identical tokens: the Node engine, the in-memory adapter, and a
|
|
7
|
+
* browser-local working copy in SaaS mode. A `node:crypto` import cannot be bundled for the
|
|
8
|
+
* browser, and WebCrypto's `subtle.digest` is asynchronous, which would change the
|
|
9
|
+
* synchronous version contract every backend relies on. One pure implementation shared by
|
|
10
|
+
* every runtime removes the divergence risk entirely; `test/sha256-parity.test.ts` proves it
|
|
11
|
+
* against `node:crypto` byte for byte.
|
|
12
|
+
*
|
|
13
|
+
* UTF-8 encoding goes through `TextEncoder`, which is a global in Node 18+ and in browsers.
|
|
14
|
+
* It encodes a lone surrogate as U+FFFD (EF BF BD), exactly as Node's `"utf8"` string
|
|
15
|
+
* encoding does, so string hashes agree across runtimes for malformed input as well.
|
|
16
|
+
*/
|
|
17
|
+
/** Lowercase hex SHA-256 of exact bytes. Works on any `Uint8Array` view, including a pooled Node `Buffer`. */
|
|
18
|
+
export declare function sha256HexOfBytes(bytes: Uint8Array): string;
|
|
19
|
+
/** Lowercase hex SHA-256 of a string's UTF-8 bytes. */
|
|
20
|
+
export declare function sha256HexOfUtf8(input: string): string;
|
|
21
|
+
//# sourceMappingURL=sha256.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sha256.d.ts","sourceRoot":"","sources":["../src/sha256.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAqEH,8GAA8G;AAC9G,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAgC1D;AAED,uDAAuD;AACvD,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAErD"}
|
package/dist/sha256.js
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Synchronous SHA-256 (FIPS 180-4) with no runtime dependency.
|
|
3
|
+
*
|
|
4
|
+
* Version tokens are minted by {@link contentVersion}, {@link versionOfBytes} and
|
|
5
|
+
* {@link blobVersion} in `versioning.ts`, and every host that holds a working copy of a
|
|
6
|
+
* bundle must mint byte-identical tokens: the Node engine, the in-memory adapter, and a
|
|
7
|
+
* browser-local working copy in SaaS mode. A `node:crypto` import cannot be bundled for the
|
|
8
|
+
* browser, and WebCrypto's `subtle.digest` is asynchronous, which would change the
|
|
9
|
+
* synchronous version contract every backend relies on. One pure implementation shared by
|
|
10
|
+
* every runtime removes the divergence risk entirely; `test/sha256-parity.test.ts` proves it
|
|
11
|
+
* against `node:crypto` byte for byte.
|
|
12
|
+
*
|
|
13
|
+
* UTF-8 encoding goes through `TextEncoder`, which is a global in Node 18+ and in browsers.
|
|
14
|
+
* It encodes a lone surrogate as U+FFFD (EF BF BD), exactly as Node's `"utf8"` string
|
|
15
|
+
* encoding does, so string hashes agree across runtimes for malformed input as well.
|
|
16
|
+
*/
|
|
17
|
+
const K = new Uint32Array([
|
|
18
|
+
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
|
|
19
|
+
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
|
|
20
|
+
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
|
|
21
|
+
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
|
|
22
|
+
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
|
|
23
|
+
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
|
|
24
|
+
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
|
|
25
|
+
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
|
|
26
|
+
]);
|
|
27
|
+
const INITIAL_STATE = new Uint32Array([
|
|
28
|
+
0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19,
|
|
29
|
+
]);
|
|
30
|
+
const encoder = new TextEncoder();
|
|
31
|
+
function rotr(value, bits) {
|
|
32
|
+
return (value >>> bits) | (value << (32 - bits));
|
|
33
|
+
}
|
|
34
|
+
/** Absorb one 64-byte block at `offset` of `view` into the running state `h`. */
|
|
35
|
+
function compress(h, w, view, offset) {
|
|
36
|
+
for (let i = 0; i < 16; i++) {
|
|
37
|
+
w[i] = view.getUint32(offset + i * 4);
|
|
38
|
+
}
|
|
39
|
+
for (let i = 16; i < 64; i++) {
|
|
40
|
+
const w15 = w[i - 15];
|
|
41
|
+
const w2 = w[i - 2];
|
|
42
|
+
const s0 = rotr(w15, 7) ^ rotr(w15, 18) ^ (w15 >>> 3);
|
|
43
|
+
const s1 = rotr(w2, 17) ^ rotr(w2, 19) ^ (w2 >>> 10);
|
|
44
|
+
w[i] = (w[i - 16] + s0 + w[i - 7] + s1) >>> 0;
|
|
45
|
+
}
|
|
46
|
+
let a = h[0];
|
|
47
|
+
let b = h[1];
|
|
48
|
+
let c = h[2];
|
|
49
|
+
let d = h[3];
|
|
50
|
+
let e = h[4];
|
|
51
|
+
let f = h[5];
|
|
52
|
+
let g = h[6];
|
|
53
|
+
let hh = h[7];
|
|
54
|
+
for (let i = 0; i < 64; i++) {
|
|
55
|
+
const S1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);
|
|
56
|
+
const ch = (e & f) ^ (~e & g);
|
|
57
|
+
const t1 = (hh + S1 + ch + K[i] + w[i]) >>> 0;
|
|
58
|
+
const S0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);
|
|
59
|
+
const maj = (a & b) ^ (a & c) ^ (b & c);
|
|
60
|
+
const t2 = (S0 + maj) >>> 0;
|
|
61
|
+
hh = g;
|
|
62
|
+
g = f;
|
|
63
|
+
f = e;
|
|
64
|
+
e = (d + t1) >>> 0;
|
|
65
|
+
d = c;
|
|
66
|
+
c = b;
|
|
67
|
+
b = a;
|
|
68
|
+
a = (t1 + t2) >>> 0;
|
|
69
|
+
}
|
|
70
|
+
h[0] = (h[0] + a) >>> 0;
|
|
71
|
+
h[1] = (h[1] + b) >>> 0;
|
|
72
|
+
h[2] = (h[2] + c) >>> 0;
|
|
73
|
+
h[3] = (h[3] + d) >>> 0;
|
|
74
|
+
h[4] = (h[4] + e) >>> 0;
|
|
75
|
+
h[5] = (h[5] + f) >>> 0;
|
|
76
|
+
h[6] = (h[6] + g) >>> 0;
|
|
77
|
+
h[7] = (h[7] + hh) >>> 0;
|
|
78
|
+
}
|
|
79
|
+
/** Lowercase hex SHA-256 of exact bytes. Works on any `Uint8Array` view, including a pooled Node `Buffer`. */
|
|
80
|
+
export function sha256HexOfBytes(bytes) {
|
|
81
|
+
const h = new Uint32Array(INITIAL_STATE);
|
|
82
|
+
const w = new Uint32Array(64);
|
|
83
|
+
const length = bytes.byteLength;
|
|
84
|
+
const view = new DataView(bytes.buffer, bytes.byteOffset, length);
|
|
85
|
+
// Full blocks are absorbed in place so a large blob is never copied.
|
|
86
|
+
const fullBlocks = length >>> 6;
|
|
87
|
+
for (let block = 0; block < fullBlocks; block++) {
|
|
88
|
+
compress(h, w, view, block * 64);
|
|
89
|
+
}
|
|
90
|
+
// The tail carries the remaining bytes, the 0x80 terminator, zero padding, and the
|
|
91
|
+
// 64-bit big-endian bit length, in one or two blocks.
|
|
92
|
+
const remaining = length - fullBlocks * 64;
|
|
93
|
+
const tail = new Uint8Array(remaining + 1 + 8 > 64 ? 128 : 64);
|
|
94
|
+
tail.set(bytes.subarray(fullBlocks * 64));
|
|
95
|
+
tail[remaining] = 0x80;
|
|
96
|
+
const tailView = new DataView(tail.buffer);
|
|
97
|
+
const bitLengthHigh = Math.floor(length / 0x20000000);
|
|
98
|
+
const bitLengthLow = (length << 3) >>> 0;
|
|
99
|
+
tailView.setUint32(tail.length - 8, bitLengthHigh);
|
|
100
|
+
tailView.setUint32(tail.length - 4, bitLengthLow);
|
|
101
|
+
for (let offset = 0; offset < tail.length; offset += 64) {
|
|
102
|
+
compress(h, w, tailView, offset);
|
|
103
|
+
}
|
|
104
|
+
let hex = "";
|
|
105
|
+
for (let i = 0; i < 8; i++) {
|
|
106
|
+
hex += h[i].toString(16).padStart(8, "0");
|
|
107
|
+
}
|
|
108
|
+
return hex;
|
|
109
|
+
}
|
|
110
|
+
/** Lowercase hex SHA-256 of a string's UTF-8 bytes. */
|
|
111
|
+
export function sha256HexOfUtf8(input) {
|
|
112
|
+
return sha256HexOfBytes(encoder.encode(input));
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=sha256.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sha256.js","sourceRoot":"","sources":["../src/sha256.ts"],"names":[],"mappings":"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"}
|
package/dist/storage.d.ts
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
2
2
|
export type { BlobKey, ConceptId, DeleteOptions, Frontmatter, HeadResult, OkfDocument, QueryFilter, ReadBlobResult, ReadResult, ReservedFilename, ReservedReadResult, StorageBackend, StorageCapabilities, Version, VersionInfo, WriteOptions, } from "./types.js";
|
|
3
3
|
export { InvalidInputError } from "./errors.js";
|
|
4
4
|
export { MalformedDocumentError } from "./frontmatter-contract.js";
|
|
5
|
-
export { RESERVED_FILENAMES, assertSafeBlobKey, assertSafeConceptId, assertSafeReservedDir, conceptIdFromPath, isReservedFile, pathFromConceptId, toPosix, } from "./paths.js";
|
|
6
|
-
export { VersionConflict, stripETagWrapper } from "./version-transport.js";
|
|
5
|
+
export { RESERVED_FILENAMES, assertSafeBlobKey, assertSafeConceptId, assertSafeReservedDir, assertSafeReservedFilename, compareStorageKeys, conceptIdFromPath, isReservedFile, pathFromConceptId, toPosix, } from "./paths.js";
|
|
6
|
+
export { VersionConflict, isContentVersion, stripETagWrapper } from "./version-transport.js";
|
|
7
|
+
export { IntentHoldConflict, IntentStateConflict } from "./journaled-backend.js";
|
|
8
|
+
export type { IntentPatch, IntentRecord, JournaledBackend, JournaledDeleteOptions, JournaledDeleteResult, JournaledHead, JournaledHeadsOptions, JournaledReadResult, JournaledWriteOptions, MetaRecord, NewIntentRecord, } from "./journaled-backend.js";
|
|
9
|
+
export { isRequestIdentity } from "./uncertain-write.js";
|
|
10
|
+
export type { Outcome } from "./uncertain-write.js";
|
|
11
|
+
export { headsDigest, isHeadsDigest, sortHeads } from "./heads-digest.js";
|
|
12
|
+
export type { DocumentHead } from "./heads-digest.js";
|
|
7
13
|
//# sourceMappingURL=storage.d.ts.map
|
package/dist/storage.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAE1F,YAAY,EACV,OAAO,EACP,SAAS,EACT,aAAa,EACb,WAAW,EACX,UAAU,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,OAAO,EACP,WAAW,EACX,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,OAAO,GACR,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAE1F,YAAY,EACV,OAAO,EACP,SAAS,EACT,aAAa,EACb,WAAW,EACX,UAAU,EACV,WAAW,EACX,WAAW,EACX,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,OAAO,EACP,WAAW,EACX,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,0BAA0B,EAC1B,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,OAAO,GACR,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAG7F,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACjF,YAAY,EACV,WAAW,EACX,YAAY,EACZ,gBAAgB,EAChB,sBAAsB,EACtB,qBAAqB,EACrB,aAAa,EACb,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EACrB,UAAU,EACV,eAAe,GAChB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,YAAY,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAGpD,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC1E,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/storage.js
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
/** Runtime-neutral storage contract for Worker, browser, and custom backend consumers. */
|
|
2
2
|
export { InvalidInputError } from "./errors.js";
|
|
3
3
|
export { MalformedDocumentError } from "./frontmatter-contract.js";
|
|
4
|
-
export { RESERVED_FILENAMES, assertSafeBlobKey, assertSafeConceptId, assertSafeReservedDir, conceptIdFromPath, isReservedFile, pathFromConceptId, toPosix, } from "./paths.js";
|
|
5
|
-
export { VersionConflict, stripETagWrapper } from "./version-transport.js";
|
|
4
|
+
export { RESERVED_FILENAMES, assertSafeBlobKey, assertSafeConceptId, assertSafeReservedDir, assertSafeReservedFilename, compareStorageKeys, conceptIdFromPath, isReservedFile, pathFromConceptId, toPosix, } from "./paths.js";
|
|
5
|
+
export { VersionConflict, isContentVersion, stripETagWrapper } from "./version-transport.js";
|
|
6
|
+
// The journaled-backend seam: what an adapter adds to `StorageBackend` to host a browser-local
|
|
7
|
+
// working copy's intent journal. Runtime-neutral, like the seam it extends.
|
|
8
|
+
export { IntentHoldConflict, IntentStateConflict } from "./journaled-backend.js";
|
|
9
|
+
// The wire request identity (`WriteOptions.requestId`) and the outcome shape an authority records
|
|
10
|
+
// for it: runtime-neutral, so Worker and browser consumers reach them through this seam.
|
|
11
|
+
export { isRequestIdentity } from "./uncertain-write.js";
|
|
12
|
+
// The heads digest a wire authority and a working copy both mint over every document id and
|
|
13
|
+
// version, so a client can learn in one round trip whether anything changed.
|
|
14
|
+
export { headsDigest, isHeadsDigest, sortHeads } from "./heads-digest.js";
|
|
6
15
|
//# sourceMappingURL=storage.js.map
|
package/dist/storage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAqB1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,OAAO,GACR,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"storage.js","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAqB1F,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,EACnB,qBAAqB,EACrB,0BAA0B,EAC1B,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,OAAO,GACR,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC7F,+FAA+F;AAC/F,4EAA4E;AAC5E,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAcjF,kGAAkG;AAClG,yFAAyF;AACzF,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,4FAA4F;AAC5F,6EAA6E;AAC7E,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -140,7 +140,8 @@ export interface ReadBlobResult {
|
|
|
140
140
|
export interface VersionInfo {
|
|
141
141
|
/** Opaque content-addressed version token for this revision. */
|
|
142
142
|
version: Version;
|
|
143
|
-
/** Who wrote this revision.
|
|
143
|
+
/** Who wrote this revision. History-keeping backends default at write time to a local identity.
|
|
144
|
+
* FilesystemBackend reports `unattributed` when document bytes carry no mutation attribution. */
|
|
144
145
|
actor: string;
|
|
145
146
|
/** ISO-8601 instant this revision was recorded. */
|
|
146
147
|
timestamp: string;
|
|
@@ -177,6 +178,12 @@ export interface WriteOptions {
|
|
|
177
178
|
* affects CAS or cross-backend token parity.
|
|
178
179
|
*/
|
|
179
180
|
agent?: string;
|
|
181
|
+
/**
|
|
182
|
+
* OPTIONAL durable request identity. A remote backend sends it as the wire's `Idempotency-Key`
|
|
183
|
+
* so the authority applies the write at most once under that key and can report its outcome
|
|
184
|
+
* later; every other backend ignores it. Minted once per intent and reused verbatim on retry.
|
|
185
|
+
*/
|
|
186
|
+
requestId?: string;
|
|
180
187
|
}
|
|
181
188
|
/**
|
|
182
189
|
* Options controlling a conditional {@link StorageBackend.delete} / {@link
|
|
@@ -196,6 +203,12 @@ export interface DeleteOptions {
|
|
|
196
203
|
* regardless of `expectedVersion` (idempotency, AXI P6: absence is success, not failure).
|
|
197
204
|
*/
|
|
198
205
|
expectedVersion?: Version;
|
|
206
|
+
/**
|
|
207
|
+
* OPTIONAL durable request identity, sent by a remote backend as `Idempotency-Key` exactly as
|
|
208
|
+
* {@link WriteOptions.requestId} is. The wire requires `expectedVersion` alongside it: an
|
|
209
|
+
* identified delete must name the revision it removes. Other backends ignore it.
|
|
210
|
+
*/
|
|
211
|
+
requestId?: string;
|
|
199
212
|
}
|
|
200
213
|
/** Optional backend capabilities reported without adapter-class inference. */
|
|
201
214
|
export interface StorageCapabilities {
|
|
@@ -337,11 +350,16 @@ export interface StorageBackend {
|
|
|
337
350
|
* a facet it chooses to honor. A backend that does not implement this method
|
|
338
351
|
* (FilesystemBackend / MemoryBackend — both local to their data, where a head projection
|
|
339
352
|
* saves nothing) is served by the engine's fallback (`list` +
|
|
340
|
-
* `readMany`, bodies read then dropped)
|
|
341
|
-
*
|
|
342
|
-
*
|
|
353
|
+
* `readMany`, bodies read then dropped). Both paths honor the scan's malformed-doc
|
|
354
|
+
* resilience: given `onSkip`, a backend reports each document it could not parse there and
|
|
355
|
+
* leaves it out; without it, a malformed document fails the scan.
|
|
343
356
|
*/
|
|
344
|
-
queryHeads?(filter?: QueryFilter
|
|
357
|
+
queryHeads?(filter?: QueryFilter, options?: {
|
|
358
|
+
onSkip?: (skip: {
|
|
359
|
+
id: ConceptId;
|
|
360
|
+
reason: string;
|
|
361
|
+
}) => void;
|
|
362
|
+
}): Promise<HeadResult[]>;
|
|
345
363
|
/**
|
|
346
364
|
* OPTIONAL capabilities self-declaration. `StorageBackend` carries
|
|
347
365
|
* no capabilities descriptor by default, so a wire router that wants to report an adapter's
|
|
@@ -383,6 +401,23 @@ export interface QueryFilter {
|
|
|
383
401
|
* (e.g. `tags: [a,b]`) matches on membership. A field the doc lacks never matches (empty set).
|
|
384
402
|
*/
|
|
385
403
|
fields?: Record<string, string>;
|
|
404
|
+
/**
|
|
405
|
+
* Restrict to concepts whose `sources` list holds at least one entry carrying this identity
|
|
406
|
+
* (see {@link SourceIdentity}). A selector naming neither key imposes no constraint, like an
|
|
407
|
+
* empty `tags` list.
|
|
408
|
+
*/
|
|
409
|
+
sources?: SourceIdentity;
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* An OKF `sources[]` identity: `resource` names the provider namespace and `id` the record within
|
|
413
|
+
* it. Each supplied key must equal the entry's own property of the same name by exact,
|
|
414
|
+
* case-sensitive string comparison: no trimming, URL normalization, or `String()` coercion. An
|
|
415
|
+
* entry that is not a mapping, or whose property is absent or not a string, never matches, and
|
|
416
|
+
* neither does a `sources` value that is not a list.
|
|
417
|
+
*/
|
|
418
|
+
export interface SourceIdentity {
|
|
419
|
+
resource?: string;
|
|
420
|
+
id?: string;
|
|
386
421
|
}
|
|
387
422
|
/** A single resolved outbound cross-link (a standard markdown link, never a wikilink). */
|
|
388
423
|
export interface Link {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,SAAS,GAAG,MAAM,CAAC;AAE/B;;;;;;;GAOG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B;;;;;;;GAOG;AACH,MAAM,WAAW,WAAW;IAC1B,uJAAuJ;IACvJ,IAAI,EAAE,MAAM,CAAC;IACb,yFAAyF;IACzF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,oFAAoF;IACpF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,yCAAyC;IACzC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,kGAAkG;IAClG,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iHAAiH;IACjH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,iFAAiF;IACjF,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,qFAAqF;AACrF,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,EAAE,EAAE,SAAS,CAAC;IACd,+BAA+B;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,+DAA+D;IAC/D,IAAI,EAAE,MAAM,CAAC;CACd;AAED,+EAA+E;AAC/E,MAAM,WAAW,MAAM;IACrB,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAED,gGAAgG;AAChG,MAAM,MAAM,gBAAgB,GAAG,UAAU,GAAG,QAAQ,CAAC;AAErD;;;;;;GAMG;AACH,MAAM,MAAM,OAAO,GAAG,MAAM,CAAC;AAE7B,uGAAuG;AACvG,MAAM,WAAW,UAAU;IACzB,mCAAmC;IACnC,GAAG,EAAE,WAAW,CAAC;IACjB,iIAAiI;IACjI,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,UAAU;IACzB,qDAAqD;IACrD,EAAE,EAAE,SAAS,CAAC;IACd,8CAA8C;IAC9C,WAAW,EAAE,WAAW,CAAC;IACzB,mKAAmK;IACnK,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,0CAA0C;IAC1C,KAAK,EAAE,UAAU,CAAC;IAClB,oFAAoF;IACpF,WAAW,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,+GAA+G;AAC/G,MAAM,WAAW,WAAW;IAC1B,gEAAgE;IAChE,OAAO,EAAE,OAAO,CAAC;IACjB
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|