@powerhousedao/shared 6.2.3-dev.3 → 6.2.3-dev.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/analytics/index.d.ts +4 -4
- package/dist/analytics/index.d.ts.map +1 -1
- package/dist/analytics/index.js +25 -24
- package/dist/analytics/index.js.map +1 -1
- package/dist/clis/args/{access-token-To5LaIfL.mjs → access-token-3Hqv_U8I.mjs} +2 -2
- package/dist/clis/args/{access-token-To5LaIfL.mjs.map → access-token-3Hqv_U8I.mjs.map} +1 -1
- package/dist/clis/args/access-token-C5sKsH2O.d.mts +16 -0
- package/dist/clis/args/access-token-C5sKsH2O.d.mts.map +1 -0
- package/dist/clis/args/access-token.d.mts +3 -2
- package/dist/clis/args/access-token.mjs +1 -1
- package/dist/clis/args/{common-CcYbXrBx.mjs → common-BXabdhiO.mjs} +30 -7
- package/dist/clis/args/common-BXabdhiO.mjs.map +1 -0
- package/dist/clis/args/common-Bnm859xU.d.mts +186 -0
- package/dist/clis/args/common-Bnm859xU.d.mts.map +1 -0
- package/dist/clis/args/common.d.mts +3 -2
- package/dist/clis/args/common.mjs +1 -1
- package/dist/clis/args/{connect-BVVvCmL9.mjs → connect-B6xK4YI_.mjs} +7 -2
- package/dist/clis/args/connect-B6xK4YI_.mjs.map +1 -0
- package/dist/clis/args/connect-DjeiqXus.d.mts +450 -0
- package/dist/clis/args/connect-DjeiqXus.d.mts.map +1 -0
- package/dist/clis/args/connect.d.mts +3 -2
- package/dist/clis/args/connect.mjs +1 -1
- package/dist/clis/args/{generate-CA916Fvj.mjs → generate-10dooJ-D.mjs} +45 -2
- package/dist/clis/args/generate-10dooJ-D.mjs.map +1 -0
- package/dist/clis/args/generate-DmgiCzuf.d.mts +106 -0
- package/dist/clis/args/generate-DmgiCzuf.d.mts.map +1 -0
- package/dist/clis/args/generate.d.mts +3 -2
- package/dist/clis/args/generate.mjs +1 -1
- package/dist/clis/args/help-DVPTARGn.d.mts +190 -0
- package/dist/clis/args/help-DVPTARGn.d.mts.map +1 -0
- package/dist/clis/args/{help-Bqbgbalu.mjs → help-yRmplJjW.mjs} +15 -15
- package/dist/clis/args/{help-Bqbgbalu.mjs.map → help-yRmplJjW.mjs.map} +1 -1
- package/dist/clis/args/help.d.mts +3 -2
- package/dist/clis/args/help.mjs +1 -1
- package/dist/clis/args/index.d.mts +20 -19
- package/dist/clis/args/index.mjs +18 -18
- package/dist/clis/args/init-CFeTq4Cq.d.mts +52 -0
- package/dist/clis/args/init-CFeTq4Cq.d.mts.map +1 -0
- package/dist/clis/args/{init-rz9Ei7nq.mjs → init-Dvb42Y87.mjs} +2 -2
- package/dist/clis/args/{init-rz9Ei7nq.mjs.map → init-Dvb42Y87.mjs.map} +1 -1
- package/dist/clis/args/init.d.mts +3 -2
- package/dist/clis/args/init.mjs +1 -1
- package/dist/clis/args/inspect-BjRmtB86.d.mts +13 -0
- package/dist/clis/args/inspect-BjRmtB86.d.mts.map +1 -0
- package/dist/clis/args/{inspect-tckH8mSw.mjs → inspect-UNQgtuR0.mjs} +2 -2
- package/dist/clis/args/{inspect-tckH8mSw.mjs.map → inspect-UNQgtuR0.mjs.map} +1 -1
- package/dist/clis/args/inspect.d.mts +3 -2
- package/dist/clis/args/inspect.mjs +1 -1
- package/dist/clis/args/install-B0tMyUMw.d.mts +37 -0
- package/dist/clis/args/install-B0tMyUMw.d.mts.map +1 -0
- package/dist/clis/args/{install-Sz2DlCHh.mjs → install-F-27kF6m.mjs} +2 -2
- package/dist/clis/args/{install-Sz2DlCHh.mjs.map → install-F-27kF6m.mjs.map} +1 -1
- package/dist/clis/args/install.d.mts +3 -2
- package/dist/clis/args/install.mjs +1 -1
- package/dist/clis/args/{list-DM2d6f1m.mjs → list-Bkfn8Yuo.mjs} +2 -2
- package/dist/clis/args/{list-DM2d6f1m.mjs.map → list-Bkfn8Yuo.mjs.map} +1 -1
- package/dist/clis/args/list-DrbxA7JJ.d.mts +10 -0
- package/dist/clis/args/list-DrbxA7JJ.d.mts.map +1 -0
- package/dist/clis/args/list.d.mts +3 -2
- package/dist/clis/args/list.mjs +1 -1
- package/dist/clis/args/{login-DiKT5Jfu.mjs → login-CIFkQExi.mjs} +2 -2
- package/dist/clis/args/{login-DiKT5Jfu.mjs.map → login-CIFkQExi.mjs.map} +1 -1
- package/dist/clis/args/login-CXRJXg71.d.mts +25 -0
- package/dist/clis/args/login-CXRJXg71.d.mts.map +1 -0
- package/dist/clis/args/login.d.mts +3 -2
- package/dist/clis/args/login.mjs +1 -1
- package/dist/clis/args/{magic-string.es-h_0HDQBQ.mjs → magic-string.es-BWtG0AyA.mjs} +33 -27
- package/dist/clis/args/magic-string.es-BWtG0AyA.mjs.map +1 -0
- package/dist/clis/args/migrate-DkCQRL2D.d.mts +19 -0
- package/dist/clis/args/migrate-DkCQRL2D.d.mts.map +1 -0
- package/dist/clis/args/{migrate-CG_gWc4k.mjs → migrate-DwJGhc2d.mjs} +2 -2
- package/dist/clis/args/{migrate-CG_gWc4k.mjs.map → migrate-DwJGhc2d.mjs.map} +1 -1
- package/dist/clis/args/migrate.d.mts +3 -2
- package/dist/clis/args/migrate.mjs +1 -1
- package/dist/clis/args/publish-CeW4bOrl.d.mts +16 -0
- package/dist/clis/args/publish-CeW4bOrl.d.mts.map +1 -0
- package/dist/clis/args/{publish-DDZYsUfV.mjs → publish-DHqlGWmL.mjs} +2 -2
- package/dist/clis/args/{publish-DDZYsUfV.mjs.map → publish-DHqlGWmL.mjs.map} +1 -1
- package/dist/clis/args/publish.d.mts +3 -2
- package/dist/clis/args/publish.mjs +1 -1
- package/dist/clis/args/{registry-C_OVFQmI.mjs → registry-DIwES3l2.mjs} +2 -2
- package/dist/clis/args/{registry-C_OVFQmI.mjs.map → registry-DIwES3l2.mjs.map} +1 -1
- package/dist/clis/args/registry-DNH8xuaE.d.mts +17 -0
- package/dist/clis/args/registry-DNH8xuaE.d.mts.map +1 -0
- package/dist/clis/args/registry.d.mts +3 -2
- package/dist/clis/args/registry.mjs +1 -1
- package/dist/clis/args/service-BBx5GDTc.d.mts +27 -0
- package/dist/clis/args/service-BBx5GDTc.d.mts.map +1 -0
- package/dist/clis/args/{service-CHOOr0Gg.mjs → service-Cpjlyeu5.mjs} +2 -2
- package/dist/clis/args/{service-CHOOr0Gg.mjs.map → service-Cpjlyeu5.mjs.map} +1 -1
- package/dist/clis/args/service.d.mts +3 -2
- package/dist/clis/args/service.mjs +1 -1
- package/dist/clis/args/{switchboard-Dsp7nosi.mjs → switchboard-CCaAtU56.mjs} +2 -2
- package/dist/clis/args/{switchboard-Dsp7nosi.mjs.map → switchboard-CCaAtU56.mjs.map} +1 -1
- package/dist/clis/args/switchboard-RrNb1fUH.d.mts +70 -0
- package/dist/clis/args/switchboard-RrNb1fUH.d.mts.map +1 -0
- package/dist/clis/args/switchboard.d.mts +3 -2
- package/dist/clis/args/switchboard.mjs +1 -1
- package/dist/clis/args/{uninstall-CTwTX0u_.mjs → uninstall-3U0B8g5c.mjs} +2 -2
- package/dist/clis/args/{uninstall-CTwTX0u_.mjs.map → uninstall-3U0B8g5c.mjs.map} +1 -1
- package/dist/clis/args/uninstall-CDx7lwxn.d.mts +28 -0
- package/dist/clis/args/uninstall-CDx7lwxn.d.mts.map +1 -0
- package/dist/clis/args/uninstall.d.mts +3 -2
- package/dist/clis/args/uninstall.mjs +1 -1
- package/dist/clis/args/unpublish-CEDsk6uv.d.mts +22 -0
- package/dist/clis/args/unpublish-CEDsk6uv.d.mts.map +1 -0
- package/dist/clis/args/{unpublish-BPMkGEg5.mjs → unpublish-s9zUh6Gw.mjs} +2 -2
- package/dist/clis/args/{unpublish-BPMkGEg5.mjs.map → unpublish-s9zUh6Gw.mjs.map} +1 -1
- package/dist/clis/args/unpublish.d.mts +3 -2
- package/dist/clis/args/unpublish.mjs +1 -1
- package/dist/clis/args/{vetra-b4KUu1Ax.mjs → vetra-BUNlAAPp.mjs} +2 -2
- package/dist/clis/args/{vetra-b4KUu1Ax.mjs.map → vetra-BUNlAAPp.mjs.map} +1 -1
- package/dist/clis/args/vetra-DkDaWFPi.d.mts +111 -0
- package/dist/clis/args/vetra-DkDaWFPi.d.mts.map +1 -0
- package/dist/clis/args/vetra-ports.test.d.mts +2 -1
- package/dist/clis/args/vetra-ports.test.mjs +285 -180
- package/dist/clis/args/vetra-ports.test.mjs.map +1 -1
- package/dist/clis/args/vetra.d.mts +3 -2
- package/dist/clis/args/vetra.mjs +1 -1
- package/dist/clis/build-config-CmdMi_wu.mjs +230 -0
- package/dist/clis/build-config-CmdMi_wu.mjs.map +1 -0
- package/dist/clis/build-config.d.mts +44 -10614
- package/dist/clis/build-config.d.mts.map +1 -1
- package/dist/clis/build-config.mjs +2 -88
- package/dist/clis/build-pieces.d.mts +101 -0
- package/dist/clis/build-pieces.d.mts.map +1 -0
- package/dist/clis/build-pieces.mjs +364 -0
- package/dist/clis/build-pieces.mjs.map +1 -0
- package/dist/clis/command-names.d.mts +2 -2
- package/dist/clis/command-names.d.mts.map +1 -1
- package/dist/clis/command-names.mjs.map +1 -1
- package/dist/clis/constants.d.mts +3 -462
- package/dist/clis/constants.mjs +25 -8
- package/dist/clis/constants.mjs.map +1 -1
- package/dist/clis/index-6CZwrmQi.d.mts +11154 -0
- package/dist/clis/index-6CZwrmQi.d.mts.map +1 -0
- package/dist/clis/index.d.mts +1339 -1221
- package/dist/clis/index.d.mts.map +1 -1
- package/dist/clis/index.mjs +186 -63
- package/dist/clis/index.mjs.map +1 -1
- package/dist/clis/project-env.d.mts +4 -4
- package/dist/clis/project-env.d.mts.map +1 -1
- package/dist/clis/project-env.mjs.map +1 -1
- package/dist/clis/project-ports.d.mts +5 -5
- package/dist/clis/project-ports.d.mts.map +1 -1
- package/dist/clis/project-ports.mjs +1 -1
- package/dist/clis/project-ports.mjs.map +1 -1
- package/dist/clis/services/telemetry.d.mts +7 -7
- package/dist/clis/services/telemetry.d.mts.map +1 -1
- package/dist/clis/services/telemetry.mjs.map +1 -1
- package/dist/clis/types-CMFHKrgv.d.mts +528 -0
- package/dist/clis/types-CMFHKrgv.d.mts.map +1 -0
- package/dist/clis/utils.d.mts +4 -4
- package/dist/clis/utils.d.mts.map +1 -1
- package/dist/clis/utils.mjs.map +1 -1
- package/dist/{config-loader-B845Hidf.js → config-loader-SYDWHtqk.js} +14 -8
- package/dist/config-loader-SYDWHtqk.js.map +1 -0
- package/dist/connect/config-loader.d.ts +7 -8
- package/dist/connect/config-loader.d.ts.map +1 -1
- package/dist/connect/config-loader.js +1 -1
- package/dist/connect/index.d.ts +158 -55
- package/dist/connect/index.d.ts.map +1 -1
- package/dist/connect/index.js +272 -30
- package/dist/connect/index.js.map +1 -1
- package/dist/connect/json-adapter.d.ts +3 -4
- package/dist/connect/json-adapter.d.ts.map +1 -1
- package/dist/connect/json-adapter.js.map +1 -1
- package/dist/{constants-BP_gjn8g.d.ts → constants-DO4IYxuR.d.ts} +2 -1
- package/dist/constants-DO4IYxuR.d.ts.map +1 -0
- package/dist/constants.d.ts +3 -2
- package/dist/constants.js.map +1 -1
- package/dist/document-drive/index.d.ts +134 -100
- package/dist/document-drive/index.d.ts.map +1 -1
- package/dist/document-drive/index.js +120 -52
- package/dist/document-drive/index.js.map +1 -1
- package/dist/document-model/index.d.ts +5 -4
- package/dist/document-model/index.js +449 -227
- package/dist/document-model/index.js.map +1 -1
- package/dist/document-model/mock.d.ts +2 -3
- package/dist/document-model/mock.d.ts.map +1 -1
- package/dist/document-model/mock.js +2 -1
- package/dist/document-model/mock.js.map +1 -1
- package/dist/document-model/utils.d.ts +3 -2
- package/dist/document-model/utils.js +1 -1
- package/dist/{index-DyYIJtVy.d.ts → index-CDDyUSHE.d.ts} +40 -28
- package/dist/index-CDDyUSHE.d.ts.map +1 -0
- package/dist/index-D0JljlgO.d.ts +36 -0
- package/dist/index-D0JljlgO.d.ts.map +1 -0
- package/dist/index.d.ts +7 -6
- package/dist/index.js.map +1 -1
- package/dist/processors/index.d.ts +3 -2
- package/dist/processors/index.js +5 -1
- package/dist/processors/index.js.map +1 -1
- package/dist/registry/index.d.ts +15 -15
- package/dist/registry/index.d.ts.map +1 -1
- package/dist/registry/index.js +14 -5
- package/dist/registry/index.js.map +1 -1
- package/dist/registry/manifest-slim.d.ts +4 -3
- package/dist/registry/manifest-slim.d.ts.map +1 -1
- package/dist/registry/manifest-slim.js +21 -0
- package/dist/registry/manifest-slim.js.map +1 -1
- package/dist/registry/updates.d.ts +3 -3
- package/dist/registry/updates.d.ts.map +1 -1
- package/dist/registry/updates.js.map +1 -1
- package/dist/registry/urls.d.ts +2 -2
- package/dist/registry/urls.d.ts.map +1 -1
- package/dist/registry/urls.js.map +1 -1
- package/dist/{types-C1in4fl3.d.ts → types-Bsp8VL2y.d.ts} +2 -2
- package/dist/types-Bsp8VL2y.d.ts.map +1 -0
- package/dist/{types-YqLqb0Zb.d.ts → types-VDHUeQnm.d.ts} +23 -35
- package/dist/types-VDHUeQnm.d.ts.map +1 -0
- package/dist/{types-CpnWmiFY.d.ts → types-xLPOHE23.d.ts} +593 -437
- package/dist/types-xLPOHE23.d.ts.map +1 -0
- package/dist/{utils-DP122OSS.d.ts → utils-BrKxCmKx.d.ts} +2 -2
- package/dist/utils-BrKxCmKx.d.ts.map +1 -0
- package/dist/{utils-aaTmfxFW.js → utils-XotexSsQ.js} +3 -2
- package/dist/{utils-aaTmfxFW.js.map → utils-XotexSsQ.js.map} +1 -1
- package/package.json +10 -5
- package/dist/clis/args/access-token--9H57y8J.d.mts +0 -18
- package/dist/clis/args/access-token--9H57y8J.d.mts.map +0 -1
- package/dist/clis/args/common-CcYbXrBx.mjs.map +0 -1
- package/dist/clis/args/common-Dsf1vpHV.d.mts +0 -183
- package/dist/clis/args/common-Dsf1vpHV.d.mts.map +0 -1
- package/dist/clis/args/connect-BVVvCmL9.mjs.map +0 -1
- package/dist/clis/args/connect-DetTnI8g.d.mts +0 -443
- package/dist/clis/args/connect-DetTnI8g.d.mts.map +0 -1
- package/dist/clis/args/generate-CA916Fvj.mjs.map +0 -1
- package/dist/clis/args/generate-DnV-bfXt.d.mts +0 -87
- package/dist/clis/args/generate-DnV-bfXt.d.mts.map +0 -1
- package/dist/clis/args/help-CjAsudUn.d.mts +0 -193
- package/dist/clis/args/help-CjAsudUn.d.mts.map +0 -1
- package/dist/clis/args/init-CUXyfquF.d.mts +0 -55
- package/dist/clis/args/init-CUXyfquF.d.mts.map +0 -1
- package/dist/clis/args/inspect-DtZeoA5c.d.mts +0 -15
- package/dist/clis/args/inspect-DtZeoA5c.d.mts.map +0 -1
- package/dist/clis/args/install-CkP8zcHb.d.mts +0 -40
- package/dist/clis/args/install-CkP8zcHb.d.mts.map +0 -1
- package/dist/clis/args/list-BGf8s_gj.d.mts +0 -12
- package/dist/clis/args/list-BGf8s_gj.d.mts.map +0 -1
- package/dist/clis/args/login-DNsHwvqk.d.mts +0 -27
- package/dist/clis/args/login-DNsHwvqk.d.mts.map +0 -1
- package/dist/clis/args/magic-string.es-h_0HDQBQ.mjs.map +0 -1
- package/dist/clis/args/migrate-sixkWhxm.d.mts +0 -21
- package/dist/clis/args/migrate-sixkWhxm.d.mts.map +0 -1
- package/dist/clis/args/publish-Dqe5DUst.d.mts +0 -18
- package/dist/clis/args/publish-Dqe5DUst.d.mts.map +0 -1
- package/dist/clis/args/registry-C_RfTsKB.d.mts +0 -19
- package/dist/clis/args/registry-C_RfTsKB.d.mts.map +0 -1
- package/dist/clis/args/service-DhIkf8-O.d.mts +0 -22
- package/dist/clis/args/service-DhIkf8-O.d.mts.map +0 -1
- package/dist/clis/args/switchboard-BlPaq2at.d.mts +0 -72
- package/dist/clis/args/switchboard-BlPaq2at.d.mts.map +0 -1
- package/dist/clis/args/uninstall-BpA3YYbw.d.mts +0 -31
- package/dist/clis/args/uninstall-BpA3YYbw.d.mts.map +0 -1
- package/dist/clis/args/unpublish-CvwaIimG.d.mts +0 -24
- package/dist/clis/args/unpublish-CvwaIimG.d.mts.map +0 -1
- package/dist/clis/args/vetra-DLQ6lhLl.d.mts +0 -113
- package/dist/clis/args/vetra-DLQ6lhLl.d.mts.map +0 -1
- package/dist/clis/build-config.mjs.map +0 -1
- package/dist/clis/constants.d.mts.map +0 -1
- package/dist/config-loader-B845Hidf.js.map +0 -1
- package/dist/constants-BP_gjn8g.d.ts.map +0 -1
- package/dist/index-C_iVZe7f.d.ts +0 -7
- package/dist/index-C_iVZe7f.d.ts.map +0 -1
- package/dist/index-DyYIJtVy.d.ts.map +0 -1
- package/dist/types-C1in4fl3.d.ts.map +0 -1
- package/dist/types-CpnWmiFY.d.ts.map +0 -1
- package/dist/types-YqLqb0Zb.d.ts.map +0 -1
- package/dist/utils-DP122OSS.d.ts.map +0 -1
|
@@ -1,9 +1,176 @@
|
|
|
1
|
-
import { a as base58Decode, c as buildOperationSignatureParams, d as hex2ab, i as ab2hex, l as getUnixTimestamp, n as generateId, o as base64UrlToBytes, r as generateMock, s as buildOperationSignatureMessage, t as deriveOperationId, u as hashBrowser } from "../utils-
|
|
1
|
+
import { a as base58Decode, c as buildOperationSignatureParams, d as hex2ab, i as ab2hex, l as getUnixTimestamp, n as generateId, o as base64UrlToBytes, r as generateMock, s as buildOperationSignatureMessage, t as deriveOperationId, u as hashBrowser } from "../utils-XotexSsQ.js";
|
|
2
2
|
import { ZodError, z } from "zod";
|
|
3
3
|
import { stringify } from "safe-stable-stringify";
|
|
4
|
+
import { sha256 } from "@noble/hashes/sha2.js";
|
|
4
5
|
import { strFromU8, strToU8, unzip, zip } from "fflate";
|
|
5
|
-
import { castDraft, create, unsafe } from "mutative";
|
|
6
|
+
import { castDraft, create, isDraft, original, unsafe } from "mutative";
|
|
6
7
|
import { constantCase, pascalCase } from "change-case";
|
|
8
|
+
//#region document-model/action-signature.ts
|
|
9
|
+
const ACTION_SIGNATURE_V2_PREFIX = "v2:";
|
|
10
|
+
const V2_HASH = /^v2:[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$/;
|
|
11
|
+
const V2_TIMESTAMP = /^[0-9]+$/;
|
|
12
|
+
const V2_SIGNATURE = /^0x[0-9a-f]{128}$/;
|
|
13
|
+
const LONE_SURROGATE = /\p{Cs}/u;
|
|
14
|
+
const PREIMAGE_FIELDS = [
|
|
15
|
+
"version",
|
|
16
|
+
"documentId",
|
|
17
|
+
"branch",
|
|
18
|
+
"scope",
|
|
19
|
+
"type",
|
|
20
|
+
"id",
|
|
21
|
+
"timestampUtcMs",
|
|
22
|
+
"input",
|
|
23
|
+
"signer.user.address",
|
|
24
|
+
"signer.user.networkId",
|
|
25
|
+
"signer.user.chainId",
|
|
26
|
+
"signer.app.key"
|
|
27
|
+
];
|
|
28
|
+
/** A value that would not survive a JSON store round trip unchanged. */
|
|
29
|
+
var CanonicalJsonError = class extends Error {
|
|
30
|
+
constructor(path, detail) {
|
|
31
|
+
super(`Cannot canonicalize ${path}: ${detail}`);
|
|
32
|
+
this.name = "CanonicalJsonError";
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
/** Sorted-key JSON, as the state hash encodes; drops `undefined` properties. */
|
|
36
|
+
function canonicalJson(value, label = "value") {
|
|
37
|
+
assertCanonical(value, label, /* @__PURE__ */ new Set());
|
|
38
|
+
return stringify(value);
|
|
39
|
+
}
|
|
40
|
+
/** Actions the reactor reduces itself, onto the document scope. */
|
|
41
|
+
const DOCUMENT_SCOPE_ACTION_TYPES = /* @__PURE__ */ new Set([
|
|
42
|
+
"CREATE_DOCUMENT",
|
|
43
|
+
"DELETE_DOCUMENT",
|
|
44
|
+
"UPGRADE_DOCUMENT",
|
|
45
|
+
"ADD_RELATIONSHIP",
|
|
46
|
+
"REMOVE_RELATIONSHIP",
|
|
47
|
+
"UPDATE_RELATIONSHIP"
|
|
48
|
+
]);
|
|
49
|
+
/** Where a document-scope action writes: `sourceId` or `documentId`. */
|
|
50
|
+
function targetDocumentId(action, fallback) {
|
|
51
|
+
const input = action.input;
|
|
52
|
+
if (action.type === "ADD_RELATIONSHIP" || action.type === "REMOVE_RELATIONSHIP" || action.type === "UPDATE_RELATIONSHIP") return typeof input?.sourceId === "string" && input.sourceId.length > 0 ? input.sourceId : fallback;
|
|
53
|
+
return typeof input?.documentId === "string" && input.documentId.length > 0 ? input.documentId : fallback;
|
|
54
|
+
}
|
|
55
|
+
/** The log an action submitted to a job on `documentId` is stored in. */
|
|
56
|
+
function actionSigningTarget(action, documentId, branch) {
|
|
57
|
+
return {
|
|
58
|
+
documentId: DOCUMENT_SCOPE_ACTION_TYPES.has(action.type) ? targetDocumentId(action, documentId) : documentId,
|
|
59
|
+
branch
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/** The identity a signer writes into `context.signer`, and signs over. */
|
|
63
|
+
function actionSignerIdentity(signer) {
|
|
64
|
+
return {
|
|
65
|
+
user: {
|
|
66
|
+
address: signer.user?.address ?? "",
|
|
67
|
+
networkId: signer.user?.networkId ?? "",
|
|
68
|
+
chainId: signer.user?.chainId ?? 0
|
|
69
|
+
},
|
|
70
|
+
app: {
|
|
71
|
+
name: signer.app?.name ?? "",
|
|
72
|
+
key: signer.app?.key ?? ""
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/** The v2 preimage; throws `CanonicalJsonError` on an unsignable action. */
|
|
77
|
+
function actionPreimageV2(action, target, signer) {
|
|
78
|
+
if (!target.documentId) throw new CanonicalJsonError("documentId", "must not be empty");
|
|
79
|
+
if (!target.branch) throw new CanonicalJsonError("branch", "must not be empty");
|
|
80
|
+
if (action.input === void 0) throw new CanonicalJsonError("input", `action ${action.id} (${action.type}) has no input`);
|
|
81
|
+
const fields = [
|
|
82
|
+
"v2",
|
|
83
|
+
target.documentId,
|
|
84
|
+
target.branch,
|
|
85
|
+
action.scope,
|
|
86
|
+
action.type,
|
|
87
|
+
action.id,
|
|
88
|
+
action.timestampUtcMs,
|
|
89
|
+
action.input,
|
|
90
|
+
signer.user.address,
|
|
91
|
+
signer.user.networkId,
|
|
92
|
+
signer.user.chainId,
|
|
93
|
+
signer.app.key
|
|
94
|
+
];
|
|
95
|
+
fields.forEach((field, i) => {
|
|
96
|
+
assertCanonical(field, PREIMAGE_FIELDS[i], /* @__PURE__ */ new Set());
|
|
97
|
+
});
|
|
98
|
+
return stringify(fields);
|
|
99
|
+
}
|
|
100
|
+
/** `"v2:" + base64url(sha256(preimage))`, unpadded. */
|
|
101
|
+
async function hashActionV2(action, target, signer) {
|
|
102
|
+
const preimage = actionPreimageV2(action, target, signer);
|
|
103
|
+
const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(preimage));
|
|
104
|
+
return "v2:" + bytesToBase64Url$1(new Uint8Array(digest));
|
|
105
|
+
}
|
|
106
|
+
/** Signs `action` as a v2 tuple; the message layout is the legacy one. */
|
|
107
|
+
async function signActionV2(params) {
|
|
108
|
+
const { action, target, signer, sign } = params;
|
|
109
|
+
const previousStateHash = params.previousStateHash ?? "";
|
|
110
|
+
if (previousStateHash.includes(", ")) throw new Error(`Cannot sign action ${action.id}: the previous state hash contains ", "`);
|
|
111
|
+
const tuple = [
|
|
112
|
+
(Date.now() / 1e3).toFixed(0),
|
|
113
|
+
signer.app.key,
|
|
114
|
+
await hashActionV2(action, target, signer),
|
|
115
|
+
previousStateHash
|
|
116
|
+
];
|
|
117
|
+
const signature = await sign(buildOperationSignatureMessage(tuple));
|
|
118
|
+
if (signature.length !== 64) throw new Error(`Cannot sign action ${action.id}: expected a 64-byte P-256 signature, got ${signature.length} bytes`);
|
|
119
|
+
return [...tuple, `0x${bytesToHex(signature)}`];
|
|
120
|
+
}
|
|
121
|
+
/** Element [2] carries the v2 prefix, whether or not it is well formed. */
|
|
122
|
+
function isV2ActionHash(hash) {
|
|
123
|
+
return hash.startsWith("v2:");
|
|
124
|
+
}
|
|
125
|
+
/** The strict shape of a v2 tuple, apart from what its hash covers. */
|
|
126
|
+
function v2TupleProblem(tuple) {
|
|
127
|
+
if (!V2_TIMESTAMP.test(tuple[0])) return "signing time is not decimal seconds";
|
|
128
|
+
if (!V2_HASH.test(tuple[2])) return "hash is not v2: and 43 base64url characters";
|
|
129
|
+
if (!V2_SIGNATURE.test(tuple[4])) return "signature is not 0x and 128 lowercase hex digits";
|
|
130
|
+
}
|
|
131
|
+
function assertCanonical(value, path, ancestors) {
|
|
132
|
+
switch (typeof value) {
|
|
133
|
+
case "string":
|
|
134
|
+
if (LONE_SURROGATE.test(value)) throw new CanonicalJsonError(path, "string holds a lone surrogate");
|
|
135
|
+
return;
|
|
136
|
+
case "boolean": return;
|
|
137
|
+
case "number":
|
|
138
|
+
if (!Number.isFinite(value)) throw new CanonicalJsonError(path, `${value} is not a JSON number`);
|
|
139
|
+
return;
|
|
140
|
+
case "undefined": throw new CanonicalJsonError(path, "undefined is not a JSON value");
|
|
141
|
+
case "bigint": throw new CanonicalJsonError(path, "BigInt is not a JSON value");
|
|
142
|
+
case "function":
|
|
143
|
+
case "symbol": throw new CanonicalJsonError(path, `${typeof value} is not a JSON value`);
|
|
144
|
+
}
|
|
145
|
+
if (value === null) return;
|
|
146
|
+
const object = value;
|
|
147
|
+
if (ancestors.has(object)) throw new CanonicalJsonError(path, "value is circular");
|
|
148
|
+
const toJSON = object.toJSON;
|
|
149
|
+
if (typeof toJSON === "function") {
|
|
150
|
+
assertCanonical(toJSON.call(object), path, new Set(ancestors).add(object));
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
ancestors.add(object);
|
|
154
|
+
if (Array.isArray(object)) for (let i = 0; i < object.length; i++) {
|
|
155
|
+
if (!(i in object)) throw new CanonicalJsonError(`${path}[${i}]`, "array is sparse");
|
|
156
|
+
assertCanonical(object[i], `${path}[${i}]`, ancestors);
|
|
157
|
+
}
|
|
158
|
+
else for (const [key, child] of Object.entries(object)) {
|
|
159
|
+
if (LONE_SURROGATE.test(key)) throw new CanonicalJsonError(path, "key holds a lone surrogate");
|
|
160
|
+
if (child === void 0) continue;
|
|
161
|
+
assertCanonical(child, `${path}.${key}`, ancestors);
|
|
162
|
+
}
|
|
163
|
+
ancestors.delete(object);
|
|
164
|
+
}
|
|
165
|
+
function bytesToBase64Url$1(bytes) {
|
|
166
|
+
let binary = "";
|
|
167
|
+
for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]);
|
|
168
|
+
return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
169
|
+
}
|
|
170
|
+
function bytesToHex(bytes) {
|
|
171
|
+
return Array.from(bytes).map((byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
172
|
+
}
|
|
173
|
+
//#endregion
|
|
7
174
|
//#region document-model/signatures.ts
|
|
8
175
|
/**
|
|
9
176
|
* What separates a signature's params when it travels as one string.
|
|
@@ -198,7 +365,7 @@ var GrantNotFoundError = class extends Error {
|
|
|
198
365
|
}
|
|
199
366
|
};
|
|
200
367
|
/**
|
|
201
|
-
* Thrown when a disallowed action (UNDO, REDO
|
|
368
|
+
* Thrown when a disallowed action (UNDO, REDO) targets the auth scope.
|
|
202
369
|
*/
|
|
203
370
|
var AuthActionNotAllowedError = class extends Error {
|
|
204
371
|
actionType;
|
|
@@ -257,8 +424,6 @@ var UnsupportedDocumentModelVersionError = class extends Error {
|
|
|
257
424
|
//#region document-model/schemas.ts
|
|
258
425
|
const isDefinedNonNullAny = (v) => v !== void 0 && v !== null;
|
|
259
426
|
const definedNonNullAnySchema = z.any().refine((v) => isDefinedNonNullAny(v));
|
|
260
|
-
const Load_StateSchema = z.enum(["LOAD_STATE"]);
|
|
261
|
-
const PruneSchema = z.enum(["PRUNE"]);
|
|
262
427
|
const RedoSchema = z.enum(["REDO"]);
|
|
263
428
|
const Set_NameSchema = z.enum(["SET_NAME"]);
|
|
264
429
|
const Set_PreferredEditorSchema = z.enum(["SET_PREFERRED_EDITOR"]);
|
|
@@ -268,50 +433,12 @@ function OperationScopeSchema() {
|
|
|
268
433
|
}
|
|
269
434
|
function DocumentActionSchema() {
|
|
270
435
|
return z.union([
|
|
271
|
-
LoadStateActionSchema(),
|
|
272
|
-
PruneActionSchema(),
|
|
273
436
|
RedoActionSchema(),
|
|
274
437
|
SetNameActionSchema(),
|
|
275
438
|
SetPreferredEditorActionSchema(),
|
|
276
439
|
UndoActionSchema()
|
|
277
440
|
]);
|
|
278
441
|
}
|
|
279
|
-
function LoadStateActionSchema() {
|
|
280
|
-
return z.object({
|
|
281
|
-
id: z.string(),
|
|
282
|
-
timestampUtcMs: z.string(),
|
|
283
|
-
input: z.lazy(() => LoadStateActionInputSchema()),
|
|
284
|
-
type: Load_StateSchema,
|
|
285
|
-
scope: OperationScopeSchema()
|
|
286
|
-
});
|
|
287
|
-
}
|
|
288
|
-
function LoadStateActionInputSchema() {
|
|
289
|
-
return z.object({
|
|
290
|
-
operations: z.number(),
|
|
291
|
-
state: z.lazy(() => LoadStateActionStateInputSchema())
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
function LoadStateActionStateInputSchema() {
|
|
295
|
-
return z.object({
|
|
296
|
-
data: z.unknown().nullish(),
|
|
297
|
-
name: z.string()
|
|
298
|
-
});
|
|
299
|
-
}
|
|
300
|
-
function PruneActionSchema() {
|
|
301
|
-
return z.object({
|
|
302
|
-
id: z.string(),
|
|
303
|
-
timestampUtcMs: z.string(),
|
|
304
|
-
input: z.lazy(() => PruneActionInputSchema()),
|
|
305
|
-
type: PruneSchema,
|
|
306
|
-
scope: OperationScopeSchema()
|
|
307
|
-
});
|
|
308
|
-
}
|
|
309
|
-
function PruneActionInputSchema() {
|
|
310
|
-
return z.object({
|
|
311
|
-
end: z.number().nullish(),
|
|
312
|
-
start: z.number().nullish()
|
|
313
|
-
});
|
|
314
|
-
}
|
|
315
442
|
function RedoActionInputSchema() {
|
|
316
443
|
return z.object({ count: z.number() });
|
|
317
444
|
}
|
|
@@ -729,6 +856,13 @@ const PowerhouseModuleSchema = z.object({
|
|
|
729
856
|
documentTypes: z.array(z.string()).optional()
|
|
730
857
|
});
|
|
731
858
|
const PowerhouseModulesSchema = z.array(PowerhouseModuleSchema).optional();
|
|
859
|
+
const PieceModuleSchema = PowerhouseModuleSchema.extend({
|
|
860
|
+
version: z.string().optional(),
|
|
861
|
+
description: z.string().optional(),
|
|
862
|
+
bundle: z.string().optional(),
|
|
863
|
+
descriptor: z.string().optional()
|
|
864
|
+
});
|
|
865
|
+
const PieceModulesSchema = z.array(PieceModuleSchema).optional();
|
|
732
866
|
const PublisherSchema = z.object({
|
|
733
867
|
name: z.string().optional(),
|
|
734
868
|
url: z.string().optional()
|
|
@@ -739,7 +873,7 @@ const ConfigEntrySchema = z.object({
|
|
|
739
873
|
type: ConfigEntryTypeSchema,
|
|
740
874
|
description: z.string().optional(),
|
|
741
875
|
required: z.boolean().optional(),
|
|
742
|
-
default: z.
|
|
876
|
+
default: z.string().optional()
|
|
743
877
|
});
|
|
744
878
|
const PwaUrlPatternSchema = z.union([z.string(), z.strictObject({
|
|
745
879
|
source: z.string(),
|
|
@@ -835,6 +969,7 @@ const ManifestSchema = z.object({
|
|
|
835
969
|
editors: PowerhouseModulesSchema,
|
|
836
970
|
processors: PowerhouseModulesSchema,
|
|
837
971
|
subgraphs: PowerhouseModulesSchema,
|
|
972
|
+
pieces: PieceModulesSchema,
|
|
838
973
|
config: z.array(ConfigEntrySchema).optional(),
|
|
839
974
|
pwa: PwaConfigSchema.optional()
|
|
840
975
|
});
|
|
@@ -854,35 +989,6 @@ const undo = (count = 1, scope = "global") => createAction("UNDO", { count }, vo
|
|
|
854
989
|
* @category Actions
|
|
855
990
|
*/
|
|
856
991
|
const redo = (count = 1, scope = "global") => createAction("REDO", { count }, void 0, RedoActionInputSchema, scope);
|
|
857
|
-
/**
|
|
858
|
-
* Joins multiple operations into a single {@link loadState | LOAD_STATE} operation.
|
|
859
|
-
*
|
|
860
|
-
* @remarks
|
|
861
|
-
* Useful to keep operations history smaller. Operations to prune are selected by index,
|
|
862
|
-
* similar to the {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/slice | slice} method in Arrays.
|
|
863
|
-
*
|
|
864
|
-
* @param start - Index of the first operation to prune
|
|
865
|
-
* @param end - Index of the last operation to prune
|
|
866
|
-
* @category Actions
|
|
867
|
-
*/
|
|
868
|
-
const prune = (start, end, scope = "global") => createAction("PRUNE", {
|
|
869
|
-
start,
|
|
870
|
-
end
|
|
871
|
-
}, void 0, PruneActionInputSchema, scope);
|
|
872
|
-
/**
|
|
873
|
-
* Replaces the state of the document.
|
|
874
|
-
*
|
|
875
|
-
* @remarks
|
|
876
|
-
* This action shouldn't be used directly. It is dispatched by the {@link prune} action.
|
|
877
|
-
*
|
|
878
|
-
* @param state - State to be set in the document.
|
|
879
|
-
* @param operations - Number of operations that were removed from the previous state.
|
|
880
|
-
* @category Actions
|
|
881
|
-
*/
|
|
882
|
-
const loadState = (state, operations) => createAction("LOAD_STATE", {
|
|
883
|
-
state,
|
|
884
|
-
operations
|
|
885
|
-
}, void 0, LoadStateActionInputSchema);
|
|
886
992
|
const noop = (scope = "global") => createAction("NOOP", {}, void 0, void 0, scope);
|
|
887
993
|
/**
|
|
888
994
|
* Helper function to be used by action creators.
|
|
@@ -980,6 +1086,7 @@ async function buildOperationSignature(context, signMethod) {
|
|
|
980
1086
|
const signature = await signMethod(buildOperationSignatureMessage(params));
|
|
981
1087
|
return [...params, `0x${ab2hex(signature)}`];
|
|
982
1088
|
}
|
|
1089
|
+
/** @deprecated Emits a legacy SHA-1 tuple; sign through `ISigner.signAction`. */
|
|
983
1090
|
async function buildSignedAction(action, reducer, document, signer, signHandler) {
|
|
984
1091
|
const scopeOperations = reducer(document, action, void 0, { reuseOperationResultingState: true }).operations[action.scope];
|
|
985
1092
|
if (!scopeOperations) throw new Error(`No operations found for scope: ${action.scope}`);
|
|
@@ -992,8 +1099,10 @@ async function buildSignedAction(action, reducer, document, signer, signHandler)
|
|
|
992
1099
|
action,
|
|
993
1100
|
previousStateHash
|
|
994
1101
|
}, signHandler);
|
|
995
|
-
|
|
1102
|
+
const actionContext = { signer: actionSigner(signer.user, signer.app, [...signer.signatures, signature]) };
|
|
1103
|
+
return operationWithContext(operation, actionContext);
|
|
996
1104
|
}
|
|
1105
|
+
/** @deprecated Use `verifyActionSignature` from `@powerhousedao/reactor`. */
|
|
997
1106
|
async function verifyOperationSignature(signature, signer, verifyHandler) {
|
|
998
1107
|
const publicKey = signer.app.key;
|
|
999
1108
|
const params = signature.slice(0, 4);
|
|
@@ -1068,8 +1177,6 @@ const baseActions = {
|
|
|
1068
1177
|
setPreferredEditor,
|
|
1069
1178
|
undo,
|
|
1070
1179
|
redo,
|
|
1071
|
-
prune,
|
|
1072
|
-
loadState,
|
|
1073
1180
|
noop
|
|
1074
1181
|
};
|
|
1075
1182
|
const documentModelActions = {
|
|
@@ -1187,7 +1294,7 @@ var AuthAdministrationMissingError = class extends Error {
|
|
|
1187
1294
|
this.name = "AuthAdministrationMissingError";
|
|
1188
1295
|
}
|
|
1189
1296
|
};
|
|
1190
|
-
const GRANT_KEYS = new Set([
|
|
1297
|
+
const GRANT_KEYS = /* @__PURE__ */ new Set([
|
|
1191
1298
|
"id",
|
|
1192
1299
|
"description",
|
|
1193
1300
|
"effect",
|
|
@@ -1195,13 +1302,13 @@ const GRANT_KEYS = new Set([
|
|
|
1195
1302
|
"capability",
|
|
1196
1303
|
"where"
|
|
1197
1304
|
]);
|
|
1198
|
-
const PRINCIPAL_KINDS = new Set([
|
|
1305
|
+
const PRINCIPAL_KINDS = /* @__PURE__ */ new Set([
|
|
1199
1306
|
"anyone",
|
|
1200
1307
|
"address",
|
|
1201
1308
|
"group",
|
|
1202
1309
|
"match"
|
|
1203
1310
|
]);
|
|
1204
|
-
const COMPARISON_CONDITION_KINDS = new Set([
|
|
1311
|
+
const COMPARISON_CONDITION_KINDS = /* @__PURE__ */ new Set([
|
|
1205
1312
|
"eq",
|
|
1206
1313
|
"ne",
|
|
1207
1314
|
"lt",
|
|
@@ -2530,12 +2637,12 @@ function assertAuthPreservedOnDuplicate(documentId, source, duplicated) {
|
|
|
2530
2637
|
* The auth scope a state snapshot may install, given the policy already there.
|
|
2531
2638
|
*
|
|
2532
2639
|
* `applyAuthAction` is the validated door onto `state.auth`, but a whole-state
|
|
2533
|
-
* snapshot (UPGRADE_DOCUMENT's `initialState
|
|
2534
|
-
*
|
|
2535
|
-
*
|
|
2536
|
-
*
|
|
2537
|
-
*
|
|
2538
|
-
*
|
|
2640
|
+
* snapshot (UPGRADE_DOCUMENT's `initialState`) replaces the scope wholesale and
|
|
2641
|
+
* is authorized as a `document`-scope write. Without this, a subject holding
|
|
2642
|
+
* `execute` on `document` and no auth grant at all can install a policy of its
|
|
2643
|
+
* choosing, name itself `creator` (which exempts the policy from the retention
|
|
2644
|
+
* rule for good), or wipe an existing policy by carrying the default
|
|
2645
|
+
* uninitialized one.
|
|
2539
2646
|
*
|
|
2540
2647
|
* Three cases:
|
|
2541
2648
|
*
|
|
@@ -2562,13 +2669,9 @@ function resolveSnapshotAuth(documentId, documentType, current, incoming) {
|
|
|
2562
2669
|
assertValidInitialGrants(incoming.grants, documentType, incoming.creator);
|
|
2563
2670
|
return incoming;
|
|
2564
2671
|
}
|
|
2565
|
-
/** UNDO
|
|
2672
|
+
/** UNDO and REDO are rejected on the auth scope. */
|
|
2566
2673
|
function assertAuthScopeActionAllowed(action) {
|
|
2567
|
-
if (action.scope === "auth" && [
|
|
2568
|
-
"UNDO",
|
|
2569
|
-
"REDO",
|
|
2570
|
-
"PRUNE"
|
|
2571
|
-
].includes(action.type)) throw new AuthActionNotAllowedError(action.type);
|
|
2674
|
+
if (action.scope === "auth" && ["UNDO", "REDO"].includes(action.type)) throw new AuthActionNotAllowedError(action.type);
|
|
2572
2675
|
}
|
|
2573
2676
|
/**
|
|
2574
2677
|
* Evaluates the auth policy for a single request and reports why it refused.
|
|
@@ -2674,6 +2777,68 @@ function assertIsDocumentModelDocument(document) {
|
|
|
2674
2777
|
DocumentModelSchema.parse(document);
|
|
2675
2778
|
}
|
|
2676
2779
|
//#endregion
|
|
2780
|
+
//#region document-model/signature-policy.ts
|
|
2781
|
+
/** The `protocolVersions` key that fixes a document's signature requirement. */
|
|
2782
|
+
const SIGNATURE_PROTOCOL = "signature";
|
|
2783
|
+
/** `protocolVersions.signature` of a document that requires v2 tuples. */
|
|
2784
|
+
const SIGNATURE_PROTOCOL_V2 = 2;
|
|
2785
|
+
/** What a new document is created as unless the caller or host says otherwise. */
|
|
2786
|
+
const DEFAULT_SIGNATURE_POLICY = "v2-required";
|
|
2787
|
+
function isSignaturePolicy(value) {
|
|
2788
|
+
return value === "legacy" || value === "v2-required";
|
|
2789
|
+
}
|
|
2790
|
+
const DERIVED_ID = /^[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$/;
|
|
2791
|
+
/** Read from a header, a CREATE_DOCUMENT input or a bare map. */
|
|
2792
|
+
function signaturePolicyOf(source) {
|
|
2793
|
+
const version = (source && "protocolVersions" in source ? source.protocolVersions : source)?.[SIGNATURE_PROTOCOL];
|
|
2794
|
+
return typeof version === "number" && version >= 2 ? "v2-required" : "legacy";
|
|
2795
|
+
}
|
|
2796
|
+
/** `protocolVersions` for a new v2-required document. */
|
|
2797
|
+
function v2RequiredProtocolVersions(base = {}) {
|
|
2798
|
+
return {
|
|
2799
|
+
"base-reducer": 2,
|
|
2800
|
+
...base,
|
|
2801
|
+
[SIGNATURE_PROTOCOL]: 2
|
|
2802
|
+
};
|
|
2803
|
+
}
|
|
2804
|
+
/**
|
|
2805
|
+
* The policy a create call asks for: `signaturePolicy`, else the `signature`
|
|
2806
|
+
* key of its `protocolVersions`, else `fallback`, the host's default.
|
|
2807
|
+
*/
|
|
2808
|
+
function requestedSignaturePolicy(request, fallback) {
|
|
2809
|
+
if (request?.signaturePolicy) return request.signaturePolicy;
|
|
2810
|
+
if (request?.protocolVersions?.["signature"] !== void 0) return signaturePolicyOf(request.protocolVersions);
|
|
2811
|
+
return fallback;
|
|
2812
|
+
}
|
|
2813
|
+
/** `protocolVersions` for a new document under `policy`, over `base`. */
|
|
2814
|
+
function protocolVersionsFor(policy, base = {}) {
|
|
2815
|
+
if (policy === "v2-required") return v2RequiredProtocolVersions(base);
|
|
2816
|
+
const { [SIGNATURE_PROTOCOL]: _signature, ...rest } = base;
|
|
2817
|
+
return {
|
|
2818
|
+
"base-reducer": 2,
|
|
2819
|
+
...rest
|
|
2820
|
+
};
|
|
2821
|
+
}
|
|
2822
|
+
/** `base64url(sha256(canonicalJson(params)))`, unpadded. */
|
|
2823
|
+
function deriveDocumentId(params) {
|
|
2824
|
+
const preimage = canonicalJson({
|
|
2825
|
+
documentType: params.documentType,
|
|
2826
|
+
createdAtUtcIso: params.createdAtUtcIso,
|
|
2827
|
+
nonce: params.nonce,
|
|
2828
|
+
protocolVersions: params.protocolVersions
|
|
2829
|
+
}, "document id");
|
|
2830
|
+
return bytesToBase64Url(sha256(new TextEncoder().encode(preimage)));
|
|
2831
|
+
}
|
|
2832
|
+
/** Whether `id` has the shape `deriveDocumentId` produces. */
|
|
2833
|
+
function isDerivedDocumentId(id) {
|
|
2834
|
+
return DERIVED_ID.test(id);
|
|
2835
|
+
}
|
|
2836
|
+
function bytesToBase64Url(bytes) {
|
|
2837
|
+
let binary = "";
|
|
2838
|
+
for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]);
|
|
2839
|
+
return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
2840
|
+
}
|
|
2841
|
+
//#endregion
|
|
2677
2842
|
//#region document-model/header.ts
|
|
2678
2843
|
/**
|
|
2679
2844
|
* Generates a deterministic payload from signing parameters
|
|
@@ -2693,11 +2858,11 @@ async function createVerificationSigner(pubKey) {
|
|
|
2693
2858
|
}, true, ["verify"]);
|
|
2694
2859
|
return {
|
|
2695
2860
|
publicKey: cryptoKey,
|
|
2696
|
-
|
|
2697
|
-
|
|
2861
|
+
sign(_data) {
|
|
2862
|
+
return Promise.reject(/* @__PURE__ */ new Error("verification-only signer cannot sign data"));
|
|
2698
2863
|
},
|
|
2699
|
-
|
|
2700
|
-
|
|
2864
|
+
signAction(_action, _target, _abortSignal) {
|
|
2865
|
+
return Promise.reject(/* @__PURE__ */ new Error("verification-only signer cannot sign actions"));
|
|
2701
2866
|
},
|
|
2702
2867
|
async verify(data, signature) {
|
|
2703
2868
|
let isValid;
|
|
@@ -2767,26 +2932,68 @@ const validateHeader = async (header) => {
|
|
|
2767
2932
|
* Creates a header that has yet to be signed. This header is not valid, but
|
|
2768
2933
|
* can be input into {@link createSignedHeader} to create a signed header.
|
|
2769
2934
|
*
|
|
2935
|
+
* With `protocolVersions` requiring v2 signatures the header takes a random
|
|
2936
|
+
* nonce and the id {@link deriveDocumentId} gives, so `id` must be omitted.
|
|
2937
|
+
*
|
|
2770
2938
|
* @returns An unsigned header for a document.
|
|
2771
2939
|
*/
|
|
2772
|
-
const createPresignedHeader = (id
|
|
2773
|
-
|
|
2774
|
-
|
|
2940
|
+
const createPresignedHeader = (id, documentType = "", protocolVersions) => {
|
|
2941
|
+
const createdAtUtcIso = (/* @__PURE__ */ new Date()).toISOString();
|
|
2942
|
+
const header = {
|
|
2943
|
+
id: id ?? generateId(),
|
|
2775
2944
|
sig: {
|
|
2776
2945
|
publicKey: {},
|
|
2777
2946
|
nonce: ""
|
|
2778
2947
|
},
|
|
2779
2948
|
documentType,
|
|
2780
|
-
createdAtUtcIso
|
|
2949
|
+
createdAtUtcIso,
|
|
2781
2950
|
slug: "",
|
|
2782
2951
|
name: "",
|
|
2783
2952
|
branch: "main",
|
|
2784
2953
|
revision: { document: 0 },
|
|
2785
|
-
lastModifiedAtUtcIso:
|
|
2954
|
+
lastModifiedAtUtcIso: createdAtUtcIso,
|
|
2786
2955
|
meta: {}
|
|
2787
2956
|
};
|
|
2957
|
+
if (protocolVersions === void 0) return header;
|
|
2958
|
+
header.protocolVersions = { ...protocolVersions };
|
|
2959
|
+
if (signaturePolicyOf(header) === "legacy") return header;
|
|
2960
|
+
if (id !== void 0) throw new Error(`A v2-required document's id is derived from its header; cannot use ${id}`);
|
|
2961
|
+
header.sig.nonce = generateId();
|
|
2962
|
+
header.id = deriveDocumentId({
|
|
2963
|
+
documentType,
|
|
2964
|
+
createdAtUtcIso,
|
|
2965
|
+
nonce: header.sig.nonce,
|
|
2966
|
+
protocolVersions: header.protocolVersions
|
|
2967
|
+
});
|
|
2968
|
+
return header;
|
|
2788
2969
|
};
|
|
2789
2970
|
/**
|
|
2971
|
+
* A header for a copy of a document headed `source`. A copy is v2-required
|
|
2972
|
+
* when its source is or when `policy` asks for it, and then takes a derived id;
|
|
2973
|
+
* otherwise it takes `id`. It keeps the source's other protocol versions.
|
|
2974
|
+
*/
|
|
2975
|
+
function createCopyHeader(source, id, policy = DEFAULT_SIGNATURE_POLICY) {
|
|
2976
|
+
const base = source.protocolVersions ?? {};
|
|
2977
|
+
if (signaturePolicyOf(source) === "v2-required" || policy === "v2-required") return createPresignedHeader(void 0, source.documentType, protocolVersionsFor("v2-required", base));
|
|
2978
|
+
const header = createPresignedHeader(id, source.documentType);
|
|
2979
|
+
if (source.protocolVersions) header.protocolVersions = { ...source.protocolVersions };
|
|
2980
|
+
return header;
|
|
2981
|
+
}
|
|
2982
|
+
/** Whether a v2-required `header` carries the id its params derive. */
|
|
2983
|
+
function hasDerivedDocumentId(header) {
|
|
2984
|
+
if (signaturePolicyOf(header) === "legacy" || !header.protocolVersions) return false;
|
|
2985
|
+
try {
|
|
2986
|
+
return deriveDocumentId({
|
|
2987
|
+
documentType: header.documentType,
|
|
2988
|
+
createdAtUtcIso: header.createdAtUtcIso,
|
|
2989
|
+
nonce: header.sig.nonce,
|
|
2990
|
+
protocolVersions: header.protocolVersions
|
|
2991
|
+
}) === header.id;
|
|
2992
|
+
} catch {
|
|
2993
|
+
return false;
|
|
2994
|
+
}
|
|
2995
|
+
}
|
|
2996
|
+
/**
|
|
2790
2997
|
* Creates a new, signed header for a document. This will replace the id of the
|
|
2791
2998
|
* document.
|
|
2792
2999
|
*
|
|
@@ -2829,7 +3036,8 @@ const createSignedHeader = async (unsignedHeader, documentType, signer) => {
|
|
|
2829
3036
|
* some are not. See the PHDocumentHeader type for more information.
|
|
2830
3037
|
*/
|
|
2831
3038
|
const createSignedHeaderForSigner = async (documentType, signer) => {
|
|
2832
|
-
|
|
3039
|
+
const unsignedHeader = createPresignedHeader();
|
|
3040
|
+
return await createSignedHeader(unsignedHeader, documentType, signer);
|
|
2833
3041
|
};
|
|
2834
3042
|
//#endregion
|
|
2835
3043
|
//#region document-model/documents.ts
|
|
@@ -2847,9 +3055,7 @@ function isDocumentAction(action) {
|
|
|
2847
3055
|
"SET_NAME",
|
|
2848
3056
|
"SET_PREFERRED_EDITOR",
|
|
2849
3057
|
"UNDO",
|
|
2850
|
-
"REDO"
|
|
2851
|
-
"PRUNE",
|
|
2852
|
-
"LOAD_STATE"
|
|
3058
|
+
"REDO"
|
|
2853
3059
|
].includes(action.type);
|
|
2854
3060
|
}
|
|
2855
3061
|
/**
|
|
@@ -2905,12 +3111,16 @@ function createDocumentScopeOperations(header, state) {
|
|
|
2905
3111
|
}
|
|
2906
3112
|
/**
|
|
2907
3113
|
* Creates a new document. When `documentType` is given the header is stamped
|
|
2908
|
-
* with it and the document-scope operations are seeded.
|
|
3114
|
+
* with it and the document-scope operations are seeded. Without
|
|
3115
|
+
* `protocolVersions` the document is v2-required and takes a derived id; with
|
|
3116
|
+
* them it is v2-required only if they say so (see {@link protocolVersionsFor}).
|
|
2909
3117
|
*/
|
|
2910
|
-
function baseCreateDocument(createState, initialState, documentType = "") {
|
|
3118
|
+
function baseCreateDocument(createState, initialState, documentType = "", protocolVersions) {
|
|
2911
3119
|
const state = createState(initialState);
|
|
2912
|
-
const header = createPresignedHeader(
|
|
2913
|
-
|
|
3120
|
+
const header = createPresignedHeader(void 0, documentType, protocolVersions === void 0 ? protocolVersionsFor("v2-required") : {
|
|
3121
|
+
"base-reducer": 2,
|
|
3122
|
+
...protocolVersions
|
|
3123
|
+
});
|
|
2914
3124
|
return {
|
|
2915
3125
|
header,
|
|
2916
3126
|
state,
|
|
@@ -2926,8 +3136,39 @@ function baseCreateDocument(createState, initialState, documentType = "") {
|
|
|
2926
3136
|
clipboard: []
|
|
2927
3137
|
};
|
|
2928
3138
|
}
|
|
3139
|
+
/**
|
|
3140
|
+
* `document`, not yet created, under a fresh header for `policy`. A legacy
|
|
3141
|
+
* header takes `id` when given; a v2-required one ignores `id` and derives its
|
|
3142
|
+
* own, so a caller that needs a fixed id must ask for legacy.
|
|
3143
|
+
* `protocolVersions` are merged over the document's. Name, slug, branch and
|
|
3144
|
+
* meta carry over. A document already under `policy` is returned as is unless
|
|
3145
|
+
* a legacy `id` or `protocolVersions` are given.
|
|
3146
|
+
*/
|
|
3147
|
+
function withSignaturePolicy(document, policy, options = {}) {
|
|
3148
|
+
const id = policy === "legacy" ? options.id : void 0;
|
|
3149
|
+
if (id === void 0 && options.protocolVersions === void 0 && signaturePolicyOf(document.header) === policy) return document;
|
|
3150
|
+
const source = document.header;
|
|
3151
|
+
const header = createPresignedHeader(id, source.documentType, protocolVersionsFor(policy, {
|
|
3152
|
+
...source.protocolVersions,
|
|
3153
|
+
...options.protocolVersions
|
|
3154
|
+
}));
|
|
3155
|
+
header.name = source.name;
|
|
3156
|
+
header.slug = source.slug;
|
|
3157
|
+
header.branch = source.branch;
|
|
3158
|
+
header.meta = source.meta;
|
|
3159
|
+
const operations = document.operations.document ? {
|
|
3160
|
+
...document.operations,
|
|
3161
|
+
document: createDocumentScopeOperations(header, document.state)
|
|
3162
|
+
} : document.operations;
|
|
3163
|
+
return {
|
|
3164
|
+
...document,
|
|
3165
|
+
header,
|
|
3166
|
+
operations
|
|
3167
|
+
};
|
|
3168
|
+
}
|
|
2929
3169
|
function hashDocumentStateForScope(document, scope = "global") {
|
|
2930
|
-
|
|
3170
|
+
const stateString = stringify(document.state[scope] || "");
|
|
3171
|
+
return hashBrowser(stateString);
|
|
2931
3172
|
}
|
|
2932
3173
|
function readOnly(value) {
|
|
2933
3174
|
return Object.freeze(value);
|
|
@@ -3058,7 +3299,7 @@ function replayDocument(initialState, operations, reducer, header, dispatch, ski
|
|
|
3058
3299
|
const backfilledInitialState = backfillAuthState(initialState);
|
|
3059
3300
|
let documentState = backfilledInitialState;
|
|
3060
3301
|
const operationsToReplay = [];
|
|
3061
|
-
const allScopes = new Set([
|
|
3302
|
+
const allScopes = /* @__PURE__ */ new Set([
|
|
3062
3303
|
...Object.keys(operations),
|
|
3063
3304
|
"global",
|
|
3064
3305
|
"local"
|
|
@@ -3116,7 +3357,7 @@ function replayDocument(initialState, operations, reducer, header, dispatch, ski
|
|
|
3116
3357
|
if (operation.hash !== hashDocumentStateForScope(result, scope)) throw new HashMismatchError(scope, result, operation);
|
|
3117
3358
|
else break;
|
|
3118
3359
|
}
|
|
3119
|
-
const allResultScopes = new Set([
|
|
3360
|
+
const allResultScopes = /* @__PURE__ */ new Set([
|
|
3120
3361
|
...Object.keys(result.operations),
|
|
3121
3362
|
...Object.keys(operations),
|
|
3122
3363
|
"global",
|
|
@@ -3179,8 +3420,8 @@ function checkCleanedOperationsIntegrity(sortedOperations) {
|
|
|
3179
3420
|
index: nextOperation.index,
|
|
3180
3421
|
skip: nextOperation.skip
|
|
3181
3422
|
},
|
|
3182
|
-
issue:
|
|
3183
|
-
category: nextIndex > currentIndex + 1 ?
|
|
3423
|
+
issue: "UNEXPECTED_INDEX",
|
|
3424
|
+
category: nextIndex > currentIndex + 1 ? "MISSING_INDEX" : "DUPLICATED_INDEX",
|
|
3184
3425
|
message: `Expected index ${currentIndex + 1} with skip 0 or equivalent, got index ${nextOperation.index} with skip ${nextOperation.skip}`
|
|
3185
3426
|
});
|
|
3186
3427
|
currentIndex = nextOperation.index;
|
|
@@ -3290,12 +3531,14 @@ function attachBranch(trunk, newBranch) {
|
|
|
3290
3531
|
nextTrunkOperation = trunkCopy.shift();
|
|
3291
3532
|
}
|
|
3292
3533
|
if (!nextTrunkOperation) enteredBranch = true;
|
|
3293
|
-
else if (!enteredBranch)
|
|
3294
|
-
|
|
3295
|
-
|
|
3296
|
-
|
|
3297
|
-
|
|
3298
|
-
|
|
3534
|
+
else if (!enteredBranch) {
|
|
3535
|
+
if (operationsAreEqual(nextTrunkOperation, newOperationCandidate)) {
|
|
3536
|
+
newOperations.shift();
|
|
3537
|
+
result.push(nextTrunkOperation);
|
|
3538
|
+
} else {
|
|
3539
|
+
trunkCopy.unshift(nextTrunkOperation);
|
|
3540
|
+
enteredBranch = true;
|
|
3541
|
+
}
|
|
3299
3542
|
}
|
|
3300
3543
|
if (enteredBranch) {
|
|
3301
3544
|
let nextAppend = newOperations.shift();
|
|
@@ -3326,13 +3569,14 @@ function split(sortedTargetOperations, sortedMergeOperations) {
|
|
|
3326
3569
|
for (let i = 0; i < maxLength; i++) {
|
|
3327
3570
|
const targetOperation = sortedTargetOperations[i];
|
|
3328
3571
|
const mergeOperation = sortedMergeOperations[i];
|
|
3329
|
-
if (targetOperation && mergeOperation)
|
|
3330
|
-
|
|
3331
|
-
|
|
3332
|
-
|
|
3333
|
-
|
|
3334
|
-
|
|
3335
|
-
|
|
3572
|
+
if (targetOperation && mergeOperation) {
|
|
3573
|
+
if (!splitHappened && operationsAreEqual(targetOperation, mergeOperation)) commonOperations.push(targetOperation);
|
|
3574
|
+
else {
|
|
3575
|
+
splitHappened = true;
|
|
3576
|
+
targetDiffOperations.push(targetOperation);
|
|
3577
|
+
mergeDiffOperations.push(mergeOperation);
|
|
3578
|
+
}
|
|
3579
|
+
} else if (targetOperation) targetDiffOperations.push(targetOperation);
|
|
3336
3580
|
else if (mergeOperation) mergeDiffOperations.push(mergeOperation);
|
|
3337
3581
|
}
|
|
3338
3582
|
return [
|
|
@@ -3384,14 +3628,14 @@ function prepareOperations(operationsHistory, newOperations) {
|
|
|
3384
3628
|
const sortedOperationsHistory = sortOperations(operationsHistory);
|
|
3385
3629
|
const sortedOperations = sortOperations(newOperations);
|
|
3386
3630
|
const integrityErrors = checkCleanedOperationsIntegrity([...sortedOperationsHistory, ...sortedOperations]);
|
|
3387
|
-
const firstMissingIndexOperation = [...integrityErrors.filter((integrityIssue) => integrityIssue.category ===
|
|
3631
|
+
const firstMissingIndexOperation = [...integrityErrors.filter((integrityIssue) => integrityIssue.category === "MISSING_INDEX")].sort((a, b) => b.operation.index - a.operation.index).pop()?.operation;
|
|
3388
3632
|
for (const newOperation of sortedOperations) {
|
|
3389
3633
|
if (firstMissingIndexOperation && newOperation.index >= firstMissingIndexOperation.index) {
|
|
3390
3634
|
result.invalidOperations.push(newOperation);
|
|
3391
3635
|
continue;
|
|
3392
3636
|
}
|
|
3393
3637
|
if (integrityErrors.some((integrityError) => {
|
|
3394
|
-
return integrityError.operation.index === newOperation.index && integrityError.operation.skip === newOperation.skip && integrityError.category ===
|
|
3638
|
+
return integrityError.operation.index === newOperation.index && integrityError.operation.skip === newOperation.skip && integrityError.category === "DUPLICATED_INDEX";
|
|
3395
3639
|
})) {
|
|
3396
3640
|
result.duplicatedOperations.push(newOperation);
|
|
3397
3641
|
continue;
|
|
@@ -3620,18 +3864,6 @@ function redoOperation(document, action, skip) {
|
|
|
3620
3864
|
});
|
|
3621
3865
|
});
|
|
3622
3866
|
}
|
|
3623
|
-
function loadStateOperation(document, action) {
|
|
3624
|
-
const loaded = backfillAuthState(action.state.data);
|
|
3625
|
-
loaded.auth = resolveSnapshotAuth(document.header.id, document.header.documentType, backfillAuthState({ ...document.state }).auth, loaded.auth);
|
|
3626
|
-
return {
|
|
3627
|
-
...document,
|
|
3628
|
-
header: {
|
|
3629
|
-
...document.header,
|
|
3630
|
-
name: action.state.name
|
|
3631
|
-
},
|
|
3632
|
-
state: loaded
|
|
3633
|
-
};
|
|
3634
|
-
}
|
|
3635
3867
|
/**
|
|
3636
3868
|
* Reads an operation's outcome. A denial takes precedence over a reducer
|
|
3637
3869
|
* error, since a denied operation never reaches its reducer.
|
|
@@ -3664,15 +3896,12 @@ function replayOperations(initialState, clearedOperations, stateReducer, header,
|
|
|
3664
3896
|
* @returns The updated document state.
|
|
3665
3897
|
*/
|
|
3666
3898
|
function updateOperationsForAction(document, action, reuseLastOperationIndex, skip, context) {
|
|
3667
|
-
if ([
|
|
3668
|
-
"UNDO",
|
|
3669
|
-
"REDO",
|
|
3670
|
-
"PRUNE"
|
|
3671
|
-
].includes(action.type)) return document;
|
|
3899
|
+
if (["UNDO", "REDO"].includes(action.type)) return document;
|
|
3672
3900
|
const scope = action.scope;
|
|
3673
3901
|
const existing = document.operations[scope];
|
|
3674
3902
|
const lastOperationIndex = existing?.at(-1)?.index ?? -1;
|
|
3675
|
-
const
|
|
3903
|
+
const index = reuseLastOperationIndex ? lastOperationIndex : lastOperationIndex + 1;
|
|
3904
|
+
const newOperation = operationFromAction(action, index, skip, context);
|
|
3676
3905
|
const operations = [...existing ?? [], newOperation];
|
|
3677
3906
|
return {
|
|
3678
3907
|
...document,
|
|
@@ -3716,20 +3945,17 @@ function updateDocument(document, action, reuseLastOperationIndex, skip, context
|
|
|
3716
3945
|
return newDocument;
|
|
3717
3946
|
}
|
|
3718
3947
|
/**
|
|
3719
|
-
* The base document reducer function
|
|
3948
|
+
* The base document reducer function.
|
|
3720
3949
|
*
|
|
3721
3950
|
* @param state The current state of the document.
|
|
3722
3951
|
* @param action The action being applied to the document.
|
|
3723
|
-
* @param wrappedReducer The custom reducer function being wrapped by the base reducer.
|
|
3724
3952
|
* @returns The updated document state.
|
|
3725
3953
|
*/
|
|
3726
|
-
function _baseReducer(document, action
|
|
3954
|
+
function _baseReducer(document, action) {
|
|
3727
3955
|
const parsedAction = DocumentActionSchema().parse(action);
|
|
3728
3956
|
switch (parsedAction.type) {
|
|
3729
3957
|
case "SET_NAME": return setNameOperation(document, parsedAction.input);
|
|
3730
3958
|
case "SET_PREFERRED_EDITOR": return setPreferredEditorOperation(document, parsedAction.input);
|
|
3731
|
-
case "PRUNE": return pruneOperation(document, parsedAction.input, wrappedReducer);
|
|
3732
|
-
case "LOAD_STATE": return loadStateOperation(document, parsedAction.input);
|
|
3733
3959
|
default: return document;
|
|
3734
3960
|
}
|
|
3735
3961
|
}
|
|
@@ -3807,7 +4033,7 @@ function processUndoOperation(document, scope, customReducer, reuseOperationResu
|
|
|
3807
4033
|
}
|
|
3808
4034
|
/**
|
|
3809
4035
|
* Base document reducer that wraps a custom document reducer and handles
|
|
3810
|
-
* document-level actions such as undo, redo,
|
|
4036
|
+
* document-level actions such as undo, redo, and set name.
|
|
3811
4037
|
*
|
|
3812
4038
|
* @template TGlobalState - The type of the state of the custom reducer.
|
|
3813
4039
|
* @template TAction - The type of the actions of the custom reducer.
|
|
@@ -3835,7 +4061,7 @@ function baseReducer(document, action, customReducer, dispatch, options = {}) {
|
|
|
3835
4061
|
...newDocument,
|
|
3836
4062
|
clipboard: []
|
|
3837
4063
|
};
|
|
3838
|
-
if (isDocumentAction(_action)) newDocument = _baseReducer(newDocument, _action
|
|
4064
|
+
if (isDocumentAction(_action)) newDocument = _baseReducer(newDocument, _action);
|
|
3839
4065
|
const operationContext = {
|
|
3840
4066
|
documentId: document.header.id,
|
|
3841
4067
|
scope: _action.scope,
|
|
@@ -3898,11 +4124,7 @@ function baseReducer(document, action, customReducer, dispatch, options = {}) {
|
|
|
3898
4124
|
}
|
|
3899
4125
|
}
|
|
3900
4126
|
});
|
|
3901
|
-
if ([
|
|
3902
|
-
"UNDO",
|
|
3903
|
-
"REDO",
|
|
3904
|
-
"PRUNE"
|
|
3905
|
-
].includes(_action.type)) return newDocument;
|
|
4127
|
+
if (["UNDO", "REDO"].includes(_action.type)) return newDocument;
|
|
3906
4128
|
const scope = _action.scope || "global";
|
|
3907
4129
|
const replayHash = options.replayOptions?.operation.hash;
|
|
3908
4130
|
const hash = replayHash ? replayHash : hashDocumentStateForScope(newDocument, scope);
|
|
@@ -3922,7 +4144,6 @@ function baseReducer(document, action, customReducer, dispatch, options = {}) {
|
|
|
3922
4144
|
* - `SET_NAME`
|
|
3923
4145
|
* - `UNDO`
|
|
3924
4146
|
* - `REDO`
|
|
3925
|
-
* - `PRUNE`
|
|
3926
4147
|
*
|
|
3927
4148
|
* It also updates the document-related attributes on every operation.
|
|
3928
4149
|
*
|
|
@@ -3937,46 +4158,6 @@ function createReducer(stateReducer, documentReducer = baseReducer) {
|
|
|
3937
4158
|
};
|
|
3938
4159
|
return reducer;
|
|
3939
4160
|
}
|
|
3940
|
-
function pruneOperation(document, input, wrappedReducer) {
|
|
3941
|
-
const operations = document.operations.global;
|
|
3942
|
-
if (!operations) throw new Error("No global operations found");
|
|
3943
|
-
let { start, end } = input;
|
|
3944
|
-
start = start || 0;
|
|
3945
|
-
end = end || operations.length;
|
|
3946
|
-
const actionsToPrune = operations.slice(start, end);
|
|
3947
|
-
const actionsToKeepStart = operations.slice(0, start);
|
|
3948
|
-
const actionsToKeepEnd = operations.slice(end);
|
|
3949
|
-
const newDocument = replayOperations(document.initialState, {
|
|
3950
|
-
...document.operations,
|
|
3951
|
-
global: actionsToKeepStart.concat(actionsToPrune)
|
|
3952
|
-
}, wrappedReducer, document.header);
|
|
3953
|
-
const newState = newDocument.state;
|
|
3954
|
-
const name = newDocument.header.name;
|
|
3955
|
-
const loadStateIndex = actionsToKeepStart.length;
|
|
3956
|
-
const loadStateTimestamp = actionsToKeepStart.length ? actionsToKeepStart[actionsToKeepStart.length - 1].timestampUtcMs : actionsToKeepEnd.length ? actionsToKeepEnd[0].timestampUtcMs : (/* @__PURE__ */ new Date()).toISOString();
|
|
3957
|
-
const action = loadState({
|
|
3958
|
-
name,
|
|
3959
|
-
...newState
|
|
3960
|
-
}, actionsToPrune.length);
|
|
3961
|
-
return replayOperations(document.initialState, {
|
|
3962
|
-
...document.operations,
|
|
3963
|
-
global: [
|
|
3964
|
-
...actionsToKeepStart,
|
|
3965
|
-
{
|
|
3966
|
-
skip: 0,
|
|
3967
|
-
...action,
|
|
3968
|
-
action,
|
|
3969
|
-
timestampUtcMs: loadStateTimestamp,
|
|
3970
|
-
index: loadStateIndex,
|
|
3971
|
-
hash: hashDocumentStateForScope({ state: newState }, "global")
|
|
3972
|
-
},
|
|
3973
|
-
...actionsToKeepEnd.map((action, index) => ({
|
|
3974
|
-
...action,
|
|
3975
|
-
index: loadStateIndex + index + 1
|
|
3976
|
-
}))
|
|
3977
|
-
]
|
|
3978
|
-
}, wrappedReducer, document.header);
|
|
3979
|
-
}
|
|
3980
4161
|
//#endregion
|
|
3981
4162
|
//#region document-model/validation.ts
|
|
3982
4163
|
/**
|
|
@@ -3986,8 +4167,6 @@ function pruneOperation(document, input, wrappedReducer) {
|
|
|
3986
4167
|
const RESERVED_OPERATION_NAMES = [
|
|
3987
4168
|
"UNDO",
|
|
3988
4169
|
"REDO",
|
|
3989
|
-
"PRUNE",
|
|
3990
|
-
"LOAD_STATE",
|
|
3991
4170
|
"SET_NAME",
|
|
3992
4171
|
"SET_PREFERRED_EDITOR",
|
|
3993
4172
|
"NOOP"
|
|
@@ -4226,6 +4405,15 @@ function orderBy(items, order) {
|
|
|
4226
4405
|
return (rank.get(a.item.id) ?? Number.MAX_SAFE_INTEGER) - (rank.get(b.item.id) ?? Number.MAX_SAFE_INTEGER) || a.index - b.index;
|
|
4227
4406
|
}).map(({ item }) => item);
|
|
4228
4407
|
}
|
|
4408
|
+
/**
|
|
4409
|
+
* The untouched base of a mutative draft, or the value itself when it is not a
|
|
4410
|
+
* draft. Build replacement lists from it and freeze them before assigning, as
|
|
4411
|
+
* the drive node reducer does, so finalize skips the walk over the assigned
|
|
4412
|
+
* list. Read before writing: the base does not see this action's mutations.
|
|
4413
|
+
*/
|
|
4414
|
+
function readBase(value) {
|
|
4415
|
+
return isDraft(value) ? original(value) : value;
|
|
4416
|
+
}
|
|
4229
4417
|
const documentModelHeaderReducer = {
|
|
4230
4418
|
setModelNameOperation(state, action) {
|
|
4231
4419
|
state.name = action.input.name;
|
|
@@ -4275,7 +4463,8 @@ const documentModelModuleReducer = {
|
|
|
4275
4463
|
deleteModuleOperation(state, action) {
|
|
4276
4464
|
findModuleOrThrow(state, action.input.id);
|
|
4277
4465
|
const latestSpec = state.specifications[state.specifications.length - 1];
|
|
4278
|
-
|
|
4466
|
+
const modules = readBase(latestSpec).modules.filter((m) => m.id != action.input.id);
|
|
4467
|
+
latestSpec.modules = Object.freeze(modules);
|
|
4279
4468
|
},
|
|
4280
4469
|
reorderModulesOperation(state, action) {
|
|
4281
4470
|
const latestSpec = state.specifications[state.specifications.length - 1];
|
|
@@ -4393,14 +4582,20 @@ const documentModelOperationReducer = {
|
|
|
4393
4582
|
const matches = latestSpec.modules.flatMap((mod) => mod.operations.filter((op) => op.id === action.input.operationId));
|
|
4394
4583
|
if (matches.length === 0) throw new Error(`Operation "${action.input.operationId}" not found in the latest specification`);
|
|
4395
4584
|
if (matches.length > 1) throw new Error(`Operation "${action.input.operationId}" is duplicated in the latest specification`);
|
|
4396
|
-
const moved = matches[0];
|
|
4397
|
-
for (const mod of latestSpec.modules)
|
|
4398
|
-
|
|
4585
|
+
const moved = readBase(matches[0]);
|
|
4586
|
+
for (const mod of latestSpec.modules) {
|
|
4587
|
+
const operations = readBase(mod).operations.filter((op) => op.id !== action.input.operationId);
|
|
4588
|
+
if (mod === targetModule) operations.push(moved);
|
|
4589
|
+
mod.operations = Object.freeze(operations);
|
|
4590
|
+
}
|
|
4399
4591
|
},
|
|
4400
4592
|
deleteOperationOperation(state, action) {
|
|
4401
4593
|
findOperationOrThrow(state, action.input.id);
|
|
4402
4594
|
const latestSpec = state.specifications[state.specifications.length - 1];
|
|
4403
|
-
for (const mod of latestSpec.modules)
|
|
4595
|
+
for (const mod of latestSpec.modules) {
|
|
4596
|
+
const operations = readBase(mod).operations.filter((operation) => operation.id != action.input.id);
|
|
4597
|
+
mod.operations = Object.freeze(operations);
|
|
4598
|
+
}
|
|
4404
4599
|
},
|
|
4405
4600
|
reorderModuleOperationsOperation(state, action) {
|
|
4406
4601
|
const targetModule = findModuleOrThrow(state, action.input.moduleId);
|
|
@@ -4438,7 +4633,8 @@ const documentModelStateSchemaReducer = {
|
|
|
4438
4633
|
if (!Object.keys(latestSpec.state).includes(action.input.scope)) throw new Error(`Invalid scope: ${action.input.scope}`);
|
|
4439
4634
|
const scopeState = latestSpec.state[action.input.scope];
|
|
4440
4635
|
if (!scopeState.examples.some((e) => e.id == action.input.id)) throw new Error(`State example "${action.input.id}" not found in scope "${action.input.scope}"`);
|
|
4441
|
-
|
|
4636
|
+
const examples = readBase(scopeState).examples.filter((e) => e.id != action.input.id);
|
|
4637
|
+
scopeState.examples = Object.freeze(examples);
|
|
4442
4638
|
},
|
|
4443
4639
|
reorderStateExamplesOperation(state, action) {
|
|
4444
4640
|
const latestSpec = state.specifications[state.specifications.length - 1];
|
|
@@ -4708,7 +4904,11 @@ function applyUpgradeDocumentAction(document, action, upgradePath) {
|
|
|
4708
4904
|
const toVersion = action.input.toVersion;
|
|
4709
4905
|
if (fromVersion === toVersion && fromVersion > 0) return document;
|
|
4710
4906
|
if (fromVersion > toVersion) throw new DowngradeNotSupportedError(document.header.documentType, fromVersion, toVersion);
|
|
4711
|
-
if (upgradePath)
|
|
4907
|
+
if (upgradePath) {
|
|
4908
|
+
const protocolVersions = document.header.protocolVersions;
|
|
4909
|
+
for (const transition of upgradePath) document = transition.upgradeReducer(document, action);
|
|
4910
|
+
document = withProtocolVersions(document, protocolVersions);
|
|
4911
|
+
}
|
|
4712
4912
|
applyInitialState(document, action);
|
|
4713
4913
|
document.state.document = {
|
|
4714
4914
|
...document.state.document,
|
|
@@ -4716,6 +4916,16 @@ function applyUpgradeDocumentAction(document, action, upgradePath) {
|
|
|
4716
4916
|
};
|
|
4717
4917
|
return document;
|
|
4718
4918
|
}
|
|
4919
|
+
/** CREATE_DOCUMENT fixes `protocolVersions`; this puts them back after a reducer. */
|
|
4920
|
+
function withProtocolVersions(document, protocolVersions) {
|
|
4921
|
+
const header = { ...document.header };
|
|
4922
|
+
if (protocolVersions === void 0) delete header.protocolVersions;
|
|
4923
|
+
else header.protocolVersions = { ...protocolVersions };
|
|
4924
|
+
return {
|
|
4925
|
+
...document,
|
|
4926
|
+
header
|
|
4927
|
+
};
|
|
4928
|
+
}
|
|
4719
4929
|
/**
|
|
4720
4930
|
* Applies a DELETE_DOCUMENT action to a document.
|
|
4721
4931
|
* Marks the document as deleted in the document scope state.
|
|
@@ -4841,7 +5051,7 @@ function replayDocumentVersioned(initialState, operations, config, header, dispa
|
|
|
4841
5051
|
const curr = boundaries[i]?.[s] ?? 0;
|
|
4842
5052
|
if (boundaries[i]) boundaries[i][s] = Math.max(prev, curr);
|
|
4843
5053
|
}
|
|
4844
|
-
const allScopes = new Set([
|
|
5054
|
+
const allScopes = /* @__PURE__ */ new Set([
|
|
4845
5055
|
...Object.keys(operations),
|
|
4846
5056
|
"global",
|
|
4847
5057
|
"local"
|
|
@@ -4928,7 +5138,7 @@ function replayDocumentVersioned(initialState, operations, config, header, dispa
|
|
|
4928
5138
|
}
|
|
4929
5139
|
}
|
|
4930
5140
|
}
|
|
4931
|
-
const allResultScopes = new Set([
|
|
5141
|
+
const allResultScopes = /* @__PURE__ */ new Set([
|
|
4932
5142
|
...Object.keys(document.operations),
|
|
4933
5143
|
...Object.keys(operations),
|
|
4934
5144
|
"global",
|
|
@@ -5012,22 +5222,21 @@ async function createZip(document) {
|
|
|
5012
5222
|
*/
|
|
5013
5223
|
async function createMinimalZip(data) {
|
|
5014
5224
|
const now = (/* @__PURE__ */ new Date()).toISOString();
|
|
5015
|
-
const header = {
|
|
5016
|
-
id: data.documentId,
|
|
5017
|
-
sig: {
|
|
5018
|
-
publicKey: {},
|
|
5019
|
-
nonce: ""
|
|
5020
|
-
},
|
|
5021
|
-
documentType: data.documentType,
|
|
5022
|
-
createdAtUtcIso: now,
|
|
5023
|
-
slug: data.name,
|
|
5024
|
-
name: data.name,
|
|
5025
|
-
branch: data.branch,
|
|
5026
|
-
revision: {},
|
|
5027
|
-
lastModifiedAtUtcIso: now
|
|
5028
|
-
};
|
|
5029
5225
|
return zipAsync({
|
|
5030
|
-
"header.json": jsonEntry(
|
|
5226
|
+
"header.json": jsonEntry({
|
|
5227
|
+
id: data.documentId,
|
|
5228
|
+
sig: {
|
|
5229
|
+
publicKey: {},
|
|
5230
|
+
nonce: ""
|
|
5231
|
+
},
|
|
5232
|
+
documentType: data.documentType,
|
|
5233
|
+
createdAtUtcIso: now,
|
|
5234
|
+
slug: data.name,
|
|
5235
|
+
name: data.name,
|
|
5236
|
+
branch: data.branch,
|
|
5237
|
+
revision: {},
|
|
5238
|
+
lastModifiedAtUtcIso: now
|
|
5239
|
+
}),
|
|
5031
5240
|
"state.json": jsonEntry(data.state),
|
|
5032
5241
|
"current-state.json": jsonEntry(data.state),
|
|
5033
5242
|
"operations.json": jsonEntry({})
|
|
@@ -5051,7 +5260,9 @@ async function parseZipData(data) {
|
|
|
5051
5260
|
if (!files["header.json"]) throw new Error("Document header not found - file format may be outdated");
|
|
5052
5261
|
const header = JSON.parse(readEntry(files, "header.json"));
|
|
5053
5262
|
if (!files["operations.json"]) throw new Error("Operations history not found");
|
|
5054
|
-
const
|
|
5263
|
+
const operations = JSON.parse(readEntry(files, "operations.json"));
|
|
5264
|
+
const clearedOperations = garbageCollectDocumentOperations(operations);
|
|
5265
|
+
pinProtocolVersionsToCreate(header, operations);
|
|
5055
5266
|
const operationsError = validateOperations(clearedOperations);
|
|
5056
5267
|
if (operationsError.length) {
|
|
5057
5268
|
const errorMessages = operationsError.map((err) => err.message);
|
|
@@ -5063,6 +5274,17 @@ async function parseZipData(data) {
|
|
|
5063
5274
|
clearedOperations
|
|
5064
5275
|
};
|
|
5065
5276
|
}
|
|
5277
|
+
/** header.json is a snapshot; the stored CREATE_DOCUMENT input wins. */
|
|
5278
|
+
function pinProtocolVersionsToCreate(header, operations) {
|
|
5279
|
+
const create = operations.document?.find((operation) => operation.action.type === "CREATE_DOCUMENT");
|
|
5280
|
+
if (!create) return;
|
|
5281
|
+
const input = create.action.input;
|
|
5282
|
+
if (input?.protocolVersions) header.protocolVersions = { ...input.protocolVersions };
|
|
5283
|
+
else if (header.protocolVersions) {
|
|
5284
|
+
const { [SIGNATURE_PROTOCOL]: _dropped, ...rest } = header.protocolVersions;
|
|
5285
|
+
header.protocolVersions = rest;
|
|
5286
|
+
}
|
|
5287
|
+
}
|
|
5066
5288
|
async function loadFromZipData(data, reducer, options) {
|
|
5067
5289
|
const { initialState, header, clearedOperations } = await parseZipData(data);
|
|
5068
5290
|
return {
|
|
@@ -5138,6 +5360,6 @@ const getFileBrowser = (file) => {
|
|
|
5138
5360
|
return Promise.resolve().then(() => readFileBrowser(file));
|
|
5139
5361
|
};
|
|
5140
5362
|
//#endregion
|
|
5141
|
-
export { AUTH_ACTION_TYPES, AUTH_DENIED_BY_GRANT_REASON, AUTH_NO_GRANT_REASON, AUTH_VERSION_UNSUPPORTED_REASON, AddChangeLogItemInputSchema, AddModuleInputSchema, AddOperationErrorInputSchema, AddOperationExampleInputSchema, AddOperationInputSchema, AddStateExampleInputSchema, AuthActionNotAllowedError, AuthAdministrationLockoutError, AuthAdministrationMissingError, AuthAlreadyInitializedError, AuthInitializerNotCreatorError, AuthPolicyNotPreservedError, AuthorSchema, BaseDocumentHeaderSchema, BaseDocumentStateSchema, CodeExampleSchema, ConfigEntrySchema, ConfigEntryTypeSchema, DOCUMENT_DELETED_REASON, DeleteChangeLogItemInputSchema, DeleteModuleInputSchema, DeleteOperationErrorInputSchema, DeleteOperationExampleInputSchema, DeleteOperationInputSchema, DeleteStateExampleInputSchema, DocumentActionSchema, DocumentModelGlobalStateSchema, DocumentModelHeaderSchema, DocumentModelInputSchema, DocumentModelPHStateSchema, DocumentModelSchema, DocumentSpecificationSchema, DowngradeNotSupportedError, FileSystemError, GrantNotFoundError, GrantSchema, GroupPrincipalNotAllowedError, HASH_ALGORITHM_SHA1, HASH_ALGORITHM_SHA256, HASH_ALGORITHM_SHA512, HASH_ENCODING_BASE64, HASH_ENCODING_HEX, HashMismatchError, InitializeAuthActionInputSchema, IntegrityIssueSubType, IntegrityIssueType, InvalidActionInputError, InvalidActionInputZodError, InvalidAuthVersionError, InvalidGrantError,
|
|
5363
|
+
export { ACTION_SIGNATURE_V2_PREFIX, AUTH_ACTION_TYPES, AUTH_DENIED_BY_GRANT_REASON, AUTH_NO_GRANT_REASON, AUTH_VERSION_UNSUPPORTED_REASON, AddChangeLogItemInputSchema, AddModuleInputSchema, AddOperationErrorInputSchema, AddOperationExampleInputSchema, AddOperationInputSchema, AddStateExampleInputSchema, AuthActionNotAllowedError, AuthAdministrationLockoutError, AuthAdministrationMissingError, AuthAlreadyInitializedError, AuthInitializerNotCreatorError, AuthPolicyNotPreservedError, AuthorSchema, BaseDocumentHeaderSchema, BaseDocumentStateSchema, CanonicalJsonError, CodeExampleSchema, ConfigEntrySchema, ConfigEntryTypeSchema, DEFAULT_SIGNATURE_POLICY, DOCUMENT_DELETED_REASON, DOCUMENT_SCOPE_ACTION_TYPES, DeleteChangeLogItemInputSchema, DeleteModuleInputSchema, DeleteOperationErrorInputSchema, DeleteOperationExampleInputSchema, DeleteOperationInputSchema, DeleteStateExampleInputSchema, DocumentActionSchema, DocumentModelGlobalStateSchema, DocumentModelHeaderSchema, DocumentModelInputSchema, DocumentModelPHStateSchema, DocumentModelSchema, DocumentSpecificationSchema, DowngradeNotSupportedError, FileSystemError, GrantNotFoundError, GrantSchema, GroupPrincipalNotAllowedError, HASH_ALGORITHM_SHA1, HASH_ALGORITHM_SHA256, HASH_ALGORITHM_SHA512, HASH_ENCODING_BASE64, HASH_ENCODING_HEX, HashMismatchError, InitializeAuthActionInputSchema, IntegrityIssueSubType, IntegrityIssueType, InvalidActionInputError, InvalidActionInputZodError, InvalidAuthVersionError, InvalidGrantError, MAX_AUTH_GRANTS, MAX_CAPABILITY_OPERATIONS, MAX_CONDITION_DEPTH, MAX_CONDITION_NODES, MAX_SUPPORTED_AUTH_VERSION, ManifestSchema, ModuleSchema, MoveGrantActionInputSchema, MoveOperationInputSchema, OPERATION_NAME_PATTERN, OperationErrorSchema, OperationScopeSchema, OperationSpecificationSchema, PieceModuleSchema, PieceModulesSchema, PowerhouseModuleSchema, PowerhouseModulesSchema, PublisherSchema, PwaConfigSchema, RESERVED_OPERATION_NAMES, RedoActionInputSchema, RedoActionSchema, RedoSchema, RemoveGrantActionInputSchema, ReorderChangeLogItemsInputSchema, ReorderModuleOperationsInputSchema, ReorderModulesInputSchema, ReorderOperationErrorsInputSchema, ReorderOperationExamplesInputSchema, ReorderStateExamplesInputSchema, SIGNATURE_PROTOCOL, SIGNATURE_PROTOCOL_V2, ScopeStateSchema, SetAuthorNameInputSchema, SetAuthorWebsiteInputSchema, SetGrantActionInputSchema, SetInitialStateInputSchema, SetModelDescriptionInputSchema, SetModelExtensionInputSchema, SetModelIdInputSchema, SetModelNameInputSchema, SetModuleDescriptionInputSchema, SetModuleNameInputSchema, SetNameActionInputSchema, SetNameActionSchema, SetOperationDescriptionInputSchema, SetOperationErrorCodeInputSchema, SetOperationErrorDescriptionInputSchema, SetOperationErrorNameInputSchema, SetOperationErrorTemplateInputSchema, SetOperationNameInputSchema, SetOperationReducerInputSchema, SetOperationSchemaInputSchema, SetOperationScopeInputSchema, SetOperationTemplateInputSchema, SetPreferredEditorActionInputSchema, SetPreferredEditorActionSchema, SetStateSchemaInputSchema, Set_NameSchema, Set_PreferredEditorSchema, StateSchema, UndoActionInputSchema, UndoActionSchema, UndoSchema, UnsupportedDocumentModelVersionError, UpdateChangeLogItemInputSchema, UpdateOperationExampleInputSchema, UpdateStateExampleInputSchema, ab2hex, actionContext, actionFromAction, actionPreimageV2, actionSigner, actionSignerIdentity, actionSigningTarget, actions, addChangeLogItem, addModule, addOperation, addOperationError, addOperationExample, addStateExample, addUndo, appendWithoutApplying, applyAuthAction, applyDeleteDocumentAction, applyInitializeAuthAction, applyMoveGrantAction, applyRemoveGrantAction, applySetGrantAction, applyUpgradeDocumentAction, assertAuthAdministrationRetained, assertAuthPreservedOnDuplicate, assertAuthScopeActionAllowed, assertIsDocumentModelDocument, assertIsDocumentModelState, assertModuleIdUnique, assertOperationErrorIdUnique, assertOperationExampleIdUnique, assertOperationIdUnique, assertValidGrant, assertValidGrantUpsert, assertValidInitialGrants, attachBranch, backfillAuthState, base58Decode, base64UrlToBytes, baseActions, baseCreateDocument, baseLoadFromInput, baseLoadFromInputVersioned, baseReducer, baseReducerVersion, baseSaveToFileHandle, buildOperationSignature, buildOperationSignatureMessage, buildOperationSignatureParams, buildSignedAction, canonicalJson, checkCleanedOperationsIntegrity, checkOperationsIntegrity, computeUpgradeTransitions, createAction, createAuthState, createBaseState, createCopyHeader, createDocumentState, createGlobalState, createLocalState, createMinimalZip, createPresignedHeader, createReducer, createSignedHeader, createSignedHeaderForSigner, createState, createVerificationSigner, createZip, decide, defaultAuthState, defaultBaseState, defaultDocumentState, defaultGlobalState, defaultLocalState, defaultPHState, definedNonNullAnySchema, deleteChangeLogItem, deleteModule, deleteOperation, deleteOperationError, deleteOperationExample, deleteStateExample, deriveDocumentId, deriveOperationId, deserializeSignature, diffOperations, documentModelActions, documentModelDocumentType, documentModelFileExtension, documentModelGlobalState, documentModelHeaderReducer, documentModelInitialGlobalState, documentModelInitialLocalState, documentModelLoadFromInput, documentModelModuleReducer, documentModelOperationErrorReducer, documentModelOperationExampleReducer, documentModelOperationReducer, documentModelReducer, documentModelSaveToFileHandle, documentModelStateReducer, documentModelStateSchemaReducer, documentModelVersioningReducer, evaluate, evaluateCondition, evaluateGrantStack, evaluateGrants, fetchFileBrowser, filterDocumentOperationsResultingState, filterDuplicatedOperations, findModuleOrThrow, findOperationErrorOrThrow, findOperationExampleOrThrow, findOperationOrThrow, garbageCollect, garbageCollectDocumentOperations, garbageCollectV2, generateId, generateMock, getAllOperationNames, getDocumentLastModified, getFileBrowser, getUnixTimestamp, grantProblem, groupDocumentType, groupMembershipActionTypes, groupOperationsByScope, hasDerivedDocumentId, hashActionV2, hashBrowser, hashDocumentStateForScope, hex2ab, initializeAuth, isAuthAction, isDefinedNonNullAny, isDenied, isDerivedDocumentId, isDocumentAction, isDocumentCreator, isDocumentModelDocument, isDocumentModelState, isDocumentZip, isNoopOperation, isPlainValue, isReservedOperationName, isSignaturePolicy, isUndo, isUndoRedo, isV2ActionHash, isValidOperationNameFormat, mapSkippedOperations, mapSkippedOperationsV2, mentionedGroupIds, merge, moveGrant, moveOperation, nextSkipNumber, noop, normalizeDocumentModelVersion, operationExampleCreators, operationFromAction, operationFromOperation, operationOutcome, operationWithContext, operationsAreEqual, parseBulkArchive, parseResultingState, precedes, prepareOperations, processUndoRedo, protocolVersionsFor, readFileBrowser, readOnly, redo, redoOperation, referencedGroupIds, releaseNewVersion, removeExistingOperations, removeGrant, reorderChangeLogItems, reorderModuleOperations, reorderModules, reorderOperationErrors, reorderOperationExamples, reorderStateExamples, replayDocument, replayDocumentVersioned, replayOperations, requestedSignaturePolicy, reshuffleByTimestamp, reshuffleByTimestampAndIndex, resolveSnapshotAuth, serializeSignature, setAuthorName, setAuthorWebsite, setGrant, setInitialState, setModelDescription, setModelExtension, setModelId, setModelName, setModuleDescription, setModuleName, setName, setNameOperation, setOperationDescription, setOperationErrorCode, setOperationErrorDescription, setOperationErrorName, setOperationErrorTemplate, setOperationName, setOperationReducer, setOperationSchema, setOperationScope, setOperationTemplate, setPreferredEditor, setPreferredEditorOperation, setStateSchema, sign, signActionV2, signaturePolicyOf, skipHeaderOperations, sortMappedOperations, sortOperations, split, targetDocumentId, toTransportAction, undo, undoOperation, undoOperationV2, updateChangeLogItem, updateDocument, updateHeaderRevision, updateOperationExample, updateStateExample, v2RequiredProtocolVersions, v2TupleProblem, validateHeader, validateInitialState, validateModule, validateModuleOperation, validateModules, validateOperationName, validateOperations, validateStateSchemaName, verify, verifyOperationSignature, withProtocolVersions, withSignaturePolicy, writeFileBrowser, zipEntries };
|
|
5142
5364
|
|
|
5143
5365
|
//# sourceMappingURL=index.js.map
|