document-drive 5.0.0-staging.9 → 5.0.1-staging.2
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 -32
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -20
- package/dist/index.js.map +1 -1
- package/dist/prisma/schema.prisma +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/cache/util.js +11 -9
- package/dist/src/cache/util.js.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 -6
- package/dist/src/drive-document-model/gen/index.d.ts.map +1 -1
- package/dist/src/drive-document-model/gen/index.js +7 -5
- 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 +5 -20
- package/dist/src/drive-document-model/gen/ph-factories.d.ts.map +1 -1
- package/dist/src/drive-document-model/gen/ph-factories.js +1 -13
- package/dist/src/drive-document-model/gen/ph-factories.js.map +1 -1
- 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 +5 -6
- 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 -34
- 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 +3 -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 +5 -8
- 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 +2 -1
- package/dist/src/drive-document-model/src/tests/generate-mock.d.ts.map +1 -1
- package/dist/src/drive-document-model/src/tests/node.test.js +32 -35
- 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 +1 -6
- package/dist/src/drive-document-model/src/tests/test-factories.d.ts.map +1 -1
- package/dist/src/drive-document-model/src/tests/test-factories.js +4 -11
- package/dist/src/drive-document-model/src/tests/test-factories.js.map +1 -1
- 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 +1 -7
- package/dist/src/drive-document-model/src/utils.d.ts.map +1 -1
- 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 +3 -5
- package/dist/src/processors/processor-manager.js.map +1 -1
- package/dist/src/processors/relational.d.ts +3 -15
- 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 +16 -7
- 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 +3 -4
- package/dist/src/queue/event.d.ts.map +1 -1
- package/dist/src/queue/event.js +2 -5
- 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 +1 -4
- 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 +2 -3
- 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 +2 -6
- package/dist/src/read-mode/types.d.ts.map +1 -1
- package/dist/src/server/base-server.d.ts +17 -26
- package/dist/src/server/base-server.d.ts.map +1 -1
- package/dist/src/server/base-server.js +304 -36
- 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 +1 -1
- package/dist/src/server/error.d.ts.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 +2 -5
- 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 -22
- package/dist/src/server/listener/transmitter/internal.d.ts.map +1 -1
- package/dist/src/server/listener/transmitter/internal.js +11 -16
- 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 +3 -7
- 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 +1 -3
- 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 +4 -7
- 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 +46 -32
- 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 +1 -2
- package/dist/src/server/utils.d.ts.map +1 -1
- package/dist/src/server/utils.js +7 -5
- package/dist/src/server/utils.js.map +1 -1
- package/dist/src/storage/browser.d.ts +2 -2
- package/dist/src/storage/browser.d.ts.map +1 -1
- package/dist/src/storage/browser.js +5 -7
- package/dist/src/storage/browser.js.map +1 -1
- package/dist/src/storage/filesystem.d.ts +3 -3
- package/dist/src/storage/filesystem.d.ts.map +1 -1
- package/dist/src/storage/filesystem.js +27 -8
- 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 +5 -3
- package/dist/src/storage/ipfs.js.map +1 -1
- package/dist/src/storage/memory.d.ts +3 -3
- package/dist/src/storage/memory.d.ts.map +1 -1
- package/dist/src/storage/memory.js +30 -13
- package/dist/src/storage/memory.js.map +1 -1
- package/dist/src/storage/prisma/client/edge.js +11 -7
- package/dist/src/storage/prisma/client/index.js +17 -9
- package/dist/src/storage/prisma/client/libquery_engine-darwin-arm64.dylib.node +0 -0
- package/dist/src/storage/prisma/client/package.json +1 -1
- package/dist/src/storage/prisma/client/schema.prisma +1 -1
- package/dist/src/storage/prisma/factory.d.ts +3 -2
- package/dist/src/storage/prisma/factory.d.ts.map +1 -1
- package/dist/src/storage/prisma/factory.js +6 -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 +27 -20
- 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 +13 -5
- package/dist/src/utils/gql-transformations.d.ts.map +1 -1
- package/dist/src/utils/gql-transformations.js +10 -3
- package/dist/src/utils/gql-transformations.js.map +1 -1
- package/dist/src/utils/graphql.d.ts +4 -30
- package/dist/src/utils/graphql.d.ts.map +1 -1
- package/dist/src/utils/graphql.js +3 -4
- 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 +7 -2
- 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 +3 -6
- 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 +187 -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 +957 -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 +158 -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 +38 -26
- package/prisma/schema.prisma +93 -0
- package/src/storage/prisma/client/default.d.ts +1 -0
- package/src/storage/prisma/client/default.js +1 -0
- package/src/storage/prisma/client/edge.d.ts +1 -0
- package/src/storage/prisma/client/edge.js +263 -0
- package/src/storage/prisma/client/index-browser.js +246 -0
- package/src/storage/prisma/client/index.d.ts +10318 -0
- package/src/storage/prisma/client/index.js +292 -0
- package/src/storage/prisma/client/libquery_engine-darwin-arm64.dylib.node +0 -0
- package/src/storage/prisma/client/libquery_engine-debian-openssl-3.0.x.so.node +0 -0
- package/src/storage/prisma/client/libquery_engine-linux-musl.so.node +0 -0
- package/src/storage/prisma/client/package.json +84 -0
- package/src/storage/prisma/client/runtime/edge-esm.js +31 -0
- package/src/storage/prisma/client/runtime/edge.js +31 -0
- package/src/storage/prisma/client/runtime/index-browser.d.ts +365 -0
- package/src/storage/prisma/client/runtime/index-browser.js +13 -0
- package/src/storage/prisma/client/runtime/library.d.ts +3273 -0
- package/src/storage/prisma/client/runtime/library.js +143 -0
- package/src/storage/prisma/client/runtime/react-native.js +80 -0
- package/src/storage/prisma/client/runtime/wasm.js +32 -0
- package/src/storage/prisma/client/schema.prisma +93 -0
- package/src/storage/prisma/client/wasm.d.ts +1 -0
- package/src/storage/prisma/client/wasm.js +246 -0
- 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 -17
- 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
|
@@ -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, driveCreateState, 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
|
|
@@ -96,6 +85,7 @@ export class BaseDocumentDriveServer {
|
|
|
96
85
|
// internal state
|
|
97
86
|
triggerMap = new Map();
|
|
98
87
|
initializePromise;
|
|
88
|
+
enableDualActionCreate;
|
|
99
89
|
constructor(documentModelModules, storage, documentStorage, cache, queueManager, eventEmitter, synchronizationManager, listenerManager, options) {
|
|
100
90
|
this.documentModelModules = documentModelModules;
|
|
101
91
|
this.legacyStorage = storage;
|
|
@@ -118,9 +108,17 @@ export class BaseDocumentDriveServer {
|
|
|
118
108
|
? () => Promise.resolve("")
|
|
119
109
|
: options.jwtHandler,
|
|
120
110
|
taskQueueMethod: options?.taskQueueMethod === undefined
|
|
121
|
-
?
|
|
111
|
+
? runAsap
|
|
122
112
|
: options.taskQueueMethod,
|
|
113
|
+
featureFlags: {
|
|
114
|
+
...options?.featureFlags,
|
|
115
|
+
},
|
|
123
116
|
};
|
|
117
|
+
this.enableDualActionCreate =
|
|
118
|
+
options?.featureFlags?.enableDualActionCreate ?? false;
|
|
119
|
+
if (this.enableDualActionCreate) {
|
|
120
|
+
this.logger.warn("Dual action create is enabled.");
|
|
121
|
+
}
|
|
124
122
|
// todo: move to external dependencies
|
|
125
123
|
this.defaultDrivesManager = new DefaultDrivesManager(this, this.defaultDrivesManagerDelegate, options);
|
|
126
124
|
this.initializePromise = this._initialize();
|
|
@@ -137,7 +135,7 @@ export class BaseDocumentDriveServer {
|
|
|
137
135
|
await this.listenerManager.initialize(this.handleListenerError.bind(this));
|
|
138
136
|
await this.queueManager.init(this.queueDelegate, (error) => {
|
|
139
137
|
this.logger.error(`Error initializing queue manager`, error);
|
|
140
|
-
errors.push(error);
|
|
138
|
+
// errors.push(error);
|
|
141
139
|
});
|
|
142
140
|
try {
|
|
143
141
|
await this.defaultDrivesManager.removeOldremoteDrives();
|
|
@@ -329,7 +327,7 @@ export class BaseDocumentDriveServer {
|
|
|
329
327
|
}
|
|
330
328
|
}
|
|
331
329
|
getDocumentModelModule(documentType) {
|
|
332
|
-
const documentModelModule = this.documentModelModules.find((module) => module.documentModel.id === documentType);
|
|
330
|
+
const documentModelModule = this.documentModelModules.find((module) => module.documentModel.global.id === documentType);
|
|
333
331
|
if (!documentModelModule) {
|
|
334
332
|
throw new Error(`Document type ${documentType} not supported`);
|
|
335
333
|
}
|
|
@@ -346,9 +344,19 @@ export class BaseDocumentDriveServer {
|
|
|
346
344
|
}
|
|
347
345
|
async addDrive(input, preferredEditor) {
|
|
348
346
|
// Create document with custom global and local state
|
|
349
|
-
const
|
|
350
|
-
|
|
351
|
-
|
|
347
|
+
const { global } = driveCreateState();
|
|
348
|
+
const document = driveCreateDocument({
|
|
349
|
+
global: {
|
|
350
|
+
...global,
|
|
351
|
+
name: input.global.name ?? global.name,
|
|
352
|
+
icon: input.global.icon ?? global.icon,
|
|
353
|
+
},
|
|
354
|
+
local: {
|
|
355
|
+
availableOffline: input.local?.availableOffline ?? false,
|
|
356
|
+
sharingType: input.local?.sharingType ?? "public",
|
|
357
|
+
listeners: input.local?.listeners ?? [],
|
|
358
|
+
triggers: input.local?.triggers ?? [],
|
|
359
|
+
},
|
|
352
360
|
});
|
|
353
361
|
if (input.id && input.id.length > 0) {
|
|
354
362
|
document.header.id = input.id;
|
|
@@ -546,6 +554,14 @@ export class BaseDocumentDriveServer {
|
|
|
546
554
|
}
|
|
547
555
|
}
|
|
548
556
|
async createDocument(input, source, meta) {
|
|
557
|
+
if (this.enableDualActionCreate) {
|
|
558
|
+
return this.createDocumentDualAction(input, source, meta);
|
|
559
|
+
}
|
|
560
|
+
else {
|
|
561
|
+
return this.createDocumentLegacy(input, source, meta);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
async createDocumentLegacy(input, source, meta) {
|
|
549
565
|
const { documentType, document: inputDocument } = resolveCreateDocumentInput(input);
|
|
550
566
|
// if a document was provided then checks if it's valid
|
|
551
567
|
let state = undefined;
|
|
@@ -608,11 +624,9 @@ export class BaseDocumentDriveServer {
|
|
|
608
624
|
// stores document information
|
|
609
625
|
const documentStorage = {
|
|
610
626
|
header,
|
|
611
|
-
history: document.history,
|
|
612
627
|
operations: { global: [], local: [] },
|
|
613
628
|
initialState: document.initialState,
|
|
614
629
|
clipboard: [],
|
|
615
|
-
attachments: document.attachments,
|
|
616
630
|
state: state ?? document.state,
|
|
617
631
|
};
|
|
618
632
|
await this.documentStorage.create(documentStorage);
|
|
@@ -647,6 +661,180 @@ export class BaseDocumentDriveServer {
|
|
|
647
661
|
}
|
|
648
662
|
return await this.getDocument(documentStorage.header.id);
|
|
649
663
|
}
|
|
664
|
+
async createDocumentDualAction(input, source, meta) {
|
|
665
|
+
const { documentType, document: inputDocument } = resolveCreateDocumentInput(input);
|
|
666
|
+
// if a document was provided then checks if it's valid
|
|
667
|
+
let state = undefined;
|
|
668
|
+
if (inputDocument) {
|
|
669
|
+
if ("documentType" in input &&
|
|
670
|
+
documentType !== inputDocument.header.documentType) {
|
|
671
|
+
throw new Error(`Provided document is not ${documentType}`);
|
|
672
|
+
}
|
|
673
|
+
const doc = this._buildDocument(inputDocument);
|
|
674
|
+
state = doc.state;
|
|
675
|
+
}
|
|
676
|
+
// if no document was provided then create a new one
|
|
677
|
+
const document = inputDocument ??
|
|
678
|
+
this.getDocumentModelModule(documentType).utils.createDocument(state);
|
|
679
|
+
// get the header
|
|
680
|
+
let header;
|
|
681
|
+
// handle the legacy case where an id is provided
|
|
682
|
+
let isSigned = false;
|
|
683
|
+
if ("id" in input && input.id) {
|
|
684
|
+
if (inputDocument) {
|
|
685
|
+
header = document.header;
|
|
686
|
+
document.header.id = input.id;
|
|
687
|
+
this.logger.warn("Assigning an id to a document is deprecated. Use the header field instead.");
|
|
688
|
+
}
|
|
689
|
+
else {
|
|
690
|
+
this.logger.warn("Creating a document with an id is deprecated. Use the header field instead.");
|
|
691
|
+
header = createPresignedHeader(input.id, documentType);
|
|
692
|
+
}
|
|
693
|
+
}
|
|
694
|
+
else if ("header" in input) {
|
|
695
|
+
// validate the header passed in
|
|
696
|
+
await validateHeader(input.header);
|
|
697
|
+
isSigned = true;
|
|
698
|
+
header = input.header;
|
|
699
|
+
}
|
|
700
|
+
else if (inputDocument?.header) {
|
|
701
|
+
if (!inputDocument.header.id) {
|
|
702
|
+
throw new Error("Document header id is required");
|
|
703
|
+
}
|
|
704
|
+
if (!inputDocument.header.documentType) {
|
|
705
|
+
throw new Error("Document header documentType is required");
|
|
706
|
+
}
|
|
707
|
+
if (!inputDocument.header.createdAtUtcIso) {
|
|
708
|
+
throw new Error("Document header createdAtUtcIso is required");
|
|
709
|
+
}
|
|
710
|
+
if (!inputDocument.header.sig.nonce) {
|
|
711
|
+
this.logger.warn("Creating a document with an unsigned id is deprecated. Use createSignedHeaderForSigner.");
|
|
712
|
+
// throw new Error("Document header sig nonce is required"); TODO: uncomment when ready to enforce signed documents
|
|
713
|
+
}
|
|
714
|
+
else {
|
|
715
|
+
await validateHeader(inputDocument.header);
|
|
716
|
+
isSigned = true;
|
|
717
|
+
}
|
|
718
|
+
header = inputDocument.header;
|
|
719
|
+
}
|
|
720
|
+
else {
|
|
721
|
+
// otherwise, generate a header
|
|
722
|
+
header = createPresignedHeader(undefined, documentType);
|
|
723
|
+
isSigned = false;
|
|
724
|
+
}
|
|
725
|
+
if (meta) {
|
|
726
|
+
header.meta = { ...header.meta, ...meta };
|
|
727
|
+
}
|
|
728
|
+
const currentVersion = "0.1.0";
|
|
729
|
+
// Get initial state from input or model's defaultState
|
|
730
|
+
const initialState = state ?? document.state;
|
|
731
|
+
// Check if the input document already has operations
|
|
732
|
+
const existingOperations = Object.values(document.operations).flat();
|
|
733
|
+
const shouldCreateOperations = existingOperations.length === 0;
|
|
734
|
+
let operations = [];
|
|
735
|
+
if (shouldCreateOperations) {
|
|
736
|
+
const timestampUtcMs = new Date().toISOString();
|
|
737
|
+
// Determine if this is a signed document
|
|
738
|
+
const signing = isSigned
|
|
739
|
+
? {
|
|
740
|
+
signature: header.id, // The document ID is the signature
|
|
741
|
+
publicKey: header.sig.publicKey,
|
|
742
|
+
nonce: header.sig.nonce,
|
|
743
|
+
createdAtUtcIso: header.createdAtUtcIso,
|
|
744
|
+
documentType: header.documentType,
|
|
745
|
+
}
|
|
746
|
+
: undefined;
|
|
747
|
+
// Create actions for CREATE_DOCUMENT and UPGRADE_DOCUMENT
|
|
748
|
+
const createDocumentInput = {
|
|
749
|
+
model: documentType,
|
|
750
|
+
version: "0.0.0",
|
|
751
|
+
documentId: header.id,
|
|
752
|
+
signing,
|
|
753
|
+
};
|
|
754
|
+
const createDocumentAction = {
|
|
755
|
+
id: `${header.id}-create`,
|
|
756
|
+
type: "CREATE_DOCUMENT",
|
|
757
|
+
timestampUtcMs,
|
|
758
|
+
input: createDocumentInput,
|
|
759
|
+
scope: "document",
|
|
760
|
+
};
|
|
761
|
+
const upgradeDocumentInput = {
|
|
762
|
+
model: documentType,
|
|
763
|
+
fromVersion: "0.0.0",
|
|
764
|
+
toVersion: currentVersion,
|
|
765
|
+
documentId: header.id,
|
|
766
|
+
initialState,
|
|
767
|
+
};
|
|
768
|
+
const upgradeDocumentAction = {
|
|
769
|
+
id: `${header.id}-upgrade`,
|
|
770
|
+
type: "UPGRADE_DOCUMENT",
|
|
771
|
+
timestampUtcMs,
|
|
772
|
+
input: upgradeDocumentInput,
|
|
773
|
+
scope: "document",
|
|
774
|
+
};
|
|
775
|
+
// we need to create hashes for later verification
|
|
776
|
+
const baseState = defaultBaseState();
|
|
777
|
+
const createStateForHash = {
|
|
778
|
+
state: baseState,
|
|
779
|
+
};
|
|
780
|
+
const createHash = hashDocumentStateForScope(createStateForHash, "document");
|
|
781
|
+
const upgradeStateForHash = {
|
|
782
|
+
state: initialState,
|
|
783
|
+
};
|
|
784
|
+
const upgradeHash = hashDocumentStateForScope(upgradeStateForHash, "document");
|
|
785
|
+
// Create operations from actions with computed hashes
|
|
786
|
+
operations = [
|
|
787
|
+
{
|
|
788
|
+
index: 0,
|
|
789
|
+
skip: 0,
|
|
790
|
+
hash: createHash,
|
|
791
|
+
timestampUtcMs,
|
|
792
|
+
action: createDocumentAction,
|
|
793
|
+
},
|
|
794
|
+
{
|
|
795
|
+
index: 1,
|
|
796
|
+
skip: 0,
|
|
797
|
+
hash: upgradeHash,
|
|
798
|
+
timestampUtcMs,
|
|
799
|
+
action: upgradeDocumentAction,
|
|
800
|
+
},
|
|
801
|
+
];
|
|
802
|
+
}
|
|
803
|
+
else {
|
|
804
|
+
// Use existing operations from the input document
|
|
805
|
+
operations = existingOperations;
|
|
806
|
+
}
|
|
807
|
+
// Group operations by scope before storing
|
|
808
|
+
const groupedOps = groupOperationsByScope(operations);
|
|
809
|
+
// Ensure backward compatibility by initializing missing scopes
|
|
810
|
+
if (!groupedOps.header) {
|
|
811
|
+
groupedOps.header = [];
|
|
812
|
+
}
|
|
813
|
+
if (!groupedOps.document) {
|
|
814
|
+
groupedOps.document = [];
|
|
815
|
+
}
|
|
816
|
+
if (!groupedOps.global) {
|
|
817
|
+
groupedOps.global = [];
|
|
818
|
+
}
|
|
819
|
+
if (!groupedOps.local) {
|
|
820
|
+
groupedOps.local = [];
|
|
821
|
+
}
|
|
822
|
+
// After initialization, it's safe to treat as DocumentOperations
|
|
823
|
+
const operationsByScope = groupedOps;
|
|
824
|
+
// stores document information with operations
|
|
825
|
+
const documentToStore = {
|
|
826
|
+
header,
|
|
827
|
+
operations: operationsByScope,
|
|
828
|
+
initialState,
|
|
829
|
+
clipboard: [],
|
|
830
|
+
state: initialState,
|
|
831
|
+
};
|
|
832
|
+
await this.documentStorage.create(documentToStore);
|
|
833
|
+
// Force rebuild to ensure operations are properly merged
|
|
834
|
+
return await this.getDocument(documentToStore.header.id, {
|
|
835
|
+
checkHashes: true,
|
|
836
|
+
});
|
|
837
|
+
}
|
|
650
838
|
async deleteDocument(documentId) {
|
|
651
839
|
try {
|
|
652
840
|
const syncUnits = await this.synchronizationManager.getSynchronizationUnitsIds(undefined, [documentId]);
|
|
@@ -675,7 +863,7 @@ export class BaseDocumentDriveServer {
|
|
|
675
863
|
let error; // TODO: replace with an array of errors/consistency issues
|
|
676
864
|
const operationsByScope = groupOperationsByScope(operations);
|
|
677
865
|
for (const scope of Object.keys(operationsByScope)) {
|
|
678
|
-
const storageDocumentOperations = documentStorage.operations[scope];
|
|
866
|
+
const storageDocumentOperations = documentStorage.operations[scope] || [];
|
|
679
867
|
// TODO two equal operations done by two clients will be considered the same, ie: { type: "INCREMENT" }
|
|
680
868
|
const branch = removeExistingOperations(operationsByScope[scope] || [], storageDocumentOperations);
|
|
681
869
|
// No operations to apply
|
|
@@ -735,7 +923,11 @@ export class BaseDocumentDriveServer {
|
|
|
735
923
|
: document.operations;
|
|
736
924
|
const documentOperations = garbageCollectDocumentOperations(operations);
|
|
737
925
|
for (const scope of Object.keys(documentOperations)) {
|
|
738
|
-
const
|
|
926
|
+
const scopeOps = documentOperations[scope];
|
|
927
|
+
if (!scopeOps) {
|
|
928
|
+
continue;
|
|
929
|
+
}
|
|
930
|
+
const lastRemainingOperation = scopeOps.at(-1);
|
|
739
931
|
// if the latest operation doesn't have a resulting state then tries
|
|
740
932
|
// to retrieve it from the db to avoid rerunning all the operations
|
|
741
933
|
if (lastRemainingOperation && !lastRemainingOperation.resultingState) {
|
|
@@ -760,22 +952,74 @@ export class BaseDocumentDriveServer {
|
|
|
760
952
|
? filterOperationsByRevision(documentStorage.operations, options.revisions)
|
|
761
953
|
: documentStorage.operations;
|
|
762
954
|
const operations = garbageCollectDocumentOperations(revisionOperations);
|
|
763
|
-
|
|
955
|
+
// Get all scopes from operations
|
|
956
|
+
const allScopes = Object.keys(operations);
|
|
957
|
+
// Initialize with all scopes found in operations, plus global and local for backward compatibility
|
|
958
|
+
const scopesToInitialize = new Set([...allScopes, "global", "local"]);
|
|
959
|
+
const headerOperations = {};
|
|
960
|
+
const operationsToReplay = {};
|
|
961
|
+
for (const scope of scopesToInitialize) {
|
|
962
|
+
headerOperations[scope] = [];
|
|
963
|
+
operationsToReplay[scope] = [];
|
|
964
|
+
}
|
|
965
|
+
// Filter out CREATE_DOCUMENT and UPGRADE_DOCUMENT operations
|
|
966
|
+
// (these don't currently have reducers and should not be replayed)
|
|
967
|
+
for (const [scope, scopeOps] of Object.entries(operations)) {
|
|
968
|
+
if (!scopeOps) {
|
|
969
|
+
continue;
|
|
970
|
+
}
|
|
971
|
+
for (const op of scopeOps) {
|
|
972
|
+
if (op.action.type === "CREATE_DOCUMENT" ||
|
|
973
|
+
op.action.type === "UPGRADE_DOCUMENT") {
|
|
974
|
+
const headerOps = headerOperations[scope];
|
|
975
|
+
if (headerOps) {
|
|
976
|
+
headerOps.push(op);
|
|
977
|
+
}
|
|
978
|
+
}
|
|
979
|
+
else {
|
|
980
|
+
const replayOps = operationsToReplay[scope];
|
|
981
|
+
if (replayOps) {
|
|
982
|
+
replayOps.push(op);
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
const replayed = replayDocument(documentStorage.initialState, operationsToReplay, documentModelModule.reducer, undefined, documentStorage.header, undefined, {
|
|
764
988
|
...options,
|
|
765
989
|
checkHashes: options?.checkHashes ?? true,
|
|
766
990
|
reuseOperationResultingState: options?.checkHashes ?? true,
|
|
767
991
|
});
|
|
992
|
+
// merge header operations back into the result
|
|
993
|
+
// Include ALL scopes from input operations, header operations, and replayed operations
|
|
994
|
+
const allScopesForMerge = new Set([
|
|
995
|
+
...Object.keys(operations), // From input storage
|
|
996
|
+
...Object.keys(headerOperations),
|
|
997
|
+
...Object.keys(replayed.operations),
|
|
998
|
+
]);
|
|
999
|
+
const finalOperations = {};
|
|
1000
|
+
for (const scope of allScopesForMerge) {
|
|
1001
|
+
finalOperations[scope] = [
|
|
1002
|
+
...(headerOperations[scope] || []),
|
|
1003
|
+
...(replayed.operations[scope] || []),
|
|
1004
|
+
];
|
|
1005
|
+
}
|
|
1006
|
+
return {
|
|
1007
|
+
...replayed,
|
|
1008
|
+
operations: finalOperations,
|
|
1009
|
+
};
|
|
768
1010
|
}
|
|
769
1011
|
async _performOperation(documentId, document, operation, skipHashValidation = false) {
|
|
770
1012
|
const documentModelModule = this.getDocumentModelModule(document.header.documentType);
|
|
771
1013
|
const signalResults = [];
|
|
772
1014
|
let newDocument = document;
|
|
773
1015
|
const scope = operation.action.scope;
|
|
1016
|
+
const currentScopeOperations = document.operations[scope] || [];
|
|
774
1017
|
const documentOperations = garbageCollectDocumentOperations({
|
|
775
1018
|
...document.operations,
|
|
776
|
-
[scope]: skipHeaderOperations(
|
|
1019
|
+
[scope]: skipHeaderOperations(currentScopeOperations, operation),
|
|
777
1020
|
});
|
|
778
|
-
const
|
|
1021
|
+
const remainingScopeOps = documentOperations[scope];
|
|
1022
|
+
const lastRemainingOperation = remainingScopeOps?.at(-1);
|
|
779
1023
|
// if the latest operation doesn't have a resulting state then tries
|
|
780
1024
|
// to retrieve it from the db to avoid rerunning all the operations
|
|
781
1025
|
if (lastRemainingOperation && !lastRemainingOperation.resultingState) {
|
|
@@ -805,7 +1049,11 @@ export class BaseDocumentDriveServer {
|
|
|
805
1049
|
reuseOperationResultingState: true,
|
|
806
1050
|
replayOptions: { operation },
|
|
807
1051
|
});
|
|
808
|
-
const
|
|
1052
|
+
const newDocScopeOperations = newDocument.operations[operation.action.scope];
|
|
1053
|
+
if (!newDocScopeOperations) {
|
|
1054
|
+
throw new OperationError("ERROR", operation, `No operations found for scope: ${operation.action.scope}`);
|
|
1055
|
+
}
|
|
1056
|
+
const appliedOperations = newDocScopeOperations.filter((op) => op.index == operation.index && op.skip == operation.skip);
|
|
809
1057
|
const appliedOperation = appliedOperations.at(0);
|
|
810
1058
|
if (!appliedOperation) {
|
|
811
1059
|
throw new OperationError("ERROR", operation, `Operation with index ${operation.index}:${operation.skip} was not applied.`);
|
|
@@ -924,11 +1172,19 @@ export class BaseDocumentDriveServer {
|
|
|
924
1172
|
async resultIfExistingOperations(id, operations) {
|
|
925
1173
|
try {
|
|
926
1174
|
const document = await this.getDocument(id);
|
|
927
|
-
const newOperation = operations.find((op) =>
|
|
928
|
-
!
|
|
1175
|
+
const newOperation = operations.find((op) => {
|
|
1176
|
+
if (!op.id) {
|
|
1177
|
+
return true;
|
|
1178
|
+
}
|
|
1179
|
+
const scopeOps = document.operations[op.action.scope];
|
|
1180
|
+
if (!scopeOps) {
|
|
1181
|
+
return true;
|
|
1182
|
+
}
|
|
1183
|
+
return !scopeOps.find((existingOp) => existingOp.id === op.id &&
|
|
929
1184
|
existingOp.index === op.index &&
|
|
930
1185
|
existingOp.action.type === op.action.type &&
|
|
931
|
-
existingOp.hash === op.hash)
|
|
1186
|
+
existingOp.hash === op.hash);
|
|
1187
|
+
});
|
|
932
1188
|
if (!newOperation) {
|
|
933
1189
|
return {
|
|
934
1190
|
status: "SUCCESS",
|
|
@@ -1280,11 +1536,19 @@ export class BaseDocumentDriveServer {
|
|
|
1280
1536
|
async resultIfExistingDriveOperations(driveId, operations) {
|
|
1281
1537
|
try {
|
|
1282
1538
|
const drive = await this.getDrive(driveId);
|
|
1283
|
-
const newOperation = operations.find((op) =>
|
|
1284
|
-
!
|
|
1539
|
+
const newOperation = operations.find((op) => {
|
|
1540
|
+
if (!op.id) {
|
|
1541
|
+
return true;
|
|
1542
|
+
}
|
|
1543
|
+
const scopeOps = drive.operations[op.action.scope];
|
|
1544
|
+
if (!scopeOps) {
|
|
1545
|
+
return true;
|
|
1546
|
+
}
|
|
1547
|
+
return !scopeOps.find((existingOp) => existingOp.id === op.id &&
|
|
1285
1548
|
existingOp.index === op.index &&
|
|
1286
1549
|
existingOp.action.type === op.action.type &&
|
|
1287
|
-
existingOp.hash === op.hash)
|
|
1550
|
+
existingOp.hash === op.hash);
|
|
1551
|
+
});
|
|
1288
1552
|
if (!newOperation) {
|
|
1289
1553
|
return {
|
|
1290
1554
|
status: "SUCCESS",
|
|
@@ -1457,7 +1721,11 @@ export class BaseDocumentDriveServer {
|
|
|
1457
1721
|
const { reducer } = this.getDocumentModelModule(documentId.header.documentType);
|
|
1458
1722
|
for (const action of actions) {
|
|
1459
1723
|
documentId = reducer(documentId, action);
|
|
1460
|
-
const
|
|
1724
|
+
const scopeOps = documentId.operations[action.scope];
|
|
1725
|
+
if (!scopeOps) {
|
|
1726
|
+
throw new Error(`No operations found for scope: ${action.scope}`);
|
|
1727
|
+
}
|
|
1728
|
+
const operation = scopeOps.slice().pop();
|
|
1461
1729
|
if (!operation) {
|
|
1462
1730
|
throw new Error("Error creating operations");
|
|
1463
1731
|
}
|