document-drive 4.1.0-dev.10 → 4.1.0-dev.100
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 +18 -27
- package/dist/src/server/base-server.d.ts.map +1 -1
- package/dist/src/server/base-server.js +363 -66
- 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 +49 -33
- 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 +13 -12
- 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 +37 -13
- 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 +39 -17
- 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 +145 -54
- 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 +3 -1
- package/dist/src/storage/utils.d.ts.map +1 -1
- package/dist/src/storage/utils.js +18 -0
- package/dist/src/storage/utils.js.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/undo-redo-clipboard.test.d.ts +2 -0
- package/dist/test/undo-redo-clipboard.test.d.ts.map +1 -0
- package/dist/test/undo-redo-clipboard.test.js +108 -0
- package/dist/test/undo-redo-clipboard.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, diffOperations, 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
|
}
|
|
@@ -344,13 +343,19 @@ export class BaseDocumentDriveServer {
|
|
|
344
343
|
return this.createDocument(input, { type: "local" }, meta);
|
|
345
344
|
}
|
|
346
345
|
async addDrive(input, preferredEditor) {
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
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 ?? [],
|
|
354
359
|
},
|
|
355
360
|
});
|
|
356
361
|
if (input.id && input.id.length > 0) {
|
|
@@ -359,9 +364,10 @@ export class BaseDocumentDriveServer {
|
|
|
359
364
|
if (input.slug && input.slug.length > 0) {
|
|
360
365
|
document.header.slug = input.slug;
|
|
361
366
|
}
|
|
362
|
-
|
|
367
|
+
const editorToUse = input.preferredEditor || preferredEditor;
|
|
368
|
+
if (editorToUse) {
|
|
363
369
|
document.header.meta = {
|
|
364
|
-
preferredEditor:
|
|
370
|
+
preferredEditor: editorToUse,
|
|
365
371
|
};
|
|
366
372
|
}
|
|
367
373
|
await this.documentStorage.create(document);
|
|
@@ -548,6 +554,14 @@ export class BaseDocumentDriveServer {
|
|
|
548
554
|
}
|
|
549
555
|
}
|
|
550
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) {
|
|
551
565
|
const { documentType, document: inputDocument } = resolveCreateDocumentInput(input);
|
|
552
566
|
// if a document was provided then checks if it's valid
|
|
553
567
|
let state = undefined;
|
|
@@ -561,9 +575,7 @@ export class BaseDocumentDriveServer {
|
|
|
561
575
|
}
|
|
562
576
|
// if no document was provided then create a new one
|
|
563
577
|
const document = inputDocument ??
|
|
564
|
-
this.getDocumentModelModule(documentType).utils.createDocument(
|
|
565
|
-
state,
|
|
566
|
-
});
|
|
578
|
+
this.getDocumentModelModule(documentType).utils.createDocument(state);
|
|
567
579
|
// get the header
|
|
568
580
|
let header;
|
|
569
581
|
// handle the legacy case where an id is provided
|
|
@@ -612,11 +624,9 @@ export class BaseDocumentDriveServer {
|
|
|
612
624
|
// stores document information
|
|
613
625
|
const documentStorage = {
|
|
614
626
|
header,
|
|
615
|
-
history: document.history,
|
|
616
627
|
operations: { global: [], local: [] },
|
|
617
628
|
initialState: document.initialState,
|
|
618
629
|
clipboard: [],
|
|
619
|
-
attachments: document.attachments,
|
|
620
630
|
state: state ?? document.state,
|
|
621
631
|
};
|
|
622
632
|
await this.documentStorage.create(documentStorage);
|
|
@@ -649,7 +659,181 @@ export class BaseDocumentDriveServer {
|
|
|
649
659
|
await this.legacyStorage.addDocumentOperations(header.id, operations, document);
|
|
650
660
|
}
|
|
651
661
|
}
|
|
652
|
-
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
|
+
});
|
|
653
837
|
}
|
|
654
838
|
async deleteDocument(documentId) {
|
|
655
839
|
try {
|
|
@@ -679,7 +863,7 @@ export class BaseDocumentDriveServer {
|
|
|
679
863
|
let error; // TODO: replace with an array of errors/consistency issues
|
|
680
864
|
const operationsByScope = groupOperationsByScope(operations);
|
|
681
865
|
for (const scope of Object.keys(operationsByScope)) {
|
|
682
|
-
const storageDocumentOperations = documentStorage.operations[scope];
|
|
866
|
+
const storageDocumentOperations = documentStorage.operations[scope] || [];
|
|
683
867
|
// TODO two equal operations done by two clients will be considered the same, ie: { type: "INCREMENT" }
|
|
684
868
|
const branch = removeExistingOperations(operationsByScope[scope] || [], storageDocumentOperations);
|
|
685
869
|
// No operations to apply
|
|
@@ -739,13 +923,17 @@ export class BaseDocumentDriveServer {
|
|
|
739
923
|
: document.operations;
|
|
740
924
|
const documentOperations = garbageCollectDocumentOperations(operations);
|
|
741
925
|
for (const scope of Object.keys(documentOperations)) {
|
|
742
|
-
const
|
|
926
|
+
const scopeOps = documentOperations[scope];
|
|
927
|
+
if (!scopeOps) {
|
|
928
|
+
continue;
|
|
929
|
+
}
|
|
930
|
+
const lastRemainingOperation = scopeOps.at(-1);
|
|
743
931
|
// if the latest operation doesn't have a resulting state then tries
|
|
744
932
|
// to retrieve it from the db to avoid rerunning all the operations
|
|
745
933
|
if (lastRemainingOperation && !lastRemainingOperation.resultingState) {
|
|
746
934
|
lastRemainingOperation.resultingState = await (isDocumentDrive(document)
|
|
747
|
-
? this.legacyStorage.getOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.scope, "main")
|
|
748
|
-
: 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"));
|
|
749
937
|
}
|
|
750
938
|
}
|
|
751
939
|
return {
|
|
@@ -764,31 +952,84 @@ export class BaseDocumentDriveServer {
|
|
|
764
952
|
? filterOperationsByRevision(documentStorage.operations, options.revisions)
|
|
765
953
|
: documentStorage.operations;
|
|
766
954
|
const operations = garbageCollectDocumentOperations(revisionOperations);
|
|
767
|
-
|
|
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, {
|
|
768
988
|
...options,
|
|
769
989
|
checkHashes: options?.checkHashes ?? true,
|
|
770
990
|
reuseOperationResultingState: options?.checkHashes ?? true,
|
|
771
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
|
+
};
|
|
772
1010
|
}
|
|
773
1011
|
async _performOperation(documentId, document, operation, skipHashValidation = false) {
|
|
774
1012
|
const documentModelModule = this.getDocumentModelModule(document.header.documentType);
|
|
775
1013
|
const signalResults = [];
|
|
776
1014
|
let newDocument = document;
|
|
777
|
-
const scope = operation.scope;
|
|
1015
|
+
const scope = operation.action.scope;
|
|
1016
|
+
const currentScopeOperations = document.operations[scope] || [];
|
|
778
1017
|
const documentOperations = garbageCollectDocumentOperations({
|
|
779
1018
|
...document.operations,
|
|
780
|
-
[scope]: skipHeaderOperations(
|
|
1019
|
+
[scope]: skipHeaderOperations(currentScopeOperations, operation),
|
|
781
1020
|
});
|
|
782
|
-
const
|
|
1021
|
+
const remainingScopeOps = documentOperations[scope];
|
|
1022
|
+
const lastRemainingOperation = remainingScopeOps?.at(-1);
|
|
783
1023
|
// if the latest operation doesn't have a resulting state then tries
|
|
784
1024
|
// to retrieve it from the db to avoid rerunning all the operations
|
|
785
1025
|
if (lastRemainingOperation && !lastRemainingOperation.resultingState) {
|
|
786
1026
|
lastRemainingOperation.resultingState = await (isDocumentDrive(document)
|
|
787
|
-
? this.legacyStorage.getOperationResultingState?.(documentId, lastRemainingOperation.index, lastRemainingOperation.scope, "main")
|
|
788
|
-
: 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"));
|
|
789
1029
|
}
|
|
1030
|
+
const operationsBeforeReducer = newDocument.operations[scope] || [];
|
|
790
1031
|
const operationSignals = [];
|
|
791
|
-
newDocument = documentModelModule.reducer(newDocument, operation, (signal) => {
|
|
1032
|
+
newDocument = documentModelModule.reducer(newDocument, operation.action, (signal) => {
|
|
792
1033
|
let handler = undefined;
|
|
793
1034
|
switch (signal.type) {
|
|
794
1035
|
case "CREATE_CHILD_DOCUMENT":
|
|
@@ -804,8 +1045,35 @@ export class BaseDocumentDriveServer {
|
|
|
804
1045
|
if (handler) {
|
|
805
1046
|
operationSignals.push(() => handler().then((result) => ({ signal, result })));
|
|
806
1047
|
}
|
|
807
|
-
}, {
|
|
808
|
-
|
|
1048
|
+
}, {
|
|
1049
|
+
skip: operation.skip,
|
|
1050
|
+
reuseOperationResultingState: true,
|
|
1051
|
+
replayOptions: { operation },
|
|
1052
|
+
});
|
|
1053
|
+
// when we have NOOP operations with skip > 0 we need to populate the
|
|
1054
|
+
// clipboard with the operations that were skipped to allow redo
|
|
1055
|
+
if (operation.action.type === "NOOP" &&
|
|
1056
|
+
operation.skip > 0 &&
|
|
1057
|
+
newDocument.clipboard.length === 0) {
|
|
1058
|
+
const scopeOperationsAfter = newDocument.operations[scope] || [];
|
|
1059
|
+
// Get operations AFTER garbageCollect (with NOOP)
|
|
1060
|
+
const afterOperations = garbageCollect(sortOperations(scopeOperationsAfter));
|
|
1061
|
+
// Get operations BEFORE the reducer ran (before NOOP was applied)
|
|
1062
|
+
const beforeOperations = garbageCollect(sortOperations(operationsBeforeReducer));
|
|
1063
|
+
// Calculate what was removed by comparing before vs after
|
|
1064
|
+
// The diff shows operations that were in "before" but not in "after"
|
|
1065
|
+
const diff = diffOperations(beforeOperations, afterOperations);
|
|
1066
|
+
// Populate clipboard with skipped operations (excluding NOOPs)
|
|
1067
|
+
newDocument = {
|
|
1068
|
+
...newDocument,
|
|
1069
|
+
clipboard: sortOperations(diff.filter((op) => op.action.type !== "NOOP")).reverse(),
|
|
1070
|
+
};
|
|
1071
|
+
}
|
|
1072
|
+
const newDocScopeOperations = newDocument.operations[operation.action.scope];
|
|
1073
|
+
if (!newDocScopeOperations) {
|
|
1074
|
+
throw new OperationError("ERROR", operation, `No operations found for scope: ${operation.action.scope}`);
|
|
1075
|
+
}
|
|
1076
|
+
const appliedOperations = newDocScopeOperations.filter((op) => op.index == operation.index && op.skip == operation.skip);
|
|
809
1077
|
const appliedOperation = appliedOperations.at(0);
|
|
810
1078
|
if (!appliedOperation) {
|
|
811
1079
|
throw new OperationError("ERROR", operation, `Operation with index ${operation.index}:${operation.skip} was not applied.`);
|
|
@@ -892,7 +1160,8 @@ export class BaseDocumentDriveServer {
|
|
|
892
1160
|
jobId = await this.queueManager.addJob({
|
|
893
1161
|
documentId: id,
|
|
894
1162
|
documentType,
|
|
895
|
-
initialState: document,
|
|
1163
|
+
initialState: document?.state,
|
|
1164
|
+
header: document?.header,
|
|
896
1165
|
options,
|
|
897
1166
|
});
|
|
898
1167
|
}
|
|
@@ -923,11 +1192,19 @@ export class BaseDocumentDriveServer {
|
|
|
923
1192
|
async resultIfExistingOperations(id, operations) {
|
|
924
1193
|
try {
|
|
925
1194
|
const document = await this.getDocument(id);
|
|
926
|
-
const newOperation = operations.find((op) =>
|
|
927
|
-
!
|
|
1195
|
+
const newOperation = operations.find((op) => {
|
|
1196
|
+
if (!op.id) {
|
|
1197
|
+
return true;
|
|
1198
|
+
}
|
|
1199
|
+
const scopeOps = document.operations[op.action.scope];
|
|
1200
|
+
if (!scopeOps) {
|
|
1201
|
+
return true;
|
|
1202
|
+
}
|
|
1203
|
+
return !scopeOps.find((existingOp) => existingOp.id === op.id &&
|
|
928
1204
|
existingOp.index === op.index &&
|
|
929
|
-
existingOp.type === op.type &&
|
|
930
|
-
existingOp.hash === op.hash)
|
|
1205
|
+
existingOp.action.type === op.action.type &&
|
|
1206
|
+
existingOp.hash === op.hash);
|
|
1207
|
+
});
|
|
931
1208
|
if (!newOperation) {
|
|
932
1209
|
return {
|
|
933
1210
|
status: "SUCCESS",
|
|
@@ -1158,10 +1435,10 @@ export class BaseDocumentDriveServer {
|
|
|
1158
1435
|
const syncUnit = {
|
|
1159
1436
|
documentId,
|
|
1160
1437
|
documentType: document.header.documentType,
|
|
1161
|
-
scope: operation.scope,
|
|
1438
|
+
scope: operation.action.scope,
|
|
1162
1439
|
branch: "main", // TODO: handle branches
|
|
1163
1440
|
revision: operation.index + 1,
|
|
1164
|
-
lastUpdated: operation.
|
|
1441
|
+
lastUpdated: operation.timestampUtcMs,
|
|
1165
1442
|
};
|
|
1166
1443
|
// checks if this sync unit was already added
|
|
1167
1444
|
const exists = syncUnits.some((unit) => unit.documentId === syncUnit.documentId &&
|
|
@@ -1279,11 +1556,19 @@ export class BaseDocumentDriveServer {
|
|
|
1279
1556
|
async resultIfExistingDriveOperations(driveId, operations) {
|
|
1280
1557
|
try {
|
|
1281
1558
|
const drive = await this.getDrive(driveId);
|
|
1282
|
-
const newOperation = operations.find((op) =>
|
|
1283
|
-
!
|
|
1559
|
+
const newOperation = operations.find((op) => {
|
|
1560
|
+
if (!op.id) {
|
|
1561
|
+
return true;
|
|
1562
|
+
}
|
|
1563
|
+
const scopeOps = drive.operations[op.action.scope];
|
|
1564
|
+
if (!scopeOps) {
|
|
1565
|
+
return true;
|
|
1566
|
+
}
|
|
1567
|
+
return !scopeOps.find((existingOp) => existingOp.id === op.id &&
|
|
1284
1568
|
existingOp.index === op.index &&
|
|
1285
|
-
existingOp.type === op.type &&
|
|
1286
|
-
existingOp.hash === op.hash)
|
|
1569
|
+
existingOp.action.type === op.action.type &&
|
|
1570
|
+
existingOp.hash === op.hash);
|
|
1571
|
+
});
|
|
1287
1572
|
if (!newOperation) {
|
|
1288
1573
|
return {
|
|
1289
1574
|
status: "SUCCESS",
|
|
@@ -1373,7 +1658,7 @@ export class BaseDocumentDriveServer {
|
|
|
1373
1658
|
this.cache.setDrive(driveId, document).catch(this.logger.error);
|
|
1374
1659
|
// update listener cache
|
|
1375
1660
|
const lastOperation = operationsApplied
|
|
1376
|
-
.filter((op) => op.scope === "global")
|
|
1661
|
+
.filter((op) => op.action.scope === "global")
|
|
1377
1662
|
.slice()
|
|
1378
1663
|
.pop();
|
|
1379
1664
|
if (lastOperation) {
|
|
@@ -1396,7 +1681,7 @@ export class BaseDocumentDriveServer {
|
|
|
1396
1681
|
documentType: document.header.documentType,
|
|
1397
1682
|
scope: "global",
|
|
1398
1683
|
branch: "main",
|
|
1399
|
-
lastUpdated: lastOperation.
|
|
1684
|
+
lastUpdated: lastOperation.timestampUtcMs,
|
|
1400
1685
|
revision: lastOperation.index,
|
|
1401
1686
|
},
|
|
1402
1687
|
], source, () => {
|
|
@@ -1456,7 +1741,11 @@ export class BaseDocumentDriveServer {
|
|
|
1456
1741
|
const { reducer } = this.getDocumentModelModule(documentId.header.documentType);
|
|
1457
1742
|
for (const action of actions) {
|
|
1458
1743
|
documentId = reducer(documentId, action);
|
|
1459
|
-
const
|
|
1744
|
+
const scopeOps = documentId.operations[action.scope];
|
|
1745
|
+
if (!scopeOps) {
|
|
1746
|
+
throw new Error(`No operations found for scope: ${action.scope}`);
|
|
1747
|
+
}
|
|
1748
|
+
const operation = scopeOps.slice().pop();
|
|
1460
1749
|
if (!operation) {
|
|
1461
1750
|
throw new Error("Error creating operations");
|
|
1462
1751
|
}
|
|
@@ -1519,7 +1808,7 @@ export class BaseDocumentDriveServer {
|
|
|
1519
1808
|
}
|
|
1520
1809
|
async _legacyAddFileAction(driveId, action, options) {
|
|
1521
1810
|
// create document before adding it to the drive
|
|
1522
|
-
const document = this.getDocumentModelModule(action.input.documentType).utils.createDocument(
|
|
1811
|
+
const document = this.getDocumentModelModule(action.input.documentType).utils.createDocument(action.input.document?.state || undefined);
|
|
1523
1812
|
document.header.id = action.input.id;
|
|
1524
1813
|
document.header.name = action.input.name;
|
|
1525
1814
|
document.header.documentType = action.input.documentType;
|
|
@@ -1590,6 +1879,14 @@ export class BaseDocumentDriveServer {
|
|
|
1590
1879
|
}
|
|
1591
1880
|
const operations = strand.operations.map((op) => ({
|
|
1592
1881
|
...op,
|
|
1882
|
+
action: {
|
|
1883
|
+
id: op.actionId,
|
|
1884
|
+
timestampUtcMs: op.timestampUtcMs,
|
|
1885
|
+
type: op.type,
|
|
1886
|
+
input: op.input,
|
|
1887
|
+
context: op.context,
|
|
1888
|
+
scope: strand.scope,
|
|
1889
|
+
},
|
|
1593
1890
|
scope: strand.scope,
|
|
1594
1891
|
branch: strand.branch,
|
|
1595
1892
|
}));
|