document-drive 4.1.0-dev.9 → 4.1.0-dev.91
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 +5 -6
- 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 +19 -27
- package/dist/src/server/base-server.d.ts.map +1 -1
- package/dist/src/server/base-server.js +348 -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 +52 -35
- 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 +33 -15
- 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 +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 +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 -27
- 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, 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
|
|
@@ -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,26 @@ 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 { 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 ?? [],
|
|
351
359
|
},
|
|
352
360
|
});
|
|
353
361
|
if (input.id && input.id.length > 0) {
|
|
@@ -356,9 +364,10 @@ export class BaseDocumentDriveServer {
|
|
|
356
364
|
if (input.slug && input.slug.length > 0) {
|
|
357
365
|
document.header.slug = input.slug;
|
|
358
366
|
}
|
|
359
|
-
|
|
367
|
+
const editorToUse = input.preferredEditor || preferredEditor;
|
|
368
|
+
if (editorToUse) {
|
|
360
369
|
document.header.meta = {
|
|
361
|
-
preferredEditor:
|
|
370
|
+
preferredEditor: editorToUse,
|
|
362
371
|
};
|
|
363
372
|
}
|
|
364
373
|
await this.documentStorage.create(document);
|
|
@@ -545,6 +554,14 @@ export class BaseDocumentDriveServer {
|
|
|
545
554
|
}
|
|
546
555
|
}
|
|
547
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) {
|
|
548
565
|
const { documentType, document: inputDocument } = resolveCreateDocumentInput(input);
|
|
549
566
|
// if a document was provided then checks if it's valid
|
|
550
567
|
let state = undefined;
|
|
@@ -558,9 +575,7 @@ export class BaseDocumentDriveServer {
|
|
|
558
575
|
}
|
|
559
576
|
// if no document was provided then create a new one
|
|
560
577
|
const document = inputDocument ??
|
|
561
|
-
this.getDocumentModelModule(documentType).utils.createDocument(
|
|
562
|
-
state,
|
|
563
|
-
});
|
|
578
|
+
this.getDocumentModelModule(documentType).utils.createDocument(state);
|
|
564
579
|
// get the header
|
|
565
580
|
let header;
|
|
566
581
|
// handle the legacy case where an id is provided
|
|
@@ -609,11 +624,9 @@ export class BaseDocumentDriveServer {
|
|
|
609
624
|
// stores document information
|
|
610
625
|
const documentStorage = {
|
|
611
626
|
header,
|
|
612
|
-
history: document.history,
|
|
613
627
|
operations: { global: [], local: [] },
|
|
614
628
|
initialState: document.initialState,
|
|
615
629
|
clipboard: [],
|
|
616
|
-
attachments: document.attachments,
|
|
617
630
|
state: state ?? document.state,
|
|
618
631
|
};
|
|
619
632
|
await this.documentStorage.create(documentStorage);
|
|
@@ -646,7 +659,181 @@ export class BaseDocumentDriveServer {
|
|
|
646
659
|
await this.legacyStorage.addDocumentOperations(header.id, operations, document);
|
|
647
660
|
}
|
|
648
661
|
}
|
|
649
|
-
return
|
|
662
|
+
return await this.getDocument(documentStorage.header.id);
|
|
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
|
+
});
|
|
650
837
|
}
|
|
651
838
|
async deleteDocument(documentId) {
|
|
652
839
|
try {
|
|
@@ -676,7 +863,7 @@ export class BaseDocumentDriveServer {
|
|
|
676
863
|
let error; // TODO: replace with an array of errors/consistency issues
|
|
677
864
|
const operationsByScope = groupOperationsByScope(operations);
|
|
678
865
|
for (const scope of Object.keys(operationsByScope)) {
|
|
679
|
-
const storageDocumentOperations = documentStorage.operations[scope];
|
|
866
|
+
const storageDocumentOperations = documentStorage.operations[scope] || [];
|
|
680
867
|
// TODO two equal operations done by two clients will be considered the same, ie: { type: "INCREMENT" }
|
|
681
868
|
const branch = removeExistingOperations(operationsByScope[scope] || [], storageDocumentOperations);
|
|
682
869
|
// No operations to apply
|
|
@@ -736,13 +923,17 @@ export class BaseDocumentDriveServer {
|
|
|
736
923
|
: document.operations;
|
|
737
924
|
const documentOperations = garbageCollectDocumentOperations(operations);
|
|
738
925
|
for (const scope of Object.keys(documentOperations)) {
|
|
739
|
-
const
|
|
926
|
+
const scopeOps = documentOperations[scope];
|
|
927
|
+
if (!scopeOps) {
|
|
928
|
+
continue;
|
|
929
|
+
}
|
|
930
|
+
const lastRemainingOperation = scopeOps.at(-1);
|
|
740
931
|
// if the latest operation doesn't have a resulting state then tries
|
|
741
932
|
// to retrieve it from the db to avoid rerunning all the operations
|
|
742
933
|
if (lastRemainingOperation && !lastRemainingOperation.resultingState) {
|
|
743
934
|
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"));
|
|
935
|
+
? this.legacyStorage.getOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.action.scope, "main")
|
|
936
|
+
: this.legacyStorage.getDriveOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.action.scope, "main"));
|
|
746
937
|
}
|
|
747
938
|
}
|
|
748
939
|
return {
|
|
@@ -761,31 +952,83 @@ export class BaseDocumentDriveServer {
|
|
|
761
952
|
? filterOperationsByRevision(documentStorage.operations, options.revisions)
|
|
762
953
|
: documentStorage.operations;
|
|
763
954
|
const operations = garbageCollectDocumentOperations(revisionOperations);
|
|
764
|
-
|
|
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, {
|
|
765
988
|
...options,
|
|
766
989
|
checkHashes: options?.checkHashes ?? true,
|
|
767
990
|
reuseOperationResultingState: options?.checkHashes ?? true,
|
|
768
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
|
+
};
|
|
769
1010
|
}
|
|
770
1011
|
async _performOperation(documentId, document, operation, skipHashValidation = false) {
|
|
771
1012
|
const documentModelModule = this.getDocumentModelModule(document.header.documentType);
|
|
772
1013
|
const signalResults = [];
|
|
773
1014
|
let newDocument = document;
|
|
774
|
-
const scope = operation.scope;
|
|
1015
|
+
const scope = operation.action.scope;
|
|
1016
|
+
const currentScopeOperations = document.operations[scope] || [];
|
|
775
1017
|
const documentOperations = garbageCollectDocumentOperations({
|
|
776
1018
|
...document.operations,
|
|
777
|
-
[scope]: skipHeaderOperations(
|
|
1019
|
+
[scope]: skipHeaderOperations(currentScopeOperations, operation),
|
|
778
1020
|
});
|
|
779
|
-
const
|
|
1021
|
+
const remainingScopeOps = documentOperations[scope];
|
|
1022
|
+
const lastRemainingOperation = remainingScopeOps?.at(-1);
|
|
780
1023
|
// if the latest operation doesn't have a resulting state then tries
|
|
781
1024
|
// to retrieve it from the db to avoid rerunning all the operations
|
|
782
1025
|
if (lastRemainingOperation && !lastRemainingOperation.resultingState) {
|
|
783
1026
|
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"));
|
|
1027
|
+
? this.legacyStorage.getOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.action.scope, "main")
|
|
1028
|
+
: this.legacyStorage.getDriveOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.action.scope, "main"));
|
|
786
1029
|
}
|
|
787
1030
|
const operationSignals = [];
|
|
788
|
-
newDocument = documentModelModule.reducer(newDocument, operation, (signal) => {
|
|
1031
|
+
newDocument = documentModelModule.reducer(newDocument, operation.action, (signal) => {
|
|
789
1032
|
let handler = undefined;
|
|
790
1033
|
switch (signal.type) {
|
|
791
1034
|
case "CREATE_CHILD_DOCUMENT":
|
|
@@ -801,8 +1044,16 @@ export class BaseDocumentDriveServer {
|
|
|
801
1044
|
if (handler) {
|
|
802
1045
|
operationSignals.push(() => handler().then((result) => ({ signal, result })));
|
|
803
1046
|
}
|
|
804
|
-
}, {
|
|
805
|
-
|
|
1047
|
+
}, {
|
|
1048
|
+
skip: operation.skip,
|
|
1049
|
+
reuseOperationResultingState: true,
|
|
1050
|
+
replayOptions: { operation },
|
|
1051
|
+
});
|
|
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);
|
|
806
1057
|
const appliedOperation = appliedOperations.at(0);
|
|
807
1058
|
if (!appliedOperation) {
|
|
808
1059
|
throw new OperationError("ERROR", operation, `Operation with index ${operation.index}:${operation.skip} was not applied.`);
|
|
@@ -889,7 +1140,8 @@ export class BaseDocumentDriveServer {
|
|
|
889
1140
|
jobId = await this.queueManager.addJob({
|
|
890
1141
|
documentId: id,
|
|
891
1142
|
documentType,
|
|
892
|
-
initialState: document,
|
|
1143
|
+
initialState: document?.state,
|
|
1144
|
+
header: document?.header,
|
|
893
1145
|
options,
|
|
894
1146
|
});
|
|
895
1147
|
}
|
|
@@ -920,11 +1172,19 @@ export class BaseDocumentDriveServer {
|
|
|
920
1172
|
async resultIfExistingOperations(id, operations) {
|
|
921
1173
|
try {
|
|
922
1174
|
const document = await this.getDocument(id);
|
|
923
|
-
const newOperation = operations.find((op) =>
|
|
924
|
-
!
|
|
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 &&
|
|
925
1184
|
existingOp.index === op.index &&
|
|
926
|
-
existingOp.type === op.type &&
|
|
927
|
-
existingOp.hash === op.hash)
|
|
1185
|
+
existingOp.action.type === op.action.type &&
|
|
1186
|
+
existingOp.hash === op.hash);
|
|
1187
|
+
});
|
|
928
1188
|
if (!newOperation) {
|
|
929
1189
|
return {
|
|
930
1190
|
status: "SUCCESS",
|
|
@@ -1155,10 +1415,10 @@ export class BaseDocumentDriveServer {
|
|
|
1155
1415
|
const syncUnit = {
|
|
1156
1416
|
documentId,
|
|
1157
1417
|
documentType: document.header.documentType,
|
|
1158
|
-
scope: operation.scope,
|
|
1418
|
+
scope: operation.action.scope,
|
|
1159
1419
|
branch: "main", // TODO: handle branches
|
|
1160
1420
|
revision: operation.index + 1,
|
|
1161
|
-
lastUpdated: operation.
|
|
1421
|
+
lastUpdated: operation.timestampUtcMs,
|
|
1162
1422
|
};
|
|
1163
1423
|
// checks if this sync unit was already added
|
|
1164
1424
|
const exists = syncUnits.some((unit) => unit.documentId === syncUnit.documentId &&
|
|
@@ -1276,11 +1536,19 @@ export class BaseDocumentDriveServer {
|
|
|
1276
1536
|
async resultIfExistingDriveOperations(driveId, operations) {
|
|
1277
1537
|
try {
|
|
1278
1538
|
const drive = await this.getDrive(driveId);
|
|
1279
|
-
const newOperation = operations.find((op) =>
|
|
1280
|
-
!
|
|
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 &&
|
|
1281
1548
|
existingOp.index === op.index &&
|
|
1282
|
-
existingOp.type === op.type &&
|
|
1283
|
-
existingOp.hash === op.hash)
|
|
1549
|
+
existingOp.action.type === op.action.type &&
|
|
1550
|
+
existingOp.hash === op.hash);
|
|
1551
|
+
});
|
|
1284
1552
|
if (!newOperation) {
|
|
1285
1553
|
return {
|
|
1286
1554
|
status: "SUCCESS",
|
|
@@ -1370,7 +1638,7 @@ export class BaseDocumentDriveServer {
|
|
|
1370
1638
|
this.cache.setDrive(driveId, document).catch(this.logger.error);
|
|
1371
1639
|
// update listener cache
|
|
1372
1640
|
const lastOperation = operationsApplied
|
|
1373
|
-
.filter((op) => op.scope === "global")
|
|
1641
|
+
.filter((op) => op.action.scope === "global")
|
|
1374
1642
|
.slice()
|
|
1375
1643
|
.pop();
|
|
1376
1644
|
if (lastOperation) {
|
|
@@ -1393,7 +1661,7 @@ export class BaseDocumentDriveServer {
|
|
|
1393
1661
|
documentType: document.header.documentType,
|
|
1394
1662
|
scope: "global",
|
|
1395
1663
|
branch: "main",
|
|
1396
|
-
lastUpdated: lastOperation.
|
|
1664
|
+
lastUpdated: lastOperation.timestampUtcMs,
|
|
1397
1665
|
revision: lastOperation.index,
|
|
1398
1666
|
},
|
|
1399
1667
|
], source, () => {
|
|
@@ -1453,7 +1721,11 @@ export class BaseDocumentDriveServer {
|
|
|
1453
1721
|
const { reducer } = this.getDocumentModelModule(documentId.header.documentType);
|
|
1454
1722
|
for (const action of actions) {
|
|
1455
1723
|
documentId = reducer(documentId, action);
|
|
1456
|
-
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();
|
|
1457
1729
|
if (!operation) {
|
|
1458
1730
|
throw new Error("Error creating operations");
|
|
1459
1731
|
}
|
|
@@ -1516,7 +1788,7 @@ export class BaseDocumentDriveServer {
|
|
|
1516
1788
|
}
|
|
1517
1789
|
async _legacyAddFileAction(driveId, action, options) {
|
|
1518
1790
|
// create document before adding it to the drive
|
|
1519
|
-
const document = this.getDocumentModelModule(action.input.documentType).utils.createDocument(
|
|
1791
|
+
const document = this.getDocumentModelModule(action.input.documentType).utils.createDocument(action.input.document?.state || undefined);
|
|
1520
1792
|
document.header.id = action.input.id;
|
|
1521
1793
|
document.header.name = action.input.name;
|
|
1522
1794
|
document.header.documentType = action.input.documentType;
|
|
@@ -1587,6 +1859,14 @@ export class BaseDocumentDriveServer {
|
|
|
1587
1859
|
}
|
|
1588
1860
|
const operations = strand.operations.map((op) => ({
|
|
1589
1861
|
...op,
|
|
1862
|
+
action: {
|
|
1863
|
+
id: op.actionId,
|
|
1864
|
+
timestampUtcMs: op.timestampUtcMs,
|
|
1865
|
+
type: op.type,
|
|
1866
|
+
input: op.input,
|
|
1867
|
+
context: op.context,
|
|
1868
|
+
scope: strand.scope,
|
|
1869
|
+
},
|
|
1590
1870
|
scope: strand.scope,
|
|
1591
1871
|
branch: strand.branch,
|
|
1592
1872
|
}));
|