document-drive 4.1.0-dev.8 → 4.1.0-dev.80
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/prisma/schema.prisma +2 -0
- 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 -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 +19 -10
- 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 +347 -68
- 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 +20 -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 +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 +24 -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 +9 -10
- 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 +31 -11
- 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 +3 -3
- package/dist/src/storage/memory.d.ts.map +1 -1
- package/dist/src/storage/memory.js +34 -12
- package/dist/src/storage/memory.js.map +1 -1
- package/dist/src/storage/prisma/client/edge.js +17 -8
- package/dist/src/storage/prisma/client/index-browser.js +1 -0
- package/dist/src/storage/prisma/client/index.d.ts +45 -0
- package/dist/src/storage/prisma/client/index.js +25 -8
- package/dist/src/storage/prisma/client/libquery_engine-darwin-arm64.dylib.node +0 -0
- package/dist/src/storage/prisma/client/libquery_engine-linux-musl.so.node +0 -0
- package/dist/src/storage/prisma/client/package.json +1 -1
- package/dist/src/storage/prisma/client/schema.prisma +4 -2
- package/dist/src/storage/prisma/client/wasm.js +1 -0
- 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 +70 -42
- 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 +88 -18
- 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 +9 -12
- 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 +39 -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 -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
|
@@ -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,181 @@ 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: "document",
|
|
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: "document",
|
|
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, "document");
|
|
784
|
+
// Create operations from actions with computed hashes
|
|
785
|
+
operations = [
|
|
786
|
+
{
|
|
787
|
+
index: 0,
|
|
788
|
+
skip: 0,
|
|
789
|
+
hash: createHash,
|
|
790
|
+
timestampUtcMs,
|
|
791
|
+
action: createDocumentAction,
|
|
792
|
+
},
|
|
793
|
+
{
|
|
794
|
+
index: 1,
|
|
795
|
+
skip: 0,
|
|
796
|
+
hash: upgradeHash,
|
|
797
|
+
timestampUtcMs,
|
|
798
|
+
action: upgradeDocumentAction,
|
|
799
|
+
},
|
|
800
|
+
];
|
|
801
|
+
}
|
|
802
|
+
else {
|
|
803
|
+
// Use existing operations from the input document
|
|
804
|
+
operations = existingOperations;
|
|
805
|
+
}
|
|
806
|
+
// Group operations by scope before storing
|
|
807
|
+
const groupedOps = groupOperationsByScope(operations);
|
|
808
|
+
// Ensure backward compatibility by initializing missing scopes
|
|
809
|
+
if (!groupedOps.header) {
|
|
810
|
+
groupedOps.header = [];
|
|
811
|
+
}
|
|
812
|
+
if (!groupedOps.document) {
|
|
813
|
+
groupedOps.document = [];
|
|
814
|
+
}
|
|
815
|
+
if (!groupedOps.global) {
|
|
816
|
+
groupedOps.global = [];
|
|
817
|
+
}
|
|
818
|
+
if (!groupedOps.local) {
|
|
819
|
+
groupedOps.local = [];
|
|
820
|
+
}
|
|
821
|
+
// After initialization, it's safe to treat as DocumentOperations
|
|
822
|
+
const operationsByScope = groupedOps;
|
|
823
|
+
// stores document information with operations
|
|
824
|
+
const documentToStore = {
|
|
825
|
+
header,
|
|
826
|
+
operations: operationsByScope,
|
|
827
|
+
initialState,
|
|
828
|
+
clipboard: [],
|
|
829
|
+
state: initialState,
|
|
830
|
+
};
|
|
831
|
+
await this.documentStorage.create(documentToStore);
|
|
832
|
+
// Force rebuild to ensure operations are properly merged
|
|
833
|
+
return await this.getDocument(documentToStore.header.id, {
|
|
834
|
+
checkHashes: true,
|
|
835
|
+
});
|
|
650
836
|
}
|
|
651
837
|
async deleteDocument(documentId) {
|
|
652
838
|
try {
|
|
@@ -676,7 +862,7 @@ export class BaseDocumentDriveServer {
|
|
|
676
862
|
let error; // TODO: replace with an array of errors/consistency issues
|
|
677
863
|
const operationsByScope = groupOperationsByScope(operations);
|
|
678
864
|
for (const scope of Object.keys(operationsByScope)) {
|
|
679
|
-
const storageDocumentOperations = documentStorage.operations[scope];
|
|
865
|
+
const storageDocumentOperations = documentStorage.operations[scope] || [];
|
|
680
866
|
// TODO two equal operations done by two clients will be considered the same, ie: { type: "INCREMENT" }
|
|
681
867
|
const branch = removeExistingOperations(operationsByScope[scope] || [], storageDocumentOperations);
|
|
682
868
|
// No operations to apply
|
|
@@ -736,13 +922,17 @@ export class BaseDocumentDriveServer {
|
|
|
736
922
|
: document.operations;
|
|
737
923
|
const documentOperations = garbageCollectDocumentOperations(operations);
|
|
738
924
|
for (const scope of Object.keys(documentOperations)) {
|
|
739
|
-
const
|
|
925
|
+
const scopeOps = documentOperations[scope];
|
|
926
|
+
if (!scopeOps) {
|
|
927
|
+
continue;
|
|
928
|
+
}
|
|
929
|
+
const lastRemainingOperation = scopeOps.at(-1);
|
|
740
930
|
// if the latest operation doesn't have a resulting state then tries
|
|
741
931
|
// to retrieve it from the db to avoid rerunning all the operations
|
|
742
932
|
if (lastRemainingOperation && !lastRemainingOperation.resultingState) {
|
|
743
933
|
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"));
|
|
934
|
+
? this.legacyStorage.getOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.action.scope, "main")
|
|
935
|
+
: this.legacyStorage.getDriveOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.action.scope, "main"));
|
|
746
936
|
}
|
|
747
937
|
}
|
|
748
938
|
return {
|
|
@@ -761,31 +951,83 @@ export class BaseDocumentDriveServer {
|
|
|
761
951
|
? filterOperationsByRevision(documentStorage.operations, options.revisions)
|
|
762
952
|
: documentStorage.operations;
|
|
763
953
|
const operations = garbageCollectDocumentOperations(revisionOperations);
|
|
764
|
-
|
|
954
|
+
// Get all scopes from operations
|
|
955
|
+
const allScopes = Object.keys(operations);
|
|
956
|
+
// Initialize with all scopes found in operations, plus global and local for backward compatibility
|
|
957
|
+
const scopesToInitialize = new Set([...allScopes, "global", "local"]);
|
|
958
|
+
const headerOperations = {};
|
|
959
|
+
const operationsToReplay = {};
|
|
960
|
+
for (const scope of scopesToInitialize) {
|
|
961
|
+
headerOperations[scope] = [];
|
|
962
|
+
operationsToReplay[scope] = [];
|
|
963
|
+
}
|
|
964
|
+
// Filter out CREATE_DOCUMENT and UPGRADE_DOCUMENT operations
|
|
965
|
+
// (these don't currently have reducers and should not be replayed)
|
|
966
|
+
for (const [scope, scopeOps] of Object.entries(operations)) {
|
|
967
|
+
if (!scopeOps) {
|
|
968
|
+
continue;
|
|
969
|
+
}
|
|
970
|
+
for (const op of scopeOps) {
|
|
971
|
+
if (op.action.type === "CREATE_DOCUMENT" ||
|
|
972
|
+
op.action.type === "UPGRADE_DOCUMENT") {
|
|
973
|
+
const headerOps = headerOperations[scope];
|
|
974
|
+
if (headerOps) {
|
|
975
|
+
headerOps.push(op);
|
|
976
|
+
}
|
|
977
|
+
}
|
|
978
|
+
else {
|
|
979
|
+
const replayOps = operationsToReplay[scope];
|
|
980
|
+
if (replayOps) {
|
|
981
|
+
replayOps.push(op);
|
|
982
|
+
}
|
|
983
|
+
}
|
|
984
|
+
}
|
|
985
|
+
}
|
|
986
|
+
const replayed = replayDocument(documentStorage.initialState, operationsToReplay, documentModelModule.reducer, undefined, documentStorage.header, undefined, {
|
|
765
987
|
...options,
|
|
766
988
|
checkHashes: options?.checkHashes ?? true,
|
|
767
989
|
reuseOperationResultingState: options?.checkHashes ?? true,
|
|
768
990
|
});
|
|
991
|
+
// merge header operations back into the result
|
|
992
|
+
// Include ALL scopes from input operations, header operations, and replayed operations
|
|
993
|
+
const allScopesForMerge = new Set([
|
|
994
|
+
...Object.keys(operations), // From input storage
|
|
995
|
+
...Object.keys(headerOperations),
|
|
996
|
+
...Object.keys(replayed.operations),
|
|
997
|
+
]);
|
|
998
|
+
const finalOperations = {};
|
|
999
|
+
for (const scope of allScopesForMerge) {
|
|
1000
|
+
finalOperations[scope] = [
|
|
1001
|
+
...(headerOperations[scope] || []),
|
|
1002
|
+
...(replayed.operations[scope] || []),
|
|
1003
|
+
];
|
|
1004
|
+
}
|
|
1005
|
+
return {
|
|
1006
|
+
...replayed,
|
|
1007
|
+
operations: finalOperations,
|
|
1008
|
+
};
|
|
769
1009
|
}
|
|
770
1010
|
async _performOperation(documentId, document, operation, skipHashValidation = false) {
|
|
771
1011
|
const documentModelModule = this.getDocumentModelModule(document.header.documentType);
|
|
772
1012
|
const signalResults = [];
|
|
773
1013
|
let newDocument = document;
|
|
774
|
-
const scope = operation.scope;
|
|
1014
|
+
const scope = operation.action.scope;
|
|
1015
|
+
const currentScopeOperations = document.operations[scope] || [];
|
|
775
1016
|
const documentOperations = garbageCollectDocumentOperations({
|
|
776
1017
|
...document.operations,
|
|
777
|
-
[scope]: skipHeaderOperations(
|
|
1018
|
+
[scope]: skipHeaderOperations(currentScopeOperations, operation),
|
|
778
1019
|
});
|
|
779
|
-
const
|
|
1020
|
+
const remainingScopeOps = documentOperations[scope];
|
|
1021
|
+
const lastRemainingOperation = remainingScopeOps?.at(-1);
|
|
780
1022
|
// if the latest operation doesn't have a resulting state then tries
|
|
781
1023
|
// to retrieve it from the db to avoid rerunning all the operations
|
|
782
1024
|
if (lastRemainingOperation && !lastRemainingOperation.resultingState) {
|
|
783
1025
|
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"));
|
|
1026
|
+
? this.legacyStorage.getOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.action.scope, "main")
|
|
1027
|
+
: this.legacyStorage.getDriveOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.action.scope, "main"));
|
|
786
1028
|
}
|
|
787
1029
|
const operationSignals = [];
|
|
788
|
-
newDocument = documentModelModule.reducer(newDocument, operation, (signal) => {
|
|
1030
|
+
newDocument = documentModelModule.reducer(newDocument, operation.action, (signal) => {
|
|
789
1031
|
let handler = undefined;
|
|
790
1032
|
switch (signal.type) {
|
|
791
1033
|
case "CREATE_CHILD_DOCUMENT":
|
|
@@ -801,8 +1043,16 @@ export class BaseDocumentDriveServer {
|
|
|
801
1043
|
if (handler) {
|
|
802
1044
|
operationSignals.push(() => handler().then((result) => ({ signal, result })));
|
|
803
1045
|
}
|
|
804
|
-
}, {
|
|
805
|
-
|
|
1046
|
+
}, {
|
|
1047
|
+
skip: operation.skip,
|
|
1048
|
+
reuseOperationResultingState: true,
|
|
1049
|
+
replayOptions: { operation },
|
|
1050
|
+
});
|
|
1051
|
+
const newDocScopeOperations = newDocument.operations[operation.action.scope];
|
|
1052
|
+
if (!newDocScopeOperations) {
|
|
1053
|
+
throw new OperationError("ERROR", operation, `No operations found for scope: ${operation.action.scope}`);
|
|
1054
|
+
}
|
|
1055
|
+
const appliedOperations = newDocScopeOperations.filter((op) => op.index == operation.index && op.skip == operation.skip);
|
|
806
1056
|
const appliedOperation = appliedOperations.at(0);
|
|
807
1057
|
if (!appliedOperation) {
|
|
808
1058
|
throw new OperationError("ERROR", operation, `Operation with index ${operation.index}:${operation.skip} was not applied.`);
|
|
@@ -889,7 +1139,8 @@ export class BaseDocumentDriveServer {
|
|
|
889
1139
|
jobId = await this.queueManager.addJob({
|
|
890
1140
|
documentId: id,
|
|
891
1141
|
documentType,
|
|
892
|
-
initialState: document,
|
|
1142
|
+
initialState: document?.state,
|
|
1143
|
+
header: document?.header,
|
|
893
1144
|
options,
|
|
894
1145
|
});
|
|
895
1146
|
}
|
|
@@ -920,11 +1171,19 @@ export class BaseDocumentDriveServer {
|
|
|
920
1171
|
async resultIfExistingOperations(id, operations) {
|
|
921
1172
|
try {
|
|
922
1173
|
const document = await this.getDocument(id);
|
|
923
|
-
const newOperation = operations.find((op) =>
|
|
924
|
-
!
|
|
1174
|
+
const newOperation = operations.find((op) => {
|
|
1175
|
+
if (!op.id) {
|
|
1176
|
+
return true;
|
|
1177
|
+
}
|
|
1178
|
+
const scopeOps = document.operations[op.action.scope];
|
|
1179
|
+
if (!scopeOps) {
|
|
1180
|
+
return true;
|
|
1181
|
+
}
|
|
1182
|
+
return !scopeOps.find((existingOp) => existingOp.id === op.id &&
|
|
925
1183
|
existingOp.index === op.index &&
|
|
926
|
-
existingOp.type === op.type &&
|
|
927
|
-
existingOp.hash === op.hash)
|
|
1184
|
+
existingOp.action.type === op.action.type &&
|
|
1185
|
+
existingOp.hash === op.hash);
|
|
1186
|
+
});
|
|
928
1187
|
if (!newOperation) {
|
|
929
1188
|
return {
|
|
930
1189
|
status: "SUCCESS",
|
|
@@ -1155,10 +1414,10 @@ export class BaseDocumentDriveServer {
|
|
|
1155
1414
|
const syncUnit = {
|
|
1156
1415
|
documentId,
|
|
1157
1416
|
documentType: document.header.documentType,
|
|
1158
|
-
scope: operation.scope,
|
|
1417
|
+
scope: operation.action.scope,
|
|
1159
1418
|
branch: "main", // TODO: handle branches
|
|
1160
1419
|
revision: operation.index + 1,
|
|
1161
|
-
lastUpdated: operation.
|
|
1420
|
+
lastUpdated: operation.timestampUtcMs,
|
|
1162
1421
|
};
|
|
1163
1422
|
// checks if this sync unit was already added
|
|
1164
1423
|
const exists = syncUnits.some((unit) => unit.documentId === syncUnit.documentId &&
|
|
@@ -1276,11 +1535,19 @@ export class BaseDocumentDriveServer {
|
|
|
1276
1535
|
async resultIfExistingDriveOperations(driveId, operations) {
|
|
1277
1536
|
try {
|
|
1278
1537
|
const drive = await this.getDrive(driveId);
|
|
1279
|
-
const newOperation = operations.find((op) =>
|
|
1280
|
-
!
|
|
1538
|
+
const newOperation = operations.find((op) => {
|
|
1539
|
+
if (!op.id) {
|
|
1540
|
+
return true;
|
|
1541
|
+
}
|
|
1542
|
+
const scopeOps = drive.operations[op.action.scope];
|
|
1543
|
+
if (!scopeOps) {
|
|
1544
|
+
return true;
|
|
1545
|
+
}
|
|
1546
|
+
return !scopeOps.find((existingOp) => existingOp.id === op.id &&
|
|
1281
1547
|
existingOp.index === op.index &&
|
|
1282
|
-
existingOp.type === op.type &&
|
|
1283
|
-
existingOp.hash === op.hash)
|
|
1548
|
+
existingOp.action.type === op.action.type &&
|
|
1549
|
+
existingOp.hash === op.hash);
|
|
1550
|
+
});
|
|
1284
1551
|
if (!newOperation) {
|
|
1285
1552
|
return {
|
|
1286
1553
|
status: "SUCCESS",
|
|
@@ -1370,7 +1637,7 @@ export class BaseDocumentDriveServer {
|
|
|
1370
1637
|
this.cache.setDrive(driveId, document).catch(this.logger.error);
|
|
1371
1638
|
// update listener cache
|
|
1372
1639
|
const lastOperation = operationsApplied
|
|
1373
|
-
.filter((op) => op.scope === "global")
|
|
1640
|
+
.filter((op) => op.action.scope === "global")
|
|
1374
1641
|
.slice()
|
|
1375
1642
|
.pop();
|
|
1376
1643
|
if (lastOperation) {
|
|
@@ -1393,7 +1660,7 @@ export class BaseDocumentDriveServer {
|
|
|
1393
1660
|
documentType: document.header.documentType,
|
|
1394
1661
|
scope: "global",
|
|
1395
1662
|
branch: "main",
|
|
1396
|
-
lastUpdated: lastOperation.
|
|
1663
|
+
lastUpdated: lastOperation.timestampUtcMs,
|
|
1397
1664
|
revision: lastOperation.index,
|
|
1398
1665
|
},
|
|
1399
1666
|
], source, () => {
|
|
@@ -1453,7 +1720,11 @@ export class BaseDocumentDriveServer {
|
|
|
1453
1720
|
const { reducer } = this.getDocumentModelModule(documentId.header.documentType);
|
|
1454
1721
|
for (const action of actions) {
|
|
1455
1722
|
documentId = reducer(documentId, action);
|
|
1456
|
-
const
|
|
1723
|
+
const scopeOps = documentId.operations[action.scope];
|
|
1724
|
+
if (!scopeOps) {
|
|
1725
|
+
throw new Error(`No operations found for scope: ${action.scope}`);
|
|
1726
|
+
}
|
|
1727
|
+
const operation = scopeOps.slice().pop();
|
|
1457
1728
|
if (!operation) {
|
|
1458
1729
|
throw new Error("Error creating operations");
|
|
1459
1730
|
}
|
|
@@ -1516,7 +1787,7 @@ export class BaseDocumentDriveServer {
|
|
|
1516
1787
|
}
|
|
1517
1788
|
async _legacyAddFileAction(driveId, action, options) {
|
|
1518
1789
|
// create document before adding it to the drive
|
|
1519
|
-
const document = this.getDocumentModelModule(action.input.documentType).utils.createDocument(
|
|
1790
|
+
const document = this.getDocumentModelModule(action.input.documentType).utils.createDocument(action.input.document?.state || undefined);
|
|
1520
1791
|
document.header.id = action.input.id;
|
|
1521
1792
|
document.header.name = action.input.name;
|
|
1522
1793
|
document.header.documentType = action.input.documentType;
|
|
@@ -1587,6 +1858,14 @@ export class BaseDocumentDriveServer {
|
|
|
1587
1858
|
}
|
|
1588
1859
|
const operations = strand.operations.map((op) => ({
|
|
1589
1860
|
...op,
|
|
1861
|
+
action: {
|
|
1862
|
+
id: op.actionId,
|
|
1863
|
+
timestampUtcMs: op.timestampUtcMs,
|
|
1864
|
+
type: op.type,
|
|
1865
|
+
input: op.input,
|
|
1866
|
+
context: op.context,
|
|
1867
|
+
scope: strand.scope,
|
|
1868
|
+
},
|
|
1590
1869
|
scope: strand.scope,
|
|
1591
1870
|
branch: strand.branch,
|
|
1592
1871
|
}));
|