@earendil-works/chord 1.1.0 → 1.3.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/CHANGELOG.md +78 -0
- package/README.md +79 -195
- package/dist/cell.d.ts +122 -0
- package/dist/cell.d.ts.map +1 -0
- package/dist/cell.js +356 -0
- package/dist/cell.js.map +1 -0
- package/dist/cluster.d.ts +27 -0
- package/dist/cluster.d.ts.map +1 -0
- package/dist/cluster.js +230 -0
- package/dist/cluster.js.map +1 -0
- package/dist/connection.d.ts +270 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/connection.js +1216 -0
- package/dist/connection.js.map +1 -0
- package/dist/context/index.d.ts +12 -1
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js.map +1 -1
- package/dist/contract.d.ts +208 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +246 -0
- package/dist/contract.js.map +1 -0
- package/dist/declare.d.ts +33 -0
- package/dist/declare.d.ts.map +1 -0
- package/dist/declare.js +2 -0
- package/dist/declare.js.map +1 -0
- package/dist/delta/apply-immutable-trusted.js.map +1 -1
- package/dist/delta/diff.d.ts +1 -1
- package/dist/delta/diff.d.ts.map +1 -1
- package/dist/delta/diff.js.map +1 -1
- package/dist/delta/index.d.ts +4 -3
- package/dist/delta/index.d.ts.map +1 -1
- package/dist/delta/index.js +45 -0
- package/dist/delta/index.js.map +1 -1
- package/dist/delta/revision-validator.d.ts +1 -1
- package/dist/delta/revision-validator.d.ts.map +1 -1
- package/dist/delta/revision-validator.js.map +1 -1
- package/dist/delta/tracker.d.ts +1 -1
- package/dist/delta/tracker.d.ts.map +1 -1
- package/dist/delta/tracker.js +40 -4
- package/dist/delta/tracker.js.map +1 -1
- package/dist/errors.d.ts +28 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +59 -0
- package/dist/errors.js.map +1 -0
- package/dist/host.d.ts +348 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +1000 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +17 -10
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -8
- package/dist/index.js.map +1 -1
- package/dist/json.d.ts +9 -1
- package/dist/json.d.ts.map +1 -1
- package/dist/json.js.map +1 -1
- package/dist/link.d.ts +107 -0
- package/dist/link.d.ts.map +1 -0
- package/dist/link.js +355 -0
- package/dist/link.js.map +1 -0
- package/dist/loader.d.ts +4 -0
- package/dist/loader.d.ts.map +1 -0
- package/dist/loader.js +73 -0
- package/dist/loader.js.map +1 -0
- package/dist/manager.d.ts +115 -0
- package/dist/manager.d.ts.map +1 -0
- package/dist/manager.js +345 -0
- package/dist/manager.js.map +1 -0
- package/dist/node.d.ts +3 -4
- package/dist/node.d.ts.map +1 -1
- package/dist/node.js +3 -2
- package/dist/node.js.map +1 -1
- package/dist/object.d.ts +438 -0
- package/dist/object.d.ts.map +1 -0
- package/dist/object.js +1571 -0
- package/dist/object.js.map +1 -0
- package/dist/output.d.ts +85 -0
- package/dist/output.d.ts.map +1 -0
- package/dist/output.js +350 -0
- package/dist/output.js.map +1 -0
- package/dist/publish.d.ts +5 -0
- package/dist/publish.d.ts.map +1 -0
- package/dist/publish.js +40 -0
- package/dist/publish.js.map +1 -0
- package/dist/registry.d.ts +25 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +6 -0
- package/dist/registry.js.map +1 -0
- package/dist/reload.d.ts +126 -0
- package/dist/reload.d.ts.map +1 -0
- package/dist/reload.js +653 -0
- package/dist/reload.js.map +1 -0
- package/dist/remote.d.ts +165 -0
- package/dist/remote.d.ts.map +1 -0
- package/dist/remote.js +612 -0
- package/dist/remote.js.map +1 -0
- package/dist/schema.d.ts +21 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +228 -0
- package/dist/schema.js.map +1 -0
- package/dist/state.d.ts +92 -0
- package/dist/state.d.ts.map +1 -0
- package/dist/{services/state.js → state.js} +28 -138
- package/dist/state.js.map +1 -0
- package/dist/types.d.ts +69 -258
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/websocket.d.ts +15 -0
- package/dist/websocket.d.ts.map +1 -0
- package/dist/websocket.js +16 -0
- package/dist/websocket.js.map +1 -0
- package/dist/wire.d.ts +216 -0
- package/dist/wire.d.ts.map +1 -0
- package/dist/wire.js +165 -0
- package/dist/wire.js.map +1 -0
- package/docs/guide.md +814 -0
- package/docs/spec.md +288 -0
- package/docs/tutorial.md +931 -0
- package/package.json +14 -10
- package/src/delta/README.md +5 -3
- package/dist/api.d.ts +0 -20
- package/dist/api.d.ts.map +0 -1
- package/dist/api.js +0 -77
- package/dist/api.js.map +0 -1
- package/dist/bundler.d.ts +0 -6
- package/dist/bundler.d.ts.map +0 -1
- package/dist/bundler.js +0 -3
- package/dist/bundler.js.map +0 -1
- package/dist/facets/host.d.ts +0 -12
- package/dist/facets/host.d.ts.map +0 -1
- package/dist/facets/host.js +0 -763
- package/dist/facets/host.js.map +0 -1
- package/dist/facets/loader.d.ts +0 -3
- package/dist/facets/loader.d.ts.map +0 -1
- package/dist/facets/loader.js +0 -5
- package/dist/facets/loader.js.map +0 -1
- package/dist/node/bundle-loader.d.ts +0 -30
- package/dist/node/bundle-loader.d.ts.map +0 -1
- package/dist/node/bundle-loader.js +0 -377
- package/dist/node/bundle-loader.js.map +0 -1
- package/dist/node/bundle.d.ts +0 -26
- package/dist/node/bundle.d.ts.map +0 -1
- package/dist/node/bundle.js +0 -183
- package/dist/node/bundle.js.map +0 -1
- package/dist/node/manifest.d.ts +0 -36
- package/dist/node/manifest.d.ts.map +0 -1
- package/dist/node/manifest.js +0 -6
- package/dist/node/manifest.js.map +0 -1
- package/dist/node/package.d.ts +0 -15
- package/dist/node/package.d.ts.map +0 -1
- package/dist/node/package.js +0 -199
- package/dist/node/package.js.map +0 -1
- package/dist/services/consumer.d.ts +0 -11
- package/dist/services/consumer.d.ts.map +0 -1
- package/dist/services/consumer.js +0 -585
- package/dist/services/consumer.js.map +0 -1
- package/dist/services/errors.d.ts +0 -8
- package/dist/services/errors.d.ts.map +0 -1
- package/dist/services/errors.js +0 -22
- package/dist/services/errors.js.map +0 -1
- package/dist/services/handle.d.ts +0 -15
- package/dist/services/handle.d.ts.map +0 -1
- package/dist/services/handle.js +0 -101
- package/dist/services/handle.js.map +0 -1
- package/dist/services/instances.d.ts +0 -26
- package/dist/services/instances.d.ts.map +0 -1
- package/dist/services/instances.js +0 -140
- package/dist/services/instances.js.map +0 -1
- package/dist/services/loopback.d.ts +0 -5
- package/dist/services/loopback.d.ts.map +0 -1
- package/dist/services/loopback.js +0 -15
- package/dist/services/loopback.js.map +0 -1
- package/dist/services/provider.d.ts +0 -37
- package/dist/services/provider.d.ts.map +0 -1
- package/dist/services/provider.js +0 -521
- package/dist/services/provider.js.map +0 -1
- package/dist/services/state-codec.d.ts +0 -15
- package/dist/services/state-codec.d.ts.map +0 -1
- package/dist/services/state-codec.js +0 -133
- package/dist/services/state-codec.js.map +0 -1
- package/dist/services/state-internals.d.ts +0 -13
- package/dist/services/state-internals.d.ts.map +0 -1
- package/dist/services/state-internals.js +0 -10
- package/dist/services/state-internals.js.map +0 -1
- package/dist/services/state.d.ts +0 -28
- package/dist/services/state.d.ts.map +0 -1
- package/dist/services/state.js.map +0 -1
- package/dist/services/wire.d.ts +0 -63
- package/dist/services/wire.d.ts.map +0 -1
- package/dist/services/wire.js +0 -186
- package/dist/services/wire.js.map +0 -1
package/dist/contract.js
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { Type } from "typebox";
|
|
2
|
+
import { Value } from "typebox/value";
|
|
3
|
+
import { ChordError, invalid } from "./errors.js";
|
|
4
|
+
import { canonicalJson, fits, hash64 } from "./schema.js";
|
|
5
|
+
const MEMBER = Symbol("chord.member");
|
|
6
|
+
export function method(args, result) {
|
|
7
|
+
return { [MEMBER]: "method", args, result };
|
|
8
|
+
}
|
|
9
|
+
/** A native in-process object identified by `name@version` (local contracts only). */
|
|
10
|
+
export const opaque = (id) => {
|
|
11
|
+
if (!/^[^@\s]+@\d+$/.test(id))
|
|
12
|
+
throw new TypeError(`opaque id must be name@version: ${id}`);
|
|
13
|
+
return { [MEMBER]: "opaque", id };
|
|
14
|
+
};
|
|
15
|
+
/** Objects of the type live on the host named `name` (`hostNamed("server")`). */
|
|
16
|
+
export function hostNamed(name) {
|
|
17
|
+
if (typeof name !== "string" || name === "")
|
|
18
|
+
throw new TypeError("hostNamed needs a host name");
|
|
19
|
+
return { name };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Objects of the type live on `prefix` + the value of the input's string field `key`: `hostFamily("session:",
|
|
23
|
+
* "session")` puts `{ session: "S1", … }` on `session:S1`. The field is required and must be a non-empty string.
|
|
24
|
+
*/
|
|
25
|
+
export function hostFamily(prefix, key) {
|
|
26
|
+
if (typeof prefix !== "string" || prefix === "")
|
|
27
|
+
throw new TypeError("hostFamily needs a host-name prefix");
|
|
28
|
+
if (typeof key !== "string" || key === "")
|
|
29
|
+
throw new TypeError("hostFamily needs an input field name");
|
|
30
|
+
return { prefix, key };
|
|
31
|
+
}
|
|
32
|
+
/** The host an object of `placement` with this (normalized) input lives on. Throws `invalid/placement`. */
|
|
33
|
+
export function resolveHost(typeName, placement, input) {
|
|
34
|
+
if ("name" in placement)
|
|
35
|
+
return placement.name;
|
|
36
|
+
const value = input !== null && typeof input === "object" ? input[placement.key] : undefined;
|
|
37
|
+
if (typeof value !== "string" || value === "")
|
|
38
|
+
throw invalid("placement", `${typeName}: input field ${placement.key} names no host`);
|
|
39
|
+
return placement.prefix + value;
|
|
40
|
+
}
|
|
41
|
+
/** Whether the host named `hostName` may serve a type of `placement`. */
|
|
42
|
+
export const placedOn = (placement, hostName) => "name" in placement
|
|
43
|
+
? placement.name === hostName
|
|
44
|
+
: hostName.startsWith(placement.prefix) && hostName.length > placement.prefix.length;
|
|
45
|
+
export const placementText = (placement) => "name" in placement ? placement.name : `${placement.prefix}<${placement.key}>`;
|
|
46
|
+
// A description travels as a reference's contract token (wire.ts), so it is declared once, as the schema that validates it.
|
|
47
|
+
// `TSchema` is an empty interface: any object is one, which is all a peer's schema is checked for here.
|
|
48
|
+
const SchemaObject = Type.Unsafe(Type.Object({}));
|
|
49
|
+
const MemberDescriptionSchema = Type.Union([
|
|
50
|
+
// Absent `args`: the method takes none. Absent `result`: it returns nothing.
|
|
51
|
+
Type.Object({
|
|
52
|
+
kind: Type.Literal("method"),
|
|
53
|
+
args: Type.Optional(SchemaObject),
|
|
54
|
+
result: Type.Optional(SchemaObject),
|
|
55
|
+
}),
|
|
56
|
+
Type.Object({ kind: Type.Literal("state"), schema: SchemaObject }),
|
|
57
|
+
Type.Object({ kind: Type.Literal("opaque"), id: Type.String() }),
|
|
58
|
+
]);
|
|
59
|
+
/** Local contracts have one unnamed variant. */
|
|
60
|
+
export const LOCAL_VARIANT = "";
|
|
61
|
+
const PlacementSchema = Type.Union([
|
|
62
|
+
Type.Object({ name: Type.String({ minLength: 1 }) }, { additionalProperties: false }),
|
|
63
|
+
Type.Object({ prefix: Type.String({ minLength: 1 }), key: Type.String({ minLength: 1 }) }, { additionalProperties: false }),
|
|
64
|
+
]);
|
|
65
|
+
export const DescriptionSchema = Type.Object({
|
|
66
|
+
name: Type.String({ minLength: 1 }),
|
|
67
|
+
scope: Type.Union([Type.Literal("remote"), Type.Literal("local")]),
|
|
68
|
+
version: Type.Integer(),
|
|
69
|
+
input: SchemaObject,
|
|
70
|
+
/** Remote types only (required there): where their objects live. */
|
|
71
|
+
host: Type.Optional(PlacementSchema),
|
|
72
|
+
variants: Type.Record(Type.String(), Type.Record(Type.String(), MemberDescriptionSchema)),
|
|
73
|
+
});
|
|
74
|
+
/** Names a reference uses itself; members may not use them. */
|
|
75
|
+
export const RESERVED_MEMBERS = new Set([
|
|
76
|
+
"variant",
|
|
77
|
+
"status",
|
|
78
|
+
"ready",
|
|
79
|
+
"shape",
|
|
80
|
+
"error",
|
|
81
|
+
"onShape",
|
|
82
|
+
"onStatus",
|
|
83
|
+
"release",
|
|
84
|
+
"then",
|
|
85
|
+
"contract",
|
|
86
|
+
]);
|
|
87
|
+
function describeMember(name, member, scope) {
|
|
88
|
+
if (RESERVED_MEMBERS.has(name))
|
|
89
|
+
throw new TypeError(`member name is reserved: ${name}`);
|
|
90
|
+
const brand = member[MEMBER];
|
|
91
|
+
if (brand === "method") {
|
|
92
|
+
const spec = member;
|
|
93
|
+
return {
|
|
94
|
+
kind: "method",
|
|
95
|
+
...(spec.args === undefined ? {} : { args: spec.args }),
|
|
96
|
+
...(spec.result === undefined ? {} : { result: spec.result }),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
if (brand === "opaque") {
|
|
100
|
+
if (scope === "remote")
|
|
101
|
+
throw new TypeError(`remote contracts cannot expose opaque members: ${name}`);
|
|
102
|
+
return { kind: "opaque", id: member.id };
|
|
103
|
+
}
|
|
104
|
+
return { kind: "state", schema: member };
|
|
105
|
+
}
|
|
106
|
+
function finish(contract) {
|
|
107
|
+
return { ...contract, fingerprint: hash64(canonicalJson(contract.description)) };
|
|
108
|
+
}
|
|
109
|
+
function checkHeader(name, version) {
|
|
110
|
+
if (!name)
|
|
111
|
+
throw new TypeError("contract name is empty");
|
|
112
|
+
if (!Number.isInteger(version) || version < 1)
|
|
113
|
+
throw new TypeError(`contract version must be a positive integer`);
|
|
114
|
+
}
|
|
115
|
+
export function remote(name, def) {
|
|
116
|
+
checkHeader(name, def.version);
|
|
117
|
+
const placement = def.host;
|
|
118
|
+
if (placement === undefined || !Value.Check(PlacementSchema, placement))
|
|
119
|
+
throw new TypeError(`remote contract ${name} needs \`host\`: hostNamed(…) or hostFamily(…)`);
|
|
120
|
+
// A JSON copy: the description travels, and a placement object may carry nothing else.
|
|
121
|
+
const host = "name" in placement ? { name: placement.name } : { prefix: placement.prefix, key: placement.key };
|
|
122
|
+
const variants = {};
|
|
123
|
+
if (Object.keys(def.variants).length === 0)
|
|
124
|
+
throw new TypeError(`remote contract ${name} has no variants`);
|
|
125
|
+
for (const [kind, variant] of Object.entries(def.variants)) {
|
|
126
|
+
const members = {};
|
|
127
|
+
for (const [key, schema] of Object.entries(variant.state ?? {}))
|
|
128
|
+
members[key] = describeMember(key, schema, "remote");
|
|
129
|
+
for (const [key, spec] of Object.entries(variant.methods ?? {})) {
|
|
130
|
+
if (key in members)
|
|
131
|
+
throw new TypeError(`member ${key} is both state and method in ${name}.${kind}`);
|
|
132
|
+
members[key] = describeMember(key, spec, "remote");
|
|
133
|
+
if (members[key].kind !== "method")
|
|
134
|
+
throw new TypeError(`methods.${key} is not a method()`);
|
|
135
|
+
}
|
|
136
|
+
variants[kind] = members;
|
|
137
|
+
}
|
|
138
|
+
const description = { name, scope: "remote", version: def.version, input: def.input, host, variants };
|
|
139
|
+
return finish({
|
|
140
|
+
scope: "remote",
|
|
141
|
+
name,
|
|
142
|
+
version: def.version,
|
|
143
|
+
input: def.input,
|
|
144
|
+
def,
|
|
145
|
+
description,
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
export function local(name, def) {
|
|
149
|
+
checkHeader(name, def.version);
|
|
150
|
+
const members = {};
|
|
151
|
+
for (const [key, member] of Object.entries(def.members ?? {}))
|
|
152
|
+
members[key] = describeMember(key, member, "local");
|
|
153
|
+
const description = {
|
|
154
|
+
name,
|
|
155
|
+
scope: "local",
|
|
156
|
+
version: def.version,
|
|
157
|
+
input: def.input,
|
|
158
|
+
variants: { [LOCAL_VARIANT]: members },
|
|
159
|
+
};
|
|
160
|
+
return finish({ scope: "local", name, version: def.version, input: def.input, def, description });
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* A consumer token received over a link (only its description travels). Has no `def`, so it is only good for binding
|
|
164
|
+
* and validation, never for TypeScript types.
|
|
165
|
+
*/
|
|
166
|
+
export function contractFromDescription(description) {
|
|
167
|
+
const { name, scope, version, input, host } = description;
|
|
168
|
+
if (typeof name !== "string" ||
|
|
169
|
+
(scope !== "remote" && scope !== "local") ||
|
|
170
|
+
!Number.isInteger(version) ||
|
|
171
|
+
(scope === "remote") !== (host !== undefined)) {
|
|
172
|
+
throw new ChordError("invalid", "malformed contract token", { reason: "token" });
|
|
173
|
+
}
|
|
174
|
+
const base = { name, version, input, description, fingerprint: hash64(canonicalJson(description)) };
|
|
175
|
+
return scope === "remote"
|
|
176
|
+
? { ...base, scope, def: { version, input, host: host, variants: {} } }
|
|
177
|
+
: { ...base, scope, def: { version, input } };
|
|
178
|
+
}
|
|
179
|
+
/** Returns why `provider` does not cover `consumer`, or undefined when it does. */
|
|
180
|
+
export function coverage(provider, consumer) {
|
|
181
|
+
if (provider.name !== consumer.name || provider.scope !== consumer.scope)
|
|
182
|
+
return "different type";
|
|
183
|
+
if (!samePlacement(provider, consumer))
|
|
184
|
+
return "host";
|
|
185
|
+
if (!fits(consumer.input, provider.input))
|
|
186
|
+
return "input";
|
|
187
|
+
for (const [kind, consumerMembers] of Object.entries(consumer.variants)) {
|
|
188
|
+
const providerMembers = provider.variants[kind];
|
|
189
|
+
if (providerMembers === undefined)
|
|
190
|
+
return `variant ${kind} missing`;
|
|
191
|
+
for (const [name, wanted] of Object.entries(consumerMembers)) {
|
|
192
|
+
const offered = providerMembers[name];
|
|
193
|
+
if (offered === undefined || offered.kind !== wanted.kind)
|
|
194
|
+
return `${kind}.${name} missing or of another kind`;
|
|
195
|
+
if (offered.kind === "method" && wanted.kind === "method") {
|
|
196
|
+
// Both take arguments or neither does; a consumer that expects no result accepts any.
|
|
197
|
+
if ((wanted.args === undefined) !== (offered.args === undefined))
|
|
198
|
+
return `${kind}.${name} arguments`;
|
|
199
|
+
if (wanted.args !== undefined && offered.args !== undefined && !fits(wanted.args, offered.args))
|
|
200
|
+
return `${kind}.${name} arguments`;
|
|
201
|
+
if (wanted.result !== undefined && (offered.result === undefined || !fits(offered.result, wanted.result)))
|
|
202
|
+
return `${kind}.${name} result`;
|
|
203
|
+
}
|
|
204
|
+
else if (offered.kind === "state" && wanted.kind === "state") {
|
|
205
|
+
if (!fits(offered.schema, wanted.schema))
|
|
206
|
+
return `${kind}.${name} state`;
|
|
207
|
+
}
|
|
208
|
+
else if (offered.kind === "opaque" && wanted.kind === "opaque" && offered.id !== wanted.id) {
|
|
209
|
+
return `${kind}.${name} opaque ${offered.id} != ${wanted.id}`;
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
return undefined;
|
|
214
|
+
}
|
|
215
|
+
const samePlacement = (a, b) => canonicalJson(a.host ?? null) === canonicalJson(b.host ?? null);
|
|
216
|
+
const placementOf = (description) => description.host === undefined ? "(local)" : placementText(description.host);
|
|
217
|
+
/** How a consumer token binds to a provider: directly or through an `accepts` adapter. Throws contract_mismatch. */
|
|
218
|
+
export function bind(provider, accepts, consumer) {
|
|
219
|
+
if (provider.fingerprint === consumer.fingerprint)
|
|
220
|
+
return undefined;
|
|
221
|
+
// A moved type is another type for its consumers: no adapter reaches across hosts.
|
|
222
|
+
if (!samePlacement(provider.description, consumer.description)) {
|
|
223
|
+
throw new ChordError("contract_mismatch", `${provider.name} lives on ${placementOf(provider.description)}, the consumer expects ${placementOf(consumer.description)}`);
|
|
224
|
+
}
|
|
225
|
+
if (provider.version === consumer.version) {
|
|
226
|
+
const reason = coverage(provider.description, consumer.description);
|
|
227
|
+
if (reason === undefined)
|
|
228
|
+
return undefined;
|
|
229
|
+
throw new ChordError("contract_mismatch", `${provider.name}@${provider.version} does not cover the consumer's description (${reason}); forgotten version bump?`);
|
|
230
|
+
}
|
|
231
|
+
const adapter = accepts?.[consumer.version];
|
|
232
|
+
if (adapter === undefined) {
|
|
233
|
+
throw new ChordError("contract_mismatch", `${provider.name}: provider version ${provider.version}, consumer version ${consumer.version}, no accepts adapter`);
|
|
234
|
+
}
|
|
235
|
+
return adapter;
|
|
236
|
+
}
|
|
237
|
+
/** Whether `contract`'s method `name` takes no arguments (it is called as `ref.name(ctx)`). */
|
|
238
|
+
export function takesNoArgs(contract, name) {
|
|
239
|
+
for (const members of Object.values(contract.description.variants)) {
|
|
240
|
+
const member = members[name];
|
|
241
|
+
if (member?.kind === "method")
|
|
242
|
+
return member.args === undefined;
|
|
243
|
+
}
|
|
244
|
+
return false;
|
|
245
|
+
}
|
|
246
|
+
//# sourceMappingURL=contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Static, type TSchema, Type } from \"typebox\";\nimport { Value } from \"typebox/value\";\nimport { ChordError, invalid } from \"./errors.ts\";\nimport { canonicalJson, fits, hash64 } from \"./schema.ts\";\nimport type { Ctx, Exposed, Readable, RefBase, StateSource } from \"./types.ts\";\n\nconst MEMBER = Symbol(\"chord.member\");\n\n/** A method's arguments and result; `undefined`: it takes no arguments, or returns nothing (void). */\nexport interface MethodSpec<\n\tA extends TSchema | undefined = TSchema | undefined,\n\tR extends TSchema | undefined = TSchema | undefined,\n> {\n\treadonly [MEMBER]: \"method\";\n\treadonly args: A;\n\treadonly result: R;\n}\n\nexport interface OpaqueSpec<T = unknown> {\n\treadonly [MEMBER]: \"opaque\";\n\treadonly id: string;\n\t/** Type carrier only; never set. */\n\treadonly type?: T;\n}\n\n/**\n * A method. `method()`: no arguments (called as `ref.name(ctx)`, implemented as `(ctx) => …`) and no result.\n * `method(args)`: no result, the handler returns nothing (void). `method(args, result)`, or `method(undefined, result)`\n * for a method without arguments that returns something.\n */\nexport function method(): MethodSpec<undefined, undefined>;\nexport function method<A extends TSchema>(args: A): MethodSpec<A, undefined>;\nexport function method<A extends TSchema | undefined, R extends TSchema>(args: A, result: R): MethodSpec<A, R>;\nexport function method(args?: TSchema, result?: TSchema): MethodSpec {\n\treturn { [MEMBER]: \"method\", args, result };\n}\n\n/** A native in-process object identified by `name@version` (local contracts only). */\nexport const opaque = <T = unknown>(id: string): OpaqueSpec<T> => {\n\tif (!/^[^@\\s]+@\\d+$/.test(id)) throw new TypeError(`opaque id must be name@version: ${id}`);\n\treturn { [MEMBER]: \"opaque\", id };\n};\n\nexport interface VariantDef {\n\treadonly state?: Readonly<Record<string, TSchema>>;\n\treadonly methods?: Readonly<Record<string, MethodSpec>>;\n}\n\n/** Where objects of a remote type live: one named host. */\nexport interface HostNamed {\n\treadonly name: string;\n}\n\n/** Where objects of a remote type live: the host `prefix` + the input's string field `key` (`session:` + `session`). */\nexport interface HostFamily<K extends string = string> {\n\treadonly prefix: string;\n\treadonly key: K;\n}\n\n/** A remote type's placement: data only, so a description carries it and every host can check it. */\nexport type Placement = HostNamed | HostFamily;\n\n/** Objects of the type live on the host named `name` (`hostNamed(\"server\")`). */\nexport function hostNamed(name: string): HostNamed {\n\tif (typeof name !== \"string\" || name === \"\") throw new TypeError(\"hostNamed needs a host name\");\n\treturn { name };\n}\n\n/**\n * Objects of the type live on `prefix` + the value of the input's string field `key`: `hostFamily(\"session:\",\n * \"session\")` puts `{ session: \"S1\", … }` on `session:S1`. The field is required and must be a non-empty string.\n */\nexport function hostFamily<const K extends string>(prefix: string, key: K): HostFamily<K> {\n\tif (typeof prefix !== \"string\" || prefix === \"\") throw new TypeError(\"hostFamily needs a host-name prefix\");\n\tif (typeof key !== \"string\" || key === \"\") throw new TypeError(\"hostFamily needs an input field name\");\n\treturn { prefix, key };\n}\n\n/** Required string fields of `I`: what a `hostFamily` may name. */\ntype StringKeys<I> = { [K in keyof I]-?: I[K] extends string ? K : never }[keyof I] & string;\n/** The placements a remote type with input `I` may have. */\nexport type PlacementFor<I> = HostNamed | HostFamily<StringKeys<I>>;\n\n/** The host an object of `placement` with this (normalized) input lives on. Throws `invalid/placement`. */\nexport function resolveHost(typeName: string, placement: Placement, input: unknown): string {\n\tif (\"name\" in placement) return placement.name;\n\tconst value =\n\t\tinput !== null && typeof input === \"object\" ? (input as Record<string, unknown>)[placement.key] : undefined;\n\tif (typeof value !== \"string\" || value === \"\")\n\t\tthrow invalid(\"placement\", `${typeName}: input field ${placement.key} names no host`);\n\treturn placement.prefix + value;\n}\n\n/** Whether the host named `hostName` may serve a type of `placement`. */\nexport const placedOn = (placement: Placement, hostName: string): boolean =>\n\t\"name\" in placement\n\t\t? placement.name === hostName\n\t\t: hostName.startsWith(placement.prefix) && hostName.length > placement.prefix.length;\n\nexport const placementText = (placement: Placement): string =>\n\t\"name\" in placement ? placement.name : `${placement.prefix}<${placement.key}>`;\n\nexport interface RemoteDef {\n\treadonly version: number;\n\treadonly input: TSchema;\n\t/** Where its objects live: `hostNamed(…)` or `hostFamily(…)`. Part of the contract (and its fingerprint). */\n\treadonly host: Placement;\n\treadonly variants: Readonly<Record<string, VariantDef>>;\n}\n\n/** A local member: a method, an opaque native object, or a state member described by its schema. */\nexport type LocalMember = MethodSpec | OpaqueSpec | TSchema;\n\nexport interface LocalDef {\n\treadonly version: number;\n\treadonly input: TSchema;\n\treadonly members?: Readonly<Record<string, LocalMember>>;\n}\n\n// A description travels as a reference's contract token (wire.ts), so it is declared once, as the schema that validates it.\n// `TSchema` is an empty interface: any object is one, which is all a peer's schema is checked for here.\nconst SchemaObject = Type.Unsafe<TSchema>(Type.Object({}));\n\nconst MemberDescriptionSchema = Type.Union([\n\t// Absent `args`: the method takes none. Absent `result`: it returns nothing.\n\tType.Object({\n\t\tkind: Type.Literal(\"method\"),\n\t\targs: Type.Optional(SchemaObject),\n\t\tresult: Type.Optional(SchemaObject),\n\t}),\n\tType.Object({ kind: Type.Literal(\"state\"), schema: SchemaObject }),\n\tType.Object({ kind: Type.Literal(\"opaque\"), id: Type.String() }),\n]);\nexport type MemberDescription = Static<typeof MemberDescriptionSchema>;\n\n/** Local contracts have one unnamed variant. */\nexport const LOCAL_VARIANT = \"\";\n\nconst PlacementSchema = Type.Union([\n\tType.Object({ name: Type.String({ minLength: 1 }) }, { additionalProperties: false }),\n\tType.Object(\n\t\t{ prefix: Type.String({ minLength: 1 }), key: Type.String({ minLength: 1 }) },\n\t\t{ additionalProperties: false },\n\t),\n]);\n\nexport const DescriptionSchema = Type.Object({\n\tname: Type.String({ minLength: 1 }),\n\tscope: Type.Union([Type.Literal(\"remote\"), Type.Literal(\"local\")]),\n\tversion: Type.Integer(),\n\tinput: SchemaObject,\n\t/** Remote types only (required there): where their objects live. */\n\thost: Type.Optional(PlacementSchema),\n\tvariants: Type.Record(Type.String(), Type.Record(Type.String(), MemberDescriptionSchema)),\n});\nexport type Description = Static<typeof DescriptionSchema>;\n\ninterface ContractBase {\n\treadonly name: string;\n\treadonly version: number;\n\treadonly input: TSchema;\n\treadonly description: Description;\n\treadonly fingerprint: string;\n}\n\nexport interface RemoteContract<D extends RemoteDef = RemoteDef> extends ContractBase {\n\treadonly scope: \"remote\";\n\treadonly def: D;\n}\n\nexport interface LocalContract<D extends LocalDef = LocalDef> extends ContractBase {\n\treadonly scope: \"local\";\n\treadonly def: D;\n}\n\nexport type AnyContract = RemoteContract | LocalContract;\n\n/** Names a reference uses itself; members may not use them. */\nexport const RESERVED_MEMBERS: ReadonlySet<string> = new Set([\n\t\"variant\",\n\t\"status\",\n\t\"ready\",\n\t\"shape\",\n\t\"error\",\n\t\"onShape\",\n\t\"onStatus\",\n\t\"release\",\n\t\"then\",\n\t\"contract\",\n]);\n\nfunction describeMember(name: string, member: unknown, scope: \"remote\" | \"local\"): MemberDescription {\n\tif (RESERVED_MEMBERS.has(name)) throw new TypeError(`member name is reserved: ${name}`);\n\tconst brand = (member as { [MEMBER]?: string })[MEMBER];\n\tif (brand === \"method\") {\n\t\tconst spec = member as MethodSpec;\n\t\treturn {\n\t\t\tkind: \"method\",\n\t\t\t...(spec.args === undefined ? {} : { args: spec.args }),\n\t\t\t...(spec.result === undefined ? {} : { result: spec.result }),\n\t\t};\n\t}\n\tif (brand === \"opaque\") {\n\t\tif (scope === \"remote\") throw new TypeError(`remote contracts cannot expose opaque members: ${name}`);\n\t\treturn { kind: \"opaque\", id: (member as OpaqueSpec).id };\n\t}\n\treturn { kind: \"state\", schema: member as TSchema };\n}\n\nfunction finish<C extends AnyContract>(contract: Omit<C, \"fingerprint\">): C {\n\treturn { ...contract, fingerprint: hash64(canonicalJson(contract.description)) } as C;\n}\n\nfunction checkHeader(name: string, version: number): void {\n\tif (!name) throw new TypeError(\"contract name is empty\");\n\tif (!Number.isInteger(version) || version < 1) throw new TypeError(`contract version must be a positive integer`);\n}\n\nexport function remote<const D extends RemoteDef>(\n\tname: string,\n\tdef: D & { readonly host: PlacementFor<Static<D[\"input\"]>> },\n): RemoteContract<D> {\n\tcheckHeader(name, def.version);\n\tconst placement = def.host as Placement | undefined;\n\tif (placement === undefined || !Value.Check(PlacementSchema, placement))\n\t\tthrow new TypeError(`remote contract ${name} needs \\`host\\`: hostNamed(…) or hostFamily(…)`);\n\t// A JSON copy: the description travels, and a placement object may carry nothing else.\n\tconst host: Placement =\n\t\t\"name\" in placement ? { name: placement.name } : { prefix: placement.prefix, key: placement.key };\n\tconst variants: Record<string, Record<string, MemberDescription>> = {};\n\tif (Object.keys(def.variants).length === 0) throw new TypeError(`remote contract ${name} has no variants`);\n\tfor (const [kind, variant] of Object.entries(def.variants)) {\n\t\tconst members: Record<string, MemberDescription> = {};\n\t\tfor (const [key, schema] of Object.entries(variant.state ?? {}))\n\t\t\tmembers[key] = describeMember(key, schema, \"remote\");\n\t\tfor (const [key, spec] of Object.entries(variant.methods ?? {})) {\n\t\t\tif (key in members) throw new TypeError(`member ${key} is both state and method in ${name}.${kind}`);\n\t\t\tmembers[key] = describeMember(key, spec, \"remote\");\n\t\t\tif (members[key].kind !== \"method\") throw new TypeError(`methods.${key} is not a method()`);\n\t\t}\n\t\tvariants[kind] = members;\n\t}\n\tconst description: Description = { name, scope: \"remote\", version: def.version, input: def.input, host, variants };\n\treturn finish<RemoteContract<D>>({\n\t\tscope: \"remote\",\n\t\tname,\n\t\tversion: def.version,\n\t\tinput: def.input,\n\t\tdef,\n\t\tdescription,\n\t});\n}\n\nexport function local<const D extends LocalDef>(name: string, def: D): LocalContract<D> {\n\tcheckHeader(name, def.version);\n\tconst members: Record<string, MemberDescription> = {};\n\tfor (const [key, member] of Object.entries(def.members ?? {})) members[key] = describeMember(key, member, \"local\");\n\tconst description: Description = {\n\t\tname,\n\t\tscope: \"local\",\n\t\tversion: def.version,\n\t\tinput: def.input,\n\t\tvariants: { [LOCAL_VARIANT]: members },\n\t};\n\treturn finish<LocalContract<D>>({ scope: \"local\", name, version: def.version, input: def.input, def, description });\n}\n\n/**\n * A consumer token received over a link (only its description travels). Has no `def`, so it is only good for binding\n * and validation, never for TypeScript types.\n */\nexport function contractFromDescription(description: Description): AnyContract {\n\tconst { name, scope, version, input, host } = description;\n\tif (\n\t\ttypeof name !== \"string\" ||\n\t\t(scope !== \"remote\" && scope !== \"local\") ||\n\t\t!Number.isInteger(version) ||\n\t\t(scope === \"remote\") !== (host !== undefined)\n\t) {\n\t\tthrow new ChordError(\"invalid\", \"malformed contract token\", { reason: \"token\" });\n\t}\n\tconst base = { name, version, input, description, fingerprint: hash64(canonicalJson(description)) };\n\treturn scope === \"remote\"\n\t\t? { ...base, scope, def: { version, input, host: host!, variants: {} } }\n\t\t: { ...base, scope, def: { version, input } };\n}\n\n/** Returns why `provider` does not cover `consumer`, or undefined when it does. */\nexport function coverage(provider: Description, consumer: Description): string | undefined {\n\tif (provider.name !== consumer.name || provider.scope !== consumer.scope) return \"different type\";\n\tif (!samePlacement(provider, consumer)) return \"host\";\n\tif (!fits(consumer.input, provider.input)) return \"input\";\n\tfor (const [kind, consumerMembers] of Object.entries(consumer.variants)) {\n\t\tconst providerMembers = provider.variants[kind];\n\t\tif (providerMembers === undefined) return `variant ${kind} missing`;\n\t\tfor (const [name, wanted] of Object.entries(consumerMembers)) {\n\t\t\tconst offered = providerMembers[name];\n\t\t\tif (offered === undefined || offered.kind !== wanted.kind) return `${kind}.${name} missing or of another kind`;\n\t\t\tif (offered.kind === \"method\" && wanted.kind === \"method\") {\n\t\t\t\t// Both take arguments or neither does; a consumer that expects no result accepts any.\n\t\t\t\tif ((wanted.args === undefined) !== (offered.args === undefined)) return `${kind}.${name} arguments`;\n\t\t\t\tif (wanted.args !== undefined && offered.args !== undefined && !fits(wanted.args, offered.args))\n\t\t\t\t\treturn `${kind}.${name} arguments`;\n\t\t\t\tif (wanted.result !== undefined && (offered.result === undefined || !fits(offered.result, wanted.result)))\n\t\t\t\t\treturn `${kind}.${name} result`;\n\t\t\t} else if (offered.kind === \"state\" && wanted.kind === \"state\") {\n\t\t\t\tif (!fits(offered.schema, wanted.schema)) return `${kind}.${name} state`;\n\t\t\t} else if (offered.kind === \"opaque\" && wanted.kind === \"opaque\" && offered.id !== wanted.id) {\n\t\t\t\treturn `${kind}.${name} opaque ${offered.id} != ${wanted.id}`;\n\t\t\t}\n\t\t}\n\t}\n\treturn undefined;\n}\n\nconst samePlacement = (a: Description, b: Description): boolean =>\n\tcanonicalJson(a.host ?? null) === canonicalJson(b.host ?? null);\nconst placementOf = (description: Description): string =>\n\tdescription.host === undefined ? \"(local)\" : placementText(description.host);\n\n/** Maps the provider's current implementation to the view a consumer of an older contract version expects. */\nexport type Adapter = (current: Record<string, unknown>) => Record<string, unknown>;\nexport type Accepts = Readonly<Record<number, Adapter>>;\n\n/** How a consumer token binds to a provider: directly or through an `accepts` adapter. Throws contract_mismatch. */\nexport function bind(provider: AnyContract, accepts: Accepts | undefined, consumer: AnyContract): Adapter | undefined {\n\tif (provider.fingerprint === consumer.fingerprint) return undefined;\n\t// A moved type is another type for its consumers: no adapter reaches across hosts.\n\tif (!samePlacement(provider.description, consumer.description)) {\n\t\tthrow new ChordError(\n\t\t\t\"contract_mismatch\",\n\t\t\t`${provider.name} lives on ${placementOf(provider.description)}, the consumer expects ${placementOf(consumer.description)}`,\n\t\t);\n\t}\n\tif (provider.version === consumer.version) {\n\t\tconst reason = coverage(provider.description, consumer.description);\n\t\tif (reason === undefined) return undefined;\n\t\tthrow new ChordError(\n\t\t\t\"contract_mismatch\",\n\t\t\t`${provider.name}@${provider.version} does not cover the consumer's description (${reason}); forgotten version bump?`,\n\t\t);\n\t}\n\tconst adapter = accepts?.[consumer.version];\n\tif (adapter === undefined) {\n\t\tthrow new ChordError(\n\t\t\t\"contract_mismatch\",\n\t\t\t`${provider.name}: provider version ${provider.version}, consumer version ${consumer.version}, no accepts adapter`,\n\t\t);\n\t}\n\treturn adapter;\n}\n\n// ─── Static types ────────────────────────────────────────────────────────────\n\ntype Empty = Record<never, never>;\ntype StateOf<V> = V extends { readonly state: infer S extends Readonly<Record<string, TSchema>> } ? S : Empty;\ntype StaticOf<S> = S extends TSchema ? Static<S> : never;\ntype MethodsOf<V> = V extends { readonly methods: infer M extends Readonly<Record<string, MethodSpec>> } ? M : Empty;\n\n/** What a handler returns: the result's value, or nothing for a void method. */\ntype Returned<R> = [R] extends [TSchema] ? Static<R> | Promise<Static<R>> : void | Promise<void>;\n/** What a call resolves to. */\ntype Resolved<R> = [R] extends [TSchema] ? Static<R> : undefined;\n\n/** A method's handler; `P` is the app's principal type (`ctx.principal`). */\nexport type MethodImplementation<M, P = unknown> = M extends MethodSpec<infer A, infer R>\n\t? [A] extends [TSchema]\n\t\t? (args: Static<A>, ctx: Ctx<P>) => Returned<R>\n\t\t: (ctx: Ctx<P>) => Returned<R>\n\t: never;\nexport type Call<M> = M extends MethodSpec<infer A, infer R>\n\t? [A] extends [TSchema]\n\t\t? (args: Static<A>, ctx?: Ctx) => Promise<Resolved<R>>\n\t\t: (ctx?: Ctx) => Promise<Resolved<R>>\n\t: never;\n\n/** Whether `contract`'s method `name` takes no arguments (it is called as `ref.name(ctx)`). */\nexport function takesNoArgs(contract: AnyContract, name: string): boolean {\n\tfor (const members of Object.values(contract.description.variants)) {\n\t\tconst member = members[name];\n\t\tif (member?.kind === \"method\") return member.args === undefined;\n\t}\n\treturn false;\n}\n\ntype VariantImplementation<K, V, P> = { readonly variant: K } & {\n\treadonly [S in keyof StateOf<V>]: StateSource<StaticOf<StateOf<V>[S]>>;\n} & {\n\treadonly [M in keyof MethodsOf<V>]: MethodImplementation<MethodsOf<V>[M], P>;\n};\n/**\n * A reference in one variant: its state members are plain readables (a reference you hold has its state) and its\n * methods calls. `variant` discriminates the union `Ref` is for a multi-variant type.\n */\ntype VariantRef<C extends AnyContract, K, V> = RefBase<C> & { readonly variant: K } & {\n\treadonly [S in keyof StateOf<V>]: Readable<StaticOf<StateOf<V>[S]>>;\n} & {\n\treadonly [M in keyof MethodsOf<V>]: Call<MethodsOf<V>[M]>;\n};\n\ntype LocalImplementationMember<M, P> = M extends MethodSpec\n\t? MethodImplementation<M, P>\n\t: M extends OpaqueSpec<infer T>\n\t\t? T | Exposed<T>\n\t\t: M extends TSchema\n\t\t\t? StateSource<Static<M>>\n\t\t\t: never;\ntype LocalRefMember<M> = M extends MethodSpec\n\t? Call<M>\n\t: M extends OpaqueSpec<infer T>\n\t\t? T | undefined\n\t\t: M extends TSchema\n\t\t\t? Readable<Static<M>>\n\t\t\t: never;\ntype LocalMembers<D> = D extends { readonly members: infer M extends Readonly<Record<string, LocalMember>> }\n\t? M\n\t: Empty;\n\nexport type InputOf<C> = C extends { readonly def: { readonly input: infer I extends TSchema } } ? Static<I> : never;\n\n/** What a factory returns for contract C; its methods' `ctx.principal` is `P`. */\nexport type ImplementationOf<C, P = unknown> = C extends RemoteContract<infer D>\n\t? { [K in keyof D[\"variants\"]]: VariantImplementation<K, D[\"variants\"][K], P> }[keyof D[\"variants\"]]\n\t: C extends LocalContract<infer D>\n\t\t? { readonly [K in keyof LocalMembers<D>]: LocalImplementationMember<LocalMembers<D>[K], P> } & Record<\n\t\t\t\tstring,\n\t\t\t\tunknown\n\t\t\t>\n\t\t: never;\n\n/**\n * What `get` returns for contract C. A remote type's reference is a union discriminated by `variant`: another variant's\n * members are reachable only after narrowing (`if (ref.variant === \"editor\") ref.add(…)`). A local type's reference has\n * its members.\n */\nexport type Ref<C extends AnyContract = AnyContract> = C extends RemoteContract<infer D>\n\t? { [K in keyof D[\"variants\"]]: VariantRef<C, K, D[\"variants\"][K]> }[keyof D[\"variants\"]]\n\t: C extends LocalContract<infer D>\n\t\t? RefBase<C> & { readonly [K in keyof LocalMembers<D>]: LocalRefMember<LocalMembers<D>[K]> }\n\t\t: never;\n"]}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { Ctx } from "./types.ts";
|
|
2
|
+
export interface Subscribable<E> {
|
|
3
|
+
subscribe(listener: (event: E) => void): () => void;
|
|
4
|
+
}
|
|
5
|
+
/** `self.resource(name, declaration)`: something the object opens and later closes (a database, a watch, a socket). */
|
|
6
|
+
export interface ResourceDeclaration<T> {
|
|
7
|
+
/** Bump to replace the resource at the next reload (a native value has no schema to detect a change). */
|
|
8
|
+
readonly version: number;
|
|
9
|
+
/** References or resources that must be live/open first. A change replaces the resource. */
|
|
10
|
+
readonly deps?: readonly unknown[];
|
|
11
|
+
/** Exclusive resources are replaced at the gate: old closed before new opened. */
|
|
12
|
+
readonly exclusive?: boolean;
|
|
13
|
+
open(options: {
|
|
14
|
+
readonly signal: AbortSignal;
|
|
15
|
+
}): T | Promise<T>;
|
|
16
|
+
close?(value: T): void | Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
export interface Resource<T> {
|
|
19
|
+
readonly key: string;
|
|
20
|
+
/** Throws not_ready until opened. */
|
|
21
|
+
readonly value: T;
|
|
22
|
+
}
|
|
23
|
+
/** A listener as `self.on` declares it. */
|
|
24
|
+
export interface ListenerDecl {
|
|
25
|
+
readonly source: unknown;
|
|
26
|
+
readonly select: ((value: never) => Subscribable<unknown>) | undefined;
|
|
27
|
+
readonly fn: (event: unknown, ctx: Ctx) => void | Promise<void>;
|
|
28
|
+
}
|
|
29
|
+
/** What `self.on(name, source, …)` passes to `select`: a resource's opened value, or the source itself. */
|
|
30
|
+
export type ValueOf<S> = S extends Subscribable<unknown> ? S : S extends Resource<infer T> ? T : S;
|
|
31
|
+
/** What `self.on(name, source, handler)` delivers: a readable's values, an event source's events. */
|
|
32
|
+
export type EventOf<S> = S extends Subscribable<infer E> ? E : S extends Resource<infer T> ? EventOf<T> : never;
|
|
33
|
+
//# sourceMappingURL=declare.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"declare.d.ts","sourceRoot":"","sources":["../src/declare.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,YAAY,CAAC;AAItC,MAAM,WAAW,YAAY,CAAC,CAAC;IAC9B,SAAS,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;CACpD;AAED,uHAAuH;AACvH,MAAM,WAAW,mBAAmB,CAAC,CAAC;IACrC,yGAAyG;IACzG,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,4FAA4F;IAC5F,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,OAAO,EAAE,CAAC;IACnC,kFAAkF;IAClF,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;KAAE,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAChE,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvC;AAED,MAAM,WAAW,QAAQ,CAAC,CAAC;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;CAClB;AAED,2CAA2C;AAC3C,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,YAAY,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IACvE,QAAQ,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAChE;AAGD,2GAA2G;AAC3G,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACnG,qGAAqG;AACrG,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC"}
|
package/dist/declare.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"declare.js","sourceRoot":"","sources":["../src/declare.ts"],"names":[],"mappings":"","sourcesContent":["import type { Ctx } from \"./types.ts\";\n\n// What a factory declares through `self` besides state cells: the shapes of resources and listeners.\n\nexport interface Subscribable<E> {\n\tsubscribe(listener: (event: E) => void): () => void;\n}\n\n/** `self.resource(name, declaration)`: something the object opens and later closes (a database, a watch, a socket). */\nexport interface ResourceDeclaration<T> {\n\t/** Bump to replace the resource at the next reload (a native value has no schema to detect a change). */\n\treadonly version: number;\n\t/** References or resources that must be live/open first. A change replaces the resource. */\n\treadonly deps?: readonly unknown[];\n\t/** Exclusive resources are replaced at the gate: old closed before new opened. */\n\treadonly exclusive?: boolean;\n\topen(options: { readonly signal: AbortSignal }): T | Promise<T>;\n\tclose?(value: T): void | Promise<void>;\n}\n\nexport interface Resource<T> {\n\treadonly key: string;\n\t/** Throws not_ready until opened. */\n\treadonly value: T;\n}\n\n/** A listener as `self.on` declares it. */\nexport interface ListenerDecl {\n\treadonly source: unknown;\n\treadonly select: ((value: never) => Subscribable<unknown>) | undefined;\n\treadonly fn: (event: unknown, ctx: Ctx) => void | Promise<void>;\n}\n\n// A cell has a `key` and a `value` too: sources are matched before resources.\n/** What `self.on(name, source, …)` passes to `select`: a resource's opened value, or the source itself. */\nexport type ValueOf<S> = S extends Subscribable<unknown> ? S : S extends Resource<infer T> ? T : S;\n/** What `self.on(name, source, handler)` delivers: a readable's values, an event source's events. */\nexport type EventOf<S> = S extends Subscribable<infer E> ? E : S extends Resource<infer T> ? EventOf<T> : never;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apply-immutable-trusted.js","sourceRoot":"","sources":["../../src/delta/apply-immutable-trusted.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonValue } from \"../types.ts\";\nimport type { Op, Path, Seg } from \"./index.ts\";\n\ntype JsonContainer = JsonValue[] | Record<string, JsonValue>;\ntype CopiedPath = { root: JsonValue; target: JsonContainer };\n\nconst DATA_DESCRIPTOR: PropertyDescriptor = {\n\tvalue: undefined,\n\twritable: true,\n\tenumerable: true,\n\tconfigurable: true,\n};\n\n/** Apply self-produced trusted operations while copying each touched container once. */\nexport function applyImmutableTrusted<T>(target: T, operations: readonly Op[]): T {\n\tlet root = target as unknown as JsonValue;\n\tconst owned = new WeakSet<object>();\n\tfor (const operation of operations) {\n\t\tif (operation[0] === \"r\") {\n\t\t\troot = operation[1];\n\t\t\tcontinue;\n\t\t}\n\t\tif (operation[0] === \"p\" || operation[0] === \"m\") {\n\t\t\tconst copied = copyPath(root, operation[1], operation[1].length, owned);\n\t\t\troot = copied.root;\n\t\t\tif (!Array.isArray(copied.target)) throw new TypeError(\"Trusted array operation target is not an array\");\n\t\t\tif (operation[0] === \"p\") spliceTrusted(copied.target, operation[2], operation[3], operation[4]);\n\t\t\telse permuteTrusted(copied.target, operation[2]);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst path = operation[1];\n\t\tconst copied = copyPath(root, path, path.length - 1, owned);\n\t\troot = copied.root;\n\t\tconst key = path[path.length - 1]!;\n\t\tswitch (operation[0]) {\n\t\t\tcase \"s\":\n\t\t\t\tdefineData(copied.target, key, operation[2]);\n\t\t\t\tbreak;\n\t\t\tcase \"d\":\n\t\t\t\tif (Array.isArray(copied.target)) {\n\t\t\t\t\tif (typeof key !== \"number\") throw new TypeError(\"Trusted array deletion key is not numeric\");\n\t\t\t\t\tspliceTrusted(copied.target, key, 1, []);\n\t\t\t\t} else Reflect.deleteProperty(copied.target, key);\n\t\t\t\tbreak;\n\t\t\tcase \"a\": {\n\t\t\t\tconst current = read(copied.target, key);\n\t\t\t\tif (typeof current !== \"string\") throw new TypeError(\"Trusted append target is not a string\");\n\t\t\t\tdefineData(copied.target, key, `${current}${operation[2]}`);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"t\": {\n\t\t\t\tconst current = read(copied.target, key);\n\t\t\t\tif (typeof current !== \"string\") throw new TypeError(\"Trusted truncate target is not a string\");\n\t\t\t\tdefineData(copied.target, key, current.slice(operation[2]));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn root as unknown as T;\n}\n\nfunction copyPath(root: JsonValue, path: Path, length: number, owned: WeakSet<object>): CopiedPath {\n\tif (!isContainer(root)) throw new TypeError(\"Trusted operation root is not a container\");\n\tlet copiedRoot = root;\n\tif (!owned.has(root)) {\n\t\tcopiedRoot = shallowCopy(root);\n\t\towned.add(copiedRoot);\n\t}\n\tlet destination = copiedRoot as JsonContainer;\n\tfor (let index = 0; index < length; index++) {\n\t\tconst segment = path[index]!;\n\t\tconst child = read(destination, segment);\n\t\tif (!isContainer(child)) throw new TypeError(\"Trusted operation path is not a container\");\n\t\tif (owned.has(child)) {\n\t\t\tdestination = child;\n\t\t\tcontinue;\n\t\t}\n\t\tconst copy = shallowCopy(child);\n\t\tdefineData(destination, segment, copy);\n\t\towned.add(copy);\n\t\tdestination = copy;\n\t}\n\treturn { root: copiedRoot, target: destination };\n}\n\nfunction shallowCopy(value: JsonContainer): JsonContainer {\n\tif (Array.isArray(value)) return Array.from(value);\n\tconst result = Object.create(Object.getPrototypeOf(value) === null ? null : Object.prototype) as Record<\n\t\tstring,\n\t\tJsonValue\n\t>;\n\tfor (const key of Object.keys(value)) defineData(result, key, value[key]!);\n\treturn result;\n}\n\nfunction read(target: JsonContainer, key: Seg): JsonValue {\n\treturn (target as Record<Seg, JsonValue>)[key]!;\n}\n\nfunction defineData(target: JsonContainer, key: Seg, value: JsonValue): void {\n\tDATA_DESCRIPTOR.value = value;\n\tObject.defineProperty(target, key, DATA_DESCRIPTOR);\n\tDATA_DESCRIPTOR.value = undefined;\n}\n\nfunction spliceTrusted(target: JsonValue[], start: number, remove: number, items: readonly JsonValue[]): void {\n\tconst oldLength = target.length;\n\tconst delta = items.length - remove;\n\tif (delta > 0) {\n\t\ttarget.length = oldLength + delta;\n\t\ttarget.copyWithin(start + items.length, start + remove, oldLength);\n\t} else if (delta < 0) {\n\t\ttarget.copyWithin(start + items.length, start + remove, oldLength);\n\t\ttarget.length = oldLength + delta;\n\t}\n\tfor (let index = 0; index < items.length; index++) defineData(target, start + index, items[index]!);\n}\n\nfunction permuteTrusted(target: JsonValue[], permutation: readonly number[]): void {\n\tif (target.length !== permutation.length) throw new TypeError(\"Trusted permutation length mismatch\");\n\tconst previous = target.slice();\n\tfor (let index = 0; index < permutation.length; index++) target[index] = previous[permutation[index]!]!;\n}\n\nfunction isContainer(value: unknown): value is JsonContainer {\n\treturn value !== null && typeof value === \"object\";\n}\n"]}
|
|
1
|
+
{"version":3,"file":"apply-immutable-trusted.js","sourceRoot":"","sources":["../../src/delta/apply-immutable-trusted.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonValue } from \"../json.ts\";\nimport type { Op, Path, Seg } from \"./index.ts\";\n\ntype JsonContainer = JsonValue[] | Record<string, JsonValue>;\ntype CopiedPath = { root: JsonValue; target: JsonContainer };\n\nconst DATA_DESCRIPTOR: PropertyDescriptor = {\n\tvalue: undefined,\n\twritable: true,\n\tenumerable: true,\n\tconfigurable: true,\n};\n\n/** Apply self-produced trusted operations while copying each touched container once. */\nexport function applyImmutableTrusted<T>(target: T, operations: readonly Op[]): T {\n\tlet root = target as unknown as JsonValue;\n\tconst owned = new WeakSet<object>();\n\tfor (const operation of operations) {\n\t\tif (operation[0] === \"r\") {\n\t\t\troot = operation[1];\n\t\t\tcontinue;\n\t\t}\n\t\tif (operation[0] === \"p\" || operation[0] === \"m\") {\n\t\t\tconst copied = copyPath(root, operation[1], operation[1].length, owned);\n\t\t\troot = copied.root;\n\t\t\tif (!Array.isArray(copied.target)) throw new TypeError(\"Trusted array operation target is not an array\");\n\t\t\tif (operation[0] === \"p\") spliceTrusted(copied.target, operation[2], operation[3], operation[4]);\n\t\t\telse permuteTrusted(copied.target, operation[2]);\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst path = operation[1];\n\t\tconst copied = copyPath(root, path, path.length - 1, owned);\n\t\troot = copied.root;\n\t\tconst key = path[path.length - 1]!;\n\t\tswitch (operation[0]) {\n\t\t\tcase \"s\":\n\t\t\t\tdefineData(copied.target, key, operation[2]);\n\t\t\t\tbreak;\n\t\t\tcase \"d\":\n\t\t\t\tif (Array.isArray(copied.target)) {\n\t\t\t\t\tif (typeof key !== \"number\") throw new TypeError(\"Trusted array deletion key is not numeric\");\n\t\t\t\t\tspliceTrusted(copied.target, key, 1, []);\n\t\t\t\t} else Reflect.deleteProperty(copied.target, key);\n\t\t\t\tbreak;\n\t\t\tcase \"a\": {\n\t\t\t\tconst current = read(copied.target, key);\n\t\t\t\tif (typeof current !== \"string\") throw new TypeError(\"Trusted append target is not a string\");\n\t\t\t\tdefineData(copied.target, key, `${current}${operation[2]}`);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase \"t\": {\n\t\t\t\tconst current = read(copied.target, key);\n\t\t\t\tif (typeof current !== \"string\") throw new TypeError(\"Trusted truncate target is not a string\");\n\t\t\t\tdefineData(copied.target, key, current.slice(operation[2]));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\treturn root as unknown as T;\n}\n\nfunction copyPath(root: JsonValue, path: Path, length: number, owned: WeakSet<object>): CopiedPath {\n\tif (!isContainer(root)) throw new TypeError(\"Trusted operation root is not a container\");\n\tlet copiedRoot = root;\n\tif (!owned.has(root)) {\n\t\tcopiedRoot = shallowCopy(root);\n\t\towned.add(copiedRoot);\n\t}\n\tlet destination = copiedRoot as JsonContainer;\n\tfor (let index = 0; index < length; index++) {\n\t\tconst segment = path[index]!;\n\t\tconst child = read(destination, segment);\n\t\tif (!isContainer(child)) throw new TypeError(\"Trusted operation path is not a container\");\n\t\tif (owned.has(child)) {\n\t\t\tdestination = child;\n\t\t\tcontinue;\n\t\t}\n\t\tconst copy = shallowCopy(child);\n\t\tdefineData(destination, segment, copy);\n\t\towned.add(copy);\n\t\tdestination = copy;\n\t}\n\treturn { root: copiedRoot, target: destination };\n}\n\nfunction shallowCopy(value: JsonContainer): JsonContainer {\n\tif (Array.isArray(value)) return Array.from(value);\n\tconst result = Object.create(Object.getPrototypeOf(value) === null ? null : Object.prototype) as Record<\n\t\tstring,\n\t\tJsonValue\n\t>;\n\tfor (const key of Object.keys(value)) defineData(result, key, value[key]!);\n\treturn result;\n}\n\nfunction read(target: JsonContainer, key: Seg): JsonValue {\n\treturn (target as Record<Seg, JsonValue>)[key]!;\n}\n\nfunction defineData(target: JsonContainer, key: Seg, value: JsonValue): void {\n\tDATA_DESCRIPTOR.value = value;\n\tObject.defineProperty(target, key, DATA_DESCRIPTOR);\n\tDATA_DESCRIPTOR.value = undefined;\n}\n\nfunction spliceTrusted(target: JsonValue[], start: number, remove: number, items: readonly JsonValue[]): void {\n\tconst oldLength = target.length;\n\tconst delta = items.length - remove;\n\tif (delta > 0) {\n\t\ttarget.length = oldLength + delta;\n\t\ttarget.copyWithin(start + items.length, start + remove, oldLength);\n\t} else if (delta < 0) {\n\t\ttarget.copyWithin(start + items.length, start + remove, oldLength);\n\t\ttarget.length = oldLength + delta;\n\t}\n\tfor (let index = 0; index < items.length; index++) defineData(target, start + index, items[index]!);\n}\n\nfunction permuteTrusted(target: JsonValue[], permutation: readonly number[]): void {\n\tif (target.length !== permutation.length) throw new TypeError(\"Trusted permutation length mismatch\");\n\tconst previous = target.slice();\n\tfor (let index = 0; index < permutation.length; index++) target[index] = previous[permutation[index]!]!;\n}\n\nfunction isContainer(value: unknown): value is JsonContainer {\n\treturn value !== null && typeof value === \"object\";\n}\n"]}
|
package/dist/delta/diff.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { JsonValue } from "../
|
|
1
|
+
import type { JsonValue } from "../json.ts";
|
|
2
2
|
import { type Op } from "./index.ts";
|
|
3
3
|
/** Compute a compact operation batch from two immutable JSON revisions. */
|
|
4
4
|
export declare function diffRevisions(before: JsonValue, after: JsonValue): Op[];
|
package/dist/delta/diff.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/delta/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/delta/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAqB,KAAK,EAAE,EAAmD,MAAM,YAAY,CAAC;AA8fzG,2EAA2E;AAC3E,wBAAgB,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,GAAG,EAAE,EAAE,CAUvE"}
|
package/dist/delta/diff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/delta/diff.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonValue } from \"../types.ts\";\nimport { type NonEmptyPath, type Op, overlap, type Path, RESERVED_SEGMENTS, type Seg } from \"./index.ts\";\n\nconst DEFAULT_OVERLAP_SCAN = 65_536;\nconst MAX_DELTA_OPERATIONS = 4_096;\nconst overflowedBatches = new WeakSet<Op[]>();\n\nconst emitOperation = (operations: Op[], operation: Op): void => {\n\tif (overflowedBatches.has(operations)) return;\n\tif (operations.length >= MAX_DELTA_OPERATIONS) {\n\t\toverflowedBatches.add(operations);\n\t\treturn;\n\t}\n\toperations.push(operation);\n};\n\nconst isContainer = (value: JsonValue): value is JsonValue[] | Record<string, JsonValue> =>\n\tvalue !== null && typeof value === \"object\";\n\nconst emitSet = (path: Path, value: JsonValue, operations: Op[]): void => {\n\tif (path.length === 0) emitOperation(operations, [\"r\", value]);\n\telse emitOperation(operations, [\"s\", path as NonEmptyPath, value]);\n};\n\nconst equalJson = (left: JsonValue, right: JsonValue): boolean => {\n\tif (left === right) return true;\n\tif (!isContainer(left) || !isContainer(right) || Array.isArray(left) !== Array.isArray(right)) return false;\n\tif (Array.isArray(left)) {\n\t\tconst other = right as JsonValue[];\n\t\tif (left.length !== other.length) return false;\n\t\tfor (let index = 0; index < left.length; index++) {\n\t\t\tif (!equalJson(left[index]!, other[index]!)) return false;\n\t\t}\n\t\treturn true;\n\t}\n\tconst other = right as Record<string, JsonValue>;\n\tconst keys = Object.keys(left);\n\tif (keys.length !== Object.keys(other).length) return false;\n\tfor (const key of keys) {\n\t\tif (!Object.hasOwn(other, key) || !equalJson(left[key]!, other[key]!)) return false;\n\t}\n\treturn true;\n};\n\nconst permutation = (before: readonly JsonValue[], after: readonly JsonValue[]): number[] | undefined => {\n\tif (before.length !== after.length) return undefined;\n\tconst positions = new Map<JsonValue, { indices: number[]; used: number }>();\n\tfor (let index = 0; index < before.length; index++) {\n\t\tconst value = before[index]!;\n\t\tconst entry = positions.get(value);\n\t\tif (entry === undefined) positions.set(value, { indices: [index], used: 0 });\n\t\telse entry.indices.push(index);\n\t}\n\tconst result = new Array<number>(after.length);\n\tfor (let index = 0; index < after.length; index++) {\n\t\tconst entry = positions.get(after[index]!);\n\t\tif (entry === undefined || entry.used === entry.indices.length) return undefined;\n\t\tresult[index] = entry.indices[entry.used++]!;\n\t}\n\treturn result;\n};\n\nconst emitString = (before: string, after: string, path: NonEmptyPath, operations: Op[]): void => {\n\tif (before === after) return;\n\tif (after.length > before.length && after.slice(0, before.length) === before) {\n\t\temitOperation(operations, [\"a\", path, after.slice(before.length)]);\n\t\treturn;\n\t}\n\tconst shared = overlap(before, after, DEFAULT_OVERLAP_SCAN);\n\tif (shared === 0) {\n\t\temitOperation(operations, [\"s\", path, after]);\n\t\treturn;\n\t}\n\temitOperation(operations, [\"t\", path, before.length - shared]);\n\tif (after.length > shared) emitOperation(operations, [\"a\", path, after.slice(shared)]);\n};\n\ntype ArrayMatch = readonly [before: number, after: number];\n\ntype MatchCandidate = {\n\tbefore: number;\n\tafter: number;\n\tprevious: number;\n};\n\nconst MAX_IDENTITY_CANDIDATES = 200_000;\nconst MAX_SEMANTIC_CELLS = 65_536;\n\nconst sameValue = (left: JsonValue, right: JsonValue): boolean => left === right || equalJson(left, right);\n\nconst lcsMatches = (\n\tbefore: readonly JsonValue[],\n\tafter: readonly JsonValue[],\n\tequal: (left: JsonValue, right: JsonValue) => boolean,\n\tmaxCells: number,\n): ArrayMatch[] | undefined => {\n\tif (before.length === 0 || after.length === 0) return [];\n\tif (before.length * after.length > maxCells) return undefined;\n\tconst width = after.length + 1;\n\tconst lengths = new Uint32Array((before.length + 1) * width);\n\tfor (let left = before.length - 1; left >= 0; left--) {\n\t\tfor (let right = after.length - 1; right >= 0; right--) {\n\t\t\tconst at = left * width + right;\n\t\t\tlengths[at] = equal(before[left]!, after[right]!)\n\t\t\t\t? lengths[(left + 1) * width + right + 1]! + 1\n\t\t\t\t: Math.max(lengths[(left + 1) * width + right]!, lengths[left * width + right + 1]!);\n\t\t}\n\t}\n\tconst matches: ArrayMatch[] = [];\n\tlet left = 0;\n\tlet right = 0;\n\twhile (left < before.length && right < after.length) {\n\t\tif (\n\t\t\tequal(before[left]!, after[right]!) &&\n\t\t\tlengths[left * width + right] === lengths[(left + 1) * width + right + 1]! + 1\n\t\t) {\n\t\t\tmatches.push([left++, right++]);\n\t\t} else if (lengths[(left + 1) * width + right]! >= lengths[left * width + right + 1]!) left += 1;\n\t\telse right += 1;\n\t}\n\treturn matches;\n};\n\nconst semanticallyAligned = (left: JsonValue, right: JsonValue): boolean => {\n\tif (sameValue(left, right)) return true;\n\tif (!isContainer(left) || !isContainer(right) || Array.isArray(left) !== Array.isArray(right)) return false;\n\tif (Array.isArray(left) && Array.isArray(right)) {\n\t\tif (left.length !== right.length) return false;\n\t\treturn left.some((value, index) => isContainer(value) && value === right[index]);\n\t}\n\tconst leftObject = left as Record<string, JsonValue>;\n\tconst rightObject = right as Record<string, JsonValue>;\n\tfor (const key of Object.keys(leftObject)) {\n\t\tconst value = leftObject[key];\n\t\tif (isContainer(value) && Object.hasOwn(rightObject, key) && value === rightObject[key]) return true;\n\t}\n\treturn false;\n};\n\nconst lowerBound = (values: readonly number[], value: number): number => {\n\tlet low = 0;\n\tlet high = values.length;\n\twhile (low < high) {\n\t\tconst middle = (low + high) >>> 1;\n\t\tif (values[middle]! < value) low = middle + 1;\n\t\telse high = middle;\n\t}\n\treturn low;\n};\n\nconst identitySubsequence = (\n\tbefore: readonly JsonValue[],\n\tbeforeStart: number,\n\tbeforeEnd: number,\n\tafter: readonly JsonValue[],\n\tafterStart: number,\n\tafterEnd: number,\n): ArrayMatch[] | undefined => {\n\tconst beforeCount = beforeEnd - beforeStart;\n\tconst afterCount = afterEnd - afterStart;\n\tconst matches: ArrayMatch[] = [];\n\tif (afterCount < beforeCount) {\n\t\tlet beforeIndex = beforeStart;\n\t\tfor (let afterIndex = afterStart; afterIndex < afterEnd; afterIndex++) {\n\t\t\twhile (beforeIndex < beforeEnd && before[beforeIndex] !== after[afterIndex]) beforeIndex += 1;\n\t\t\tif (beforeIndex === beforeEnd) return undefined;\n\t\t\tmatches.push([beforeIndex++, afterIndex]);\n\t\t}\n\t\treturn matches;\n\t}\n\tif (beforeCount < afterCount) {\n\t\tlet afterIndex = afterStart;\n\t\tfor (let beforeIndex = beforeStart; beforeIndex < beforeEnd; beforeIndex++) {\n\t\t\twhile (afterIndex < afterEnd && before[beforeIndex] !== after[afterIndex]) afterIndex += 1;\n\t\t\tif (afterIndex === afterEnd) return undefined;\n\t\t\tmatches.push([beforeIndex, afterIndex++]);\n\t\t}\n\t\treturn matches;\n\t}\n\treturn undefined;\n};\n\nconst greedyIdentityAnchors = (\n\tpositions: ReadonlyMap<JsonValue, readonly number[]>,\n\tafter: readonly JsonValue[],\n\tafterStart: number,\n\tafterEnd: number,\n): ArrayMatch[] => {\n\tconst matches: ArrayMatch[] = [];\n\tlet previous = -1;\n\tfor (let afterIndex = afterStart; afterIndex < afterEnd; afterIndex++) {\n\t\tconst candidates = positions.get(after[afterIndex]!);\n\t\tif (candidates === undefined) continue;\n\t\tconst at = lowerBound(candidates, previous + 1);\n\t\tconst beforeIndex = candidates[at];\n\t\tif (beforeIndex === undefined) continue;\n\t\tmatches.push([beforeIndex, afterIndex]);\n\t\tprevious = beforeIndex;\n\t}\n\treturn matches;\n};\n\nconst identityAnchors = (\n\tbefore: readonly JsonValue[],\n\tbeforeStart: number,\n\tbeforeEnd: number,\n\tafter: readonly JsonValue[],\n\tafterStart: number,\n\tafterEnd: number,\n): ArrayMatch[] => {\n\tconst positions = new Map<JsonValue, number[]>();\n\tfor (let index = beforeStart; index < beforeEnd; index++) {\n\t\tconst value = before[index]!;\n\t\tconst existing = positions.get(value);\n\t\tif (existing === undefined) positions.set(value, [index]);\n\t\telse existing.push(index);\n\t}\n\tlet candidateCount = 0;\n\tfor (let index = afterStart; index < afterEnd; index++) {\n\t\tcandidateCount += positions.get(after[index]!)?.length ?? 0;\n\t\tif (candidateCount > MAX_IDENTITY_CANDIDATES) {\n\t\t\treturn greedyIdentityAnchors(positions, after, afterStart, afterEnd);\n\t\t}\n\t}\n\tif (candidateCount === 0) return [];\n\n\tconst candidates: MatchCandidate[] = [];\n\tconst tails: number[] = [];\n\tconst tailValues: number[] = [];\n\tfor (let afterIndex = afterStart; afterIndex < afterEnd; afterIndex++) {\n\t\tconst beforePositions = positions.get(after[afterIndex]!);\n\t\tif (beforePositions === undefined) continue;\n\t\tfor (let index = beforePositions.length - 1; index >= 0; index--) {\n\t\t\tconst beforeIndex = beforePositions[index]!;\n\t\t\tconst at = lowerBound(tailValues, beforeIndex);\n\t\t\tconst candidateIndex = candidates.length;\n\t\t\tcandidates.push({ before: beforeIndex, after: afterIndex, previous: at === 0 ? -1 : tails[at - 1]! });\n\t\t\ttails[at] = candidateIndex;\n\t\t\ttailValues[at] = beforeIndex;\n\t\t}\n\t}\n\tconst matches: ArrayMatch[] = [];\n\tlet candidateIndex = tails[tails.length - 1] ?? -1;\n\twhile (candidateIndex >= 0) {\n\t\tconst candidate = candidates[candidateIndex]!;\n\t\tmatches.push([candidate.before, candidate.after]);\n\t\tcandidateIndex = candidate.previous;\n\t}\n\tmatches.reverse();\n\treturn matches;\n};\n\nconst processArrayMatches = (\n\tbefore: JsonValue[],\n\tafter: JsonValue[],\n\tpath: Path,\n\toperations: Op[],\n\tbeforeStart: number,\n\tbeforeEnd: number,\n\tafterStart: number,\n\tafterEnd: number,\n\toutputStart: number,\n\tmatches: readonly ArrayMatch[],\n): void => {\n\tlet beforeAt = beforeStart;\n\tlet afterAt = afterStart;\n\tlet outputAt = outputStart;\n\tfor (const [beforeMatch, afterMatch] of matches) {\n\t\tif (overflowedBatches.has(operations)) return;\n\t\tdiffArrayRegion(before, after, path, operations, beforeAt, beforeMatch, afterAt, afterMatch, outputAt);\n\t\toutputAt += afterMatch - afterAt;\n\t\tif (!sameValue(before[beforeMatch]!, after[afterMatch]!)) {\n\t\t\tdiffValue(before[beforeMatch]!, after[afterMatch]!, [...path, outputAt], operations);\n\t\t}\n\t\toutputAt += 1;\n\t\tbeforeAt = beforeMatch + 1;\n\t\tafterAt = afterMatch + 1;\n\t}\n\tif (!overflowedBatches.has(operations)) {\n\t\tdiffArrayRegion(before, after, path, operations, beforeAt, beforeEnd, afterAt, afterEnd, outputAt);\n\t}\n};\n\nfunction diffArrayRegion(\n\tbefore: JsonValue[],\n\tafter: JsonValue[],\n\tpath: Path,\n\toperations: Op[],\n\tbeforeStart: number,\n\tbeforeEnd: number,\n\tafterStart: number,\n\tafterEnd: number,\n\toutputStart: number,\n): void {\n\tif (overflowedBatches.has(operations)) return;\n\twhile (beforeStart < beforeEnd && afterStart < afterEnd && sameValue(before[beforeStart]!, after[afterStart]!)) {\n\t\tbeforeStart += 1;\n\t\tafterStart += 1;\n\t\toutputStart += 1;\n\t}\n\twhile (beforeStart < beforeEnd && afterStart < afterEnd && sameValue(before[beforeEnd - 1]!, after[afterEnd - 1]!)) {\n\t\tbeforeEnd -= 1;\n\t\tafterEnd -= 1;\n\t}\n\tconst beforeCount = beforeEnd - beforeStart;\n\tconst afterCount = afterEnd - afterStart;\n\tif (beforeCount === 0 && afterCount === 0) return;\n\tif (beforeCount === 0 || afterCount === 0) {\n\t\temitOperation(operations, [\"p\", path, outputStart, beforeCount, after.slice(afterStart, afterEnd)]);\n\t\treturn;\n\t}\n\n\tif (beforeCount === afterCount) {\n\t\tconst positional: ArrayMatch[] = [];\n\t\tfor (let offset = 0; offset < beforeCount; offset++) {\n\t\t\tif (sameValue(before[beforeStart + offset]!, after[afterStart + offset]!)) {\n\t\t\t\tpositional.push([beforeStart + offset, afterStart + offset]);\n\t\t\t}\n\t\t}\n\t\tif (positional.length > 0) {\n\t\t\tprocessArrayMatches(\n\t\t\t\tbefore,\n\t\t\t\tafter,\n\t\t\t\tpath,\n\t\t\t\toperations,\n\t\t\t\tbeforeStart,\n\t\t\t\tbeforeEnd,\n\t\t\t\tafterStart,\n\t\t\t\tafterEnd,\n\t\t\t\toutputStart,\n\t\t\t\tpositional,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tconst subsequence = identitySubsequence(before, beforeStart, beforeEnd, after, afterStart, afterEnd);\n\tif (subsequence !== undefined && subsequence.length > 0) {\n\t\tprocessArrayMatches(\n\t\t\tbefore,\n\t\t\tafter,\n\t\t\tpath,\n\t\t\toperations,\n\t\t\tbeforeStart,\n\t\t\tbeforeEnd,\n\t\t\tafterStart,\n\t\t\tafterEnd,\n\t\t\toutputStart,\n\t\t\tsubsequence,\n\t\t);\n\t\treturn;\n\t}\n\n\tconst identity = identityAnchors(before, beforeStart, beforeEnd, after, afterStart, afterEnd);\n\tif (identity.length > 0) {\n\t\tprocessArrayMatches(\n\t\t\tbefore,\n\t\t\tafter,\n\t\t\tpath,\n\t\t\toperations,\n\t\t\tbeforeStart,\n\t\t\tbeforeEnd,\n\t\t\tafterStart,\n\t\t\tafterEnd,\n\t\t\toutputStart,\n\t\t\tidentity,\n\t\t);\n\t\treturn;\n\t}\n\n\tconst semantic = lcsMatches(\n\t\tbefore.slice(beforeStart, beforeEnd),\n\t\tafter.slice(afterStart, afterEnd),\n\t\tsemanticallyAligned,\n\t\tMAX_SEMANTIC_CELLS,\n\t);\n\tif (semantic !== undefined && semantic.length > 0) {\n\t\tconst absolute = semantic.map(\n\t\t\t([beforeIndex, afterIndex]) => [beforeStart + beforeIndex, afterStart + afterIndex] as const,\n\t\t);\n\t\tprocessArrayMatches(\n\t\t\tbefore,\n\t\t\tafter,\n\t\t\tpath,\n\t\t\toperations,\n\t\t\tbeforeStart,\n\t\t\tbeforeEnd,\n\t\t\tafterStart,\n\t\t\tafterEnd,\n\t\t\toutputStart,\n\t\t\tabsolute,\n\t\t);\n\t\treturn;\n\t}\n\n\tif (beforeCount === 1 && afterCount === 1) {\n\t\tdiffValue(before[beforeStart]!, after[afterStart]!, [...path, outputStart], operations);\n\t\treturn;\n\t}\n\temitOperation(operations, [\"p\", path, outputStart, beforeCount, after.slice(afterStart, afterEnd)]);\n}\n\nconst diffArray = (before: JsonValue[], after: JsonValue[], path: Path, operations: Op[]): void => {\n\tif (before === after || equalJson(before, after)) return;\n\tif (\n\t\tbefore.length === after.length &&\n\t\tbefore.length > 1 &&\n\t\t!sameValue(before[0]!, after[0]!) &&\n\t\t!sameValue(before[before.length - 1]!, after[after.length - 1]!)\n\t) {\n\t\tconst order = permutation(before, after);\n\t\tif (order !== undefined) {\n\t\t\temitOperation(operations, [\"m\", path, order]);\n\t\t\treturn;\n\t\t}\n\t}\n\tdiffArrayRegion(before, after, path, operations, 0, before.length, 0, after.length, 0);\n};\n\nconst diffObject = (\n\tbefore: Record<string, JsonValue>,\n\tafter: Record<string, JsonValue>,\n\tpath: Path,\n\toperations: Op[],\n): void => {\n\tconst beforeKeys = Object.keys(before);\n\tconst afterKeys = Object.keys(after);\n\tif ([...beforeKeys, ...afterKeys].some((key) => RESERVED_SEGMENTS.has(key))) {\n\t\tif (!equalJson(before, after)) emitSet(path, after, operations);\n\t\treturn;\n\t}\n\tfor (const key of afterKeys) {\n\t\tif (overflowedBatches.has(operations)) return;\n\t\tif (Object.hasOwn(before, key)) diffValue(before[key]!, after[key]!, [...path, key], operations);\n\t\telse emitSet([...path, key], after[key]!, operations);\n\t}\n\tfor (const key of beforeKeys) {\n\t\tif (overflowedBatches.has(operations)) return;\n\t\tif (!Object.hasOwn(after, key)) emitOperation(operations, [\"d\", [...path, key] as unknown as NonEmptyPath]);\n\t}\n};\n\nconst diffValue = (before: JsonValue, after: JsonValue, path: Path, operations: Op[]): void => {\n\tif (before === after || overflowedBatches.has(operations)) return;\n\tif (typeof before === \"string\" && typeof after === \"string\" && path.length > 0) {\n\t\temitString(before, after, path as NonEmptyPath, operations);\n\t\treturn;\n\t}\n\tif (Array.isArray(before) && Array.isArray(after)) {\n\t\tdiffArray(before, after, path, operations);\n\t\treturn;\n\t}\n\tif (isContainer(before) && isContainer(after) && !Array.isArray(before) && !Array.isArray(after)) {\n\t\tdiffObject(before, after, path, operations);\n\t\treturn;\n\t}\n\temitSet(path, after, operations);\n};\n\nconst jsonCost = (value: JsonValue): number => {\n\tif (value === null) return 4;\n\tif (typeof value === \"string\") return value.length + 2;\n\tif (typeof value === \"number\") return String(value).length;\n\tif (typeof value === \"boolean\") return value ? 4 : 5;\n\tif (Array.isArray(value)) {\n\t\tlet cost = 2;\n\t\tfor (let index = 0; index < value.length; index++) cost += jsonCost(value[index]!) + (index === 0 ? 0 : 1);\n\t\treturn cost;\n\t}\n\tlet cost = 2;\n\tlet index = 0;\n\tfor (const key of Object.keys(value)) {\n\t\tcost += key.length + 3 + jsonCost(value[key]!) + (index++ === 0 ? 0 : 1);\n\t}\n\treturn cost;\n};\n\nconst pathCost = (path: Path): number => {\n\tlet cost = 2;\n\tfor (let index = 0; index < path.length; index++) {\n\t\tconst segment: Seg = path[index]!;\n\t\tcost += (typeof segment === \"string\" ? segment.length + 2 : String(segment).length) + (index === 0 ? 0 : 1);\n\t}\n\treturn cost;\n};\n\nconst operationCost = (operation: Op): number => {\n\tswitch (operation[0]) {\n\t\tcase \"r\":\n\t\t\treturn 6 + jsonCost(operation[1]);\n\t\tcase \"s\":\n\t\t\treturn 7 + pathCost(operation[1]) + jsonCost(operation[2]);\n\t\tcase \"d\":\n\t\t\treturn 6 + pathCost(operation[1]);\n\t\tcase \"a\":\n\t\t\treturn 7 + pathCost(operation[1]) + operation[2].length + 2;\n\t\tcase \"t\":\n\t\t\treturn 7 + pathCost(operation[1]) + String(operation[2]).length;\n\t\tcase \"p\":\n\t\t\treturn (\n\t\t\t\t10 +\n\t\t\t\tpathCost(operation[1]) +\n\t\t\t\tString(operation[2]).length +\n\t\t\t\tString(operation[3]).length +\n\t\t\t\tjsonCost(operation[4])\n\t\t\t);\n\t\tcase \"m\":\n\t\t\treturn 7 + pathCost(operation[1]) + jsonCost(operation[2]);\n\t}\n};\n\n/** Compute a compact operation batch from two immutable JSON revisions. */\nexport function diffRevisions(before: JsonValue, after: JsonValue): Op[] {\n\tconst operations: Op[] = [];\n\tdiffValue(before, after, [], operations);\n\tif (overflowedBatches.has(operations)) return [[\"r\", after]];\n\tif (operations.length === 0 || operations[0]?.[0] === \"r\") return operations;\n\tlet deltaCost = 2;\n\tfor (const operation of operations) deltaCost += operationCost(operation) + 1;\n\tif (deltaCost < 65_536) return operations;\n\tconst snapshotCost = jsonCost(after) + 6;\n\treturn deltaCost >= snapshotCost ? [[\"r\", after]] : operations;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/delta/diff.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JsonValue } from \"../json.ts\";\nimport { type NonEmptyPath, type Op, overlap, type Path, RESERVED_SEGMENTS, type Seg } from \"./index.ts\";\n\nconst DEFAULT_OVERLAP_SCAN = 65_536;\nconst MAX_DELTA_OPERATIONS = 4_096;\nconst overflowedBatches = new WeakSet<Op[]>();\n\nconst emitOperation = (operations: Op[], operation: Op): void => {\n\tif (overflowedBatches.has(operations)) return;\n\tif (operations.length >= MAX_DELTA_OPERATIONS) {\n\t\toverflowedBatches.add(operations);\n\t\treturn;\n\t}\n\toperations.push(operation);\n};\n\nconst isContainer = (value: JsonValue): value is JsonValue[] | Record<string, JsonValue> =>\n\tvalue !== null && typeof value === \"object\";\n\nconst emitSet = (path: Path, value: JsonValue, operations: Op[]): void => {\n\tif (path.length === 0) emitOperation(operations, [\"r\", value]);\n\telse emitOperation(operations, [\"s\", path as NonEmptyPath, value]);\n};\n\nconst equalJson = (left: JsonValue, right: JsonValue): boolean => {\n\tif (left === right) return true;\n\tif (!isContainer(left) || !isContainer(right) || Array.isArray(left) !== Array.isArray(right)) return false;\n\tif (Array.isArray(left)) {\n\t\tconst other = right as JsonValue[];\n\t\tif (left.length !== other.length) return false;\n\t\tfor (let index = 0; index < left.length; index++) {\n\t\t\tif (!equalJson(left[index]!, other[index]!)) return false;\n\t\t}\n\t\treturn true;\n\t}\n\tconst other = right as Record<string, JsonValue>;\n\tconst keys = Object.keys(left);\n\tif (keys.length !== Object.keys(other).length) return false;\n\tfor (const key of keys) {\n\t\tif (!Object.hasOwn(other, key) || !equalJson(left[key]!, other[key]!)) return false;\n\t}\n\treturn true;\n};\n\nconst permutation = (before: readonly JsonValue[], after: readonly JsonValue[]): number[] | undefined => {\n\tif (before.length !== after.length) return undefined;\n\tconst positions = new Map<JsonValue, { indices: number[]; used: number }>();\n\tfor (let index = 0; index < before.length; index++) {\n\t\tconst value = before[index]!;\n\t\tconst entry = positions.get(value);\n\t\tif (entry === undefined) positions.set(value, { indices: [index], used: 0 });\n\t\telse entry.indices.push(index);\n\t}\n\tconst result = new Array<number>(after.length);\n\tfor (let index = 0; index < after.length; index++) {\n\t\tconst entry = positions.get(after[index]!);\n\t\tif (entry === undefined || entry.used === entry.indices.length) return undefined;\n\t\tresult[index] = entry.indices[entry.used++]!;\n\t}\n\treturn result;\n};\n\nconst emitString = (before: string, after: string, path: NonEmptyPath, operations: Op[]): void => {\n\tif (before === after) return;\n\tif (after.length > before.length && after.slice(0, before.length) === before) {\n\t\temitOperation(operations, [\"a\", path, after.slice(before.length)]);\n\t\treturn;\n\t}\n\tconst shared = overlap(before, after, DEFAULT_OVERLAP_SCAN);\n\tif (shared === 0) {\n\t\temitOperation(operations, [\"s\", path, after]);\n\t\treturn;\n\t}\n\temitOperation(operations, [\"t\", path, before.length - shared]);\n\tif (after.length > shared) emitOperation(operations, [\"a\", path, after.slice(shared)]);\n};\n\ntype ArrayMatch = readonly [before: number, after: number];\n\ntype MatchCandidate = {\n\tbefore: number;\n\tafter: number;\n\tprevious: number;\n};\n\nconst MAX_IDENTITY_CANDIDATES = 200_000;\nconst MAX_SEMANTIC_CELLS = 65_536;\n\nconst sameValue = (left: JsonValue, right: JsonValue): boolean => left === right || equalJson(left, right);\n\nconst lcsMatches = (\n\tbefore: readonly JsonValue[],\n\tafter: readonly JsonValue[],\n\tequal: (left: JsonValue, right: JsonValue) => boolean,\n\tmaxCells: number,\n): ArrayMatch[] | undefined => {\n\tif (before.length === 0 || after.length === 0) return [];\n\tif (before.length * after.length > maxCells) return undefined;\n\tconst width = after.length + 1;\n\tconst lengths = new Uint32Array((before.length + 1) * width);\n\tfor (let left = before.length - 1; left >= 0; left--) {\n\t\tfor (let right = after.length - 1; right >= 0; right--) {\n\t\t\tconst at = left * width + right;\n\t\t\tlengths[at] = equal(before[left]!, after[right]!)\n\t\t\t\t? lengths[(left + 1) * width + right + 1]! + 1\n\t\t\t\t: Math.max(lengths[(left + 1) * width + right]!, lengths[left * width + right + 1]!);\n\t\t}\n\t}\n\tconst matches: ArrayMatch[] = [];\n\tlet left = 0;\n\tlet right = 0;\n\twhile (left < before.length && right < after.length) {\n\t\tif (\n\t\t\tequal(before[left]!, after[right]!) &&\n\t\t\tlengths[left * width + right] === lengths[(left + 1) * width + right + 1]! + 1\n\t\t) {\n\t\t\tmatches.push([left++, right++]);\n\t\t} else if (lengths[(left + 1) * width + right]! >= lengths[left * width + right + 1]!) left += 1;\n\t\telse right += 1;\n\t}\n\treturn matches;\n};\n\nconst semanticallyAligned = (left: JsonValue, right: JsonValue): boolean => {\n\tif (sameValue(left, right)) return true;\n\tif (!isContainer(left) || !isContainer(right) || Array.isArray(left) !== Array.isArray(right)) return false;\n\tif (Array.isArray(left) && Array.isArray(right)) {\n\t\tif (left.length !== right.length) return false;\n\t\treturn left.some((value, index) => isContainer(value) && value === right[index]);\n\t}\n\tconst leftObject = left as Record<string, JsonValue>;\n\tconst rightObject = right as Record<string, JsonValue>;\n\tfor (const key of Object.keys(leftObject)) {\n\t\tconst value = leftObject[key];\n\t\tif (isContainer(value) && Object.hasOwn(rightObject, key) && value === rightObject[key]) return true;\n\t}\n\treturn false;\n};\n\nconst lowerBound = (values: readonly number[], value: number): number => {\n\tlet low = 0;\n\tlet high = values.length;\n\twhile (low < high) {\n\t\tconst middle = (low + high) >>> 1;\n\t\tif (values[middle]! < value) low = middle + 1;\n\t\telse high = middle;\n\t}\n\treturn low;\n};\n\nconst identitySubsequence = (\n\tbefore: readonly JsonValue[],\n\tbeforeStart: number,\n\tbeforeEnd: number,\n\tafter: readonly JsonValue[],\n\tafterStart: number,\n\tafterEnd: number,\n): ArrayMatch[] | undefined => {\n\tconst beforeCount = beforeEnd - beforeStart;\n\tconst afterCount = afterEnd - afterStart;\n\tconst matches: ArrayMatch[] = [];\n\tif (afterCount < beforeCount) {\n\t\tlet beforeIndex = beforeStart;\n\t\tfor (let afterIndex = afterStart; afterIndex < afterEnd; afterIndex++) {\n\t\t\twhile (beforeIndex < beforeEnd && before[beforeIndex] !== after[afterIndex]) beforeIndex += 1;\n\t\t\tif (beforeIndex === beforeEnd) return undefined;\n\t\t\tmatches.push([beforeIndex++, afterIndex]);\n\t\t}\n\t\treturn matches;\n\t}\n\tif (beforeCount < afterCount) {\n\t\tlet afterIndex = afterStart;\n\t\tfor (let beforeIndex = beforeStart; beforeIndex < beforeEnd; beforeIndex++) {\n\t\t\twhile (afterIndex < afterEnd && before[beforeIndex] !== after[afterIndex]) afterIndex += 1;\n\t\t\tif (afterIndex === afterEnd) return undefined;\n\t\t\tmatches.push([beforeIndex, afterIndex++]);\n\t\t}\n\t\treturn matches;\n\t}\n\treturn undefined;\n};\n\nconst greedyIdentityAnchors = (\n\tpositions: ReadonlyMap<JsonValue, readonly number[]>,\n\tafter: readonly JsonValue[],\n\tafterStart: number,\n\tafterEnd: number,\n): ArrayMatch[] => {\n\tconst matches: ArrayMatch[] = [];\n\tlet previous = -1;\n\tfor (let afterIndex = afterStart; afterIndex < afterEnd; afterIndex++) {\n\t\tconst candidates = positions.get(after[afterIndex]!);\n\t\tif (candidates === undefined) continue;\n\t\tconst at = lowerBound(candidates, previous + 1);\n\t\tconst beforeIndex = candidates[at];\n\t\tif (beforeIndex === undefined) continue;\n\t\tmatches.push([beforeIndex, afterIndex]);\n\t\tprevious = beforeIndex;\n\t}\n\treturn matches;\n};\n\nconst identityAnchors = (\n\tbefore: readonly JsonValue[],\n\tbeforeStart: number,\n\tbeforeEnd: number,\n\tafter: readonly JsonValue[],\n\tafterStart: number,\n\tafterEnd: number,\n): ArrayMatch[] => {\n\tconst positions = new Map<JsonValue, number[]>();\n\tfor (let index = beforeStart; index < beforeEnd; index++) {\n\t\tconst value = before[index]!;\n\t\tconst existing = positions.get(value);\n\t\tif (existing === undefined) positions.set(value, [index]);\n\t\telse existing.push(index);\n\t}\n\tlet candidateCount = 0;\n\tfor (let index = afterStart; index < afterEnd; index++) {\n\t\tcandidateCount += positions.get(after[index]!)?.length ?? 0;\n\t\tif (candidateCount > MAX_IDENTITY_CANDIDATES) {\n\t\t\treturn greedyIdentityAnchors(positions, after, afterStart, afterEnd);\n\t\t}\n\t}\n\tif (candidateCount === 0) return [];\n\n\tconst candidates: MatchCandidate[] = [];\n\tconst tails: number[] = [];\n\tconst tailValues: number[] = [];\n\tfor (let afterIndex = afterStart; afterIndex < afterEnd; afterIndex++) {\n\t\tconst beforePositions = positions.get(after[afterIndex]!);\n\t\tif (beforePositions === undefined) continue;\n\t\tfor (let index = beforePositions.length - 1; index >= 0; index--) {\n\t\t\tconst beforeIndex = beforePositions[index]!;\n\t\t\tconst at = lowerBound(tailValues, beforeIndex);\n\t\t\tconst candidateIndex = candidates.length;\n\t\t\tcandidates.push({ before: beforeIndex, after: afterIndex, previous: at === 0 ? -1 : tails[at - 1]! });\n\t\t\ttails[at] = candidateIndex;\n\t\t\ttailValues[at] = beforeIndex;\n\t\t}\n\t}\n\tconst matches: ArrayMatch[] = [];\n\tlet candidateIndex = tails[tails.length - 1] ?? -1;\n\twhile (candidateIndex >= 0) {\n\t\tconst candidate = candidates[candidateIndex]!;\n\t\tmatches.push([candidate.before, candidate.after]);\n\t\tcandidateIndex = candidate.previous;\n\t}\n\tmatches.reverse();\n\treturn matches;\n};\n\nconst processArrayMatches = (\n\tbefore: JsonValue[],\n\tafter: JsonValue[],\n\tpath: Path,\n\toperations: Op[],\n\tbeforeStart: number,\n\tbeforeEnd: number,\n\tafterStart: number,\n\tafterEnd: number,\n\toutputStart: number,\n\tmatches: readonly ArrayMatch[],\n): void => {\n\tlet beforeAt = beforeStart;\n\tlet afterAt = afterStart;\n\tlet outputAt = outputStart;\n\tfor (const [beforeMatch, afterMatch] of matches) {\n\t\tif (overflowedBatches.has(operations)) return;\n\t\tdiffArrayRegion(before, after, path, operations, beforeAt, beforeMatch, afterAt, afterMatch, outputAt);\n\t\toutputAt += afterMatch - afterAt;\n\t\tif (!sameValue(before[beforeMatch]!, after[afterMatch]!)) {\n\t\t\tdiffValue(before[beforeMatch]!, after[afterMatch]!, [...path, outputAt], operations);\n\t\t}\n\t\toutputAt += 1;\n\t\tbeforeAt = beforeMatch + 1;\n\t\tafterAt = afterMatch + 1;\n\t}\n\tif (!overflowedBatches.has(operations)) {\n\t\tdiffArrayRegion(before, after, path, operations, beforeAt, beforeEnd, afterAt, afterEnd, outputAt);\n\t}\n};\n\nfunction diffArrayRegion(\n\tbefore: JsonValue[],\n\tafter: JsonValue[],\n\tpath: Path,\n\toperations: Op[],\n\tbeforeStart: number,\n\tbeforeEnd: number,\n\tafterStart: number,\n\tafterEnd: number,\n\toutputStart: number,\n): void {\n\tif (overflowedBatches.has(operations)) return;\n\twhile (beforeStart < beforeEnd && afterStart < afterEnd && sameValue(before[beforeStart]!, after[afterStart]!)) {\n\t\tbeforeStart += 1;\n\t\tafterStart += 1;\n\t\toutputStart += 1;\n\t}\n\twhile (beforeStart < beforeEnd && afterStart < afterEnd && sameValue(before[beforeEnd - 1]!, after[afterEnd - 1]!)) {\n\t\tbeforeEnd -= 1;\n\t\tafterEnd -= 1;\n\t}\n\tconst beforeCount = beforeEnd - beforeStart;\n\tconst afterCount = afterEnd - afterStart;\n\tif (beforeCount === 0 && afterCount === 0) return;\n\tif (beforeCount === 0 || afterCount === 0) {\n\t\temitOperation(operations, [\"p\", path, outputStart, beforeCount, after.slice(afterStart, afterEnd)]);\n\t\treturn;\n\t}\n\n\tif (beforeCount === afterCount) {\n\t\tconst positional: ArrayMatch[] = [];\n\t\tfor (let offset = 0; offset < beforeCount; offset++) {\n\t\t\tif (sameValue(before[beforeStart + offset]!, after[afterStart + offset]!)) {\n\t\t\t\tpositional.push([beforeStart + offset, afterStart + offset]);\n\t\t\t}\n\t\t}\n\t\tif (positional.length > 0) {\n\t\t\tprocessArrayMatches(\n\t\t\t\tbefore,\n\t\t\t\tafter,\n\t\t\t\tpath,\n\t\t\t\toperations,\n\t\t\t\tbeforeStart,\n\t\t\t\tbeforeEnd,\n\t\t\t\tafterStart,\n\t\t\t\tafterEnd,\n\t\t\t\toutputStart,\n\t\t\t\tpositional,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\t}\n\n\tconst subsequence = identitySubsequence(before, beforeStart, beforeEnd, after, afterStart, afterEnd);\n\tif (subsequence !== undefined && subsequence.length > 0) {\n\t\tprocessArrayMatches(\n\t\t\tbefore,\n\t\t\tafter,\n\t\t\tpath,\n\t\t\toperations,\n\t\t\tbeforeStart,\n\t\t\tbeforeEnd,\n\t\t\tafterStart,\n\t\t\tafterEnd,\n\t\t\toutputStart,\n\t\t\tsubsequence,\n\t\t);\n\t\treturn;\n\t}\n\n\tconst identity = identityAnchors(before, beforeStart, beforeEnd, after, afterStart, afterEnd);\n\tif (identity.length > 0) {\n\t\tprocessArrayMatches(\n\t\t\tbefore,\n\t\t\tafter,\n\t\t\tpath,\n\t\t\toperations,\n\t\t\tbeforeStart,\n\t\t\tbeforeEnd,\n\t\t\tafterStart,\n\t\t\tafterEnd,\n\t\t\toutputStart,\n\t\t\tidentity,\n\t\t);\n\t\treturn;\n\t}\n\n\tconst semantic = lcsMatches(\n\t\tbefore.slice(beforeStart, beforeEnd),\n\t\tafter.slice(afterStart, afterEnd),\n\t\tsemanticallyAligned,\n\t\tMAX_SEMANTIC_CELLS,\n\t);\n\tif (semantic !== undefined && semantic.length > 0) {\n\t\tconst absolute = semantic.map(\n\t\t\t([beforeIndex, afterIndex]) => [beforeStart + beforeIndex, afterStart + afterIndex] as const,\n\t\t);\n\t\tprocessArrayMatches(\n\t\t\tbefore,\n\t\t\tafter,\n\t\t\tpath,\n\t\t\toperations,\n\t\t\tbeforeStart,\n\t\t\tbeforeEnd,\n\t\t\tafterStart,\n\t\t\tafterEnd,\n\t\t\toutputStart,\n\t\t\tabsolute,\n\t\t);\n\t\treturn;\n\t}\n\n\tif (beforeCount === 1 && afterCount === 1) {\n\t\tdiffValue(before[beforeStart]!, after[afterStart]!, [...path, outputStart], operations);\n\t\treturn;\n\t}\n\temitOperation(operations, [\"p\", path, outputStart, beforeCount, after.slice(afterStart, afterEnd)]);\n}\n\nconst diffArray = (before: JsonValue[], after: JsonValue[], path: Path, operations: Op[]): void => {\n\tif (before === after || equalJson(before, after)) return;\n\tif (\n\t\tbefore.length === after.length &&\n\t\tbefore.length > 1 &&\n\t\t!sameValue(before[0]!, after[0]!) &&\n\t\t!sameValue(before[before.length - 1]!, after[after.length - 1]!)\n\t) {\n\t\tconst order = permutation(before, after);\n\t\tif (order !== undefined) {\n\t\t\temitOperation(operations, [\"m\", path, order]);\n\t\t\treturn;\n\t\t}\n\t}\n\tdiffArrayRegion(before, after, path, operations, 0, before.length, 0, after.length, 0);\n};\n\nconst diffObject = (\n\tbefore: Record<string, JsonValue>,\n\tafter: Record<string, JsonValue>,\n\tpath: Path,\n\toperations: Op[],\n): void => {\n\tconst beforeKeys = Object.keys(before);\n\tconst afterKeys = Object.keys(after);\n\tif ([...beforeKeys, ...afterKeys].some((key) => RESERVED_SEGMENTS.has(key))) {\n\t\tif (!equalJson(before, after)) emitSet(path, after, operations);\n\t\treturn;\n\t}\n\tfor (const key of afterKeys) {\n\t\tif (overflowedBatches.has(operations)) return;\n\t\tif (Object.hasOwn(before, key)) diffValue(before[key]!, after[key]!, [...path, key], operations);\n\t\telse emitSet([...path, key], after[key]!, operations);\n\t}\n\tfor (const key of beforeKeys) {\n\t\tif (overflowedBatches.has(operations)) return;\n\t\tif (!Object.hasOwn(after, key)) emitOperation(operations, [\"d\", [...path, key] as unknown as NonEmptyPath]);\n\t}\n};\n\nconst diffValue = (before: JsonValue, after: JsonValue, path: Path, operations: Op[]): void => {\n\tif (before === after || overflowedBatches.has(operations)) return;\n\tif (typeof before === \"string\" && typeof after === \"string\" && path.length > 0) {\n\t\temitString(before, after, path as NonEmptyPath, operations);\n\t\treturn;\n\t}\n\tif (Array.isArray(before) && Array.isArray(after)) {\n\t\tdiffArray(before, after, path, operations);\n\t\treturn;\n\t}\n\tif (isContainer(before) && isContainer(after) && !Array.isArray(before) && !Array.isArray(after)) {\n\t\tdiffObject(before, after, path, operations);\n\t\treturn;\n\t}\n\temitSet(path, after, operations);\n};\n\nconst jsonCost = (value: JsonValue): number => {\n\tif (value === null) return 4;\n\tif (typeof value === \"string\") return value.length + 2;\n\tif (typeof value === \"number\") return String(value).length;\n\tif (typeof value === \"boolean\") return value ? 4 : 5;\n\tif (Array.isArray(value)) {\n\t\tlet cost = 2;\n\t\tfor (let index = 0; index < value.length; index++) cost += jsonCost(value[index]!) + (index === 0 ? 0 : 1);\n\t\treturn cost;\n\t}\n\tlet cost = 2;\n\tlet index = 0;\n\tfor (const key of Object.keys(value)) {\n\t\tcost += key.length + 3 + jsonCost(value[key]!) + (index++ === 0 ? 0 : 1);\n\t}\n\treturn cost;\n};\n\nconst pathCost = (path: Path): number => {\n\tlet cost = 2;\n\tfor (let index = 0; index < path.length; index++) {\n\t\tconst segment: Seg = path[index]!;\n\t\tcost += (typeof segment === \"string\" ? segment.length + 2 : String(segment).length) + (index === 0 ? 0 : 1);\n\t}\n\treturn cost;\n};\n\nconst operationCost = (operation: Op): number => {\n\tswitch (operation[0]) {\n\t\tcase \"r\":\n\t\t\treturn 6 + jsonCost(operation[1]);\n\t\tcase \"s\":\n\t\t\treturn 7 + pathCost(operation[1]) + jsonCost(operation[2]);\n\t\tcase \"d\":\n\t\t\treturn 6 + pathCost(operation[1]);\n\t\tcase \"a\":\n\t\t\treturn 7 + pathCost(operation[1]) + operation[2].length + 2;\n\t\tcase \"t\":\n\t\t\treturn 7 + pathCost(operation[1]) + String(operation[2]).length;\n\t\tcase \"p\":\n\t\t\treturn (\n\t\t\t\t10 +\n\t\t\t\tpathCost(operation[1]) +\n\t\t\t\tString(operation[2]).length +\n\t\t\t\tString(operation[3]).length +\n\t\t\t\tjsonCost(operation[4])\n\t\t\t);\n\t\tcase \"m\":\n\t\t\treturn 7 + pathCost(operation[1]) + jsonCost(operation[2]);\n\t}\n};\n\n/** Compute a compact operation batch from two immutable JSON revisions. */\nexport function diffRevisions(before: JsonValue, after: JsonValue): Op[] {\n\tconst operations: Op[] = [];\n\tdiffValue(before, after, [], operations);\n\tif (overflowedBatches.has(operations)) return [[\"r\", after]];\n\tif (operations.length === 0 || operations[0]?.[0] === \"r\") return operations;\n\tlet deltaCost = 2;\n\tfor (const operation of operations) deltaCost += operationCost(operation) + 1;\n\tif (deltaCost < 65_536) return operations;\n\tconst snapshotCost = jsonCost(after) + 6;\n\treturn deltaCost >= snapshotCost ? [[\"r\", after]] : operations;\n}\n"]}
|