@markless/serializer 0.2.2 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,4 +3,4 @@
3
3
  Markless serialization tiers and the resumability payload protocol. Internal
4
4
  implementation package of `@markless/core`.
5
5
 
6
- See the repository for documentation: https://github.com/markless-dev/markless
6
+ See the repository for documentation: https://github.com/compiled-run/markless
@@ -1,4 +1,4 @@
1
- import { a as SerializedRecord, o as SerializedSlot, r as SerializedGraphPayload } from "./value-h64yUmxK.js";
1
+ import { a as SerializedRecord, o as SerializedSlot, r as SerializedGraphPayload } from "./value-BJ6YNKDd.js";
2
2
 
3
3
  //#region src/value-decode-client.d.ts
4
4
  type ValueDecodeExtensions = {
@@ -1,6 +1,6 @@
1
1
  //#region src/value-decode-client.ts
2
2
  async function deserializeGraphValueForClient(payload) {
3
- return deserializeGraphValueWithExtensions(payload, payloadNeedsExtendedDecoders(payload) ? (await import("./value-decode-extensions-9I1L0f-F.js")).valueDecodeExtensions : void 0);
3
+ return deserializeGraphValueWithExtensions(payload, payloadNeedsExtendedDecoders(payload) ? (await import("./value-decode-extensions-Bf-pgKHA.js")).valueDecodeExtensions : void 0);
4
4
  }
5
5
  function deserializeGraphValueWithExtensions(payload, extensions) {
6
6
  const shells = /* @__PURE__ */ new Map();
package/dist/decode.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { a as SerializedRecord, l as deserializeGraphValue, o as SerializedSlot, r as SerializedGraphPayload } from "./value-h64yUmxK.js";
1
+ import { a as SerializedRecord, l as deserializeGraphValue, o as SerializedSlot, r as SerializedGraphPayload } from "./value-BJ6YNKDd.js";
2
2
  export { SerializedGraphPayload, SerializedRecord, SerializedSlot, deserializeGraphValue };
package/dist/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- import { ASYNC_PROTOCOL_VERSION, ProtocolArmBranchRecord, ProtocolArmRecordSet, ProtocolPayloadScripts, ProtocolStatePayload, ProtocolSyncPolicy, ProtocolSyncPolicyBranch, ProtocolSyncPolicyCondition, ProtocolViewPayload, STORAGE_PROTOCOL_VERSION } from "./protocol.js";
2
- import { a as SerializedRecord, c as serializeGraphValue, i as SerializedPrimitive, l as deserializeGraphValue, n as SerializationResult, o as SerializedSlot, r as SerializedGraphPayload, s as TypedArrayName, t as SerializationDiagnostic } from "./value-h64yUmxK.js";
3
- import { DecodedPayloadScripts, EncodedPayloadScripts, RuntimePayloadDiagnostic, RuntimePayloadError, RuntimePayloadErrorCode, RuntimePayloadType, assertProtocolStateCellPayload, assertProtocolStatePayload, assertProtocolViewPayload, decodePayloadScripts, payloadInvalidError, payloadScriptSelector } from "./protocol-validation.js";
1
+ import { _ as ASYNC_PROTOCOL_VERSION, a as ProtocolEventAction, b as ASYNC_BOUNDARY_ARM, c as ProtocolPayloadScripts, d as ProtocolSyncPolicy, f as ProtocolSyncPolicyBranch, g as protocolEventDispatchesMarkless, h as protocolEventActionKind, i as ProtocolAsyncBoundaryArm, l as ProtocolStatePayload, m as ProtocolViewPayload, n as ProtocolArmBranchRecord, o as ProtocolEventActionKind, p as ProtocolSyncPolicyCondition, r as ProtocolArmRecordSet, s as ProtocolEventRecord, t as PROTOCOL_EVENT_ACTION_KIND, u as ProtocolStreamedArmPatch, v as STORAGE_PROTOCOL_VERSION, y as protocolStateVersion } from "./protocol-BfzeLgjZ.js";
2
+ import { a as SerializedRecord, c as serializeGraphValue, i as SerializedPrimitive, l as deserializeGraphValue, n as SerializationResult, o as SerializedSlot, r as SerializedGraphPayload, s as TypedArrayName, t as SerializationDiagnostic } from "./value-BJ6YNKDd.js";
3
+ import { a as RuntimePayloadError, c as assertProtocolStateCellPayload, d as decodePayloadScriptsWithVersion, f as invalidPayloadShapeError, i as RuntimePayloadDiagnostic, l as assertProtocolStatePayload, m as payloadScriptSelector, n as DecodedPayloadScripts, o as RuntimePayloadErrorCode, p as payloadInvalidError, r as EncodedPayloadScripts, s as RuntimePayloadType, t as decodePayloadScripts, u as assertProtocolViewPayload } from "./protocol-validation-storage-DogbS8xp.js";
4
4
 
5
5
  //#region src/payload-scripts.d.ts
6
6
  type RenderPayloadScriptsInput = {
@@ -70,6 +70,22 @@ declare function createProtocolStatePayload(input: ProtocolStatePayloadInput): P
70
70
  declare function serializeRuntimeStateCells(cells: ProtocolStatePayload['cells']): ProtocolStatePayload['cells'];
71
71
  declare function serializeRuntimeAsyncSnapshots(computed: ProtocolStatePayload['computed']): ProtocolStatePayload['computed'];
72
72
  //#endregion
73
+ //#region src/resume-record-merge.d.ts
74
+ type ResumeRecordSet = {
75
+ readonly state: ProtocolStatePayload;
76
+ readonly view: ProtocolViewPayload;
77
+ };
78
+ declare function mergeResumeRecordDelta(baseline: ResumeRecordSet, delta: ResumeRecordSet): ResumeRecordSet;
79
+ //#endregion
80
+ //#region src/resume-record-delta.d.ts
81
+ type ResumeRecordDeltaClassification = {
82
+ readonly kind: 'empty';
83
+ } | {
84
+ readonly kind: 'divergent';
85
+ readonly delta: ResumeRecordSet;
86
+ };
87
+ declare function classifyResumeRecordDelta(baseline: ResumeRecordSet, request: ResumeRecordSet): ResumeRecordDeltaClassification;
88
+ //#endregion
73
89
  //#region src/storage-key.d.ts
74
90
  declare function isValidStorageKey(value: string): boolean;
75
91
  //#endregion
@@ -86,4 +102,4 @@ declare function storageSlotEntryKeyFromGraphNodeId(graphNodeId: string): string
86
102
  declare function createStorageSeedMetadata(moduleId: string, driverKey: string, fallback: string): StorageSeedMetadata;
87
103
  declare function createStorageSeedMetadataFromGraphNodeId(graphNodeId: string, driverKey: string, fallback: string): StorageSeedMetadata;
88
104
  //#endregion
89
- export { ASYNC_PROTOCOL_VERSION, DecodedPayloadScripts, EncodedPayloadScripts, ProtocolArmBranchRecord, ProtocolArmRecordSet, ProtocolAsyncComputedSnapshotInput, ProtocolPayloadScripts, ProtocolStatePayload, ProtocolStatePayloadInput, ProtocolStateSerializationDiagnostic, ProtocolStateSerializationError, ProtocolSyncPolicy, ProtocolSyncPolicyBranch, ProtocolSyncPolicyCondition, ProtocolViewPayload, RenderPayloadScriptsInput, RenderedPayloadScripts, RuntimePayloadDiagnostic, RuntimePayloadError, RuntimePayloadErrorCode, RuntimePayloadType, STORAGE_PROTOCOL_VERSION, STORAGE_SLOT_SYMBOL_KEY, SerializationDiagnostic, SerializationResult, SerializedGraphPayload, SerializedPrimitive, SerializedRecord, SerializedSlot, StorageSeedMetadata, TypedArrayName, assertProtocolStateCellPayload, assertProtocolStatePayload, assertProtocolViewPayload, createProtocolStatePayload, createStorageSeedMetadata, createStorageSeedMetadataFromGraphNodeId, decodePayloadScripts, deserializeGraphValue, isValidStorageKey, payloadInvalidError, payloadScriptSelector, renderPayloadScripts, serializeGraphValue, serializeRuntimeAsyncSnapshots, serializeRuntimeStateCells, storageAttributeName, storageSlotEntryKey, storageSlotEntryKeyFromGraphNodeId };
105
+ export { ASYNC_BOUNDARY_ARM, ASYNC_PROTOCOL_VERSION, DecodedPayloadScripts, EncodedPayloadScripts, PROTOCOL_EVENT_ACTION_KIND, ProtocolArmBranchRecord, ProtocolArmRecordSet, ProtocolAsyncBoundaryArm, ProtocolAsyncComputedSnapshotInput, ProtocolEventAction, ProtocolEventActionKind, ProtocolEventRecord, ProtocolPayloadScripts, ProtocolStatePayload, ProtocolStatePayloadInput, ProtocolStateSerializationDiagnostic, ProtocolStateSerializationError, ProtocolStreamedArmPatch, ProtocolSyncPolicy, ProtocolSyncPolicyBranch, ProtocolSyncPolicyCondition, ProtocolViewPayload, RenderPayloadScriptsInput, RenderedPayloadScripts, ResumeRecordDeltaClassification, type ResumeRecordSet, RuntimePayloadDiagnostic, RuntimePayloadError, RuntimePayloadErrorCode, RuntimePayloadType, STORAGE_PROTOCOL_VERSION, STORAGE_SLOT_SYMBOL_KEY, SerializationDiagnostic, SerializationResult, SerializedGraphPayload, SerializedPrimitive, SerializedRecord, SerializedSlot, StorageSeedMetadata, TypedArrayName, assertProtocolStateCellPayload, assertProtocolStatePayload, assertProtocolViewPayload, classifyResumeRecordDelta, createProtocolStatePayload, createStorageSeedMetadata, createStorageSeedMetadataFromGraphNodeId, decodePayloadScripts, decodePayloadScriptsWithVersion, deserializeGraphValue, invalidPayloadShapeError, isValidStorageKey, mergeResumeRecordDelta, payloadInvalidError, payloadScriptSelector, protocolEventActionKind, protocolEventDispatchesMarkless, protocolStateVersion, renderPayloadScripts, serializeGraphValue, serializeRuntimeAsyncSnapshots, serializeRuntimeStateCells, storageAttributeName, storageSlotEntryKey, storageSlotEntryKeyFromGraphNodeId };
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { ASYNC_PROTOCOL_VERSION, STORAGE_PROTOCOL_VERSION } from "./protocol.js";
1
+ import { a as ASYNC_PROTOCOL_VERSION, i as ASYNC_BOUNDARY_ARM, n as protocolEventActionKind, o as STORAGE_PROTOCOL_VERSION, r as protocolEventDispatchesMarkless, s as protocolStateVersion, t as PROTOCOL_EVENT_ACTION_KIND } from "./protocol-BX4yw9bm.js";
2
2
  import { deserializeGraphValue } from "./decode.js";
3
- import { a as decodePayloadScripts, c as isValidStorageKey, i as assertProtocolViewPayload, n as assertProtocolStateCellPayload, o as payloadInvalidError, r as assertProtocolStatePayload, s as payloadScriptSelector, t as RuntimePayloadError } from "./protocol-validation-BzwtRg-T.js";
3
+ import { a as assertProtocolStatePayload, c as invalidPayloadShapeError, i as assertProtocolStateCellPayload, l as payloadInvalidError, n as isValidStorageKey, o as assertProtocolViewPayload, r as RuntimePayloadError, s as decodePayloadScriptsWithVersion, t as decodePayloadScripts, u as payloadScriptSelector } from "./protocol-validation-storage-BQ8D2S5j.js";
4
4
  //#region src/payload-scripts.ts
5
5
  function renderPayloadScripts(input) {
6
6
  return {
@@ -291,7 +291,7 @@ var ProtocolStateSerializationError = class extends Error {
291
291
  function createProtocolStatePayload(input) {
292
292
  const storage = input.storage ?? [];
293
293
  return {
294
- version: storage.length > 0 ? 2 : 1,
294
+ version: protocolStateVersion(storage),
295
295
  cells: input.cells.map((cell) => {
296
296
  const result = serializeGraphValue(cell.value);
297
297
  if (!result.ok) throw protocolStateSerializationError(cell, result.diagnostics[0]);
@@ -401,6 +401,153 @@ function protocolStateSerializationError(cell, diagnostic) {
401
401
  });
402
402
  }
403
403
  //#endregion
404
+ //#region src/resume-record-merge.ts
405
+ function mergeResumeRecordDelta(baseline, delta) {
406
+ assertMatchingVersion$1(baseline.state.version, delta.state.version, "state");
407
+ assertMatchingVersion$1(baseline.view.version, delta.view.version, "view");
408
+ return {
409
+ state: {
410
+ ...baseline.state,
411
+ cells: mergeRecords(baseline.state.cells, delta.state.cells, (record) => record.graphNodeId),
412
+ computed: mergeRecords(baseline.state.computed, delta.state.computed, (record) => record.graphNodeId),
413
+ ...mergeOptionalRecords(baseline.state, delta.state, "sharedDefinitions", (record) => record.id),
414
+ ...mergeOptionalRecords(baseline.state, delta.state, "storage", (record) => record.graphNodeId)
415
+ },
416
+ view: {
417
+ ...baseline.view,
418
+ ...mergeAsyncRunners(baseline.view, delta.view),
419
+ locators: mergeRecords(baseline.view.locators, delta.view.locators, (record) => record.hostNodeId),
420
+ events: mergeRecords(baseline.view.events, delta.view.events, (record) => `${record.hostNodeId}\0${record.eventName}`),
421
+ domUpdates: mergeRecords(baseline.view.domUpdates, delta.view.domUpdates, (record) => `${record.hostNodeId}\0${record.graphNodeId}\0${record.source}`),
422
+ behaviors: mergeRecords(baseline.view.behaviors, delta.view.behaviors, (record) => `${record.hostNodeId}\0${record.source}`),
423
+ elementHandles: mergeRecords(baseline.view.elementHandles, delta.view.elementHandles, (record) => `${record.hostNodeId}\0${record.handleId}`),
424
+ ...mergeOptionalRecords(baseline.view, delta.view, "keyedRepeats", (record) => record.id),
425
+ ...mergeOptionalRecords(baseline.view, delta.view, "branches", (record) => record.id),
426
+ asyncBoundaries: mergeRecords(baseline.view.asyncBoundaries, delta.view.asyncBoundaries, (record) => record.id)
427
+ }
428
+ };
429
+ }
430
+ function mergeRecords(baseline, delta, key) {
431
+ const byKey = uniqueRecords$1(delta, key, "payload record");
432
+ const merged = baseline.map((record) => byKey.get(key(record)) ?? record);
433
+ const baselineKeys = new Set(baseline.map(key));
434
+ for (const record of delta) if (!baselineKeys.has(key(record))) merged.push(record);
435
+ return merged;
436
+ }
437
+ function uniqueRecords$1(records, key, source) {
438
+ const result = /* @__PURE__ */ new Map();
439
+ for (const record of records) {
440
+ const recordKey = key(record);
441
+ if (result.has(recordKey)) throw new Error(`MARKLESS_RESUME_RECORD_DELTA_DUPLICATE_KEY: ${source} ${recordKey}.`);
442
+ result.set(recordKey, record);
443
+ }
444
+ return result;
445
+ }
446
+ function mergeOptionalRecords(baseline, delta, property, key) {
447
+ if (!(property in delta)) return {};
448
+ return { [property]: mergeRecords(baseline[property] ?? [], delta[property] ?? [], key) };
449
+ }
450
+ function mergeAsyncRunners(baseline, delta) {
451
+ if (!("asyncRunners" in delta)) return {};
452
+ return { asyncRunners: {
453
+ ...baseline.asyncRunners,
454
+ ...delta.asyncRunners
455
+ } };
456
+ }
457
+ function assertMatchingVersion$1(baseline, delta, payload) {
458
+ if (baseline !== delta) throw new Error(`MARKLESS_RESUME_RECORD_DELTA_VERSION_MISMATCH: ${payload} ${baseline} !== ${delta}.`);
459
+ }
460
+ //#endregion
461
+ //#region src/resume-record-delta.ts
462
+ function classifyResumeRecordDelta(baseline, request) {
463
+ durableComparisonValue(baseline, "build baseline");
464
+ durableComparisonValue(request, "request records");
465
+ assertMatchingVersion(baseline.state.version, request.state.version, "state");
466
+ assertMatchingVersion(baseline.view.version, request.view.version, "view");
467
+ const delta = {
468
+ state: {
469
+ version: request.state.version,
470
+ cells: divergentRecords(baseline.state.cells, request.state.cells, stateCellKey, "state cell"),
471
+ computed: divergentRecords(baseline.state.computed, request.state.computed, stateComputedKey, "computed"),
472
+ ...optionalRecordDelta(baseline.state, request.state, "sharedDefinitions", (record) => record.id, "shared definition"),
473
+ ...optionalRecordDelta(baseline.state, request.state, "storage", (record) => record.graphNodeId, "storage")
474
+ },
475
+ view: {
476
+ version: request.view.version,
477
+ ...asyncRunnerDelta(baseline.view, request.view),
478
+ locators: divergentRecords(baseline.view.locators, request.view.locators, (record) => record.hostNodeId, "view locator"),
479
+ events: divergentRecords(baseline.view.events, request.view.events, (record) => `${record.hostNodeId}\0${record.eventName}`, "view event"),
480
+ domUpdates: divergentRecords(baseline.view.domUpdates, request.view.domUpdates, (record) => `${record.hostNodeId}\0${record.graphNodeId}\0${record.source}`, "DOM update"),
481
+ behaviors: divergentRecords(baseline.view.behaviors, request.view.behaviors, (record) => `${record.hostNodeId}\0${record.source}`, "behavior"),
482
+ elementHandles: divergentRecords(baseline.view.elementHandles, request.view.elementHandles, (record) => `${record.hostNodeId}\0${record.handleId}`, "element handle"),
483
+ ...optionalRecordDelta(baseline.view, request.view, "keyedRepeats", (record) => record.id, "keyed repeat"),
484
+ ...optionalRecordDelta(baseline.view, request.view, "branches", (record) => record.id, "branch"),
485
+ asyncBoundaries: divergentRecords(baseline.view.asyncBoundaries, request.view.asyncBoundaries, (record) => record.id, "async boundary")
486
+ }
487
+ };
488
+ return hasDeltaRecords(delta) ? {
489
+ kind: "divergent",
490
+ delta
491
+ } : { kind: "empty" };
492
+ }
493
+ function stateCellKey(record) {
494
+ return record.graphNodeId;
495
+ }
496
+ function stateComputedKey(record) {
497
+ return record.graphNodeId;
498
+ }
499
+ function divergentRecords(baseline, request, key, label) {
500
+ const baselineByKey = uniqueRecords(baseline, key, `build baseline ${label}`);
501
+ const requestByKey = uniqueRecords(request, key, `request ${label}`);
502
+ for (const baselineKey of baselineByKey.keys()) if (!requestByKey.has(baselineKey)) throw new Error(`MARKLESS_RESUME_RECORD_DELTA_REMOVAL_UNSUPPORTED: ${label} ${baselineKey}.`);
503
+ return request.filter((record) => {
504
+ const baselineRecord = baselineByKey.get(key(record));
505
+ return baselineRecord === void 0 || durableComparisonValue(baselineRecord, `build baseline ${label}`) !== durableComparisonValue(record, `request ${label}`);
506
+ });
507
+ }
508
+ function uniqueRecords(records, key, source) {
509
+ const result = /* @__PURE__ */ new Map();
510
+ for (const record of records) {
511
+ const recordKey = key(record);
512
+ if (result.has(recordKey)) throw new Error(`MARKLESS_RESUME_RECORD_DELTA_DUPLICATE_KEY: ${source} ${recordKey}.`);
513
+ result.set(recordKey, record);
514
+ }
515
+ return result;
516
+ }
517
+ function optionalRecordDelta(baseline, request, property, key, label) {
518
+ const baselineRecords = baseline[property];
519
+ const requestRecords = request[property];
520
+ if (requestRecords === void 0) {
521
+ if (baselineRecords !== void 0) throw new Error(`MARKLESS_RESUME_RECORD_DELTA_REMOVAL_UNSUPPORTED: ${label} set.`);
522
+ return {};
523
+ }
524
+ return { [property]: divergentRecords(baselineRecords ?? [], requestRecords, key, label) };
525
+ }
526
+ function asyncRunnerDelta(baseline, request) {
527
+ if (request.asyncRunners === void 0) {
528
+ if (baseline.asyncRunners !== void 0) throw new Error("MARKLESS_RESUME_RECORD_DELTA_REMOVAL_UNSUPPORTED: async runner set.");
529
+ return {};
530
+ }
531
+ const delta = {};
532
+ for (const key of Object.keys(baseline.asyncRunners ?? {})) if (!(key in request.asyncRunners)) throw new Error(`MARKLESS_RESUME_RECORD_DELTA_REMOVAL_UNSUPPORTED: async runner ${key}.`);
533
+ for (const [key, value] of Object.entries(request.asyncRunners)) if (baseline.asyncRunners?.[key] !== value) delta[key] = value;
534
+ return { asyncRunners: delta };
535
+ }
536
+ function hasDeltaRecords(delta) {
537
+ return delta.state.cells.length > 0 || delta.state.computed.length > 0 || (delta.state.sharedDefinitions?.length ?? 0) > 0 || (delta.state.storage?.length ?? 0) > 0 || Object.keys(delta.view.asyncRunners ?? {}).length > 0 || delta.view.locators.length > 0 || delta.view.events.length > 0 || delta.view.domUpdates.length > 0 || delta.view.behaviors.length > 0 || delta.view.elementHandles.length > 0 || (delta.view.keyedRepeats?.length ?? 0) > 0 || (delta.view.branches?.length ?? 0) > 0 || delta.view.asyncBoundaries.length > 0;
538
+ }
539
+ function assertMatchingVersion(baseline, request, payload) {
540
+ if (baseline !== request) throw new Error(`MARKLESS_RESUME_RECORD_DELTA_VERSION_MISMATCH: ${payload} ${baseline} !== ${request}.`);
541
+ }
542
+ function durableComparisonValue(value, source) {
543
+ const result = serializeGraphValue(value);
544
+ if (!result.ok) {
545
+ const diagnostic = result.diagnostics[0];
546
+ throw new Error(`MARKLESS_RESUME_RECORD_DIVERGENCE_UNSERIALIZABLE: ${source} contains ${diagnostic?.valueKind ?? "unsupported"} at ${diagnostic?.statePath ?? "<root>"}.`);
547
+ }
548
+ return JSON.stringify(result.payload);
549
+ }
550
+ //#endregion
404
551
  //#region src/storage-slot.ts
405
552
  const STORAGE_SLOT_SYMBOL_KEY = "tsrx.storage/1";
406
553
  function storageAttributeName(driverKey) {
@@ -427,4 +574,4 @@ function createStorageSeedMetadataFromGraphNodeId(graphNodeId, driverKey, fallba
427
574
  };
428
575
  }
429
576
  //#endregion
430
- export { ASYNC_PROTOCOL_VERSION, ProtocolStateSerializationError, RuntimePayloadError, STORAGE_PROTOCOL_VERSION, STORAGE_SLOT_SYMBOL_KEY, assertProtocolStateCellPayload, assertProtocolStatePayload, assertProtocolViewPayload, createProtocolStatePayload, createStorageSeedMetadata, createStorageSeedMetadataFromGraphNodeId, decodePayloadScripts, deserializeGraphValue, isValidStorageKey, payloadInvalidError, payloadScriptSelector, renderPayloadScripts, serializeGraphValue, serializeRuntimeAsyncSnapshots, serializeRuntimeStateCells, storageAttributeName, storageSlotEntryKey, storageSlotEntryKeyFromGraphNodeId };
577
+ export { ASYNC_BOUNDARY_ARM, ASYNC_PROTOCOL_VERSION, PROTOCOL_EVENT_ACTION_KIND, ProtocolStateSerializationError, RuntimePayloadError, STORAGE_PROTOCOL_VERSION, STORAGE_SLOT_SYMBOL_KEY, assertProtocolStateCellPayload, assertProtocolStatePayload, assertProtocolViewPayload, classifyResumeRecordDelta, createProtocolStatePayload, createStorageSeedMetadata, createStorageSeedMetadataFromGraphNodeId, decodePayloadScripts, decodePayloadScriptsWithVersion, deserializeGraphValue, invalidPayloadShapeError, isValidStorageKey, mergeResumeRecordDelta, payloadInvalidError, payloadScriptSelector, protocolEventActionKind, protocolEventDispatchesMarkless, protocolStateVersion, renderPayloadScripts, serializeGraphValue, serializeRuntimeAsyncSnapshots, serializeRuntimeStateCells, storageAttributeName, storageSlotEntryKey, storageSlotEntryKeyFromGraphNodeId };
@@ -0,0 +1,31 @@
1
+ //#region src/protocol-constants.ts
2
+ const ASYNC_PROTOCOL_VERSION = 1;
3
+ const STORAGE_PROTOCOL_VERSION = 2;
4
+ function protocolStateVersion(storage) {
5
+ return (storage?.length ?? 0) > 0 ? 2 : 1;
6
+ }
7
+ //#endregion
8
+ //#region src/async-boundary-arm.ts
9
+ const ASYNC_BOUNDARY_ARM = {
10
+ try: 0,
11
+ pending: 1,
12
+ catch: 2
13
+ };
14
+ //#endregion
15
+ //#region src/protocol.ts
16
+ const PROTOCOL_EVENT_ACTION_KIND = {
17
+ event: "event",
18
+ externalDelegate: "external-delegate"
19
+ };
20
+ function protocolEventActionKind(record) {
21
+ return record.action?.kind ?? PROTOCOL_EVENT_ACTION_KIND.event;
22
+ }
23
+ const PROTOCOL_EVENT_ACTION_DISPATCHES_MARKLESS = {
24
+ [PROTOCOL_EVENT_ACTION_KIND.event]: true,
25
+ [PROTOCOL_EVENT_ACTION_KIND.externalDelegate]: false
26
+ };
27
+ function protocolEventDispatchesMarkless(record) {
28
+ return PROTOCOL_EVENT_ACTION_DISPATCHES_MARKLESS[protocolEventActionKind(record)];
29
+ }
30
+ //#endregion
31
+ export { ASYNC_PROTOCOL_VERSION as a, ASYNC_BOUNDARY_ARM as i, protocolEventActionKind as n, STORAGE_PROTOCOL_VERSION as o, protocolEventDispatchesMarkless as r, protocolStateVersion as s, PROTOCOL_EVENT_ACTION_KIND as t };
@@ -0,0 +1,288 @@
1
+ //#region src/async-boundary-arm.d.ts
2
+ declare const ASYNC_BOUNDARY_ARM: {
3
+ readonly try: 0;
4
+ readonly pending: 1;
5
+ readonly catch: 2;
6
+ };
7
+ //#endregion
8
+ //#region src/protocol-constants.d.ts
9
+ declare const ASYNC_PROTOCOL_VERSION = 1;
10
+ declare const STORAGE_PROTOCOL_VERSION = 2;
11
+ declare function protocolStateVersion(storage: readonly unknown[] | undefined): typeof ASYNC_PROTOCOL_VERSION | typeof STORAGE_PROTOCOL_VERSION;
12
+ //#endregion
13
+ //#region src/protocol.d.ts
14
+ type ProtocolAsyncBoundaryArm = (typeof ASYNC_BOUNDARY_ARM)[keyof typeof ASYNC_BOUNDARY_ARM];
15
+ type ProtocolSyncPolicyCondition = {
16
+ readonly type: 'and';
17
+ readonly conditions: ReadonlyArray<ProtocolSyncPolicyCondition>;
18
+ } | {
19
+ readonly type: 'or';
20
+ readonly conditions: ReadonlyArray<ProtocolSyncPolicyCondition>;
21
+ } | {
22
+ readonly type: 'not';
23
+ readonly condition: ProtocolSyncPolicyCondition;
24
+ } | {
25
+ readonly type: 'graph-truthy';
26
+ readonly graphNodeId: string;
27
+ readonly path?: ReadonlyArray<string>;
28
+ } | {
29
+ readonly type: 'constant-truthy';
30
+ readonly value: unknown;
31
+ } | {
32
+ readonly type: 'event-equals';
33
+ readonly field: string;
34
+ readonly value: unknown;
35
+ };
36
+ type ProtocolSyncPolicyBranch = {
37
+ readonly when: ProtocolSyncPolicyCondition;
38
+ readonly actions: ReadonlyArray<'preventDefault' | 'stopPropagation'>;
39
+ };
40
+ type ProtocolSyncPolicy = ProtocolSyncPolicyBranch | {
41
+ readonly branches: ReadonlyArray<ProtocolSyncPolicyBranch>;
42
+ };
43
+ declare const PROTOCOL_EVENT_ACTION_KIND: {
44
+ readonly event: "event";
45
+ readonly externalDelegate: "external-delegate";
46
+ };
47
+ type ProtocolEventActionKind = (typeof PROTOCOL_EVENT_ACTION_KIND)[keyof typeof PROTOCOL_EVENT_ACTION_KIND];
48
+ type ProtocolEventAction = {
49
+ readonly kind: typeof PROTOCOL_EVENT_ACTION_KIND.externalDelegate;
50
+ readonly owner: string;
51
+ };
52
+ type ProtocolEventRecord = {
53
+ readonly hostNodeId: string;
54
+ readonly eventName: string;
55
+ readonly syncPolicy?: ProtocolSyncPolicy;
56
+ readonly symbolIds: ReadonlyArray<string>;
57
+ readonly action?: ProtocolEventAction;
58
+ };
59
+ declare function protocolEventActionKind(record: Pick<ProtocolEventRecord, 'action'>): ProtocolEventActionKind;
60
+ declare function protocolEventDispatchesMarkless(record: Pick<ProtocolEventRecord, 'action'>): boolean;
61
+ type ProtocolStatePayload = {
62
+ readonly version: typeof ASYNC_PROTOCOL_VERSION | typeof STORAGE_PROTOCOL_VERSION;
63
+ readonly cells: ReadonlyArray<{
64
+ readonly graphNodeId: string;
65
+ readonly name: string;
66
+ readonly valueKind: 'scalar' | 'object' | 'array' | 'unknown';
67
+ readonly value?: unknown;
68
+ readonly directValue?: unknown;
69
+ }>;
70
+ readonly computed: ReadonlyArray<{
71
+ readonly graphNodeId: string;
72
+ readonly name: string;
73
+ readonly async: boolean;
74
+ readonly deriveSymbolId?: string;
75
+ readonly dependencies?: ReadonlyArray<{
76
+ readonly graphNodeId: string;
77
+ readonly path: ReadonlyArray<string>;
78
+ }>;
79
+ readonly snapshot?: {
80
+ readonly status: 'idle';
81
+ readonly version: 0;
82
+ } | {
83
+ readonly status: 'pending';
84
+ readonly version: number;
85
+ readonly key: unknown;
86
+ } | {
87
+ readonly status: 'fulfilled';
88
+ readonly version: number;
89
+ readonly key: unknown;
90
+ readonly value: unknown;
91
+ } | {
92
+ readonly status: 'rejected';
93
+ readonly version: number;
94
+ readonly key: unknown;
95
+ readonly error: unknown;
96
+ };
97
+ }>;
98
+ readonly sharedDefinitions?: ReadonlyArray<{
99
+ readonly id: string;
100
+ readonly name: string;
101
+ readonly exportedName: string;
102
+ readonly scope?: 'request' | 'container' | 'page';
103
+ readonly version: number;
104
+ readonly graphNodeIds: ReadonlyArray<string>;
105
+ readonly dependencies?: ReadonlyArray<{
106
+ readonly definitionId: string;
107
+ readonly definitionName: string;
108
+ }>;
109
+ readonly returnProperties?: ReadonlyArray<{
110
+ readonly kind: 'graph';
111
+ readonly name: string;
112
+ readonly graphNodeId: string;
113
+ readonly path: ReadonlyArray<string>;
114
+ } | {
115
+ readonly kind: 'method';
116
+ readonly name: string;
117
+ }>;
118
+ }>;
119
+ readonly storage?: ReadonlyArray<{
120
+ readonly graphNodeId: string;
121
+ readonly key: string;
122
+ }>;
123
+ };
124
+ type ProtocolArmBranchRecord = {
125
+ readonly id: string;
126
+ readonly testReads: ReadonlyArray<{
127
+ readonly source: string;
128
+ readonly graphNodeId: string;
129
+ readonly path: ReadonlyArray<string>;
130
+ }>;
131
+ readonly symbolId?: string;
132
+ readonly armTests?: ReadonlyArray<unknown>;
133
+ readonly declaredEmptyArms?: ReadonlyArray<number>;
134
+ readonly startAnchor?: {
135
+ readonly strategy: 'arm-branch-comment';
136
+ readonly index: number;
137
+ };
138
+ readonly endAnchor?: {
139
+ readonly strategy: 'arm-branch-comment';
140
+ readonly index: number;
141
+ };
142
+ readonly armRecords?: NonNullable<ProtocolViewPayload['branches']>[number]['armRecords'];
143
+ };
144
+ type ProtocolArmRecordSet = {
145
+ readonly locators: ReadonlyArray<{
146
+ readonly hostNodeId: string;
147
+ readonly strategy: 'arm-relative';
148
+ readonly index: number;
149
+ readonly tagName: string;
150
+ }>;
151
+ readonly events: ProtocolViewPayload['events'];
152
+ readonly domUpdates?: ProtocolViewPayload['domUpdates'];
153
+ readonly behaviors: ProtocolViewPayload['behaviors'];
154
+ readonly elementHandles: ProtocolViewPayload['elementHandles'];
155
+ readonly keyedRepeats?: ProtocolViewPayload['keyedRepeats'];
156
+ readonly branches?: ReadonlyArray<ProtocolArmBranchRecord>;
157
+ };
158
+ type ProtocolStreamedArmPatch = readonly [arm: ProtocolAsyncBoundaryArm, records: ProtocolArmRecordSet];
159
+ type ProtocolViewPayload = {
160
+ readonly version: typeof ASYNC_PROTOCOL_VERSION;
161
+ readonly asyncRunners?: Readonly<Record<string, string>>;
162
+ readonly locators: ReadonlyArray<{
163
+ readonly hostNodeId: string;
164
+ readonly strategy: 'dom-order';
165
+ readonly index: number;
166
+ readonly tagName: string;
167
+ }>;
168
+ readonly events: ReadonlyArray<ProtocolEventRecord>;
169
+ readonly domUpdates: ReadonlyArray<{
170
+ readonly hostNodeId: string;
171
+ readonly source: string;
172
+ readonly graphNodeId: string;
173
+ readonly path: ReadonlyArray<string>;
174
+ readonly target?: {
175
+ readonly kind: 'text';
176
+ readonly prefix?: string;
177
+ readonly suffix?: string;
178
+ readonly trueValue?: string;
179
+ readonly falseValue?: string;
180
+ } | {
181
+ readonly kind: 'attribute';
182
+ readonly name: string;
183
+ } | {
184
+ readonly kind: 'property';
185
+ readonly name: string;
186
+ } | {
187
+ readonly kind: 'class';
188
+ readonly trueValue?: string;
189
+ readonly falseValue?: string;
190
+ } | {
191
+ readonly kind: 'style';
192
+ };
193
+ readonly symbolId?: string;
194
+ }>;
195
+ readonly behaviors: ReadonlyArray<{
196
+ readonly hostNodeId: string;
197
+ readonly source: string;
198
+ readonly functionSource: string;
199
+ readonly inputSources: ReadonlyArray<string>;
200
+ readonly inputValues?: ReadonlyArray<unknown>;
201
+ readonly inputGraphReads?: ReadonlyArray<{
202
+ readonly inputIndex: number;
203
+ readonly source: string;
204
+ readonly graphNodeId: string;
205
+ readonly path: ReadonlyArray<string>;
206
+ }>;
207
+ readonly symbolId?: string;
208
+ }>;
209
+ readonly elementHandles: ReadonlyArray<{
210
+ readonly hostNodeId: string;
211
+ readonly handleId: string;
212
+ readonly name: string;
213
+ }>;
214
+ readonly keyedRepeats?: ReadonlyArray<{
215
+ readonly id: string;
216
+ readonly parentHostNodeId: string;
217
+ readonly collectionGraphNodeId?: string;
218
+ readonly collectionPath: ReadonlyArray<string>;
219
+ readonly keyPath: ReadonlyArray<string>;
220
+ readonly itemName: string;
221
+ readonly rowElementCount: number;
222
+ readonly rowEvents: ReadonlyArray<{
223
+ readonly hostPath: ReadonlyArray<number>;
224
+ readonly eventName: string;
225
+ readonly symbolIds: ReadonlyArray<string>;
226
+ readonly syncPolicy?: ProtocolSyncPolicy;
227
+ }>;
228
+ }>;
229
+ readonly branches?: ReadonlyArray<{
230
+ readonly id: string;
231
+ readonly startAnchor: {
232
+ readonly strategy: 'dom-order-comment';
233
+ readonly index: number;
234
+ };
235
+ readonly endAnchor: {
236
+ readonly strategy: 'dom-order-comment';
237
+ readonly index: number;
238
+ };
239
+ readonly symbolId?: string;
240
+ readonly armTests?: ReadonlyArray<unknown>;
241
+ readonly armRecords?: ReadonlyArray<{
242
+ readonly events: ReadonlyArray<{
243
+ readonly hostPath: ReadonlyArray<number>;
244
+ readonly eventName: string;
245
+ readonly symbolIds: ReadonlyArray<string>;
246
+ readonly syncPolicy?: ProtocolSyncPolicy;
247
+ readonly action?: ProtocolEventAction;
248
+ }>;
249
+ readonly domUpdates: ReadonlyArray<Record<string, unknown>>;
250
+ readonly behaviors: ReadonlyArray<Record<string, unknown>>;
251
+ readonly elementHandles: ReadonlyArray<Record<string, unknown>>;
252
+ }>;
253
+ readonly testReads?: ReadonlyArray<{
254
+ readonly source: string;
255
+ readonly graphNodeId: string;
256
+ readonly path: ReadonlyArray<string>;
257
+ }>;
258
+ }>;
259
+ readonly asyncBoundaries: ReadonlyArray<{
260
+ readonly id: string;
261
+ readonly runnerGraphNodeId: string | null;
262
+ readonly initiallyServedArm: ProtocolAsyncBoundaryArm;
263
+ readonly updateSymbolId?: string;
264
+ readonly armRecords?: ProtocolArmRecordSet | ReadonlyArray<ProtocolArmRecordSet>;
265
+ readonly startAnchor: {
266
+ readonly strategy: 'dom-order-comment';
267
+ readonly index: number;
268
+ };
269
+ readonly endAnchor: {
270
+ readonly strategy: 'dom-order-comment';
271
+ readonly index: number;
272
+ };
273
+ readonly asyncReads: ReadonlyArray<{
274
+ readonly source: string;
275
+ readonly graphNodeId: string;
276
+ readonly path: ReadonlyArray<string>;
277
+ readonly runnerSymbolId?: string;
278
+ }>;
279
+ }>;
280
+ };
281
+ type ProtocolPayloadScripts = {
282
+ readonly state: ProtocolStatePayload;
283
+ readonly view: ProtocolViewPayload;
284
+ readonly stateScript: string;
285
+ readonly viewScript: string;
286
+ };
287
+ //#endregion
288
+ export { ASYNC_PROTOCOL_VERSION as _, ProtocolEventAction as a, ASYNC_BOUNDARY_ARM as b, ProtocolPayloadScripts as c, ProtocolSyncPolicy as d, ProtocolSyncPolicyBranch as f, protocolEventDispatchesMarkless as g, protocolEventActionKind as h, ProtocolAsyncBoundaryArm as i, ProtocolStatePayload as l, ProtocolViewPayload as m, ProtocolArmBranchRecord as n, ProtocolEventActionKind as o, ProtocolSyncPolicyCondition as p, ProtocolArmRecordSet as r, ProtocolEventRecord as s, PROTOCOL_EVENT_ACTION_KIND as t, ProtocolStreamedArmPatch as u, STORAGE_PROTOCOL_VERSION as v, protocolStateVersion as y };
@@ -1,10 +1,4 @@
1
- import "./protocol.js";
2
- //#region src/storage-key.ts
3
- const STORAGE_KEY_PATTERN = /^[A-Za-z0-9$_:.-]+$/;
4
- function isValidStorageKey(value) {
5
- return STORAGE_KEY_PATTERN.test(value);
6
- }
7
- //#endregion
1
+ import { i as ASYNC_BOUNDARY_ARM, t as PROTOCOL_EVENT_ACTION_KIND } from "./protocol-BX4yw9bm.js";
8
2
  //#region src/protocol-validation.ts
9
3
  var RuntimePayloadError = class extends Error {
10
4
  constructor(diagnostic) {
@@ -15,12 +9,12 @@ var RuntimePayloadError = class extends Error {
15
9
  }, diagnostic, { name: "RuntimePayloadError" });
16
10
  }
17
11
  };
18
- function decodePayloadScripts(input) {
12
+ function decodePayloadScriptsWithVersion(input, allowStorage) {
19
13
  const state = parseDataScript(input.stateScript, "markless/state");
20
14
  const view = parseDataScript(input.viewScript, "markless/view");
21
15
  assertProtocolStatePayload(state);
22
16
  assertProtocolViewPayload(view);
23
- assertProtocolVersion(state.version, "markless/state");
17
+ assertProtocolVersion(state.version, "markless/state", allowStorage);
24
18
  assertProtocolVersion(view.version, "markless/view");
25
19
  return {
26
20
  state,
@@ -52,7 +46,6 @@ function assertProtocolStatePayload(payload) {
52
46
  assertOptionalAsyncComputedSnapshot(computed, context);
53
47
  }
54
48
  assertOptionalSharedDefinitions(payload);
55
- assertStorageRecords(payload);
56
49
  }
57
50
  function assertProtocolStateCellPayload(cell, context) {
58
51
  assertRecordShape(cell, context);
@@ -86,6 +79,7 @@ function assertProtocolViewPayload(payload) {
86
79
  assertStringField(event, "hostNodeId", context);
87
80
  assertStringField(event, "eventName", context);
88
81
  assertStringArrayField(event, "symbolIds", context);
82
+ assertOptionalEventAction(event.action, `${context}.action`);
89
83
  if (event.syncPolicy !== void 0) assertSyncPolicy(event.syncPolicy, `${context}.syncPolicy`);
90
84
  }
91
85
  for (const [index, domUpdate] of domUpdates.entries()) {
@@ -120,6 +114,8 @@ function assertProtocolViewPayload(payload) {
120
114
  const context = `markless/view asyncBoundary[${index}]`;
121
115
  assertRecordShape(boundary, context);
122
116
  assertStringField(boundary, "id", context);
117
+ assertNullableStringField(boundary, "runnerGraphNodeId", context);
118
+ assertAsyncBoundaryArm(boundary.initiallyServedArm, context);
123
119
  assertCommentAnchor(boundary.startAnchor, `${context}.startAnchor`);
124
120
  assertCommentAnchor(boundary.endAnchor, `${context}.endAnchor`);
125
121
  assertAsyncBoundaryReads(boundary.asyncReads, context);
@@ -127,22 +123,26 @@ function assertProtocolViewPayload(payload) {
127
123
  assertOptionalKeyedRepeats(payload);
128
124
  assertOptionalBranches(payload);
129
125
  }
130
- function assertProtocolVersion(version, type) {
131
- if (version !== 1 && !(type === "markless/state" && version === 2)) throw protocolVersionMismatchError(type, version);
126
+ const EVENT_ACTION_VALIDATORS = {
127
+ [PROTOCOL_EVENT_ACTION_KIND.event]: () => {},
128
+ [PROTOCOL_EVENT_ACTION_KIND.externalDelegate]: (action, context) => assertStringField(action, "owner", context)
129
+ };
130
+ function assertOptionalEventAction(value, context) {
131
+ if (value === void 0) return;
132
+ assertRecordShape(value, context);
133
+ assertStringField(value, "kind", context);
134
+ const validate = EVENT_ACTION_VALIDATORS[value.kind];
135
+ if (!validate) throw invalidPayloadShapeError(contextPayloadType(context), `Invalid ${context}: unknown event action kind.`);
136
+ validate(value, context);
132
137
  }
133
- function assertStorageRecords(payload) {
134
- if (payload.version === 1) return;
135
- if (payload.version !== 2) return;
136
- const storage = requiredPayloadArrayField(payload, "storage", "markless/state");
137
- const cellIds = new Set(payload.cells.map((cell) => cell.graphNodeId));
138
- for (const [index, entry] of storage.entries()) {
139
- const context = `markless/state storage[${index}]`;
140
- assertRecordShape(entry, context);
141
- assertStringField(entry, "graphNodeId", context);
142
- assertStringField(entry, "key", context);
143
- if (!cellIds.has(entry.graphNodeId)) throw invalidPayloadShapeError("markless/state", `Invalid ${context}: graphNodeId must match a state cell.`);
144
- if (!isValidStorageKey(entry.key)) throw invalidPayloadShapeError("markless/state", `Invalid ${context}: key must be a verbatim key or a derived markless:<identifier>.`);
145
- }
138
+ function assertNullableStringField(record, field, context) {
139
+ if (record[field] !== null && typeof record[field] !== "string") throw invalidPayloadShapeError(contextPayloadType(context), `Invalid ${context}: expected ${field} string or null.`);
140
+ }
141
+ function assertAsyncBoundaryArm(value, context) {
142
+ if (!Object.values(ASYNC_BOUNDARY_ARM).includes(value)) throw invalidPayloadShapeError(contextPayloadType(context), `Invalid ${context}: expected initiallyServedArm to name a protocol async boundary arm.`);
143
+ }
144
+ function assertProtocolVersion(version, type, allowStorage = false) {
145
+ if (version !== 1 && !(allowStorage && type === "markless/state" && version === 2)) throw protocolVersionMismatchError(type, version);
146
146
  }
147
147
  function isRecord(value) {
148
148
  return typeof value === "object" && value !== null && !Array.isArray(value);
@@ -672,4 +672,29 @@ function payloadScriptSelector(type) {
672
672
  return `script[type="${type}"]`;
673
673
  }
674
674
  //#endregion
675
- export { decodePayloadScripts as a, isValidStorageKey as c, assertProtocolViewPayload as i, assertProtocolStateCellPayload as n, payloadInvalidError as o, assertProtocolStatePayload as r, payloadScriptSelector as s, RuntimePayloadError as t };
675
+ //#region src/storage-key.ts
676
+ const STORAGE_KEY_PATTERN = /^[A-Za-z0-9$_:.-]+$/;
677
+ function isValidStorageKey(value) {
678
+ return STORAGE_KEY_PATTERN.test(value);
679
+ }
680
+ //#endregion
681
+ //#region src/protocol-validation-storage.ts
682
+ function decodePayloadScripts(input) {
683
+ const decoded = decodePayloadScriptsWithVersion(input, true);
684
+ if (decoded.state.version !== 2) return decoded;
685
+ const cellIds = new Set(decoded.state.cells.map((cell) => cell.graphNodeId));
686
+ const storage = decoded.state.storage;
687
+ if (!Array.isArray(storage)) throw invalidPayloadShapeError("markless/state", "Invalid markless/state payload: expected storage array.");
688
+ for (const [index, entry] of storage.entries()) {
689
+ const context = `markless/state storage[${index}]`;
690
+ if (typeof entry !== "object" || entry === null || Array.isArray(entry)) throw invalidPayloadShapeError("markless/state", `Invalid ${context}: expected object.`);
691
+ const record = entry;
692
+ if (typeof record.graphNodeId !== "string") throw invalidPayloadShapeError("markless/state", `Invalid ${context}: expected graphNodeId string.`);
693
+ if (typeof record.key !== "string") throw invalidPayloadShapeError("markless/state", `Invalid ${context}: expected key string.`);
694
+ if (!cellIds.has(record.graphNodeId)) throw invalidPayloadShapeError("markless/state", `Invalid ${context}: graphNodeId must match a state cell.`);
695
+ if (!isValidStorageKey(record.key)) throw invalidPayloadShapeError("markless/state", `Invalid ${context}: key must be a verbatim key or a derived markless:<identifier>.`);
696
+ }
697
+ return decoded;
698
+ }
699
+ //#endregion
700
+ export { assertProtocolStatePayload as a, invalidPayloadShapeError as c, assertProtocolStateCellPayload as i, payloadInvalidError as l, isValidStorageKey as n, assertProtocolViewPayload as o, RuntimePayloadError as r, decodePayloadScriptsWithVersion as s, decodePayloadScripts as t, payloadScriptSelector as u };
@@ -0,0 +1,59 @@
1
+ import { l as ProtocolStatePayload, m as ProtocolViewPayload } from "./protocol-BfzeLgjZ.js";
2
+
3
+ //#region src/protocol-validation.d.ts
4
+ type EncodedPayloadScripts = {
5
+ readonly stateScript: string;
6
+ readonly viewScript: string;
7
+ };
8
+ type DecodedPayloadScripts = {
9
+ readonly state: ProtocolStatePayload;
10
+ readonly view: ProtocolViewPayload;
11
+ };
12
+ type RuntimePayloadType = 'markless/state' | 'markless/view';
13
+ type RuntimePayloadErrorCode = 'MARKLESS_PAYLOAD_INVALID' | 'MARKLESS_PROTOCOL_VERSION_MISMATCH';
14
+ type RuntimePayloadDiagnostic = {
15
+ readonly code: RuntimePayloadErrorCode;
16
+ readonly severity: 'error';
17
+ readonly phase: 'payload';
18
+ readonly title: string;
19
+ readonly message: string;
20
+ readonly why: string;
21
+ readonly payloadType: RuntimePayloadType;
22
+ readonly payloadScript: string;
23
+ readonly expectedVersion?: number;
24
+ readonly actualVersion?: unknown;
25
+ readonly suggestions: ReadonlyArray<{
26
+ readonly message: string;
27
+ }>;
28
+ readonly docsUrl: string;
29
+ };
30
+ declare class RuntimePayloadError extends Error implements RuntimePayloadDiagnostic {
31
+ readonly code: RuntimePayloadErrorCode;
32
+ readonly severity: 'error';
33
+ readonly phase: 'payload';
34
+ readonly title: string;
35
+ readonly why: string;
36
+ readonly payloadType: RuntimePayloadType;
37
+ readonly payloadScript: string;
38
+ readonly expectedVersion?: number;
39
+ readonly actualVersion?: unknown;
40
+ readonly suggestions: ReadonlyArray<{
41
+ readonly message: string;
42
+ }>;
43
+ readonly docsUrl: string;
44
+ constructor(diagnostic: RuntimePayloadDiagnostic);
45
+ }
46
+ declare function decodePayloadScriptsWithVersion(input: EncodedPayloadScripts, allowStorage: boolean): DecodedPayloadScripts;
47
+ declare function assertProtocolStatePayload(payload: unknown): asserts payload is ProtocolStatePayload;
48
+ declare function assertProtocolStateCellPayload(cell: unknown, context: string): asserts cell is ProtocolStatePayload['cells'][number];
49
+ declare function assertProtocolViewPayload(payload: unknown): asserts payload is ProtocolViewPayload;
50
+ declare function payloadInvalidError(payloadType: RuntimePayloadType, message: string, why: string, suggestions: ReadonlyArray<{
51
+ readonly message: string;
52
+ }>): RuntimePayloadError;
53
+ declare function invalidPayloadShapeError(payloadType: RuntimePayloadType, message: string): RuntimePayloadError;
54
+ declare function payloadScriptSelector(type: RuntimePayloadType): string;
55
+ //#endregion
56
+ //#region src/protocol-validation-storage.d.ts
57
+ declare function decodePayloadScripts(input: EncodedPayloadScripts): DecodedPayloadScripts;
58
+ //#endregion
59
+ export { RuntimePayloadError as a, assertProtocolStateCellPayload as c, decodePayloadScriptsWithVersion as d, invalidPayloadShapeError as f, RuntimePayloadDiagnostic as i, assertProtocolStatePayload as l, payloadScriptSelector as m, DecodedPayloadScripts as n, RuntimePayloadErrorCode as o, payloadInvalidError as p, EncodedPayloadScripts as r, RuntimePayloadType as s, decodePayloadScripts as t, assertProtocolViewPayload as u };
@@ -1,55 +1,2 @@
1
- import { ProtocolStatePayload, ProtocolViewPayload } from "./protocol.js";
2
-
3
- //#region src/protocol-validation.d.ts
4
- type EncodedPayloadScripts = {
5
- readonly stateScript: string;
6
- readonly viewScript: string;
7
- };
8
- type DecodedPayloadScripts = {
9
- readonly state: ProtocolStatePayload;
10
- readonly view: ProtocolViewPayload;
11
- };
12
- type RuntimePayloadType = 'markless/state' | 'markless/view';
13
- type RuntimePayloadErrorCode = 'MARKLESS_PAYLOAD_INVALID' | 'MARKLESS_PROTOCOL_VERSION_MISMATCH';
14
- type RuntimePayloadDiagnostic = {
15
- readonly code: RuntimePayloadErrorCode;
16
- readonly severity: 'error';
17
- readonly phase: 'payload';
18
- readonly title: string;
19
- readonly message: string;
20
- readonly why: string;
21
- readonly payloadType: RuntimePayloadType;
22
- readonly payloadScript: string;
23
- readonly expectedVersion?: number;
24
- readonly actualVersion?: unknown;
25
- readonly suggestions: ReadonlyArray<{
26
- readonly message: string;
27
- }>;
28
- readonly docsUrl: string;
29
- };
30
- declare class RuntimePayloadError extends Error implements RuntimePayloadDiagnostic {
31
- readonly code: RuntimePayloadErrorCode;
32
- readonly severity: 'error';
33
- readonly phase: 'payload';
34
- readonly title: string;
35
- readonly why: string;
36
- readonly payloadType: RuntimePayloadType;
37
- readonly payloadScript: string;
38
- readonly expectedVersion?: number;
39
- readonly actualVersion?: unknown;
40
- readonly suggestions: ReadonlyArray<{
41
- readonly message: string;
42
- }>;
43
- readonly docsUrl: string;
44
- constructor(diagnostic: RuntimePayloadDiagnostic);
45
- }
46
- declare function decodePayloadScripts(input: EncodedPayloadScripts): DecodedPayloadScripts;
47
- declare function assertProtocolStatePayload(payload: unknown): asserts payload is ProtocolStatePayload;
48
- declare function assertProtocolStateCellPayload(cell: unknown, context: string): asserts cell is ProtocolStatePayload['cells'][number];
49
- declare function assertProtocolViewPayload(payload: unknown): asserts payload is ProtocolViewPayload;
50
- declare function payloadInvalidError(payloadType: RuntimePayloadType, message: string, why: string, suggestions: ReadonlyArray<{
51
- readonly message: string;
52
- }>): RuntimePayloadError;
53
- declare function payloadScriptSelector(type: RuntimePayloadType): string;
54
- //#endregion
55
- export { DecodedPayloadScripts, EncodedPayloadScripts, RuntimePayloadDiagnostic, RuntimePayloadError, RuntimePayloadErrorCode, RuntimePayloadType, assertProtocolStateCellPayload, assertProtocolStatePayload, assertProtocolViewPayload, decodePayloadScripts, payloadInvalidError, payloadScriptSelector };
1
+ import { a as RuntimePayloadError, c as assertProtocolStateCellPayload, d as decodePayloadScriptsWithVersion, f as invalidPayloadShapeError, i as RuntimePayloadDiagnostic, l as assertProtocolStatePayload, m as payloadScriptSelector, n as DecodedPayloadScripts, o as RuntimePayloadErrorCode, p as payloadInvalidError, r as EncodedPayloadScripts, s as RuntimePayloadType, t as decodePayloadScripts, u as assertProtocolViewPayload } from "./protocol-validation-storage-DogbS8xp.js";
2
+ export { DecodedPayloadScripts, EncodedPayloadScripts, RuntimePayloadDiagnostic, RuntimePayloadError, RuntimePayloadErrorCode, RuntimePayloadType, assertProtocolStateCellPayload, assertProtocolStatePayload, assertProtocolViewPayload, decodePayloadScripts, decodePayloadScriptsWithVersion, invalidPayloadShapeError, payloadInvalidError, payloadScriptSelector };
@@ -1,3 +1,2 @@
1
- import "./protocol.js";
2
- import { a as decodePayloadScripts, i as assertProtocolViewPayload, n as assertProtocolStateCellPayload, o as payloadInvalidError, r as assertProtocolStatePayload, s as payloadScriptSelector, t as RuntimePayloadError } from "./protocol-validation-BzwtRg-T.js";
3
- export { RuntimePayloadError, assertProtocolStateCellPayload, assertProtocolStatePayload, assertProtocolViewPayload, decodePayloadScripts, payloadInvalidError, payloadScriptSelector };
1
+ import { a as assertProtocolStatePayload, c as invalidPayloadShapeError, i as assertProtocolStateCellPayload, l as payloadInvalidError, o as assertProtocolViewPayload, r as RuntimePayloadError, s as decodePayloadScriptsWithVersion, t as decodePayloadScripts, u as payloadScriptSelector } from "./protocol-validation-storage-BQ8D2S5j.js";
2
+ export { RuntimePayloadError, assertProtocolStateCellPayload, assertProtocolStatePayload, assertProtocolViewPayload, decodePayloadScripts, decodePayloadScriptsWithVersion, invalidPayloadShapeError, payloadInvalidError, payloadScriptSelector };
@@ -1,257 +1,2 @@
1
- //#region src/protocol.d.ts
2
- declare const ASYNC_PROTOCOL_VERSION = 1;
3
- declare const STORAGE_PROTOCOL_VERSION = 2;
4
- type ProtocolSyncPolicyCondition = {
5
- readonly type: 'and';
6
- readonly conditions: ReadonlyArray<ProtocolSyncPolicyCondition>;
7
- } | {
8
- readonly type: 'or';
9
- readonly conditions: ReadonlyArray<ProtocolSyncPolicyCondition>;
10
- } | {
11
- readonly type: 'not';
12
- readonly condition: ProtocolSyncPolicyCondition;
13
- } | {
14
- readonly type: 'graph-truthy';
15
- readonly graphNodeId: string;
16
- readonly path?: ReadonlyArray<string>;
17
- } | {
18
- readonly type: 'constant-truthy';
19
- readonly value: unknown;
20
- } | {
21
- readonly type: 'event-equals';
22
- readonly field: string;
23
- readonly value: unknown;
24
- };
25
- type ProtocolSyncPolicyBranch = {
26
- readonly when: ProtocolSyncPolicyCondition;
27
- readonly actions: ReadonlyArray<'preventDefault' | 'stopPropagation'>;
28
- };
29
- type ProtocolSyncPolicy = ProtocolSyncPolicyBranch | {
30
- readonly branches: ReadonlyArray<ProtocolSyncPolicyBranch>;
31
- };
32
- type ProtocolStatePayload = {
33
- readonly version: typeof ASYNC_PROTOCOL_VERSION | typeof STORAGE_PROTOCOL_VERSION;
34
- readonly cells: ReadonlyArray<{
35
- readonly graphNodeId: string;
36
- readonly name: string;
37
- readonly valueKind: 'scalar' | 'object' | 'array' | 'unknown';
38
- readonly value?: unknown;
39
- readonly directValue?: unknown;
40
- }>;
41
- readonly computed: ReadonlyArray<{
42
- readonly graphNodeId: string;
43
- readonly name: string;
44
- readonly async: boolean;
45
- readonly dependencies?: ReadonlyArray<{
46
- readonly graphNodeId: string;
47
- readonly path: ReadonlyArray<string>;
48
- }>;
49
- readonly snapshot?: {
50
- readonly status: 'idle';
51
- readonly version: 0;
52
- } | {
53
- readonly status: 'pending';
54
- readonly version: number;
55
- readonly key: unknown;
56
- } | {
57
- readonly status: 'fulfilled';
58
- readonly version: number;
59
- readonly key: unknown;
60
- readonly value: unknown;
61
- } | {
62
- readonly status: 'rejected';
63
- readonly version: number;
64
- readonly key: unknown;
65
- readonly error: unknown;
66
- };
67
- }>;
68
- readonly sharedDefinitions?: ReadonlyArray<{
69
- readonly id: string;
70
- readonly name: string;
71
- readonly exportedName: string;
72
- readonly scope?: 'request' | 'container' | 'page';
73
- readonly version: number;
74
- readonly graphNodeIds: ReadonlyArray<string>;
75
- readonly dependencies?: ReadonlyArray<{
76
- readonly definitionId: string;
77
- readonly definitionName: string;
78
- }>;
79
- readonly returnProperties?: ReadonlyArray<{
80
- readonly kind: 'graph';
81
- readonly name: string;
82
- readonly graphNodeId: string;
83
- readonly path: ReadonlyArray<string>;
84
- } | {
85
- readonly kind: 'method';
86
- readonly name: string;
87
- }>;
88
- }>;
89
- readonly storage?: ReadonlyArray<{
90
- readonly graphNodeId: string;
91
- readonly key: string;
92
- }>;
93
- };
94
- type ProtocolArmBranchRecord = {
95
- readonly id: string;
96
- readonly testReads: ReadonlyArray<{
97
- readonly source: string;
98
- readonly graphNodeId: string;
99
- readonly path: ReadonlyArray<string>;
100
- }>;
101
- readonly symbolId?: string;
102
- readonly armTests?: ReadonlyArray<unknown>;
103
- readonly declaredEmptyArms?: ReadonlyArray<number>;
104
- readonly startAnchor?: {
105
- readonly strategy: 'arm-branch-comment';
106
- readonly index: number;
107
- };
108
- readonly endAnchor?: {
109
- readonly strategy: 'arm-branch-comment';
110
- readonly index: number;
111
- };
112
- readonly armRecords?: NonNullable<ProtocolViewPayload['branches']>[number]['armRecords'];
113
- };
114
- type ProtocolArmRecordSet = {
115
- readonly locators: ReadonlyArray<{
116
- readonly hostNodeId: string;
117
- readonly strategy: 'arm-relative';
118
- readonly index: number;
119
- readonly tagName: string;
120
- }>;
121
- readonly events: ProtocolViewPayload['events'];
122
- readonly behaviors: ProtocolViewPayload['behaviors'];
123
- readonly elementHandles: ProtocolViewPayload['elementHandles'];
124
- readonly branches?: ReadonlyArray<ProtocolArmBranchRecord>;
125
- };
126
- type ProtocolViewPayload = {
127
- readonly version: typeof ASYNC_PROTOCOL_VERSION;
128
- readonly asyncRunners?: Readonly<Record<string, string>>;
129
- readonly locators: ReadonlyArray<{
130
- readonly hostNodeId: string;
131
- readonly strategy: 'dom-order';
132
- readonly index: number;
133
- readonly tagName: string;
134
- }>;
135
- readonly events: ReadonlyArray<{
136
- readonly hostNodeId: string;
137
- readonly eventName: string;
138
- readonly syncPolicy?: ProtocolSyncPolicy;
139
- readonly symbolIds: ReadonlyArray<string>;
140
- }>;
141
- readonly domUpdates: ReadonlyArray<{
142
- readonly hostNodeId: string;
143
- readonly source: string;
144
- readonly graphNodeId: string;
145
- readonly path: ReadonlyArray<string>;
146
- readonly target?: {
147
- readonly kind: 'text';
148
- readonly prefix?: string;
149
- readonly suffix?: string;
150
- readonly trueValue?: string;
151
- readonly falseValue?: string;
152
- } | {
153
- readonly kind: 'attribute';
154
- readonly name: string;
155
- } | {
156
- readonly kind: 'property';
157
- readonly name: string;
158
- } | {
159
- readonly kind: 'class';
160
- readonly trueValue?: string;
161
- readonly falseValue?: string;
162
- } | {
163
- readonly kind: 'style';
164
- };
165
- readonly symbolId?: string;
166
- }>;
167
- readonly behaviors: ReadonlyArray<{
168
- readonly hostNodeId: string;
169
- readonly source: string;
170
- readonly functionSource: string;
171
- readonly inputSources: ReadonlyArray<string>;
172
- readonly inputValues?: ReadonlyArray<unknown>;
173
- readonly inputGraphReads?: ReadonlyArray<{
174
- readonly inputIndex: number;
175
- readonly source: string;
176
- readonly graphNodeId: string;
177
- readonly path: ReadonlyArray<string>;
178
- }>;
179
- readonly symbolId?: string;
180
- }>;
181
- readonly elementHandles: ReadonlyArray<{
182
- readonly hostNodeId: string;
183
- readonly handleId: string;
184
- readonly name: string;
185
- }>;
186
- readonly keyedRepeats?: ReadonlyArray<{
187
- readonly id: string;
188
- readonly parentHostNodeId: string;
189
- readonly collectionGraphNodeId?: string;
190
- readonly collectionPath: ReadonlyArray<string>;
191
- readonly keyPath: ReadonlyArray<string>;
192
- readonly itemName: string;
193
- readonly rowElementCount: number;
194
- readonly rowEvents: ReadonlyArray<{
195
- readonly hostPath: ReadonlyArray<number>;
196
- readonly eventName: string;
197
- readonly symbolIds: ReadonlyArray<string>;
198
- readonly syncPolicy?: ProtocolSyncPolicy;
199
- }>;
200
- }>;
201
- readonly branches?: ReadonlyArray<{
202
- readonly id: string;
203
- readonly startAnchor: {
204
- readonly strategy: 'dom-order-comment';
205
- readonly index: number;
206
- };
207
- readonly endAnchor: {
208
- readonly strategy: 'dom-order-comment';
209
- readonly index: number;
210
- };
211
- readonly symbolId?: string;
212
- readonly armTests?: ReadonlyArray<unknown>;
213
- readonly armRecords?: ReadonlyArray<{
214
- readonly events: ReadonlyArray<{
215
- readonly hostPath: ReadonlyArray<number>;
216
- readonly eventName: string;
217
- readonly symbolIds: ReadonlyArray<string>;
218
- readonly syncPolicy?: ProtocolSyncPolicy;
219
- }>;
220
- readonly domUpdates: ReadonlyArray<Record<string, unknown>>;
221
- readonly behaviors: ReadonlyArray<Record<string, unknown>>;
222
- readonly elementHandles: ReadonlyArray<Record<string, unknown>>;
223
- }>;
224
- readonly testReads?: ReadonlyArray<{
225
- readonly source: string;
226
- readonly graphNodeId: string;
227
- readonly path: ReadonlyArray<string>;
228
- }>;
229
- }>;
230
- readonly asyncBoundaries: ReadonlyArray<{
231
- readonly id: string;
232
- readonly updateSymbolId?: string;
233
- readonly armRecords?: ProtocolArmRecordSet | ReadonlyArray<ProtocolArmRecordSet>;
234
- readonly startAnchor: {
235
- readonly strategy: 'dom-order-comment';
236
- readonly index: number;
237
- };
238
- readonly endAnchor: {
239
- readonly strategy: 'dom-order-comment';
240
- readonly index: number;
241
- };
242
- readonly asyncReads: ReadonlyArray<{
243
- readonly source: string;
244
- readonly graphNodeId: string;
245
- readonly path: ReadonlyArray<string>;
246
- readonly runnerSymbolId?: string;
247
- }>;
248
- }>;
249
- };
250
- type ProtocolPayloadScripts = {
251
- readonly state: ProtocolStatePayload;
252
- readonly view: ProtocolViewPayload;
253
- readonly stateScript: string;
254
- readonly viewScript: string;
255
- };
256
- //#endregion
257
- export { ASYNC_PROTOCOL_VERSION, ProtocolArmBranchRecord, ProtocolArmRecordSet, ProtocolPayloadScripts, ProtocolStatePayload, ProtocolSyncPolicy, ProtocolSyncPolicyBranch, ProtocolSyncPolicyCondition, ProtocolViewPayload, STORAGE_PROTOCOL_VERSION };
1
+ import { _ as ASYNC_PROTOCOL_VERSION, a as ProtocolEventAction, b as ASYNC_BOUNDARY_ARM, c as ProtocolPayloadScripts, d as ProtocolSyncPolicy, f as ProtocolSyncPolicyBranch, g as protocolEventDispatchesMarkless, h as protocolEventActionKind, i as ProtocolAsyncBoundaryArm, l as ProtocolStatePayload, m as ProtocolViewPayload, n as ProtocolArmBranchRecord, o as ProtocolEventActionKind, p as ProtocolSyncPolicyCondition, r as ProtocolArmRecordSet, s as ProtocolEventRecord, t as PROTOCOL_EVENT_ACTION_KIND, u as ProtocolStreamedArmPatch, v as STORAGE_PROTOCOL_VERSION, y as protocolStateVersion } from "./protocol-BfzeLgjZ.js";
2
+ export { ASYNC_BOUNDARY_ARM, ASYNC_PROTOCOL_VERSION, PROTOCOL_EVENT_ACTION_KIND, ProtocolArmBranchRecord, ProtocolArmRecordSet, ProtocolAsyncBoundaryArm, ProtocolEventAction, ProtocolEventActionKind, ProtocolEventRecord, ProtocolPayloadScripts, ProtocolStatePayload, ProtocolStreamedArmPatch, ProtocolSyncPolicy, ProtocolSyncPolicyBranch, ProtocolSyncPolicyCondition, ProtocolViewPayload, STORAGE_PROTOCOL_VERSION, protocolEventActionKind, protocolEventDispatchesMarkless, protocolStateVersion };
package/dist/protocol.js CHANGED
@@ -1,5 +1,2 @@
1
- //#region src/protocol.ts
2
- const ASYNC_PROTOCOL_VERSION = 1;
3
- const STORAGE_PROTOCOL_VERSION = 2;
4
- //#endregion
5
- export { ASYNC_PROTOCOL_VERSION, STORAGE_PROTOCOL_VERSION };
1
+ import { a as ASYNC_PROTOCOL_VERSION, i as ASYNC_BOUNDARY_ARM, n as protocolEventActionKind, o as STORAGE_PROTOCOL_VERSION, r as protocolEventDispatchesMarkless, s as protocolStateVersion, t as PROTOCOL_EVENT_ACTION_KIND } from "./protocol-BX4yw9bm.js";
2
+ export { ASYNC_BOUNDARY_ARM, ASYNC_PROTOCOL_VERSION, PROTOCOL_EVENT_ACTION_KIND, STORAGE_PROTOCOL_VERSION, protocolEventActionKind, protocolEventDispatchesMarkless, protocolStateVersion };
@@ -1,3 +1,6 @@
1
+ //#region src/value-constants.d.ts
2
+ declare const GRAPH_VALUE_PROTOCOL_VERSION = 1;
3
+ //#endregion
1
4
  //#region src/value-decode.d.ts
2
5
  declare function deserializeGraphValue(payload: SerializedGraphPayload): unknown;
3
6
  //#endregion
@@ -70,7 +73,7 @@ type SerializedRecord = {
70
73
  };
71
74
  type TypedArrayName = 'Int8Array' | 'Uint8Array' | 'Uint8ClampedArray' | 'Int16Array' | 'Uint16Array' | 'Int32Array' | 'Uint32Array' | 'Float32Array' | 'Float64Array' | 'BigInt64Array' | 'BigUint64Array';
72
75
  type SerializedGraphPayload = {
73
- readonly version: 1;
76
+ readonly version: typeof GRAPH_VALUE_PROTOCOL_VERSION;
74
77
  readonly root: SerializedSlot;
75
78
  readonly records: ReadonlyArray<SerializedRecord>;
76
79
  };
package/package.json CHANGED
@@ -1,17 +1,16 @@
1
1
  {
2
2
  "name": "@markless/serializer",
3
- "version": "0.2.2",
3
+ "version": "0.3.1",
4
4
  "description": "Markless serialization tiers and resumability payload protocol.",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
8
- "url": "git+https://github.com/markless-dev/markless.git",
8
+ "url": "git+https://github.com/compiled-run/markless.git",
9
9
  "directory": "packages/serializer"
10
10
  },
11
- "publishConfig": {
12
- "access": "public",
13
- "provenance": true
14
- },
11
+ "files": [
12
+ "dist"
13
+ ],
15
14
  "type": "module",
16
15
  "sideEffects": false,
17
16
  "exports": {
@@ -19,10 +18,22 @@
19
18
  "types": "./dist/index.d.ts",
20
19
  "default": "./dist/index.js"
21
20
  },
21
+ "./async-boundary-arm": {
22
+ "types": "./dist/index.d.ts",
23
+ "default": "./dist/index.js"
24
+ },
22
25
  "./decode": {
23
26
  "types": "./dist/decode.d.ts",
24
27
  "default": "./dist/decode.js"
25
28
  },
29
+ "./resume-record-delta": {
30
+ "types": "./dist/index.d.ts",
31
+ "default": "./dist/index.js"
32
+ },
33
+ "./resume-record-merge": {
34
+ "types": "./dist/index.d.ts",
35
+ "default": "./dist/index.js"
36
+ },
26
37
  "./decode-client": {
27
38
  "types": "./dist/decode-client.d.ts",
28
39
  "default": "./dist/decode-client.js"
@@ -36,8 +47,9 @@
36
47
  "default": "./dist/protocol-validation.js"
37
48
  }
38
49
  },
39
- "files": [
40
- "dist"
41
- ],
50
+ "publishConfig": {
51
+ "access": "public",
52
+ "provenance": true
53
+ },
42
54
  "scripts": {}
43
55
  }