document-drive 4.1.0-dev.7 → 4.1.0-dev.70
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/index.d.ts +17 -30
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -19
- package/dist/index.js.map +1 -1
- package/dist/src/cache/index.d.ts +5 -0
- package/dist/src/cache/index.d.ts.map +1 -0
- package/dist/src/cache/index.js +5 -0
- package/dist/src/cache/index.js.map +1 -0
- package/dist/src/cache/lru.d.ts +2 -13
- package/dist/src/cache/lru.d.ts.map +1 -1
- package/dist/src/cache/lru.js +1 -2
- package/dist/src/cache/lru.js.map +1 -1
- package/dist/src/cache/memory.d.ts +3 -14
- package/dist/src/cache/memory.d.ts.map +1 -1
- package/dist/src/cache/memory.js +2 -3
- package/dist/src/cache/memory.js.map +1 -1
- package/dist/src/cache/redis.d.ts +3 -5
- package/dist/src/cache/redis.d.ts.map +1 -1
- package/dist/src/cache/redis.js +2 -4
- package/dist/src/cache/redis.js.map +1 -1
- package/dist/src/cache/types.d.ts +23 -2
- package/dist/src/cache/types.d.ts.map +1 -1
- package/dist/src/cache/util.d.ts +1 -1
- package/dist/src/cache/util.d.ts.map +1 -1
- package/dist/src/drive-document-model/constants.d.ts +2 -1
- package/dist/src/drive-document-model/constants.d.ts.map +1 -1
- package/dist/src/drive-document-model/constants.js +2 -2
- package/dist/src/drive-document-model/constants.js.map +1 -1
- package/dist/src/drive-document-model/gen/document-model.d.ts +2 -2
- package/dist/src/drive-document-model/gen/document-model.d.ts.map +1 -1
- package/dist/src/drive-document-model/gen/document-model.js +1 -1
- package/dist/src/drive-document-model/gen/document-model.js.map +1 -1
- package/dist/src/drive-document-model/gen/drive/actions.d.ts +12 -2
- package/dist/src/drive-document-model/gen/drive/actions.d.ts.map +1 -1
- package/dist/src/drive-document-model/gen/drive/creators.d.ts +2 -2
- package/dist/src/drive-document-model/gen/drive/creators.d.ts.map +1 -1
- package/dist/src/drive-document-model/gen/drive/creators.js +10 -10
- package/dist/src/drive-document-model/gen/drive/creators.js.map +1 -1
- package/dist/src/drive-document-model/gen/drive/index.d.ts +2 -0
- package/dist/src/drive-document-model/gen/drive/index.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/drive/index.js +2 -0
- package/dist/src/drive-document-model/gen/drive/index.js.map +1 -0
- package/dist/src/drive-document-model/gen/drive/types.d.ts +2 -0
- package/dist/src/drive-document-model/gen/drive/types.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/drive/types.js +2 -0
- package/dist/src/drive-document-model/gen/drive/types.js.map +1 -0
- package/dist/src/drive-document-model/gen/index.d.ts +7 -4
- package/dist/src/drive-document-model/gen/index.d.ts.map +1 -1
- package/dist/src/drive-document-model/gen/index.js +7 -4
- package/dist/src/drive-document-model/gen/index.js.map +1 -1
- package/dist/src/drive-document-model/gen/node/actions.d.ts +11 -2
- package/dist/src/drive-document-model/gen/node/actions.d.ts.map +1 -1
- package/dist/src/drive-document-model/gen/node/creators.d.ts +1 -2
- package/dist/src/drive-document-model/gen/node/creators.d.ts.map +1 -1
- package/dist/src/drive-document-model/gen/node/creators.js +9 -9
- package/dist/src/drive-document-model/gen/node/creators.js.map +1 -1
- package/dist/src/drive-document-model/gen/node/index.d.ts +2 -0
- package/dist/src/drive-document-model/gen/node/index.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/node/index.js +2 -0
- package/dist/src/drive-document-model/gen/node/index.js.map +1 -0
- package/dist/src/drive-document-model/gen/node/types.d.ts +2 -0
- package/dist/src/drive-document-model/gen/node/types.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/node/types.js +2 -0
- package/dist/src/drive-document-model/gen/node/types.js.map +1 -0
- package/dist/src/drive-document-model/gen/ph-factories.d.ts +12 -0
- package/dist/src/drive-document-model/gen/ph-factories.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/ph-factories.js +46 -0
- package/dist/src/drive-document-model/gen/ph-factories.js.map +1 -0
- package/dist/src/drive-document-model/gen/reducer.d.ts +3 -3
- package/dist/src/drive-document-model/gen/reducer.d.ts.map +1 -1
- package/dist/src/drive-document-model/gen/reducer.js +34 -36
- package/dist/src/drive-document-model/gen/reducer.js.map +1 -1
- package/dist/src/drive-document-model/gen/schema/index.d.ts +2 -2
- package/dist/src/drive-document-model/gen/schema/index.d.ts.map +1 -1
- package/dist/src/drive-document-model/gen/schema/index.js +2 -2
- package/dist/src/drive-document-model/gen/schema/index.js.map +1 -1
- package/dist/src/drive-document-model/gen/schema/types.d.ts +8 -3
- package/dist/src/drive-document-model/gen/schema/types.d.ts.map +1 -1
- package/dist/src/drive-document-model/gen/schema/zod.d.ts +28 -28
- package/dist/src/drive-document-model/gen/schema/zod.d.ts.map +1 -1
- package/dist/src/drive-document-model/gen/schema/zod.js.map +1 -1
- package/dist/src/drive-document-model/gen/types.d.ts +7 -8
- package/dist/src/drive-document-model/gen/types.d.ts.map +1 -1
- package/dist/src/drive-document-model/gen/types.js +3 -1
- package/dist/src/drive-document-model/gen/types.js.map +1 -1
- package/dist/src/drive-document-model/gen/utils.d.ts +7 -9
- package/dist/src/drive-document-model/gen/utils.d.ts.map +1 -1
- package/dist/src/drive-document-model/gen/utils.js +21 -37
- package/dist/src/drive-document-model/gen/utils.js.map +1 -1
- package/dist/src/drive-document-model/index.d.ts +4 -1
- package/dist/src/drive-document-model/index.d.ts.map +1 -1
- package/dist/src/drive-document-model/index.js +4 -1
- package/dist/src/drive-document-model/index.js.map +1 -1
- package/dist/src/drive-document-model/module.d.ts +2 -27
- package/dist/src/drive-document-model/module.d.ts.map +1 -1
- package/dist/src/drive-document-model/module.js +17 -16
- package/dist/src/drive-document-model/module.js.map +1 -1
- package/dist/src/drive-document-model/src/index.d.ts +3 -0
- package/dist/src/drive-document-model/src/index.d.ts.map +1 -0
- package/dist/src/drive-document-model/src/index.js +3 -0
- package/dist/src/drive-document-model/src/index.js.map +1 -0
- package/dist/src/drive-document-model/src/reducers/drive.d.ts +2 -2
- package/dist/src/drive-document-model/src/reducers/drive.d.ts.map +1 -1
- package/dist/src/drive-document-model/src/reducers/drive.js +1 -1
- package/dist/src/drive-document-model/src/reducers/drive.js.map +1 -1
- package/dist/src/drive-document-model/src/reducers/index.d.ts +3 -0
- package/dist/src/drive-document-model/src/reducers/index.d.ts.map +1 -0
- package/dist/src/drive-document-model/src/reducers/index.js +3 -0
- package/dist/src/drive-document-model/src/reducers/index.js.map +1 -0
- package/dist/src/drive-document-model/src/reducers/node.d.ts +2 -2
- package/dist/src/drive-document-model/src/reducers/node.d.ts.map +1 -1
- package/dist/src/drive-document-model/src/reducers/node.js +15 -4
- package/dist/src/drive-document-model/src/reducers/node.js.map +1 -1
- package/dist/src/drive-document-model/src/tests/actions.test.js +20 -22
- package/dist/src/drive-document-model/src/tests/actions.test.js.map +1 -1
- package/dist/src/drive-document-model/src/tests/base.test.js +12 -52
- package/dist/src/drive-document-model/src/tests/base.test.js.map +1 -1
- package/dist/src/drive-document-model/src/tests/document-model.test.js +3 -3
- package/dist/src/drive-document-model/src/tests/document-model.test.js.map +1 -1
- package/dist/src/drive-document-model/src/tests/drive.test.js +12 -15
- package/dist/src/drive-document-model/src/tests/drive.test.js.map +1 -1
- package/dist/src/drive-document-model/src/tests/generate-mock.d.ts +5 -0
- package/dist/src/drive-document-model/src/tests/generate-mock.d.ts.map +1 -0
- package/dist/src/drive-document-model/src/tests/generate-mock.js +5 -0
- package/dist/src/drive-document-model/src/tests/generate-mock.js.map +1 -0
- package/dist/src/drive-document-model/src/tests/node.test.js +75 -112
- package/dist/src/drive-document-model/src/tests/node.test.js.map +1 -1
- package/dist/src/drive-document-model/src/tests/test-factories.d.ts +9 -0
- package/dist/src/drive-document-model/src/tests/test-factories.d.ts.map +1 -0
- package/dist/src/drive-document-model/src/tests/test-factories.js +17 -0
- package/dist/src/drive-document-model/src/tests/test-factories.js.map +1 -0
- package/dist/src/drive-document-model/src/tests/utils.test.js +1 -1
- package/dist/src/drive-document-model/src/tests/utils.test.js.map +1 -1
- package/dist/src/drive-document-model/src/types.d.ts +8 -0
- package/dist/src/drive-document-model/src/types.d.ts.map +1 -0
- package/dist/src/drive-document-model/src/types.js +2 -0
- package/dist/src/drive-document-model/src/types.js.map +1 -0
- package/dist/src/drive-document-model/src/utils.d.ts +2 -7
- package/dist/src/drive-document-model/src/utils.d.ts.map +1 -1
- package/dist/src/drive-document-model/src/utils.js +4 -0
- package/dist/src/drive-document-model/src/utils.js.map +1 -1
- package/dist/src/drive-document-model/types.d.ts +10 -0
- package/dist/src/drive-document-model/types.d.ts.map +1 -0
- package/dist/src/drive-document-model/types.js +3 -0
- package/dist/src/drive-document-model/types.js.map +1 -0
- package/dist/src/processors/index.d.ts +4 -0
- package/dist/src/processors/index.d.ts.map +1 -0
- package/dist/src/processors/index.js +4 -0
- package/dist/src/processors/index.js.map +1 -0
- package/dist/src/processors/processor-manager.d.ts +1 -2
- package/dist/src/processors/processor-manager.d.ts.map +1 -1
- package/dist/src/processors/processor-manager.js +4 -5
- package/dist/src/processors/processor-manager.js.map +1 -1
- package/dist/src/processors/relational.d.ts +4 -17
- package/dist/src/processors/relational.d.ts.map +1 -1
- package/dist/src/processors/relational.js +4 -7
- package/dist/src/processors/relational.js.map +1 -1
- package/dist/src/processors/types.d.ts +18 -8
- package/dist/src/processors/types.d.ts.map +1 -1
- package/dist/src/processors/utils.d.ts +1 -2
- package/dist/src/processors/utils.d.ts.map +1 -1
- package/dist/src/processors/utils.js +0 -2
- package/dist/src/processors/utils.js.map +1 -1
- package/dist/src/queue/base.d.ts +1 -1
- package/dist/src/queue/base.d.ts.map +1 -1
- package/dist/src/queue/event.d.ts +4 -5
- package/dist/src/queue/event.d.ts.map +1 -1
- package/dist/src/queue/event.js +10 -8
- package/dist/src/queue/event.js.map +1 -1
- package/dist/src/queue/index.d.ts +5 -0
- package/dist/src/queue/index.d.ts.map +1 -0
- package/dist/src/queue/index.js +5 -0
- package/dist/src/queue/index.js.map +1 -0
- package/dist/src/queue/redis.js +1 -1
- package/dist/src/queue/redis.js.map +1 -1
- package/dist/src/queue/types.d.ts +4 -6
- package/dist/src/queue/types.d.ts.map +1 -1
- package/dist/src/queue/types.js +1 -9
- package/dist/src/queue/types.js.map +1 -1
- package/dist/src/queue/utils.d.ts +5 -0
- package/dist/src/queue/utils.d.ts.map +1 -0
- package/dist/src/queue/utils.js +10 -0
- package/dist/src/queue/utils.js.map +1 -0
- package/dist/src/read-mode/index.d.ts +4 -0
- package/dist/src/read-mode/index.d.ts.map +1 -0
- package/dist/src/read-mode/index.js +4 -0
- package/dist/src/read-mode/index.js.map +1 -0
- package/dist/src/read-mode/server.d.ts +1 -2
- package/dist/src/read-mode/server.d.ts.map +1 -1
- package/dist/src/read-mode/server.js +1 -3
- package/dist/src/read-mode/server.js.map +1 -1
- package/dist/src/read-mode/service.d.ts +4 -6
- package/dist/src/read-mode/service.d.ts.map +1 -1
- package/dist/src/read-mode/service.js +1 -5
- package/dist/src/read-mode/service.js.map +1 -1
- package/dist/src/read-mode/types.d.ts +4 -8
- package/dist/src/read-mode/types.d.ts.map +1 -1
- package/dist/src/server/base-server.d.ts +10 -15
- package/dist/src/server/base-server.d.ts.map +1 -1
- package/dist/src/server/base-server.js +281 -59
- package/dist/src/server/base-server.js.map +1 -1
- package/dist/src/server/builder.d.ts +2 -5
- package/dist/src/server/builder.d.ts.map +1 -1
- package/dist/src/server/builder.js +8 -10
- package/dist/src/server/builder.js.map +1 -1
- package/dist/src/server/constants.d.ts +3 -0
- package/dist/src/server/constants.d.ts.map +1 -1
- package/dist/src/server/constants.js +3 -0
- package/dist/src/server/constants.js.map +1 -1
- package/dist/src/server/error.d.ts +6 -2
- package/dist/src/server/error.d.ts.map +1 -1
- package/dist/src/server/error.js +7 -2
- package/dist/src/server/error.js.map +1 -1
- package/dist/src/server/event-emitter.d.ts +2 -2
- package/dist/src/server/event-emitter.d.ts.map +1 -1
- package/dist/src/server/event-emitter.js.map +1 -1
- package/dist/src/server/index.d.ts +10 -0
- package/dist/src/server/index.d.ts.map +1 -0
- package/dist/src/server/index.js +10 -0
- package/dist/src/server/index.js.map +1 -0
- package/dist/src/server/listener/index.d.ts +2 -0
- package/dist/src/server/listener/index.d.ts.map +1 -1
- package/dist/src/server/listener/index.js +2 -0
- package/dist/src/server/listener/index.js.map +1 -1
- package/dist/src/server/listener/listener-manager.d.ts +4 -5
- package/dist/src/server/listener/listener-manager.d.ts.map +1 -1
- package/dist/src/server/listener/listener-manager.js +7 -9
- package/dist/src/server/listener/listener-manager.js.map +1 -1
- package/dist/src/server/listener/transmitter/factory.d.ts +3 -4
- package/dist/src/server/listener/transmitter/factory.d.ts.map +1 -1
- package/dist/src/server/listener/transmitter/factory.js +2 -3
- package/dist/src/server/listener/transmitter/factory.js.map +1 -1
- package/dist/src/server/listener/transmitter/index.d.ts +5 -0
- package/dist/src/server/listener/transmitter/index.d.ts.map +1 -0
- package/dist/src/server/listener/transmitter/index.js +5 -0
- package/dist/src/server/listener/transmitter/index.js.map +1 -0
- package/dist/src/server/listener/transmitter/internal.d.ts +3 -20
- package/dist/src/server/listener/transmitter/internal.d.ts.map +1 -1
- package/dist/src/server/listener/transmitter/internal.js +18 -15
- package/dist/src/server/listener/transmitter/internal.js.map +1 -1
- package/dist/src/server/listener/transmitter/pull-responder.d.ts +4 -22
- package/dist/src/server/listener/transmitter/pull-responder.d.ts.map +1 -1
- package/dist/src/server/listener/transmitter/pull-responder.js +7 -9
- package/dist/src/server/listener/transmitter/pull-responder.js.map +1 -1
- package/dist/src/server/listener/transmitter/switchboard-push.d.ts +1 -2
- package/dist/src/server/listener/transmitter/switchboard-push.d.ts.map +1 -1
- package/dist/src/server/listener/transmitter/switchboard-push.js +18 -5
- package/dist/src/server/listener/transmitter/switchboard-push.js.map +1 -1
- package/dist/src/server/listener/transmitter/types.d.ts +32 -2
- package/dist/src/server/listener/transmitter/types.d.ts.map +1 -1
- package/dist/src/server/listener/types.d.ts +2 -0
- package/dist/src/server/listener/types.d.ts.map +1 -0
- package/dist/src/server/listener/types.js +2 -0
- package/dist/src/server/listener/types.js.map +1 -0
- package/dist/src/server/sync-manager.d.ts +4 -7
- package/dist/src/server/sync-manager.d.ts.map +1 -1
- package/dist/src/server/sync-manager.js +13 -15
- package/dist/src/server/sync-manager.js.map +1 -1
- package/dist/src/server/sync-unit-map.d.ts +4 -25
- package/dist/src/server/sync-unit-map.d.ts.map +1 -1
- package/dist/src/server/sync-unit-map.js +0 -1
- package/dist/src/server/sync-unit-map.js.map +1 -1
- package/dist/src/server/types.d.ts +43 -26
- package/dist/src/server/types.d.ts.map +1 -1
- package/dist/src/server/types.js +10 -12
- package/dist/src/server/types.js.map +1 -1
- package/dist/src/server/utils.d.ts +3 -1
- package/dist/src/server/utils.d.ts.map +1 -1
- package/dist/src/server/utils.js +17 -1
- package/dist/src/server/utils.js.map +1 -1
- package/dist/src/storage/browser.d.ts +1 -2
- package/dist/src/storage/browser.d.ts.map +1 -1
- package/dist/src/storage/browser.js +5 -8
- package/dist/src/storage/browser.js.map +1 -1
- package/dist/src/storage/filesystem.d.ts +2 -3
- package/dist/src/storage/filesystem.d.ts.map +1 -1
- package/dist/src/storage/filesystem.js +5 -7
- package/dist/src/storage/filesystem.js.map +1 -1
- package/dist/src/storage/index.d.ts +4 -0
- package/dist/src/storage/index.d.ts.map +1 -0
- package/dist/src/storage/index.js +4 -0
- package/dist/src/storage/index.js.map +1 -0
- package/dist/src/storage/ipfs.d.ts +2 -3
- package/dist/src/storage/ipfs.d.ts.map +1 -1
- package/dist/src/storage/ipfs.js +7 -5
- package/dist/src/storage/ipfs.js.map +1 -1
- package/dist/src/storage/memory.d.ts +2 -3
- package/dist/src/storage/memory.d.ts.map +1 -1
- package/dist/src/storage/memory.js +5 -8
- package/dist/src/storage/memory.js.map +1 -1
- package/dist/src/storage/prisma/factory.d.ts +2 -2
- package/dist/src/storage/prisma/factory.d.ts.map +1 -1
- package/dist/src/storage/prisma/factory.js +3 -2
- package/dist/src/storage/prisma/factory.js.map +1 -1
- package/dist/src/storage/prisma/prisma.d.ts +4 -5
- package/dist/src/storage/prisma/prisma.d.ts.map +1 -1
- package/dist/src/storage/prisma/prisma.js +46 -31
- package/dist/src/storage/prisma/prisma.js.map +1 -1
- package/dist/src/storage/types.d.ts +1 -2
- package/dist/src/storage/types.d.ts.map +1 -1
- package/dist/src/storage/utils.d.ts +1 -1
- package/dist/src/storage/utils.d.ts.map +1 -1
- package/dist/src/utils/default-drives-manager.d.ts +1 -12
- package/dist/src/utils/default-drives-manager.d.ts.map +1 -1
- package/dist/src/utils/default-drives-manager.js +1 -2
- package/dist/src/utils/default-drives-manager.js.map +1 -1
- package/dist/src/utils/gql-transformations.d.ts +14 -5
- package/dist/src/utils/gql-transformations.d.ts.map +1 -1
- package/dist/src/utils/gql-transformations.js +19 -5
- package/dist/src/utils/gql-transformations.js.map +1 -1
- package/dist/src/utils/graphql.d.ts +6 -32
- package/dist/src/utils/graphql.d.ts.map +1 -1
- package/dist/src/utils/graphql.js +21 -31
- package/dist/src/utils/graphql.js.map +1 -1
- package/dist/src/utils/index.d.ts +8 -0
- package/dist/src/utils/index.d.ts.map +1 -0
- package/dist/src/utils/index.js +8 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/logger.d.ts +2 -8
- package/dist/src/utils/logger.d.ts.map +1 -1
- package/dist/src/utils/logger.js +6 -7
- package/dist/src/utils/logger.js.map +1 -1
- package/dist/src/utils/migrations.d.ts +1 -1
- package/dist/src/utils/migrations.d.ts.map +1 -1
- package/dist/src/utils/migrations.js +81 -17
- package/dist/src/utils/migrations.js.map +1 -1
- package/dist/src/utils/misc.d.ts +2 -6
- package/dist/src/utils/misc.d.ts.map +1 -1
- package/dist/src/utils/misc.js +7 -11
- package/dist/src/utils/misc.js.map +1 -1
- package/dist/src/utils/run-asap.d.ts +7 -11
- package/dist/src/utils/run-asap.d.ts.map +1 -1
- package/dist/src/utils/run-asap.js +110 -122
- package/dist/src/utils/run-asap.js.map +1 -1
- package/dist/src/utils/types.d.ts +50 -0
- package/dist/src/utils/types.d.ts.map +1 -0
- package/dist/src/utils/types.js +2 -0
- package/dist/src/utils/types.js.map +1 -0
- package/dist/test/benchmarks/getDrive.json +10 -0
- package/dist/test/benchmarks/processOperations.bench.d.ts +2 -0
- package/dist/test/benchmarks/processOperations.bench.d.ts.map +1 -0
- package/dist/test/benchmarks/processOperations.bench.js +148 -0
- package/dist/test/benchmarks/processOperations.bench.js.map +1 -0
- package/dist/test/benchmarks/queue.bench.d.ts +2 -0
- package/dist/test/benchmarks/queue.bench.d.ts.map +1 -0
- package/dist/test/benchmarks/queue.bench.js +51 -0
- package/dist/test/benchmarks/queue.bench.js.map +1 -0
- package/dist/test/benchmarks/strands.small.json +37085 -0
- package/dist/test/cache.test.d.ts +2 -0
- package/dist/test/cache.test.d.ts.map +1 -0
- package/dist/test/cache.test.js +275 -0
- package/dist/test/cache.test.js.map +1 -0
- package/dist/test/default-remote-drives.test.d.ts +2 -0
- package/dist/test/default-remote-drives.test.d.ts.map +1 -0
- package/dist/test/default-remote-drives.test.js +445 -0
- package/dist/test/default-remote-drives.test.js.map +1 -0
- package/dist/test/drive-operations.test.d.ts +2 -0
- package/dist/test/drive-operations.test.d.ts.map +1 -0
- package/dist/test/drive-operations.test.js +134 -0
- package/dist/test/drive-operations.test.js.map +1 -0
- package/dist/test/dual-action-create.test.d.ts +2 -0
- package/dist/test/dual-action-create.test.d.ts.map +1 -0
- package/dist/test/dual-action-create.test.js +199 -0
- package/dist/test/dual-action-create.test.js.map +1 -0
- package/dist/test/dual-action-migration.test.d.ts +2 -0
- package/dist/test/dual-action-migration.test.d.ts.map +1 -0
- package/dist/test/dual-action-migration.test.js +344 -0
- package/dist/test/dual-action-migration.test.js.map +1 -0
- package/dist/test/graphql.test.d.ts +2 -0
- package/dist/test/graphql.test.d.ts.map +1 -0
- package/dist/test/graphql.test.js +9 -0
- package/dist/test/graphql.test.js.map +1 -0
- package/dist/test/index.d.ts +2 -0
- package/dist/test/index.d.ts.map +1 -0
- package/dist/test/index.js +2 -0
- package/dist/test/index.js.map +1 -0
- package/dist/test/internal-listener.test.d.ts +2 -0
- package/dist/test/internal-listener.test.d.ts.map +1 -0
- package/dist/test/internal-listener.test.js +243 -0
- package/dist/test/internal-listener.test.js.map +1 -0
- package/dist/test/queue.test.d.ts +2 -0
- package/dist/test/queue.test.d.ts.map +1 -0
- package/dist/test/queue.test.js +324 -0
- package/dist/test/queue.test.js.map +1 -0
- package/dist/test/reactor.test.d.ts +2 -0
- package/dist/test/reactor.test.d.ts.map +1 -0
- package/dist/test/reactor.test.js +32 -0
- package/dist/test/reactor.test.js.map +1 -0
- package/dist/test/read-mode.test.d.ts +2 -0
- package/dist/test/read-mode.test.d.ts.map +1 -0
- package/dist/test/read-mode.test.js +569 -0
- package/dist/test/read-mode.test.js.map +1 -0
- package/dist/test/server/driveOperationsConflictResolution.test.d.ts +2 -0
- package/dist/test/server/driveOperationsConflictResolution.test.d.ts.map +1 -0
- package/dist/test/server/driveOperationsConflictResolution.test.js +486 -0
- package/dist/test/server/driveOperationsConflictResolution.test.js.map +1 -0
- package/dist/test/server/mergeOperations.test.d.ts +2 -0
- package/dist/test/server/mergeOperations.test.d.ts.map +1 -0
- package/dist/test/server/mergeOperations.test.js +115 -0
- package/dist/test/server/mergeOperations.test.js.map +1 -0
- package/dist/test/server/processOperations.test.d.ts +2 -0
- package/dist/test/server/processOperations.test.d.ts.map +1 -0
- package/dist/test/server/processOperations.test.js +392 -0
- package/dist/test/server/processOperations.test.js.map +1 -0
- package/dist/test/server.test.d.ts +2 -0
- package/dist/test/server.test.d.ts.map +1 -0
- package/dist/test/server.test.js +944 -0
- package/dist/test/server.test.js.map +1 -0
- package/dist/test/signature-migration.test.d.ts +2 -0
- package/dist/test/signature-migration.test.d.ts.map +1 -0
- package/dist/test/signature-migration.test.js +241 -0
- package/dist/test/signature-migration.test.js.map +1 -0
- package/dist/test/storage.test.d.ts +2 -0
- package/dist/test/storage.test.d.ts.map +1 -0
- package/dist/test/storage.test.js +522 -0
- package/dist/test/storage.test.js.map +1 -0
- package/dist/test/switchboard-push-listener.test.d.ts +2 -0
- package/dist/test/switchboard-push-listener.test.d.ts.map +1 -0
- package/dist/test/switchboard-push-listener.test.js +133 -0
- package/dist/test/switchboard-push-listener.test.js.map +1 -0
- package/dist/test/sync-manager.test.d.ts +2 -0
- package/dist/test/sync-manager.test.d.ts.map +1 -0
- package/dist/test/sync-manager.test.js +349 -0
- package/dist/test/sync-manager.test.js.map +1 -0
- package/dist/test/utils.d.ts +62 -0
- package/dist/test/utils.d.ts.map +1 -0
- package/dist/test/utils.js +154 -0
- package/dist/test/utils.js.map +1 -0
- package/dist/test/utils.test.d.ts +2 -0
- package/dist/test/utils.test.d.ts.map +1 -0
- package/dist/test/utils.test.js +86 -0
- package/dist/test/utils.test.js.map +1 -0
- package/dist/test/vitest-setup.d.ts +2 -0
- package/dist/test/vitest-setup.d.ts.map +1 -0
- package/dist/test/vitest-setup.js +5 -0
- package/dist/test/vitest-setup.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/dist/vitest.config.d.ts +3 -0
- package/dist/vitest.config.d.ts.map +1 -0
- package/dist/vitest.config.js +28 -0
- package/dist/vitest.config.js.map +1 -0
- package/package.json +37 -26
- package/{dist/src → src}/storage/prisma/client/edge.js +13 -8
- package/{dist/src → src}/storage/prisma/client/index-browser.js +1 -0
- package/{dist/src → src}/storage/prisma/client/index.d.ts +45 -0
- package/{dist/src → src}/storage/prisma/client/index.js +19 -10
- package/src/storage/prisma/client/libquery_engine-darwin-arm64.dylib.node +0 -0
- package/{dist/src/storage/prisma/client/libquery_engine-debian-openssl-3.0.x.so.node → src/storage/prisma/client/libquery_engine-linux-musl.so.node} +0 -0
- package/{dist/src → src}/storage/prisma/client/package.json +1 -1
- package/{dist/src → src}/storage/prisma/client/schema.prisma +4 -2
- package/{dist/src → src}/storage/prisma/client/wasm.js +1 -0
- package/dist/prisma/schema.prisma +0 -91
- package/dist/src/drive-document-model/gen/actions.d.ts +0 -6
- package/dist/src/drive-document-model/gen/actions.d.ts.map +0 -1
- package/dist/src/drive-document-model/gen/actions.js +0 -3
- package/dist/src/drive-document-model/gen/actions.js.map +0 -1
- package/dist/src/drive-document-model/gen/drive/object.d.ts +0 -14
- package/dist/src/drive-document-model/gen/drive/object.d.ts.map +0 -1
- package/dist/src/drive-document-model/gen/drive/object.js +0 -29
- package/dist/src/drive-document-model/gen/drive/object.js.map +0 -1
- package/dist/src/drive-document-model/gen/drive/operations.d.ts +0 -14
- package/dist/src/drive-document-model/gen/drive/operations.d.ts.map +0 -1
- package/dist/src/drive-document-model/gen/drive/operations.js +0 -2
- package/dist/src/drive-document-model/gen/drive/operations.js.map +0 -1
- package/dist/src/drive-document-model/gen/node/object.d.ts +0 -13
- package/dist/src/drive-document-model/gen/node/object.d.ts.map +0 -1
- package/dist/src/drive-document-model/gen/node/object.js +0 -26
- package/dist/src/drive-document-model/gen/node/object.js.map +0 -1
- package/dist/src/drive-document-model/gen/node/operations.d.ts +0 -13
- package/dist/src/drive-document-model/gen/node/operations.d.ts.map +0 -1
- package/dist/src/drive-document-model/gen/node/operations.js +0 -2
- package/dist/src/drive-document-model/gen/node/operations.js.map +0 -1
- package/dist/src/drive-document-model/gen/object.d.ts +0 -18
- package/dist/src/drive-document-model/gen/object.d.ts.map +0 -1
- package/dist/src/drive-document-model/gen/object.js +0 -28
- package/dist/src/drive-document-model/gen/object.js.map +0 -1
- package/dist/tsconfig.lib.tsbuildinfo +0 -1
- /package/{dist/src → src}/storage/prisma/client/default.d.ts +0 -0
- /package/{dist/src → src}/storage/prisma/client/default.js +0 -0
- /package/{dist/src → src}/storage/prisma/client/edge.d.ts +0 -0
- /package/{dist/src → src}/storage/prisma/client/runtime/edge-esm.js +0 -0
- /package/{dist/src → src}/storage/prisma/client/runtime/edge.js +0 -0
- /package/{dist/src → src}/storage/prisma/client/runtime/index-browser.d.ts +0 -0
- /package/{dist/src → src}/storage/prisma/client/runtime/index-browser.js +0 -0
- /package/{dist/src → src}/storage/prisma/client/runtime/library.d.ts +0 -0
- /package/{dist/src → src}/storage/prisma/client/runtime/library.js +0 -0
- /package/{dist/src → src}/storage/prisma/client/runtime/react-native.js +0 -0
- /package/{dist/src → src}/storage/prisma/client/runtime/wasm.js +0 -0
- /package/{dist/src → src}/storage/prisma/client/wasm.d.ts +0 -0
|
@@ -1,19 +1,8 @@
|
|
|
1
|
-
import { removeListener, removeTrigger, setSharingType, } from "
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { DefaultDrivesManager, } from "#utils/default-drives-manager";
|
|
6
|
-
import { requestPublicDriveWithTokenFromReactor } from "#utils/graphql";
|
|
7
|
-
import { isDocumentDrive, runAsapAsync } from "#utils/misc";
|
|
8
|
-
import { RunAsap } from "#utils/run-asap";
|
|
9
|
-
import { DocumentAlreadyExistsError, childLogger, } from "document-drive";
|
|
10
|
-
import { attachBranch, createPresignedHeader, garbageCollect, garbageCollectDocumentOperations, groupOperationsByScope, merge, precedes, removeExistingOperations, replayDocument, reshuffleByTimestamp, skipHeaderOperations, sortOperations, validateHeader, } from "document-model";
|
|
1
|
+
import { ConflictOperationError, DefaultDrivesManager, DefaultListenerManagerOptions, DocumentAlreadyExistsError, OperationError, PullResponderTransmitter, ReadModeServer, SwitchboardPushTransmitter, childLogger, driveCreateDocument, filterOperationsByRevision, isActionJob, isAtRevision, isDocumentDrive, isDocumentJob, isOperationJob, removeListener, removeTrigger, requestPublicDriveWithTokenFromReactor, resolveCreateDocumentInput, setSharingType, } from "document-drive";
|
|
2
|
+
import { runAsap, runAsapAsync } from "document-drive/run-asap";
|
|
3
|
+
import {} from "document-model";
|
|
4
|
+
import { attachBranch, createPresignedHeader, defaultBaseState, garbageCollect, garbageCollectDocumentOperations, groupOperationsByScope, hashDocumentStateForScope, merge, precedes, removeExistingOperations, replayDocument, reshuffleByTimestamp, skipHeaderOperations, sortOperations, validateHeader, } from "document-model/core";
|
|
11
5
|
import { ClientError } from "graphql-request";
|
|
12
|
-
import { ConflictOperationError, OperationError, } from "./error.js";
|
|
13
|
-
import { PullResponderTransmitter, } from "./listener/transmitter/pull-responder.js";
|
|
14
|
-
import { SwitchboardPushTransmitter } from "./listener/transmitter/switchboard-push.js";
|
|
15
|
-
import { DefaultListenerManagerOptions, } from "./types.js";
|
|
16
|
-
import { filterOperationsByRevision, isAtRevision, resolveCreateDocumentInput, } from "./utils.js";
|
|
17
6
|
export class BaseDocumentDriveServer {
|
|
18
7
|
logger = childLogger(["BaseDocumentDriveServer"]);
|
|
19
8
|
// external dependencies
|
|
@@ -47,18 +36,19 @@ export class BaseDocumentDriveServer {
|
|
|
47
36
|
? this.processDriveActions(documentId, actions, options)
|
|
48
37
|
: this.processActions(documentId, actions, options);
|
|
49
38
|
},
|
|
50
|
-
processDocumentJob: async ({ documentId, documentType, initialState, options, }) => {
|
|
39
|
+
processDocumentJob: async ({ documentId, documentType, header: inputHeader, initialState, options, }) => {
|
|
51
40
|
const documentModelModule = this.getDocumentModelModule(documentType);
|
|
52
|
-
const document = documentModelModule.utils.createDocument(
|
|
53
|
-
...initialState,
|
|
54
|
-
});
|
|
41
|
+
const document = documentModelModule.utils.createDocument(initialState);
|
|
55
42
|
// TODO: header must be included
|
|
56
43
|
const header = createPresignedHeader(documentId, documentType);
|
|
57
44
|
document.header.id = documentId;
|
|
58
45
|
document.header.sig = header.sig;
|
|
59
46
|
document.header.documentType = documentType;
|
|
47
|
+
if (inputHeader) {
|
|
48
|
+
document.header.meta = inputHeader.meta;
|
|
49
|
+
}
|
|
60
50
|
try {
|
|
61
|
-
const createdDocument = await this.createDocument({ document }, options?.source ?? { type: "local" },
|
|
51
|
+
const createdDocument = await this.createDocument({ document }, options?.source ?? { type: "local" }, document.header.meta);
|
|
62
52
|
return {
|
|
63
53
|
status: "SUCCESS",
|
|
64
54
|
operations: [],
|
|
@@ -95,6 +85,7 @@ export class BaseDocumentDriveServer {
|
|
|
95
85
|
// internal state
|
|
96
86
|
triggerMap = new Map();
|
|
97
87
|
initializePromise;
|
|
88
|
+
enableDualActionCreate;
|
|
98
89
|
constructor(documentModelModules, storage, documentStorage, cache, queueManager, eventEmitter, synchronizationManager, listenerManager, options) {
|
|
99
90
|
this.documentModelModules = documentModelModules;
|
|
100
91
|
this.legacyStorage = storage;
|
|
@@ -117,9 +108,17 @@ export class BaseDocumentDriveServer {
|
|
|
117
108
|
? () => Promise.resolve("")
|
|
118
109
|
: options.jwtHandler,
|
|
119
110
|
taskQueueMethod: options?.taskQueueMethod === undefined
|
|
120
|
-
?
|
|
111
|
+
? runAsap
|
|
121
112
|
: options.taskQueueMethod,
|
|
113
|
+
featureFlags: {
|
|
114
|
+
...options?.featureFlags,
|
|
115
|
+
},
|
|
122
116
|
};
|
|
117
|
+
this.enableDualActionCreate =
|
|
118
|
+
options?.featureFlags?.enableDualActionCreate ?? false;
|
|
119
|
+
if (this.enableDualActionCreate) {
|
|
120
|
+
this.logger.warn("Dual action create is enabled.");
|
|
121
|
+
}
|
|
123
122
|
// todo: move to external dependencies
|
|
124
123
|
this.defaultDrivesManager = new DefaultDrivesManager(this, this.defaultDrivesManagerDelegate, options);
|
|
125
124
|
this.initializePromise = this._initialize();
|
|
@@ -136,7 +135,7 @@ export class BaseDocumentDriveServer {
|
|
|
136
135
|
await this.listenerManager.initialize(this.handleListenerError.bind(this));
|
|
137
136
|
await this.queueManager.init(this.queueDelegate, (error) => {
|
|
138
137
|
this.logger.error(`Error initializing queue manager`, error);
|
|
139
|
-
errors.push(error);
|
|
138
|
+
// errors.push(error);
|
|
140
139
|
});
|
|
141
140
|
try {
|
|
142
141
|
await this.defaultDrivesManager.removeOldremoteDrives();
|
|
@@ -328,7 +327,7 @@ export class BaseDocumentDriveServer {
|
|
|
328
327
|
}
|
|
329
328
|
}
|
|
330
329
|
getDocumentModelModule(documentType) {
|
|
331
|
-
const documentModelModule = this.documentModelModules.find((module) => module.documentModel.id === documentType);
|
|
330
|
+
const documentModelModule = this.documentModelModules.find((module) => module.documentModel.global.id === documentType);
|
|
332
331
|
if (!documentModelModule) {
|
|
333
332
|
throw new Error(`Document type ${documentType} not supported`);
|
|
334
333
|
}
|
|
@@ -337,17 +336,25 @@ export class BaseDocumentDriveServer {
|
|
|
337
336
|
getDocumentModelModules() {
|
|
338
337
|
return [...this.documentModelModules];
|
|
339
338
|
}
|
|
340
|
-
addDocument(
|
|
341
|
-
|
|
339
|
+
addDocument(documentOrType, meta) {
|
|
340
|
+
const input = typeof documentOrType === "string"
|
|
341
|
+
? { documentType: documentOrType }
|
|
342
|
+
: { document: documentOrType };
|
|
343
|
+
return this.createDocument(input, { type: "local" }, meta);
|
|
342
344
|
}
|
|
343
345
|
async addDrive(input, preferredEditor) {
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
346
|
+
// Create document with custom global and local state
|
|
347
|
+
const document = driveCreateDocument({
|
|
348
|
+
global: {
|
|
349
|
+
nodes: [],
|
|
350
|
+
icon: null,
|
|
351
|
+
...input.global,
|
|
352
|
+
},
|
|
353
|
+
local: {
|
|
354
|
+
availableOffline: input.local?.availableOffline ?? false,
|
|
355
|
+
sharingType: input.local?.sharingType ?? "public",
|
|
356
|
+
listeners: input.local?.listeners ?? [],
|
|
357
|
+
triggers: input.local?.triggers ?? [],
|
|
351
358
|
},
|
|
352
359
|
});
|
|
353
360
|
if (input.id && input.id.length > 0) {
|
|
@@ -356,9 +363,10 @@ export class BaseDocumentDriveServer {
|
|
|
356
363
|
if (input.slug && input.slug.length > 0) {
|
|
357
364
|
document.header.slug = input.slug;
|
|
358
365
|
}
|
|
359
|
-
|
|
366
|
+
const editorToUse = input.preferredEditor || preferredEditor;
|
|
367
|
+
if (editorToUse) {
|
|
360
368
|
document.header.meta = {
|
|
361
|
-
preferredEditor:
|
|
369
|
+
preferredEditor: editorToUse,
|
|
362
370
|
};
|
|
363
371
|
}
|
|
364
372
|
await this.documentStorage.create(document);
|
|
@@ -545,6 +553,14 @@ export class BaseDocumentDriveServer {
|
|
|
545
553
|
}
|
|
546
554
|
}
|
|
547
555
|
async createDocument(input, source, meta) {
|
|
556
|
+
if (this.enableDualActionCreate) {
|
|
557
|
+
return this.createDocumentDualAction(input, source, meta);
|
|
558
|
+
}
|
|
559
|
+
else {
|
|
560
|
+
return this.createDocumentLegacy(input, source, meta);
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
async createDocumentLegacy(input, source, meta) {
|
|
548
564
|
const { documentType, document: inputDocument } = resolveCreateDocumentInput(input);
|
|
549
565
|
// if a document was provided then checks if it's valid
|
|
550
566
|
let state = undefined;
|
|
@@ -558,9 +574,7 @@ export class BaseDocumentDriveServer {
|
|
|
558
574
|
}
|
|
559
575
|
// if no document was provided then create a new one
|
|
560
576
|
const document = inputDocument ??
|
|
561
|
-
this.getDocumentModelModule(documentType).utils.createDocument(
|
|
562
|
-
state,
|
|
563
|
-
});
|
|
577
|
+
this.getDocumentModelModule(documentType).utils.createDocument(state);
|
|
564
578
|
// get the header
|
|
565
579
|
let header;
|
|
566
580
|
// handle the legacy case where an id is provided
|
|
@@ -609,11 +623,9 @@ export class BaseDocumentDriveServer {
|
|
|
609
623
|
// stores document information
|
|
610
624
|
const documentStorage = {
|
|
611
625
|
header,
|
|
612
|
-
history: document.history,
|
|
613
626
|
operations: { global: [], local: [] },
|
|
614
627
|
initialState: document.initialState,
|
|
615
628
|
clipboard: [],
|
|
616
|
-
attachments: document.attachments,
|
|
617
629
|
state: state ?? document.state,
|
|
618
630
|
};
|
|
619
631
|
await this.documentStorage.create(documentStorage);
|
|
@@ -646,7 +658,172 @@ export class BaseDocumentDriveServer {
|
|
|
646
658
|
await this.legacyStorage.addDocumentOperations(header.id, operations, document);
|
|
647
659
|
}
|
|
648
660
|
}
|
|
649
|
-
return
|
|
661
|
+
return await this.getDocument(documentStorage.header.id);
|
|
662
|
+
}
|
|
663
|
+
async createDocumentDualAction(input, source, meta) {
|
|
664
|
+
const { documentType, document: inputDocument } = resolveCreateDocumentInput(input);
|
|
665
|
+
// if a document was provided then checks if it's valid
|
|
666
|
+
let state = undefined;
|
|
667
|
+
if (inputDocument) {
|
|
668
|
+
if ("documentType" in input &&
|
|
669
|
+
documentType !== inputDocument.header.documentType) {
|
|
670
|
+
throw new Error(`Provided document is not ${documentType}`);
|
|
671
|
+
}
|
|
672
|
+
const doc = this._buildDocument(inputDocument);
|
|
673
|
+
state = doc.state;
|
|
674
|
+
}
|
|
675
|
+
// if no document was provided then create a new one
|
|
676
|
+
const document = inputDocument ??
|
|
677
|
+
this.getDocumentModelModule(documentType).utils.createDocument(state);
|
|
678
|
+
// get the header
|
|
679
|
+
let header;
|
|
680
|
+
// handle the legacy case where an id is provided
|
|
681
|
+
let isSigned = false;
|
|
682
|
+
if ("id" in input && input.id) {
|
|
683
|
+
if (inputDocument) {
|
|
684
|
+
header = document.header;
|
|
685
|
+
document.header.id = input.id;
|
|
686
|
+
this.logger.warn("Assigning an id to a document is deprecated. Use the header field instead.");
|
|
687
|
+
}
|
|
688
|
+
else {
|
|
689
|
+
this.logger.warn("Creating a document with an id is deprecated. Use the header field instead.");
|
|
690
|
+
header = createPresignedHeader(input.id, documentType);
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
else if ("header" in input) {
|
|
694
|
+
// validate the header passed in
|
|
695
|
+
await validateHeader(input.header);
|
|
696
|
+
isSigned = true;
|
|
697
|
+
header = input.header;
|
|
698
|
+
}
|
|
699
|
+
else if (inputDocument?.header) {
|
|
700
|
+
if (!inputDocument.header.id) {
|
|
701
|
+
throw new Error("Document header id is required");
|
|
702
|
+
}
|
|
703
|
+
if (!inputDocument.header.documentType) {
|
|
704
|
+
throw new Error("Document header documentType is required");
|
|
705
|
+
}
|
|
706
|
+
if (!inputDocument.header.createdAtUtcIso) {
|
|
707
|
+
throw new Error("Document header createdAtUtcIso is required");
|
|
708
|
+
}
|
|
709
|
+
if (!inputDocument.header.sig.nonce) {
|
|
710
|
+
this.logger.warn("Creating a document with an unsigned id is deprecated. Use createSignedHeaderForSigner.");
|
|
711
|
+
// throw new Error("Document header sig nonce is required"); TODO: uncomment when ready to enforce signed documents
|
|
712
|
+
}
|
|
713
|
+
else {
|
|
714
|
+
await validateHeader(inputDocument.header);
|
|
715
|
+
isSigned = true;
|
|
716
|
+
}
|
|
717
|
+
header = inputDocument.header;
|
|
718
|
+
}
|
|
719
|
+
else {
|
|
720
|
+
// otherwise, generate a header
|
|
721
|
+
header = createPresignedHeader(undefined, documentType);
|
|
722
|
+
isSigned = false;
|
|
723
|
+
}
|
|
724
|
+
if (meta) {
|
|
725
|
+
header.meta = { ...header.meta, ...meta };
|
|
726
|
+
}
|
|
727
|
+
const currentVersion = "0.1.0";
|
|
728
|
+
// Get initial state from input or model's defaultState
|
|
729
|
+
const initialState = state ?? document.state;
|
|
730
|
+
// Check if the input document already has operations
|
|
731
|
+
const existingOperations = Object.values(document.operations).flat();
|
|
732
|
+
const shouldCreateOperations = existingOperations.length === 0;
|
|
733
|
+
let operations = [];
|
|
734
|
+
if (shouldCreateOperations) {
|
|
735
|
+
const timestampUtcMs = new Date().toISOString();
|
|
736
|
+
// Determine if this is a signed document
|
|
737
|
+
const signing = isSigned
|
|
738
|
+
? {
|
|
739
|
+
signature: header.id, // The document ID is the signature
|
|
740
|
+
publicKey: header.sig.publicKey,
|
|
741
|
+
nonce: header.sig.nonce,
|
|
742
|
+
createdAtUtcIso: header.createdAtUtcIso,
|
|
743
|
+
documentType: header.documentType,
|
|
744
|
+
}
|
|
745
|
+
: undefined;
|
|
746
|
+
// Create actions for CREATE_DOCUMENT and UPGRADE_DOCUMENT
|
|
747
|
+
const createDocumentInput = {
|
|
748
|
+
model: documentType,
|
|
749
|
+
version: "0.0.0",
|
|
750
|
+
documentId: header.id,
|
|
751
|
+
signing,
|
|
752
|
+
};
|
|
753
|
+
const createDocumentAction = {
|
|
754
|
+
id: `${header.id}-create`,
|
|
755
|
+
type: "CREATE_DOCUMENT",
|
|
756
|
+
timestampUtcMs,
|
|
757
|
+
input: createDocumentInput,
|
|
758
|
+
scope: "global",
|
|
759
|
+
};
|
|
760
|
+
const upgradeDocumentInput = {
|
|
761
|
+
model: documentType,
|
|
762
|
+
fromVersion: "0.0.0",
|
|
763
|
+
toVersion: currentVersion,
|
|
764
|
+
documentId: header.id,
|
|
765
|
+
initialState,
|
|
766
|
+
};
|
|
767
|
+
const upgradeDocumentAction = {
|
|
768
|
+
id: `${header.id}-upgrade`,
|
|
769
|
+
type: "UPGRADE_DOCUMENT",
|
|
770
|
+
timestampUtcMs,
|
|
771
|
+
input: upgradeDocumentInput,
|
|
772
|
+
scope: "global",
|
|
773
|
+
};
|
|
774
|
+
// we need to create hashes for later verification
|
|
775
|
+
const baseState = defaultBaseState();
|
|
776
|
+
const createStateForHash = {
|
|
777
|
+
state: baseState,
|
|
778
|
+
};
|
|
779
|
+
const createHash = hashDocumentStateForScope(createStateForHash, "document");
|
|
780
|
+
const upgradeStateForHash = {
|
|
781
|
+
state: initialState,
|
|
782
|
+
};
|
|
783
|
+
const upgradeHash = hashDocumentStateForScope(upgradeStateForHash,
|
|
784
|
+
// this is bad! there may not be a global scope
|
|
785
|
+
"global");
|
|
786
|
+
// Create operations from actions with computed hashes
|
|
787
|
+
operations = [
|
|
788
|
+
{
|
|
789
|
+
index: 0,
|
|
790
|
+
skip: 0,
|
|
791
|
+
hash: createHash,
|
|
792
|
+
timestampUtcMs,
|
|
793
|
+
action: createDocumentAction,
|
|
794
|
+
},
|
|
795
|
+
{
|
|
796
|
+
index: 1,
|
|
797
|
+
skip: 0,
|
|
798
|
+
hash: upgradeHash,
|
|
799
|
+
timestampUtcMs,
|
|
800
|
+
action: upgradeDocumentAction,
|
|
801
|
+
},
|
|
802
|
+
];
|
|
803
|
+
}
|
|
804
|
+
else {
|
|
805
|
+
// Use existing operations from the input document
|
|
806
|
+
operations = existingOperations;
|
|
807
|
+
}
|
|
808
|
+
// stores document information with empty operations initially
|
|
809
|
+
const documentToStore = {
|
|
810
|
+
header,
|
|
811
|
+
operations: { global: [], local: [] },
|
|
812
|
+
initialState: document.initialState,
|
|
813
|
+
clipboard: [],
|
|
814
|
+
state: initialState,
|
|
815
|
+
};
|
|
816
|
+
await this.documentStorage.create(documentToStore);
|
|
817
|
+
// Store operations separately (if any)
|
|
818
|
+
if (operations.length > 0) {
|
|
819
|
+
if (isDocumentDrive(documentToStore)) {
|
|
820
|
+
await this.legacyStorage.addDriveOperations(header.id, operations, documentToStore);
|
|
821
|
+
}
|
|
822
|
+
else {
|
|
823
|
+
await this.legacyStorage.addDocumentOperations(header.id, operations, documentToStore);
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
return await this.getDocument(documentToStore.header.id);
|
|
650
827
|
}
|
|
651
828
|
async deleteDocument(documentId) {
|
|
652
829
|
try {
|
|
@@ -741,8 +918,8 @@ export class BaseDocumentDriveServer {
|
|
|
741
918
|
// to retrieve it from the db to avoid rerunning all the operations
|
|
742
919
|
if (lastRemainingOperation && !lastRemainingOperation.resultingState) {
|
|
743
920
|
lastRemainingOperation.resultingState = await (isDocumentDrive(document)
|
|
744
|
-
? this.legacyStorage.getOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.scope, "main")
|
|
745
|
-
: this.legacyStorage.getDriveOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.scope, "main"));
|
|
921
|
+
? this.legacyStorage.getOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.action.scope, "main")
|
|
922
|
+
: this.legacyStorage.getDriveOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.action.scope, "main"));
|
|
746
923
|
}
|
|
747
924
|
}
|
|
748
925
|
return {
|
|
@@ -761,17 +938,49 @@ export class BaseDocumentDriveServer {
|
|
|
761
938
|
? filterOperationsByRevision(documentStorage.operations, options.revisions)
|
|
762
939
|
: documentStorage.operations;
|
|
763
940
|
const operations = garbageCollectDocumentOperations(revisionOperations);
|
|
764
|
-
|
|
941
|
+
// for backward compatibility, we need to add global and local
|
|
942
|
+
const headerOperations = { global: [], local: [] };
|
|
943
|
+
const operationsToReplay = { global: [], local: [] };
|
|
944
|
+
// Filter out CREATE_DOCUMENT and UPGRADE_DOCUMENT operations
|
|
945
|
+
// (these don't currently have reducers and should not be replayed)
|
|
946
|
+
for (const [scope, scopeOps] of Object.entries(operations)) {
|
|
947
|
+
for (const op of scopeOps) {
|
|
948
|
+
if (op.action.type === "CREATE_DOCUMENT" ||
|
|
949
|
+
op.action.type === "UPGRADE_DOCUMENT") {
|
|
950
|
+
headerOperations[scope].push(op);
|
|
951
|
+
}
|
|
952
|
+
else {
|
|
953
|
+
operationsToReplay[scope].push(op);
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
}
|
|
957
|
+
const replayed = replayDocument(documentStorage.initialState, operationsToReplay, documentModelModule.reducer, undefined, documentStorage.header, undefined, {
|
|
765
958
|
...options,
|
|
766
959
|
checkHashes: options?.checkHashes ?? true,
|
|
767
960
|
reuseOperationResultingState: options?.checkHashes ?? true,
|
|
768
961
|
});
|
|
962
|
+
// merge header operations back into the result
|
|
963
|
+
const allScopes = new Set([
|
|
964
|
+
...Object.keys(headerOperations),
|
|
965
|
+
...Object.keys(replayed.operations),
|
|
966
|
+
]);
|
|
967
|
+
const finalOperations = {};
|
|
968
|
+
for (const scope of allScopes) {
|
|
969
|
+
finalOperations[scope] = [
|
|
970
|
+
...headerOperations[scope],
|
|
971
|
+
...replayed.operations[scope],
|
|
972
|
+
];
|
|
973
|
+
}
|
|
974
|
+
return {
|
|
975
|
+
...replayed,
|
|
976
|
+
operations: finalOperations,
|
|
977
|
+
};
|
|
769
978
|
}
|
|
770
979
|
async _performOperation(documentId, document, operation, skipHashValidation = false) {
|
|
771
980
|
const documentModelModule = this.getDocumentModelModule(document.header.documentType);
|
|
772
981
|
const signalResults = [];
|
|
773
982
|
let newDocument = document;
|
|
774
|
-
const scope = operation.scope;
|
|
983
|
+
const scope = operation.action.scope;
|
|
775
984
|
const documentOperations = garbageCollectDocumentOperations({
|
|
776
985
|
...document.operations,
|
|
777
986
|
[scope]: skipHeaderOperations(document.operations[scope], operation),
|
|
@@ -781,11 +990,11 @@ export class BaseDocumentDriveServer {
|
|
|
781
990
|
// to retrieve it from the db to avoid rerunning all the operations
|
|
782
991
|
if (lastRemainingOperation && !lastRemainingOperation.resultingState) {
|
|
783
992
|
lastRemainingOperation.resultingState = await (isDocumentDrive(document)
|
|
784
|
-
? this.legacyStorage.getOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.scope, "main")
|
|
785
|
-
: this.legacyStorage.getDriveOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.scope, "main"));
|
|
993
|
+
? this.legacyStorage.getOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.action.scope, "main")
|
|
994
|
+
: this.legacyStorage.getDriveOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.action.scope, "main"));
|
|
786
995
|
}
|
|
787
996
|
const operationSignals = [];
|
|
788
|
-
newDocument = documentModelModule.reducer(newDocument, operation, (signal) => {
|
|
997
|
+
newDocument = documentModelModule.reducer(newDocument, operation.action, (signal) => {
|
|
789
998
|
let handler = undefined;
|
|
790
999
|
switch (signal.type) {
|
|
791
1000
|
case "CREATE_CHILD_DOCUMENT":
|
|
@@ -801,8 +1010,12 @@ export class BaseDocumentDriveServer {
|
|
|
801
1010
|
if (handler) {
|
|
802
1011
|
operationSignals.push(() => handler().then((result) => ({ signal, result })));
|
|
803
1012
|
}
|
|
804
|
-
}, {
|
|
805
|
-
|
|
1013
|
+
}, {
|
|
1014
|
+
skip: operation.skip,
|
|
1015
|
+
reuseOperationResultingState: true,
|
|
1016
|
+
replayOptions: { operation },
|
|
1017
|
+
});
|
|
1018
|
+
const appliedOperations = newDocument.operations[operation.action.scope].filter((op) => op.index == operation.index && op.skip == operation.skip);
|
|
806
1019
|
const appliedOperation = appliedOperations.at(0);
|
|
807
1020
|
if (!appliedOperation) {
|
|
808
1021
|
throw new OperationError("ERROR", operation, `Operation with index ${operation.index}:${operation.skip} was not applied.`);
|
|
@@ -889,7 +1102,8 @@ export class BaseDocumentDriveServer {
|
|
|
889
1102
|
jobId = await this.queueManager.addJob({
|
|
890
1103
|
documentId: id,
|
|
891
1104
|
documentType,
|
|
892
|
-
initialState: document,
|
|
1105
|
+
initialState: document?.state,
|
|
1106
|
+
header: document?.header,
|
|
893
1107
|
options,
|
|
894
1108
|
});
|
|
895
1109
|
}
|
|
@@ -921,9 +1135,9 @@ export class BaseDocumentDriveServer {
|
|
|
921
1135
|
try {
|
|
922
1136
|
const document = await this.getDocument(id);
|
|
923
1137
|
const newOperation = operations.find((op) => !op.id ||
|
|
924
|
-
!document.operations[op.scope].find((existingOp) => existingOp.id === op.id &&
|
|
1138
|
+
!document.operations[op.action.scope].find((existingOp) => existingOp.id === op.id &&
|
|
925
1139
|
existingOp.index === op.index &&
|
|
926
|
-
existingOp.type === op.type &&
|
|
1140
|
+
existingOp.action.type === op.action.type &&
|
|
927
1141
|
existingOp.hash === op.hash));
|
|
928
1142
|
if (!newOperation) {
|
|
929
1143
|
return {
|
|
@@ -1155,10 +1369,10 @@ export class BaseDocumentDriveServer {
|
|
|
1155
1369
|
const syncUnit = {
|
|
1156
1370
|
documentId,
|
|
1157
1371
|
documentType: document.header.documentType,
|
|
1158
|
-
scope: operation.scope,
|
|
1372
|
+
scope: operation.action.scope,
|
|
1159
1373
|
branch: "main", // TODO: handle branches
|
|
1160
1374
|
revision: operation.index + 1,
|
|
1161
|
-
lastUpdated: operation.
|
|
1375
|
+
lastUpdated: operation.timestampUtcMs,
|
|
1162
1376
|
};
|
|
1163
1377
|
// checks if this sync unit was already added
|
|
1164
1378
|
const exists = syncUnits.some((unit) => unit.documentId === syncUnit.documentId &&
|
|
@@ -1277,9 +1491,9 @@ export class BaseDocumentDriveServer {
|
|
|
1277
1491
|
try {
|
|
1278
1492
|
const drive = await this.getDrive(driveId);
|
|
1279
1493
|
const newOperation = operations.find((op) => !op.id ||
|
|
1280
|
-
!drive.operations[op.scope].find((existingOp) => existingOp.id === op.id &&
|
|
1494
|
+
!drive.operations[op.action.scope].find((existingOp) => existingOp.id === op.id &&
|
|
1281
1495
|
existingOp.index === op.index &&
|
|
1282
|
-
existingOp.type === op.type &&
|
|
1496
|
+
existingOp.action.type === op.action.type &&
|
|
1283
1497
|
existingOp.hash === op.hash));
|
|
1284
1498
|
if (!newOperation) {
|
|
1285
1499
|
return {
|
|
@@ -1370,7 +1584,7 @@ export class BaseDocumentDriveServer {
|
|
|
1370
1584
|
this.cache.setDrive(driveId, document).catch(this.logger.error);
|
|
1371
1585
|
// update listener cache
|
|
1372
1586
|
const lastOperation = operationsApplied
|
|
1373
|
-
.filter((op) => op.scope === "global")
|
|
1587
|
+
.filter((op) => op.action.scope === "global")
|
|
1374
1588
|
.slice()
|
|
1375
1589
|
.pop();
|
|
1376
1590
|
if (lastOperation) {
|
|
@@ -1393,7 +1607,7 @@ export class BaseDocumentDriveServer {
|
|
|
1393
1607
|
documentType: document.header.documentType,
|
|
1394
1608
|
scope: "global",
|
|
1395
1609
|
branch: "main",
|
|
1396
|
-
lastUpdated: lastOperation.
|
|
1610
|
+
lastUpdated: lastOperation.timestampUtcMs,
|
|
1397
1611
|
revision: lastOperation.index,
|
|
1398
1612
|
},
|
|
1399
1613
|
], source, () => {
|
|
@@ -1516,7 +1730,7 @@ export class BaseDocumentDriveServer {
|
|
|
1516
1730
|
}
|
|
1517
1731
|
async _legacyAddFileAction(driveId, action, options) {
|
|
1518
1732
|
// create document before adding it to the drive
|
|
1519
|
-
const document = this.getDocumentModelModule(action.input.documentType).utils.createDocument(
|
|
1733
|
+
const document = this.getDocumentModelModule(action.input.documentType).utils.createDocument(action.input.document?.state || undefined);
|
|
1520
1734
|
document.header.id = action.input.id;
|
|
1521
1735
|
document.header.name = action.input.name;
|
|
1522
1736
|
document.header.documentType = action.input.documentType;
|
|
@@ -1587,6 +1801,14 @@ export class BaseDocumentDriveServer {
|
|
|
1587
1801
|
}
|
|
1588
1802
|
const operations = strand.operations.map((op) => ({
|
|
1589
1803
|
...op,
|
|
1804
|
+
action: {
|
|
1805
|
+
id: op.actionId,
|
|
1806
|
+
timestampUtcMs: op.timestampUtcMs,
|
|
1807
|
+
type: op.type,
|
|
1808
|
+
input: op.input,
|
|
1809
|
+
context: op.context,
|
|
1810
|
+
scope: strand.scope,
|
|
1811
|
+
},
|
|
1590
1812
|
scope: strand.scope,
|
|
1591
1813
|
branch: strand.branch,
|
|
1592
1814
|
}));
|