document-drive 1.19.1 → 1.20.1
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/README.md +4 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/src/cache/memory.d.ts +10 -0
- package/dist/src/cache/memory.d.ts.map +1 -0
- package/dist/src/cache/memory.js +26 -0
- package/dist/src/cache/redis.d.ts +14 -0
- package/dist/src/cache/redis.d.ts.map +1 -0
- package/dist/src/cache/redis.js +40 -0
- package/dist/src/cache/types.d.ts +7 -0
- package/dist/src/cache/types.d.ts.map +1 -0
- package/dist/src/cache/types.js +1 -0
- package/dist/src/drive-document-model/constants.d.ts +2 -0
- package/dist/src/drive-document-model/constants.d.ts.map +1 -0
- package/dist/src/drive-document-model/constants.js +1 -0
- package/dist/src/drive-document-model/gen/actions.d.ts +7 -0
- package/dist/src/drive-document-model/gen/actions.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/actions.js +2 -0
- package/dist/src/drive-document-model/gen/constants.d.ts +7 -0
- package/dist/src/drive-document-model/gen/constants.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/constants.js +16 -0
- package/dist/src/drive-document-model/gen/creators.d.ts +3 -0
- package/dist/src/drive-document-model/gen/creators.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/creators.js +2 -0
- package/dist/src/drive-document-model/gen/document-model.d.ts +3 -0
- package/dist/src/drive-document-model/gen/document-model.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/document-model.js +210 -0
- package/dist/src/drive-document-model/gen/drive/actions.d.ts +12 -0
- package/dist/src/drive-document-model/gen/drive/actions.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/drive/actions.js +1 -0
- package/dist/src/drive-document-model/gen/drive/creators.d.ts +11 -0
- package/dist/src/drive-document-model/gen/drive/creators.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/drive/creators.js +10 -0
- package/dist/src/drive-document-model/gen/drive/error.d.ts +2 -0
- package/dist/src/drive-document-model/gen/drive/error.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/drive/error.js +1 -0
- package/dist/src/drive-document-model/gen/drive/object.d.ts +14 -0
- package/dist/src/drive-document-model/gen/drive/object.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/drive/object.js +28 -0
- package/dist/src/drive-document-model/gen/drive/operations.d.ts +14 -0
- package/dist/src/drive-document-model/gen/drive/operations.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/drive/operations.js +1 -0
- package/dist/src/drive-document-model/gen/node/actions.d.ts +11 -0
- package/dist/src/drive-document-model/gen/node/actions.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/node/actions.js +1 -0
- package/dist/src/drive-document-model/gen/node/creators.d.ts +10 -0
- package/dist/src/drive-document-model/gen/node/creators.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/node/creators.js +9 -0
- package/dist/src/drive-document-model/gen/node/error.d.ts +2 -0
- package/dist/src/drive-document-model/gen/node/error.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/node/error.js +1 -0
- package/dist/src/drive-document-model/gen/node/object.d.ts +13 -0
- package/dist/src/drive-document-model/gen/node/object.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/node/object.js +25 -0
- package/dist/src/drive-document-model/gen/node/operations.d.ts +13 -0
- package/dist/src/drive-document-model/gen/node/operations.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/node/operations.js +1 -0
- package/dist/src/drive-document-model/gen/object.d.ts +21 -0
- package/dist/src/drive-document-model/gen/object.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/object.js +28 -0
- package/dist/src/drive-document-model/gen/reducer.d.ts +4 -0
- package/dist/src/drive-document-model/gen/reducer.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/reducer.js +74 -0
- package/dist/src/drive-document-model/gen/schema/types.d.ts +176 -0
- package/dist/src/drive-document-model/gen/schema/types.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/schema/types.js +1 -0
- package/dist/src/drive-document-model/gen/schema/zod.d.ts +87 -0
- package/dist/src/drive-document-model/gen/schema/zod.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/schema/zod.js +203 -0
- package/dist/src/drive-document-model/gen/types.d.ts +9 -0
- package/dist/src/drive-document-model/gen/types.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/types.js +1 -0
- package/dist/src/drive-document-model/gen/utils.d.ts +10 -0
- package/dist/src/drive-document-model/gen/utils.d.ts.map +1 -0
- package/dist/src/drive-document-model/gen/utils.js +27 -0
- package/dist/src/drive-document-model/index.d.ts +2 -0
- package/dist/src/drive-document-model/index.d.ts.map +1 -0
- package/dist/src/drive-document-model/index.js +1 -0
- package/dist/src/drive-document-model/module.d.ts +3 -0
- package/dist/src/drive-document-model/module.d.ts.map +1 -0
- package/dist/src/drive-document-model/module.js +12 -0
- package/dist/src/drive-document-model/src/reducers/drive.d.ts +8 -0
- package/dist/src/drive-document-model/src/reducers/drive.d.ts.map +1 -0
- package/dist/src/drive-document-model/src/reducers/drive.js +37 -0
- package/dist/src/drive-document-model/src/reducers/node.d.ts +8 -0
- package/dist/src/drive-document-model/src/reducers/node.d.ts.map +1 -0
- package/dist/src/drive-document-model/src/reducers/node.js +185 -0
- package/dist/src/drive-document-model/src/utils.d.ts +34 -0
- package/dist/src/drive-document-model/src/utils.d.ts.map +1 -0
- package/dist/src/drive-document-model/src/utils.js +146 -0
- package/dist/src/queue/base.d.ts +43 -0
- package/dist/src/queue/base.d.ts.map +1 -0
- package/dist/src/queue/base.js +241 -0
- package/dist/src/queue/redis.d.ts +28 -0
- package/dist/src/queue/redis.d.ts.map +1 -0
- package/dist/src/queue/redis.js +110 -0
- package/dist/src/queue/types.d.ts +55 -0
- package/dist/src/queue/types.d.ts.map +1 -0
- package/dist/src/queue/types.js +6 -0
- package/dist/src/read-mode/errors.d.ts +12 -0
- package/dist/src/read-mode/errors.d.ts.map +1 -0
- package/dist/src/read-mode/errors.js +17 -0
- package/dist/src/read-mode/server.d.ts +4 -0
- package/dist/src/read-mode/server.d.ts.map +1 -0
- package/dist/src/read-mode/server.js +78 -0
- package/dist/src/read-mode/service.d.ts +18 -0
- package/dist/src/read-mode/service.d.ts.map +1 -0
- package/dist/src/read-mode/service.js +112 -0
- package/dist/src/read-mode/types.d.ts +35 -0
- package/dist/src/read-mode/types.d.ts.map +1 -0
- package/dist/src/read-mode/types.js +1 -0
- package/dist/src/server/base-server.d.ts +112 -0
- package/dist/src/server/base-server.d.ts.map +1 -0
- package/dist/src/server/base-server.js +1280 -0
- package/dist/src/server/builder.d.ts +30 -0
- package/dist/src/server/builder.d.ts.map +1 -0
- package/dist/src/server/builder.js +89 -0
- package/dist/src/server/constants.d.ts +2 -0
- package/dist/src/server/constants.d.ts.map +1 -0
- package/dist/src/server/constants.js +1 -0
- package/dist/src/server/error.d.ts +30 -0
- package/dist/src/server/error.d.ts.map +1 -0
- package/dist/src/server/error.js +47 -0
- package/dist/src/server/event-emitter.d.ts +8 -0
- package/dist/src/server/event-emitter.d.ts.map +1 -0
- package/dist/src/server/event-emitter.js +10 -0
- package/dist/src/server/listener/index.d.ts +2 -0
- package/dist/src/server/listener/index.d.ts.map +1 -0
- package/dist/src/server/listener/index.js +1 -0
- package/dist/src/server/listener/listener-manager.d.ts +27 -0
- package/dist/src/server/listener/listener-manager.d.ts.map +1 -0
- package/dist/src/server/listener/listener-manager.js +401 -0
- package/dist/src/server/listener/transmitter/factory.d.ts +8 -0
- package/dist/src/server/listener/transmitter/factory.d.ts.map +1 -0
- package/dist/src/server/listener/transmitter/factory.js +25 -0
- package/dist/src/server/listener/transmitter/internal.d.ts +34 -0
- package/dist/src/server/listener/transmitter/internal.d.ts.map +1 -0
- package/dist/src/server/listener/transmitter/internal.js +87 -0
- package/dist/src/server/listener/transmitter/pull-responder.d.ts +38 -0
- package/dist/src/server/listener/transmitter/pull-responder.d.ts.map +1 -0
- package/dist/src/server/listener/transmitter/pull-responder.js +256 -0
- package/dist/src/server/listener/transmitter/switchboard-push.d.ts +9 -0
- package/dist/src/server/listener/transmitter/switchboard-push.d.ts.map +1 -0
- package/dist/src/server/listener/transmitter/switchboard-push.js +77 -0
- package/dist/src/server/listener/transmitter/types.d.ts +20 -0
- package/dist/src/server/listener/transmitter/types.d.ts.map +1 -0
- package/dist/src/server/listener/transmitter/types.js +1 -0
- package/dist/src/server/listener/util.d.ts +2 -0
- package/dist/src/server/listener/util.d.ts.map +1 -0
- package/dist/src/server/listener/util.js +22 -0
- package/dist/src/server/sync-manager.d.ts +30 -0
- package/dist/src/server/sync-manager.d.ts.map +1 -0
- package/dist/src/server/sync-manager.js +287 -0
- package/dist/src/server/types.d.ts +308 -0
- package/dist/src/server/types.d.ts.map +1 -0
- package/dist/src/server/types.js +12 -0
- package/dist/src/server/utils.d.ts +8 -0
- package/dist/src/server/utils.d.ts.map +1 -0
- package/dist/src/server/utils.js +47 -0
- package/dist/src/storage/base.d.ts +36 -0
- package/dist/src/storage/base.d.ts.map +1 -0
- package/dist/src/storage/base.js +4 -0
- package/dist/src/storage/browser.d.ts +36 -0
- package/dist/src/storage/browser.d.ts.map +1 -0
- package/dist/src/storage/browser.js +155 -0
- package/dist/src/storage/filesystem.d.ts +33 -0
- package/dist/src/storage/filesystem.d.ts.map +1 -0
- package/dist/src/storage/filesystem.js +197 -0
- package/dist/src/storage/memory.d.ts +33 -0
- package/dist/src/storage/memory.d.ts.map +1 -0
- package/dist/src/storage/memory.js +139 -0
- package/dist/src/storage/prisma.d.ts +67 -0
- package/dist/src/storage/prisma.d.ts.map +1 -0
- package/dist/src/storage/prisma.js +445 -0
- package/dist/src/storage/sequelize.d.ts +32 -0
- package/dist/src/storage/sequelize.d.ts.map +1 -0
- package/dist/src/storage/sequelize.js +373 -0
- package/dist/src/storage/types.d.ts +43 -0
- package/dist/src/storage/types.d.ts.map +1 -0
- package/dist/src/storage/types.js +1 -0
- package/dist/src/utils/default-drives-manager.d.ts +29 -0
- package/dist/src/utils/default-drives-manager.d.ts.map +1 -0
- package/dist/src/utils/default-drives-manager.js +208 -0
- package/dist/src/utils/graphql.d.ts +34 -0
- package/dist/src/utils/graphql.d.ts.map +1 -0
- package/dist/src/utils/graphql.js +183 -0
- package/dist/src/utils/logger.d.ts +27 -0
- package/dist/src/utils/logger.d.ts.map +1 -0
- package/dist/src/utils/logger.js +105 -0
- package/dist/src/utils/migrations.d.ts +4 -0
- package/dist/src/utils/migrations.d.ts.map +1 -0
- package/dist/src/utils/migrations.js +41 -0
- package/dist/src/utils/misc.d.ts +11 -0
- package/dist/src/utils/misc.d.ts.map +1 -0
- package/dist/src/utils/misc.js +43 -0
- package/dist/src/utils/run-asap.d.ts +12 -0
- package/dist/src/utils/run-asap.d.ts.map +1 -0
- package/dist/src/utils/run-asap.js +131 -0
- package/dist/test/document-helpers/utils.d.ts +8 -0
- package/dist/test/document-helpers/utils.d.ts.map +1 -0
- package/dist/test/document-helpers/utils.js +21 -0
- package/dist/test/utils.d.ts +48 -0
- package/dist/test/utils.d.ts.map +1 -0
- package/dist/test/utils.js +132 -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 +4 -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 +20 -0
- package/package.json +20 -38
- package/src/cache/index.ts +0 -2
- package/src/cache/memory.ts +0 -33
- package/src/cache/redis.ts +0 -56
- package/src/cache/types.ts +0 -9
- package/src/index.ts +0 -4
- package/src/queue/base.ts +0 -320
- package/src/queue/index.ts +0 -2
- package/src/queue/redis.ts +0 -144
- package/src/queue/types.ts +0 -79
- package/src/read-mode/errors.ts +0 -19
- package/src/read-mode/index.ts +0 -125
- package/src/read-mode/service.ts +0 -207
- package/src/read-mode/types.ts +0 -108
- package/src/server/error.ts +0 -70
- package/src/server/index.ts +0 -2444
- package/src/server/listener/index.ts +0 -2
- package/src/server/listener/manager.ts +0 -652
- package/src/server/listener/transmitter/index.ts +0 -4
- package/src/server/listener/transmitter/internal.ts +0 -143
- package/src/server/listener/transmitter/pull-responder.ts +0 -462
- package/src/server/listener/transmitter/switchboard-push.ts +0 -125
- package/src/server/listener/transmitter/types.ts +0 -27
- package/src/server/types.ts +0 -596
- package/src/server/utils.ts +0 -82
- package/src/storage/base.ts +0 -81
- package/src/storage/browser.ts +0 -238
- package/src/storage/filesystem.ts +0 -297
- package/src/storage/index.ts +0 -2
- package/src/storage/memory.ts +0 -211
- package/src/storage/prisma.ts +0 -653
- package/src/storage/sequelize.ts +0 -498
- package/src/storage/types.ts +0 -97
- package/src/utils/default-drives-manager.ts +0 -341
- package/src/utils/document-helpers.ts +0 -21
- package/src/utils/graphql.ts +0 -301
- package/src/utils/index.ts +0 -90
- package/src/utils/logger.ts +0 -38
- package/src/utils/migrations.ts +0 -58
- package/src/utils/run-asap.ts +0 -156
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { DocumentDriveLocalState, FileNode, FolderNode } from "#drive-document-model/gen/types";
|
|
2
|
+
import { DocumentModelModule, DocumentModelState, OperationFromDocument, PHDocument } from "document-model";
|
|
3
|
+
import { BuildSchemaOptions, GraphQLError, ParseOptions } from "graphql";
|
|
4
|
+
import request from "graphql-request";
|
|
5
|
+
export { gql } from "graphql-request";
|
|
6
|
+
export type GraphQLResult<T> = {
|
|
7
|
+
[K in keyof T]: T[K] | null;
|
|
8
|
+
} & {
|
|
9
|
+
errors?: GraphQLError[];
|
|
10
|
+
};
|
|
11
|
+
export declare function requestGraphql<T>(...args: Parameters<typeof request>): Promise<GraphQLResult<T>>;
|
|
12
|
+
export type DriveInfo = {
|
|
13
|
+
id: string;
|
|
14
|
+
name: string;
|
|
15
|
+
slug: string;
|
|
16
|
+
icon?: string;
|
|
17
|
+
meta?: {
|
|
18
|
+
preferredEditor?: string;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
export declare function generateDocumentStateQueryFields(documentModelState: DocumentModelState, options?: BuildSchemaOptions & ParseOptions): string;
|
|
22
|
+
export declare function requestPublicDrive(url: string): Promise<DriveInfo>;
|
|
23
|
+
export type DriveState = DriveInfo & Pick<DocumentDriveLocalState, "availableOffline" | "sharingType"> & {
|
|
24
|
+
nodes: Array<FolderNode | Omit<FileNode, "synchronizationUnits">>;
|
|
25
|
+
};
|
|
26
|
+
export type DocumentGraphQLResult<TDocument extends PHDocument> = TDocument & {
|
|
27
|
+
operations: (OperationFromDocument<TDocument> & {
|
|
28
|
+
inputText: string;
|
|
29
|
+
})[];
|
|
30
|
+
};
|
|
31
|
+
export declare function fetchDocument<TDocument extends PHDocument>(url: string, documentId: string, documentModelModule: DocumentModelModule<TDocument>): Promise<GraphQLResult<{
|
|
32
|
+
document: DocumentGraphQLResult<TDocument>;
|
|
33
|
+
}>>;
|
|
34
|
+
//# sourceMappingURL=graphql.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graphql.d.ts","sourceRoot":"","sources":["../../../src/utils/graphql.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,QAAQ,EACR,UAAU,EACX,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EACL,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACrB,UAAU,EACX,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,kBAAkB,EAClB,YAAY,EAOZ,YAAY,EAEb,MAAM,SAAS,CAAC;AACjB,OAAO,OAA+B,MAAM,iBAAiB,CAAC;AAG9D,OAAO,EAAE,GAAG,EAAE,MAAM,iBAAiB,CAAC;AAMtC,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;CAAE,GAAG;IAC/D,MAAM,CAAC,EAAE,YAAY,EAAE,CAAC;CACzB,CAAC;AAGF,wBAAsB,cAAc,CAAC,CAAC,EACpC,GAAG,IAAI,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,GAClC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAc3B;AAED,MAAM,MAAM,SAAS,GAAG;IACtB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE;QACL,eAAe,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH,CAAC;AAkDF,wBAAgB,gCAAgC,CAC9C,kBAAkB,EAAE,kBAAkB,EACtC,OAAO,CAAC,EAAE,kBAAkB,GAAG,YAAY,GAC1C,MAAM,CAqBR;AAED,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CA6BxE;AAED,MAAM,MAAM,UAAU,GAAG,SAAS,GAChC,IAAI,CAAC,uBAAuB,EAAE,kBAAkB,GAAG,aAAa,CAAC,GAAG;IAClE,KAAK,EAAE,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,QAAQ,EAAE,sBAAsB,CAAC,CAAC,CAAC;CACnE,CAAC;AAEJ,MAAM,MAAM,qBAAqB,CAAC,SAAS,SAAS,UAAU,IAAI,SAAS,GAAG;IAC5E,UAAU,EAAE,CAAC,qBAAqB,CAAC,SAAS,CAAC,GAAG;QAC9C,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,EAAE,CAAC;CACN,CAAC;AAEF,wBAAsB,aAAa,CAAC,SAAS,SAAS,UAAU,EAC9D,GAAG,EAAE,MAAM,EACX,UAAU,EAAE,MAAM,EAClB,mBAAmB,EAAE,mBAAmB,CAAC,SAAS,CAAC,GAClD,OAAO,CACR,aAAa,CAAC;IACZ,QAAQ,EAAE,qBAAqB,CAAC,SAAS,CAAC,CAAC;CAC5C,CAAC,CACH,CA0FA"}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { pascalCase } from "change-case";
|
|
2
|
+
import { GraphQLError, GraphQLList, GraphQLNonNull, GraphQLObjectType, GraphQLScalarType, GraphQLUnionType, buildSchema, } from "graphql";
|
|
3
|
+
import { GraphQLClient, gql } from "graphql-request";
|
|
4
|
+
import { logger } from "./logger.js";
|
|
5
|
+
export { gql } from "graphql-request";
|
|
6
|
+
// replaces fetch so it can be used in Node and Browser envs
|
|
7
|
+
export async function requestGraphql(...args) {
|
|
8
|
+
const [url, ...requestArgs] = args;
|
|
9
|
+
const client = new GraphQLClient(url, { fetch });
|
|
10
|
+
const { errors, ...response } = await client.request(...requestArgs);
|
|
11
|
+
const result = { ...response };
|
|
12
|
+
if (errors?.length) {
|
|
13
|
+
result.errors = errors.map(({ message, ...options }) => new GraphQLError(message, options));
|
|
14
|
+
}
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
17
|
+
function getFields(type) {
|
|
18
|
+
if (type instanceof GraphQLObjectType) {
|
|
19
|
+
return Object.entries(type.getFields())
|
|
20
|
+
.map(([fieldName, field]) => {
|
|
21
|
+
const fieldType = field.type instanceof GraphQLNonNull ? field.type.ofType : field.type;
|
|
22
|
+
if (fieldType instanceof GraphQLObjectType ||
|
|
23
|
+
fieldType instanceof GraphQLUnionType) {
|
|
24
|
+
return `${fieldName} { ${getFields(fieldType)} }`;
|
|
25
|
+
}
|
|
26
|
+
if (fieldType instanceof GraphQLList) {
|
|
27
|
+
const listItemType = fieldType.ofType instanceof GraphQLNonNull
|
|
28
|
+
? fieldType.ofType.ofType
|
|
29
|
+
: fieldType.ofType;
|
|
30
|
+
if (listItemType instanceof GraphQLScalarType) {
|
|
31
|
+
return fieldName;
|
|
32
|
+
}
|
|
33
|
+
else if (listItemType instanceof GraphQLObjectType ||
|
|
34
|
+
listItemType instanceof GraphQLUnionType) {
|
|
35
|
+
return `${fieldName} { ${getFields(listItemType)} }`;
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
throw new Error(`List item type ${listItemType.toString()} is not handled`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return fieldName;
|
|
42
|
+
})
|
|
43
|
+
.join(" ");
|
|
44
|
+
}
|
|
45
|
+
else if (type instanceof GraphQLUnionType) {
|
|
46
|
+
return type
|
|
47
|
+
.getTypes()
|
|
48
|
+
.map((unionType) => {
|
|
49
|
+
return `... on ${unionType.name} { ${getFields(unionType)} }`;
|
|
50
|
+
})
|
|
51
|
+
.join(" ");
|
|
52
|
+
}
|
|
53
|
+
return "";
|
|
54
|
+
}
|
|
55
|
+
export function generateDocumentStateQueryFields(documentModelState, options) {
|
|
56
|
+
const name = pascalCase(documentModelState.name);
|
|
57
|
+
const spec = documentModelState.specifications.at(-1);
|
|
58
|
+
if (!spec) {
|
|
59
|
+
throw new Error("No document model specification found");
|
|
60
|
+
}
|
|
61
|
+
const source = `${spec.state.global.schema} type Query { ${name}: ${name}State }`;
|
|
62
|
+
const schema = buildSchema(source, options);
|
|
63
|
+
const queryType = schema.getQueryType();
|
|
64
|
+
if (!queryType) {
|
|
65
|
+
throw new Error("No query type found");
|
|
66
|
+
}
|
|
67
|
+
const fields = queryType.getFields();
|
|
68
|
+
const stateQuery = fields[name];
|
|
69
|
+
if (!stateQuery) {
|
|
70
|
+
throw new Error("No state query found");
|
|
71
|
+
}
|
|
72
|
+
const queryFields = getFields(stateQuery.type);
|
|
73
|
+
return queryFields;
|
|
74
|
+
}
|
|
75
|
+
export async function requestPublicDrive(url) {
|
|
76
|
+
let drive;
|
|
77
|
+
try {
|
|
78
|
+
const result = await requestGraphql(url, gql `
|
|
79
|
+
query getDrive {
|
|
80
|
+
drive {
|
|
81
|
+
id
|
|
82
|
+
name
|
|
83
|
+
icon
|
|
84
|
+
slug
|
|
85
|
+
meta {
|
|
86
|
+
preferredEditor
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
`);
|
|
91
|
+
if (result.errors?.length || !result.drive) {
|
|
92
|
+
throw result.errors?.at(0) ?? new Error("Drive not found");
|
|
93
|
+
}
|
|
94
|
+
drive = result.drive;
|
|
95
|
+
}
|
|
96
|
+
catch (e) {
|
|
97
|
+
logger.error(e);
|
|
98
|
+
throw new Error("Couldn't find drive info");
|
|
99
|
+
}
|
|
100
|
+
return drive;
|
|
101
|
+
}
|
|
102
|
+
export async function fetchDocument(url, documentId, documentModelModule) {
|
|
103
|
+
const { documentModel, utils } = documentModelModule;
|
|
104
|
+
const stateFields = generateDocumentStateQueryFields(documentModel);
|
|
105
|
+
const name = pascalCase(documentModel.name);
|
|
106
|
+
const result = await requestGraphql(url, gql `
|
|
107
|
+
query ($id: String!) {
|
|
108
|
+
document(id: $id) {
|
|
109
|
+
id
|
|
110
|
+
name
|
|
111
|
+
created
|
|
112
|
+
documentType
|
|
113
|
+
lastModified
|
|
114
|
+
revision
|
|
115
|
+
operations {
|
|
116
|
+
id
|
|
117
|
+
error
|
|
118
|
+
hash
|
|
119
|
+
index
|
|
120
|
+
skip
|
|
121
|
+
timestamp
|
|
122
|
+
type
|
|
123
|
+
inputText
|
|
124
|
+
context {
|
|
125
|
+
signer {
|
|
126
|
+
user {
|
|
127
|
+
address
|
|
128
|
+
networkId
|
|
129
|
+
chainId
|
|
130
|
+
}
|
|
131
|
+
app {
|
|
132
|
+
name
|
|
133
|
+
key
|
|
134
|
+
}
|
|
135
|
+
signatures
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
... on ${name} {
|
|
140
|
+
state {
|
|
141
|
+
${stateFields}
|
|
142
|
+
}
|
|
143
|
+
initialState {
|
|
144
|
+
${stateFields}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
`, { id: documentId });
|
|
150
|
+
const document = result.document
|
|
151
|
+
? {
|
|
152
|
+
...result.document,
|
|
153
|
+
revision: {
|
|
154
|
+
global: result.document.revision.global,
|
|
155
|
+
local: 0,
|
|
156
|
+
},
|
|
157
|
+
state: result.document.state,
|
|
158
|
+
operations: {
|
|
159
|
+
global: result.document.operations.map(({ inputText, ...o }) => ({
|
|
160
|
+
...o,
|
|
161
|
+
error: o.error ?? undefined,
|
|
162
|
+
scope: "global",
|
|
163
|
+
input: JSON.parse(inputText),
|
|
164
|
+
})),
|
|
165
|
+
local: [],
|
|
166
|
+
},
|
|
167
|
+
attachments: {},
|
|
168
|
+
initialState: utils.createExtendedState({
|
|
169
|
+
// TODO: getDocument should return all the initial state fields
|
|
170
|
+
created: result.document.created,
|
|
171
|
+
lastModified: result.document.created,
|
|
172
|
+
state: utils.createState({
|
|
173
|
+
global: result.document.initialState.state.global,
|
|
174
|
+
}),
|
|
175
|
+
}),
|
|
176
|
+
clipboard: [],
|
|
177
|
+
}
|
|
178
|
+
: null;
|
|
179
|
+
return {
|
|
180
|
+
...result,
|
|
181
|
+
document,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
type LogLevel = "verbose" | "debug" | "info" | "warn" | "error" | "silent";
|
|
2
|
+
export type ILogger = Pick<Console, "log" | "info" | "warn" | "error" | "debug"> & {
|
|
3
|
+
level: LogLevel | "env";
|
|
4
|
+
errorHandler: LoggerErrorHandler | undefined;
|
|
5
|
+
verbose: (message?: any, ...optionalParams: any[]) => void;
|
|
6
|
+
};
|
|
7
|
+
export type LoggerErrorHandler = (...data: any[]) => void;
|
|
8
|
+
export declare class ConsoleLogger implements ILogger {
|
|
9
|
+
#private;
|
|
10
|
+
constructor(tags?: string[], errorHandler?: LoggerErrorHandler);
|
|
11
|
+
get level(): LogLevel | "env";
|
|
12
|
+
set level(level: LogLevel | "env");
|
|
13
|
+
get errorHandler(): LoggerErrorHandler | undefined;
|
|
14
|
+
set errorHandler(handler: LoggerErrorHandler | undefined);
|
|
15
|
+
log(...data: any[]): void;
|
|
16
|
+
verbose(...data: any[]): void;
|
|
17
|
+
debug(...data: any[]): void;
|
|
18
|
+
info(...data: any[]): void;
|
|
19
|
+
warn(...data: any[]): void;
|
|
20
|
+
error(...data: any[]): void;
|
|
21
|
+
}
|
|
22
|
+
export declare const logger: ILogger;
|
|
23
|
+
export declare const setErrorHandler: (handler: LoggerErrorHandler) => void;
|
|
24
|
+
export declare const setLogLevel: (level: LogLevel | "env") => void;
|
|
25
|
+
export declare const childLogger: (tags: string[]) => ConsoleLogger;
|
|
26
|
+
export {};
|
|
27
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,KAAK,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE3E,MAAM,MAAM,OAAO,GAAG,IAAI,CACxB,OAAO,EACP,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,CAC5C,GAAG;IACF,KAAK,EAAE,QAAQ,GAAG,KAAK,CAAC;IACxB,YAAY,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAE7C,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;CAC5D,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAC;AAW1D,qBAAa,aAAc,YAAW,OAAO;;gBAK/B,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,YAAY,CAAC,EAAE,kBAAkB;IAa9D,IAAI,KAAK,IAAI,QAAQ,GAAG,KAAK,CAE5B;IAED,IAAI,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,KAAK,EAEhC;IAED,IAAI,YAAY,IAAI,kBAAkB,GAAG,SAAS,CAEjD;IAED,IAAI,YAAY,CAAC,OAAO,EAAE,kBAAkB,GAAG,SAAS,EAEvD;IAmBD,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAIzB,OAAO,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAQ7B,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAQ3B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAQ1B,IAAI,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;IAQ1B,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI;CAW5B;AASD,eAAO,MAAM,MAAM,EAAE,OAAwB,CAAC;AAE9C,eAAO,MAAM,eAAe,YAAa,kBAAkB,SAG1D,CAAC;AAEF,eAAO,MAAM,WAAW,UAAW,QAAQ,GAAG,KAAK,SAGlD,CAAC;AAEF,eAAO,MAAM,WAAW,SAAU,MAAM,EAAE,kBAKzC,CAAC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
const LEVELS = {
|
|
2
|
+
verbose: 1,
|
|
3
|
+
debug: 2,
|
|
4
|
+
info: 3,
|
|
5
|
+
warn: 4,
|
|
6
|
+
error: 5,
|
|
7
|
+
silent: 6,
|
|
8
|
+
};
|
|
9
|
+
export class ConsoleLogger {
|
|
10
|
+
#tags;
|
|
11
|
+
#levelString = "env";
|
|
12
|
+
#errorHandler;
|
|
13
|
+
constructor(tags, errorHandler) {
|
|
14
|
+
this.#tags = (tags || []).map((tag) => `[${tag}]`);
|
|
15
|
+
this.#errorHandler = errorHandler;
|
|
16
|
+
// Bind all methods to the current instance
|
|
17
|
+
this.log = this.log.bind(this);
|
|
18
|
+
this.info = this.info.bind(this);
|
|
19
|
+
this.warn = this.warn.bind(this);
|
|
20
|
+
this.error = this.error.bind(this);
|
|
21
|
+
this.debug = this.debug.bind(this);
|
|
22
|
+
this.verbose = this.verbose.bind(this);
|
|
23
|
+
}
|
|
24
|
+
get level() {
|
|
25
|
+
return this.#levelString;
|
|
26
|
+
}
|
|
27
|
+
set level(level) {
|
|
28
|
+
this.#levelString = level;
|
|
29
|
+
}
|
|
30
|
+
get errorHandler() {
|
|
31
|
+
return this.#errorHandler;
|
|
32
|
+
}
|
|
33
|
+
set errorHandler(handler) {
|
|
34
|
+
this.#errorHandler = handler;
|
|
35
|
+
}
|
|
36
|
+
get #levelValue() {
|
|
37
|
+
if (this.#levelString === "env") {
|
|
38
|
+
const envLevel = process.env.LOG_LEVEL;
|
|
39
|
+
if (!envLevel) {
|
|
40
|
+
return LEVELS.debug;
|
|
41
|
+
}
|
|
42
|
+
if (!(envLevel in LEVELS)) {
|
|
43
|
+
return LEVELS.debug;
|
|
44
|
+
}
|
|
45
|
+
return LEVELS[envLevel];
|
|
46
|
+
}
|
|
47
|
+
return LEVELS[this.#levelString];
|
|
48
|
+
}
|
|
49
|
+
log(...data) {
|
|
50
|
+
return this.debug(...data);
|
|
51
|
+
}
|
|
52
|
+
verbose(...data) {
|
|
53
|
+
if (this.#levelValue > LEVELS.verbose) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
return this.debug(...data);
|
|
57
|
+
}
|
|
58
|
+
debug(...data) {
|
|
59
|
+
if (this.#levelValue > LEVELS.debug) {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
return console.debug(...[...this.#tags, ...data]);
|
|
63
|
+
}
|
|
64
|
+
info(...data) {
|
|
65
|
+
if (this.#levelValue > LEVELS.info) {
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
return console.info(...[...this.#tags, ...data]);
|
|
69
|
+
}
|
|
70
|
+
warn(...data) {
|
|
71
|
+
if (this.#levelValue > LEVELS.warn) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
return console.warn(...[...this.#tags, ...data]);
|
|
75
|
+
}
|
|
76
|
+
error(...data) {
|
|
77
|
+
if (this.#levelValue > LEVELS.error) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (this.#errorHandler) {
|
|
81
|
+
this.#errorHandler(...data);
|
|
82
|
+
}
|
|
83
|
+
return console.error(...[...this.#tags, ...data]);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
const loggerInstance = new ConsoleLogger();
|
|
87
|
+
let logLevel = "env";
|
|
88
|
+
let errorHandler;
|
|
89
|
+
loggerInstance.level = logLevel;
|
|
90
|
+
loggerInstance.errorHandler = errorHandler;
|
|
91
|
+
export const logger = loggerInstance;
|
|
92
|
+
export const setErrorHandler = (handler) => {
|
|
93
|
+
errorHandler = handler;
|
|
94
|
+
loggerInstance.errorHandler = handler;
|
|
95
|
+
};
|
|
96
|
+
export const setLogLevel = (level) => {
|
|
97
|
+
logLevel = level;
|
|
98
|
+
loggerInstance.level = level;
|
|
99
|
+
};
|
|
100
|
+
export const childLogger = (tags) => {
|
|
101
|
+
const logger = new ConsoleLogger(tags);
|
|
102
|
+
logger.level = logLevel;
|
|
103
|
+
logger.errorHandler = errorHandler;
|
|
104
|
+
return logger;
|
|
105
|
+
};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Operation, PHDocument } from "document-model";
|
|
2
|
+
export declare function migrateDocumentOperationSignatures(document: PHDocument): PHDocument | undefined;
|
|
3
|
+
export declare function migrateLegacyOperationSignature<TGlobalState, TLocalState>(operation: Operation): Operation;
|
|
4
|
+
//# sourceMappingURL=migrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../../../src/utils/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EAET,UAAU,EAEX,MAAM,gBAAgB,CAAC;AAExB,wBAAgB,kCAAkC,CAChD,QAAQ,EAAE,UAAU,GACnB,UAAU,GAAG,SAAS,CAoBxB;AAED,wBAAgB,+BAA+B,CAAC,YAAY,EAAE,WAAW,EACvE,SAAS,EAAE,SAAS,GACnB,SAAS,CAuBX"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export function migrateDocumentOperationSignatures(document) {
|
|
2
|
+
let legacy = false;
|
|
3
|
+
const operations = Object.entries(document.operations).reduce((acc, [key, operations]) => {
|
|
4
|
+
const scope = key;
|
|
5
|
+
for (const op of operations) {
|
|
6
|
+
const newOp = migrateLegacyOperationSignature(op);
|
|
7
|
+
acc[scope].push(newOp);
|
|
8
|
+
if (newOp !== op) {
|
|
9
|
+
legacy = true;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return acc;
|
|
13
|
+
}, { global: [], local: [] });
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
15
|
+
return legacy ? { ...document, operations } : document;
|
|
16
|
+
}
|
|
17
|
+
export function migrateLegacyOperationSignature(operation) {
|
|
18
|
+
if (!operation.context?.signer || operation.context.signer.signatures) {
|
|
19
|
+
return operation;
|
|
20
|
+
}
|
|
21
|
+
const { signer } = operation.context;
|
|
22
|
+
if ("signature" in signer) {
|
|
23
|
+
const signature = signer.signature;
|
|
24
|
+
return {
|
|
25
|
+
...operation,
|
|
26
|
+
context: {
|
|
27
|
+
...operation.context,
|
|
28
|
+
signer: {
|
|
29
|
+
user: signer.user,
|
|
30
|
+
app: signer.app,
|
|
31
|
+
signatures: (signature?.length
|
|
32
|
+
? [signature]
|
|
33
|
+
: []),
|
|
34
|
+
},
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
return operation;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Operation, OperationFromDocument, OperationsFromDocument, PHDocument } from "document-model";
|
|
2
|
+
import { DocumentDriveDocument } from "#drive-document-model/gen/types";
|
|
3
|
+
import { RunAsap } from "./run-asap.js";
|
|
4
|
+
export declare const runAsap: typeof RunAsap.runAsap;
|
|
5
|
+
export declare const runAsapAsync: typeof RunAsap.runAsapAsync;
|
|
6
|
+
export declare function isDocumentDrive(document: PHDocument): document is DocumentDriveDocument;
|
|
7
|
+
export declare function mergeOperations<TDocument extends PHDocument>(currentOperations: OperationsFromDocument<TDocument>, newOperations: OperationFromDocument<TDocument>[]): OperationsFromDocument<TDocument>;
|
|
8
|
+
export declare function generateUUID(): string;
|
|
9
|
+
export declare function isNoopUpdate(operation: Operation, latestOperation?: Operation): boolean;
|
|
10
|
+
export declare function isBefore(dateA: Date | string, dateB: Date | string): boolean;
|
|
11
|
+
//# sourceMappingURL=misc.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"misc.d.ts","sourceRoot":"","sources":["../../../src/utils/misc.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,SAAS,EACT,qBAAqB,EAErB,sBAAsB,EACtB,UAAU,EAEX,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAAE,qBAAqB,EAAE,MAAM,iCAAiC,CAAC;AAExE,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAExC,eAAO,MAAM,OAAO,wBAAkB,CAAC;AACvC,eAAO,MAAM,YAAY,6BAAuB,CAAC;AAEjD,wBAAgB,eAAe,CAC7B,QAAQ,EAAE,UAAU,GACnB,QAAQ,IAAI,qBAAqB,CAEnC;AAED,wBAAgB,eAAe,CAAC,SAAS,SAAS,UAAU,EAC1D,iBAAiB,EAAE,sBAAsB,CAAC,SAAS,CAAC,EACpD,aAAa,EAAE,qBAAqB,CAAC,SAAS,CAAC,EAAE,GAChD,sBAAsB,CAAC,SAAS,CAAC,CA0BnC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED,wBAAgB,YAAY,CAC1B,SAAS,EAAE,SAAS,EACpB,eAAe,CAAC,EAAE,SAAS,WAc5B;AAGD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,EAAE,KAAK,EAAE,IAAI,GAAG,MAAM,WAElE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { generateId, } from "document-model";
|
|
2
|
+
import { driveDocumentType } from "#drive-document-model/constants";
|
|
3
|
+
import { OperationError } from "#server/error";
|
|
4
|
+
import { RunAsap } from "./run-asap.js";
|
|
5
|
+
export const runAsap = RunAsap.runAsap;
|
|
6
|
+
export const runAsapAsync = RunAsap.runAsapAsync;
|
|
7
|
+
export function isDocumentDrive(document) {
|
|
8
|
+
return document.documentType === driveDocumentType;
|
|
9
|
+
}
|
|
10
|
+
export function mergeOperations(currentOperations, newOperations) {
|
|
11
|
+
const minIndexByScope = Object.keys(currentOperations).reduce((acc, curr) => {
|
|
12
|
+
const scope = curr;
|
|
13
|
+
acc[scope] = currentOperations[scope].at(-1)?.index ?? 0;
|
|
14
|
+
return acc;
|
|
15
|
+
}, {});
|
|
16
|
+
const conflictOp = newOperations.find((op) => op.index < (minIndexByScope[op.scope] ?? 0));
|
|
17
|
+
if (conflictOp) {
|
|
18
|
+
throw new OperationError("ERROR", conflictOp, `Tried to add operation with index ${conflictOp.index} and document is at index ${minIndexByScope[conflictOp.scope]}`);
|
|
19
|
+
}
|
|
20
|
+
return newOperations
|
|
21
|
+
.sort((a, b) => a.index - b.index)
|
|
22
|
+
.reduce((acc, curr) => {
|
|
23
|
+
const existingOperations = acc[curr.scope] || [];
|
|
24
|
+
return { ...acc, [curr.scope]: [...existingOperations, curr] };
|
|
25
|
+
}, currentOperations);
|
|
26
|
+
}
|
|
27
|
+
export function generateUUID() {
|
|
28
|
+
return generateId();
|
|
29
|
+
}
|
|
30
|
+
export function isNoopUpdate(operation, latestOperation) {
|
|
31
|
+
if (!latestOperation) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
const isNoopOp = operation.type === "NOOP";
|
|
35
|
+
const isNoopLatestOp = latestOperation.type === "NOOP";
|
|
36
|
+
const isSameIndexOp = operation.index === latestOperation.index;
|
|
37
|
+
const isSkipOpGreaterThanLatestOp = operation.skip > latestOperation.skip;
|
|
38
|
+
return (isNoopOp && isNoopLatestOp && isSameIndexOp && isSkipOpGreaterThanLatestOp);
|
|
39
|
+
}
|
|
40
|
+
// return true if dateA is before dateB
|
|
41
|
+
export function isBefore(dateA, dateB) {
|
|
42
|
+
return new Date(dateA) < new Date(dateB);
|
|
43
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare namespace RunAsap {
|
|
2
|
+
type Task<T = void> = () => T;
|
|
3
|
+
type AbortTask = () => void;
|
|
4
|
+
type RunAsap<T> = (task: Task<T>) => AbortTask;
|
|
5
|
+
const useMessageChannel: Error | ((task: Task) => () => void);
|
|
6
|
+
const usePostMessage: Error | ((task: Task) => () => void);
|
|
7
|
+
const useSetImmediate: Error | ((task: Task) => () => void);
|
|
8
|
+
const useSetTimeout: (task: Task) => () => void;
|
|
9
|
+
function runAsap<T = void>(task: Task<T>): AbortTask;
|
|
10
|
+
function runAsapAsync<T = void>(task: RunAsap.Task<Promise<T>>, queueMethod?: RunAsap<void>): Promise<T>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=run-asap.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run-asap.d.ts","sourceRoot":"","sources":["../../../src/utils/run-asap.ts"],"names":[],"mappings":"AACA,yBAAiB,OAAO,CAAC;IACvB,KAAY,IAAI,CAAC,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC,CAAC;IACrC,KAAY,SAAS,GAAG,MAAM,IAAI,CAAC;IACnC,KAAY,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC;IAE/C,MAAM,iBAAiB,kBAKd,IAAI,gBAiBhB,CAAC;IAEE,MAAM,cAAc,kBA0DX,IAAI,gBAQhB,CAAC;IAEE,MAAM,eAAe,kBAQZ,IAAI,gBAIhB,CAAC;IAEE,MAAM,aAAa,SACV,IAAI,eAIhB,CAAC;IAIL,SAAgB,OAAO,CAAC,CAAC,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,SAAS,CAiB1D;IAED,SAAgB,YAAY,CAAC,CAAC,GAAG,IAAI,EACnC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAC9B,WAAW,GAAE,OAAO,CAAC,IAAI,CAAW,GACnC,OAAO,CAAC,CAAC,CAAC,CAWZ;CACF"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
// eslint-disable-next-line @typescript-eslint/no-namespace
|
|
2
|
+
export var RunAsap;
|
|
3
|
+
(function (RunAsap) {
|
|
4
|
+
RunAsap.useMessageChannel = (() => {
|
|
5
|
+
if (typeof MessageChannel === "undefined") {
|
|
6
|
+
return new Error("MessageChannel is not supported");
|
|
7
|
+
}
|
|
8
|
+
return (task) => {
|
|
9
|
+
const controller = new AbortController();
|
|
10
|
+
const signal = controller.signal;
|
|
11
|
+
const mc = new MessageChannel();
|
|
12
|
+
mc.port1.postMessage(null);
|
|
13
|
+
mc.port2.addEventListener("message", () => {
|
|
14
|
+
task();
|
|
15
|
+
mc.port1.close();
|
|
16
|
+
mc.port2.close();
|
|
17
|
+
}, { once: true, signal: signal });
|
|
18
|
+
mc.port2.start();
|
|
19
|
+
return () => controller.abort();
|
|
20
|
+
};
|
|
21
|
+
})();
|
|
22
|
+
RunAsap.usePostMessage = (() => {
|
|
23
|
+
const _main =
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
25
|
+
(typeof window === "object" && window) ||
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
27
|
+
(typeof global === "object" && global) ||
|
|
28
|
+
(typeof self === "object" && self);
|
|
29
|
+
if (!_main) {
|
|
30
|
+
return new Error("No global object found");
|
|
31
|
+
}
|
|
32
|
+
const main = _main;
|
|
33
|
+
if (
|
|
34
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
35
|
+
!main.postMessage ||
|
|
36
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
37
|
+
!main.addEventListener ||
|
|
38
|
+
main.importScripts // web workers can't this method
|
|
39
|
+
) {
|
|
40
|
+
return new Error("postMessage is not supported");
|
|
41
|
+
}
|
|
42
|
+
let index = 0;
|
|
43
|
+
const tasks = new Map();
|
|
44
|
+
function getNewIndex() {
|
|
45
|
+
if (index === 9007199254740991) {
|
|
46
|
+
return 0;
|
|
47
|
+
}
|
|
48
|
+
return ++index;
|
|
49
|
+
}
|
|
50
|
+
const MESSAGE_PREFIX = "com.usePostMessage" + Math.random();
|
|
51
|
+
main.addEventListener("message", (e) => {
|
|
52
|
+
const event = e;
|
|
53
|
+
if (typeof event.data !== "string") {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
if (event.source !== main || !event.data.startsWith(MESSAGE_PREFIX)) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const index = event.data.split(":").at(1);
|
|
60
|
+
if (index === undefined) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const i = +index;
|
|
64
|
+
const task = tasks.get(i);
|
|
65
|
+
if (task) {
|
|
66
|
+
task();
|
|
67
|
+
tasks.delete(i);
|
|
68
|
+
}
|
|
69
|
+
}, false);
|
|
70
|
+
return (task) => {
|
|
71
|
+
const i = getNewIndex();
|
|
72
|
+
tasks.set(i, task);
|
|
73
|
+
main.postMessage(MESSAGE_PREFIX + ":" + i, { targetOrigin: "*" });
|
|
74
|
+
return () => {
|
|
75
|
+
tasks.delete(i);
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
})();
|
|
79
|
+
RunAsap.useSetImmediate = (() => {
|
|
80
|
+
if (typeof window !== "undefined") {
|
|
81
|
+
return new Error("setImmediate is not supported on the browser");
|
|
82
|
+
}
|
|
83
|
+
if (typeof setImmediate === "undefined") {
|
|
84
|
+
return new Error("setImmediate is not supported");
|
|
85
|
+
}
|
|
86
|
+
return (task) => {
|
|
87
|
+
const id = setImmediate(task);
|
|
88
|
+
return () => clearImmediate(id);
|
|
89
|
+
};
|
|
90
|
+
})();
|
|
91
|
+
RunAsap.useSetTimeout = (() => {
|
|
92
|
+
return (task) => {
|
|
93
|
+
const id = setTimeout(task, 0);
|
|
94
|
+
return () => clearTimeout(id);
|
|
95
|
+
};
|
|
96
|
+
})();
|
|
97
|
+
// queues the task in the macro tasks queue, so it doesn't
|
|
98
|
+
// prevent the event loop from movin on the next tick
|
|
99
|
+
function runAsap(task) {
|
|
100
|
+
// if on node use setImmediate
|
|
101
|
+
if (!(RunAsap.useSetImmediate instanceof Error)) {
|
|
102
|
+
return RunAsap.useSetImmediate(task);
|
|
103
|
+
}
|
|
104
|
+
// on browser use MessageChannel if available
|
|
105
|
+
else if (!(RunAsap.useMessageChannel instanceof Error)) {
|
|
106
|
+
return RunAsap.useMessageChannel(task);
|
|
107
|
+
}
|
|
108
|
+
// otherwise use window.postMessage
|
|
109
|
+
else if (!(RunAsap.usePostMessage instanceof Error)) {
|
|
110
|
+
return RunAsap.usePostMessage(task);
|
|
111
|
+
}
|
|
112
|
+
// fallback to setTimeout with 0 delay
|
|
113
|
+
else {
|
|
114
|
+
return RunAsap.useSetTimeout(task);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
RunAsap.runAsap = runAsap;
|
|
118
|
+
function runAsapAsync(task, queueMethod = runAsap) {
|
|
119
|
+
if (queueMethod instanceof Error) {
|
|
120
|
+
throw new Error("queueMethod is not supported", {
|
|
121
|
+
cause: queueMethod,
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
return new Promise((resolve, reject) => {
|
|
125
|
+
queueMethod(() => {
|
|
126
|
+
task().then(resolve).catch(reject);
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
RunAsap.runAsapAsync = runAsapAsync;
|
|
131
|
+
})(RunAsap || (RunAsap = {}));
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Operation } from "document-model";
|
|
2
|
+
export type InputOperation = Partial<Omit<Operation, "index" | "skip">> & {
|
|
3
|
+
index: number;
|
|
4
|
+
skip: number;
|
|
5
|
+
};
|
|
6
|
+
export declare const buildOperation: (input: InputOperation, shuffled?: boolean) => Operation;
|
|
7
|
+
export declare const buildOperations: (inputs: InputOperation[], shuffled?: boolean) => Operation[];
|
|
8
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../test/document-helpers/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC,GAAG;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,eAAO,MAAM,cAAc,UAClB,cAAc,yBAEpB,SAoBF,CAAC;AAEF,eAAO,MAAM,eAAe,WAClB,cAAc,EAAE,yBAEvB,SAAS,EAAoD,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export const buildOperation = (input, shuffled = false) => {
|
|
2
|
+
if (shuffled) {
|
|
3
|
+
return {
|
|
4
|
+
scope: "global",
|
|
5
|
+
type: "TEST",
|
|
6
|
+
timestamp: new Date().toISOString(),
|
|
7
|
+
input: {},
|
|
8
|
+
hash: `hash-${input.index}`,
|
|
9
|
+
...input,
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
hash: `hash-${input.index}`,
|
|
14
|
+
timestamp: new Date().toISOString(),
|
|
15
|
+
input: {},
|
|
16
|
+
scope: "global",
|
|
17
|
+
type: "TEST",
|
|
18
|
+
...input,
|
|
19
|
+
};
|
|
20
|
+
};
|
|
21
|
+
export const buildOperations = (inputs, shuffled = false) => inputs.map((i) => buildOperation(i, shuffled));
|