@lenne.tech/nest-server 12.1.0 → 12.2.0
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/.claude/rules/architecture.md +1 -0
- package/.claude/rules/better-auth.md +18 -6
- package/.claude/rules/configurable-features.md +5 -4
- package/.claude/rules/package-management.md +16 -1
- package/.claude/rules/persistence.md +26 -0
- package/.claude/rules/testing.md +102 -28
- package/CLAUDE.md +3 -2
- package/FRAMEWORK-API.md +17 -2
- package/README.md +24 -3
- package/dist/core/common/helpers/file.helper.js +3 -4
- package/dist/core/common/helpers/file.helper.js.map +1 -1
- package/dist/core/common/helpers/graphql-ws-connection.helper.js.map +1 -1
- package/dist/core/common/interfaces/server-options.interface.d.ts +41 -0
- package/dist/core/common/interfaces/service-options.interface.d.ts +3 -0
- package/dist/core/common/persistence/core-persistence.module.js +12 -2
- package/dist/core/common/persistence/core-persistence.module.js.map +1 -1
- package/dist/core/common/persistence/data-source.runtime.js +14 -19
- package/dist/core/common/persistence/data-source.runtime.js.map +1 -1
- package/dist/core/common/persistence/data-store.interface.d.ts +24 -9
- package/dist/core/common/persistence/id-format.d.ts +2 -0
- package/dist/core/common/persistence/id-format.js +14 -0
- package/dist/core/common/persistence/id-format.js.map +1 -1
- package/dist/core/common/persistence/model-descriptor.interface.d.ts +6 -0
- package/dist/core/common/persistence/model-metadata.registry.d.ts +2 -1
- package/dist/core/common/persistence/model-metadata.registry.js +20 -2
- package/dist/core/common/persistence/model-metadata.registry.js.map +1 -1
- package/dist/core/common/persistence/mongo/sync-schema.plugin.d.ts +18 -0
- package/dist/core/common/persistence/mongo/sync-schema.plugin.js +368 -0
- package/dist/core/common/persistence/mongo/sync-schema.plugin.js.map +1 -0
- package/dist/core/common/persistence/mongoose-data-store.d.ts +19 -9
- package/dist/core/common/persistence/mongoose-data-store.js +107 -31
- package/dist/core/common/persistence/mongoose-data-store.js.map +1 -1
- package/dist/core/common/persistence/persisted-model.decorator.d.ts +3 -0
- package/dist/core/common/persistence/persisted-model.decorator.js +9 -0
- package/dist/core/common/persistence/persisted-model.decorator.js.map +1 -1
- package/dist/core/common/persistence/persistence-runtime.registry.d.ts +5 -1
- package/dist/core/common/persistence/persistence-runtime.registry.js.map +1 -1
- package/dist/core/common/persistence/policies/sync.policy.d.ts +17 -0
- package/dist/core/common/persistence/policies/sync.policy.js +77 -0
- package/dist/core/common/persistence/policies/sync.policy.js.map +1 -0
- package/dist/core/common/persistence/sql/mysql/mysql-data-store.d.ts +12 -8
- package/dist/core/common/persistence/sql/mysql/mysql-data-store.js +82 -29
- package/dist/core/common/persistence/sql/mysql/mysql-data-store.js.map +1 -1
- package/dist/core/common/persistence/sql/mysql/mysql-schema.compiler.d.ts +10 -0
- package/dist/core/common/persistence/sql/mysql/mysql-schema.compiler.js +61 -4
- package/dist/core/common/persistence/sql/mysql/mysql-schema.compiler.js.map +1 -1
- package/dist/core/common/persistence/sql/mysql/mysql-schema.migrator.d.ts +2 -0
- package/dist/core/common/persistence/sql/mysql/mysql-schema.migrator.js +145 -4
- package/dist/core/common/persistence/sql/mysql/mysql-schema.migrator.js.map +1 -1
- package/dist/core/common/persistence/sql/postgres/postgres-schema.compiler.d.ts +10 -0
- package/dist/core/common/persistence/sql/postgres/postgres-schema.compiler.js +41 -2
- package/dist/core/common/persistence/sql/postgres/postgres-schema.compiler.js.map +1 -1
- package/dist/core/common/persistence/sql/postgres/postgres-schema.migrator.js +98 -10
- package/dist/core/common/persistence/sql/postgres/postgres-schema.migrator.js.map +1 -1
- package/dist/core/common/persistence/sql/sql-data-store.d.ts +38 -14
- package/dist/core/common/persistence/sql/sql-data-store.js +212 -38
- package/dist/core/common/persistence/sql/sql-data-store.js.map +1 -1
- package/dist/core/common/persistence/sql/sql-dialect.d.ts +2 -0
- package/dist/core/common/persistence/sql/sql-dialect.js +14 -2
- package/dist/core/common/persistence/sql/sql-dialect.js.map +1 -1
- package/dist/core/common/persistence/sql/sql-errors.d.ts +2 -1
- package/dist/core/common/persistence/sql/sql-errors.js +3 -1
- package/dist/core/common/persistence/sql/sql-errors.js.map +1 -1
- package/dist/core/common/persistence/sync-access.registry.d.ts +17 -0
- package/dist/core/common/persistence/sync-access.registry.js +8 -0
- package/dist/core/common/persistence/sync-access.registry.js.map +1 -0
- package/dist/core/common/persistence/sync-model.d.ts +29 -0
- package/dist/core/common/persistence/sync-model.js +138 -0
- package/dist/core/common/persistence/sync-model.js.map +1 -0
- package/dist/core/common/services/core-cron-jobs.service.d.ts +27 -0
- package/dist/core/common/services/core-cron-jobs.service.js +269 -13
- package/dist/core/common/services/core-cron-jobs.service.js.map +1 -1
- package/dist/core/common/services/core-redis-pubsub.js +5 -5
- package/dist/core/common/services/core-redis-pubsub.js.map +1 -1
- package/dist/core/common/services/core-redis.service.d.ts +6 -0
- package/dist/core/common/services/core-redis.service.js +57 -0
- package/dist/core/common/services/core-redis.service.js.map +1 -1
- package/dist/core/common/services/crud.service.d.ts +13 -1
- package/dist/core/common/services/crud.service.js +174 -16
- package/dist/core/common/services/crud.service.js.map +1 -1
- package/dist/core/modules/better-auth/better-auth-sql.helper.d.ts +1 -0
- package/dist/core/modules/better-auth/better-auth-sql.helper.js +41 -14
- package/dist/core/modules/better-auth/better-auth-sql.helper.js.map +1 -1
- package/dist/core/modules/better-auth/better-auth.config.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-sql.store.d.ts +4 -7
- package/dist/core/modules/better-auth/core-better-auth-sql.store.js +23 -16
- package/dist/core/modules/better-auth/core-better-auth-sql.store.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-user.mapper.d.ts +12 -2
- package/dist/core/modules/better-auth/core-better-auth-user.mapper.js +82 -5
- package/dist/core/modules/better-auth/core-better-auth-user.mapper.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth.module.js +1 -1
- package/dist/core/modules/better-auth/core-better-auth.module.js.map +1 -1
- package/dist/core/modules/error-code/error-codes.d.ts +54 -0
- package/dist/core/modules/error-code/error-codes.js +48 -0
- package/dist/core/modules/error-code/error-codes.js.map +1 -1
- package/dist/core/modules/hub/hub-buffer.js +3 -4
- package/dist/core/modules/hub/hub-buffer.js.map +1 -1
- package/dist/core/modules/migrate/index.js.map +1 -1
- package/dist/core/modules/migrate/migration-runner.d.ts +6 -0
- package/dist/core/modules/migrate/migration-runner.js +28 -2
- package/dist/core/modules/migrate/migration-runner.js.map +1 -1
- package/dist/core/modules/migrate/mongo-state-store.d.ts +0 -1
- package/dist/core/modules/migrate/mongo-state-store.js +0 -5
- package/dist/core/modules/migrate/mongo-state-store.js.map +1 -1
- package/dist/core/modules/migrate/sql-migration.helper.d.ts +15 -1
- package/dist/core/modules/migrate/sql-migration.helper.js +90 -5
- package/dist/core/modules/migrate/sql-migration.helper.js.map +1 -1
- package/dist/core/modules/sync/core-sync-base.controller.d.ts +7 -0
- package/dist/core/modules/sync/core-sync-base.controller.js +44 -0
- package/dist/core/modules/sync/core-sync-base.controller.js.map +1 -0
- package/dist/core/modules/sync/core-sync-cursor.d.ts +19 -0
- package/dist/core/modules/sync/core-sync-cursor.js +77 -0
- package/dist/core/modules/sync/core-sync-cursor.js.map +1 -0
- package/dist/core/modules/sync/core-sync-hints.controller.d.ts +4 -0
- package/dist/core/modules/sync/core-sync-hints.controller.js +55 -0
- package/dist/core/modules/sync/core-sync-hints.controller.js.map +1 -0
- package/dist/core/modules/sync/core-sync-hints.service.d.ts +28 -0
- package/dist/core/modules/sync/core-sync-hints.service.js +155 -0
- package/dist/core/modules/sync/core-sync-hints.service.js.map +1 -0
- package/dist/core/modules/sync/core-sync-infrastructure.models.d.ts +2 -0
- package/dist/core/modules/sync/core-sync-infrastructure.models.js +17 -0
- package/dist/core/modules/sync/core-sync-infrastructure.models.js.map +1 -0
- package/dist/core/modules/sync/core-sync-mutation.store.d.ts +43 -0
- package/dist/core/modules/sync/core-sync-mutation.store.js +88 -0
- package/dist/core/modules/sync/core-sync-mutation.store.js.map +1 -0
- package/dist/core/modules/sync/core-sync-state.store.d.ts +18 -0
- package/dist/core/modules/sync/core-sync-state.store.js +64 -0
- package/dist/core/modules/sync/core-sync-state.store.js.map +1 -0
- package/dist/core/modules/sync/core-sync.constants.d.ts +28 -0
- package/dist/core/modules/sync/core-sync.constants.js +23 -0
- package/dist/core/modules/sync/core-sync.constants.js.map +1 -0
- package/dist/core/modules/sync/core-sync.controller.d.ts +8 -0
- package/dist/core/modules/sync/core-sync.controller.js +79 -0
- package/dist/core/modules/sync/core-sync.controller.js.map +1 -0
- package/dist/core/modules/sync/core-sync.decorators.d.ts +12 -0
- package/dist/core/modules/sync/core-sync.decorators.js +28 -0
- package/dist/core/modules/sync/core-sync.decorators.js.map +1 -0
- package/dist/core/modules/sync/core-sync.module.d.ts +16 -0
- package/dist/core/modules/sync/core-sync.module.js +50 -0
- package/dist/core/modules/sync/core-sync.module.js.map +1 -0
- package/dist/core/modules/sync/core-sync.resolver.d.ts +9 -0
- package/dist/core/modules/sync/core-sync.resolver.js +46 -0
- package/dist/core/modules/sync/core-sync.resolver.js.map +1 -0
- package/dist/core/modules/sync/core-sync.service.d.ts +142 -0
- package/dist/core/modules/sync/core-sync.service.js +1208 -0
- package/dist/core/modules/sync/core-sync.service.js.map +1 -0
- package/dist/core/modules/sync/interfaces/core-sync.interfaces.d.ts +56 -0
- package/dist/core/modules/sync/interfaces/core-sync.interfaces.js +2 -0
- package/dist/core/modules/sync/interfaces/core-sync.interfaces.js.map +1 -0
- package/dist/core/modules/sync/models/core-sync-hint.model.d.ts +4 -0
- package/dist/core/modules/sync/models/core-sync-hint.model.js +30 -0
- package/dist/core/modules/sync/models/core-sync-hint.model.js.map +1 -0
- package/dist/core/modules/tenant/core-tenant.guard.js +8 -3
- package/dist/core/modules/tenant/core-tenant.guard.js.map +1 -1
- package/dist/core.module.js +14 -0
- package/dist/core.module.js.map +1 -1
- package/dist/index.d.ts +16 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/server/modules/error-code/error-codes.d.ts +6 -0
- package/dist/server/modules/sync-note/inputs/sync-note-create.input.d.ts +4 -0
- package/dist/server/modules/sync-note/inputs/sync-note-create.input.js +27 -0
- package/dist/server/modules/sync-note/inputs/sync-note-create.input.js.map +1 -0
- package/dist/server/modules/sync-note/inputs/sync-note.input.d.ts +6 -0
- package/dist/server/modules/sync-note/inputs/sync-note.input.js +37 -0
- package/dist/server/modules/sync-note/inputs/sync-note.input.js.map +1 -0
- package/dist/server/modules/sync-note/sync-note.model.d.ts +10 -0
- package/dist/server/modules/sync-note/sync-note.model.js +73 -0
- package/dist/server/modules/sync-note/sync-note.model.js.map +1 -0
- package/dist/server/modules/sync-note/sync-note.module.d.ts +2 -0
- package/dist/server/modules/sync-note/sync-note.module.js +21 -0
- package/dist/server/modules/sync-note/sync-note.module.js.map +1 -0
- package/dist/server/modules/sync-note/sync-note.service.d.ts +10 -0
- package/dist/server/modules/sync-note/sync-note.service.js +35 -0
- package/dist/server/modules/sync-note/sync-note.service.js.map +1 -0
- package/docs/REQUEST-LIFECYCLE.md +3 -2
- package/docs/choosing-a-database.md +7 -4
- package/docs/offline-sync-protocol.md +410 -0
- package/docs/security-overrides.md +14 -0
- package/migration-guides/12.0.x-to-12.1.x.md +9 -4
- package/migration-guides/12.1.0-to-12.1.1.md +125 -0
- package/migration-guides/12.1.x-to-12.2.x.md +154 -0
- package/package.json +10 -8
- package/src/core/common/helpers/file.helper.ts +7 -5
- package/src/core/common/helpers/graphql-ws-connection.helper.ts +3 -2
- package/src/core/common/interfaces/cron-job-config.interface.ts +7 -2
- package/src/core/common/interfaces/server-options.interface.ts +149 -0
- package/src/core/common/interfaces/service-options.interface.ts +15 -0
- package/src/core/common/persistence/core-persistence.module.ts +21 -2
- package/src/core/common/persistence/data-source.runtime.ts +22 -23
- package/src/core/common/persistence/data-store.interface.ts +65 -12
- package/src/core/common/persistence/id-format.ts +26 -0
- package/src/core/common/persistence/model-descriptor.interface.ts +12 -0
- package/src/core/common/persistence/model-metadata.registry.ts +31 -2
- package/src/core/common/persistence/mongo/sync-schema.plugin.ts +508 -0
- package/src/core/common/persistence/mongoose-data-store.ts +171 -35
- package/src/core/common/persistence/persisted-model.decorator.ts +26 -0
- package/src/core/common/persistence/persistence-runtime.registry.ts +16 -5
- package/src/core/common/persistence/policies/sync.policy.ts +121 -0
- package/src/core/common/persistence/sql/mysql/mysql-data-store.ts +108 -30
- package/src/core/common/persistence/sql/mysql/mysql-schema.compiler.ts +107 -4
- package/src/core/common/persistence/sql/mysql/mysql-schema.migrator.ts +194 -3
- package/src/core/common/persistence/sql/postgres/postgres-schema.compiler.ts +74 -2
- package/src/core/common/persistence/sql/postgres/postgres-schema.migrator.ts +139 -7
- package/src/core/common/persistence/sql/sql-data-store.ts +325 -44
- package/src/core/common/persistence/sql/sql-dialect.ts +38 -1
- package/src/core/common/persistence/sql/sql-errors.ts +5 -1
- package/src/core/common/persistence/sql/sql-executor.interface.ts +4 -1
- package/src/core/common/persistence/sync-access.registry.ts +50 -0
- package/src/core/common/persistence/sync-model.ts +270 -0
- package/src/core/common/services/core-cron-jobs.service.ts +441 -27
- package/src/core/common/services/core-redis-pubsub.ts +8 -6
- package/src/core/common/services/core-redis.service.ts +99 -0
- package/src/core/common/services/crud.service.ts +257 -19
- package/src/core/modules/better-auth/README.md +25 -1
- package/src/core/modules/better-auth/better-auth-sql.helper.ts +56 -24
- package/src/core/modules/better-auth/better-auth.config.ts +4 -3
- package/src/core/modules/better-auth/core-better-auth-sql.store.ts +28 -21
- package/src/core/modules/better-auth/core-better-auth-user.mapper.ts +122 -6
- package/src/core/modules/better-auth/core-better-auth.module.ts +2 -2
- package/src/core/modules/error-code/error-codes.ts +59 -0
- package/src/core/modules/hub/README.md +5 -2
- package/src/core/modules/hub/hub-buffer.ts +13 -7
- package/src/core/modules/migrate/README.md +20 -11
- package/src/core/modules/migrate/index.ts +1 -0
- package/src/core/modules/migrate/migration-runner.ts +68 -3
- package/src/core/modules/migrate/mongo-state-store.ts +7 -30
- package/src/core/modules/migrate/sql-migration.helper.ts +141 -7
- package/src/core/modules/sync/INTEGRATION-CHECKLIST.md +95 -0
- package/src/core/modules/sync/README.md +188 -0
- package/src/core/modules/sync/SECURITY.md +65 -0
- package/src/core/modules/sync/core-sync-base.controller.ts +43 -0
- package/src/core/modules/sync/core-sync-cursor.ts +117 -0
- package/src/core/modules/sync/core-sync-hints.controller.ts +52 -0
- package/src/core/modules/sync/core-sync-hints.service.ts +178 -0
- package/src/core/modules/sync/core-sync-infrastructure.models.ts +40 -0
- package/src/core/modules/sync/core-sync-mutation.store.ts +146 -0
- package/src/core/modules/sync/core-sync-state.store.ts +89 -0
- package/src/core/modules/sync/core-sync.constants.ts +51 -0
- package/src/core/modules/sync/core-sync.controller.ts +68 -0
- package/src/core/modules/sync/core-sync.decorators.ts +84 -0
- package/src/core/modules/sync/core-sync.module.ts +75 -0
- package/src/core/modules/sync/core-sync.resolver.ts +35 -0
- package/src/core/modules/sync/core-sync.service.ts +1728 -0
- package/src/core/modules/sync/interfaces/core-sync.interfaces.ts +85 -0
- package/src/core/modules/sync/models/core-sync-hint.model.ts +18 -0
- package/src/core/modules/tenant/README.md +1 -0
- package/src/core/modules/tenant/core-tenant.guard.ts +16 -3
- package/src/core.module.ts +25 -0
- package/src/index.ts +21 -0
- package/src/server/modules/sync-note/inputs/sync-note-create.input.ts +14 -0
- package/src/server/modules/sync-note/inputs/sync-note.input.ts +23 -0
- package/src/server/modules/sync-note/sync-note.model.ts +77 -0
- package/src/server/modules/sync-note/sync-note.module.ts +16 -0
- package/src/server/modules/sync-note/sync-note.service.ts +25 -0
|
@@ -11,7 +11,8 @@ export declare class QueryCastError extends Error {
|
|
|
11
11
|
}
|
|
12
12
|
export declare class DuplicateKeyError extends BadRequestException {
|
|
13
13
|
readonly model: string;
|
|
14
|
+
readonly primaryKey: boolean;
|
|
14
15
|
readonly name = "DuplicateKeyError";
|
|
15
16
|
readonly code = 11000;
|
|
16
|
-
constructor(model: string);
|
|
17
|
+
constructor(model: string, primaryKey?: boolean);
|
|
17
18
|
}
|
|
@@ -15,11 +15,13 @@ export class QueryCastError extends Error {
|
|
|
15
15
|
}
|
|
16
16
|
export class DuplicateKeyError extends BadRequestException {
|
|
17
17
|
model;
|
|
18
|
+
primaryKey;
|
|
18
19
|
name = 'DuplicateKeyError';
|
|
19
20
|
code = 11000;
|
|
20
|
-
constructor(model) {
|
|
21
|
+
constructor(model, primaryKey = false) {
|
|
21
22
|
super(`E11000 duplicate key error: a unique value of ${model} already exists`);
|
|
22
23
|
this.model = model;
|
|
24
|
+
this.primaryKey = primaryKey;
|
|
23
25
|
}
|
|
24
26
|
}
|
|
25
27
|
//# sourceMappingURL=sql-errors.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sql-errors.js","sourceRoot":"","sources":["../../../../../src/core/common/persistence/sql/sql-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAarD,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC5B,IAAI,GAAG,uBAAuB,CAAC;CAClD;AAMD,MAAM,OAAO,cAAe,SAAQ,KAAK;IAO5B;IACA;IAPO,IAAI,GAAG,gBAAgB,CAAC;IAK1C,YACW,IAAY,EACZ,IAAY,EACrB,KAAe;QAEf,KAAK,CAAC,WAAW,IAAI,oBAAoB,IAAI,GAAG,CAAC,CAAC;QAJzC,SAAI,GAAJ,IAAI,CAAQ;QACZ,SAAI,GAAJ,IAAI,CAAQ;QAIrB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC;CACF;AAMD,MAAM,OAAO,iBAAkB,SAAQ,mBAAmB;
|
|
1
|
+
{"version":3,"file":"sql-errors.js","sourceRoot":"","sources":["../../../../../src/core/common/persistence/sql/sql-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAarD,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC5B,IAAI,GAAG,uBAAuB,CAAC;CAClD;AAMD,MAAM,OAAO,cAAe,SAAQ,KAAK;IAO5B;IACA;IAPO,IAAI,GAAG,gBAAgB,CAAC;IAK1C,YACW,IAAY,EACZ,IAAY,EACrB,KAAe;QAEf,KAAK,CAAC,WAAW,IAAI,oBAAoB,IAAI,GAAG,CAAC,CAAC;QAJzC,SAAI,GAAJ,IAAI,CAAQ;QACZ,SAAI,GAAJ,IAAI,CAAQ;QAIrB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACrE,CAAC;CACF;AAMD,MAAM,OAAO,iBAAkB,SAAQ,mBAAmB;IAM7C;IACA;IANO,IAAI,GAAG,mBAAmB,CAAC;IACpC,IAAI,GAAG,KAAK,CAAC;IAGtB,YACW,KAAa,EACb,aAAa,KAAK;QAE3B,KAAK,CAAC,iDAAiD,KAAK,iBAAiB,CAAC,CAAC;QAHtE,UAAK,GAAL,KAAK,CAAQ;QACb,eAAU,GAAV,UAAU,CAAQ;IAG7B,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface SyncRecordMove {
|
|
2
|
+
model: string;
|
|
3
|
+
tenantId?: string;
|
|
4
|
+
tenantChanged: boolean;
|
|
5
|
+
usersLost: string[];
|
|
6
|
+
}
|
|
7
|
+
export interface SyncRecordChange {
|
|
8
|
+
model: string;
|
|
9
|
+
tenantIds: string[];
|
|
10
|
+
}
|
|
11
|
+
export interface SyncAccessListener {
|
|
12
|
+
recordChanged?(change: SyncRecordChange): void;
|
|
13
|
+
recordMoved(move: SyncRecordMove): Promise<void>;
|
|
14
|
+
tenantInvalidated(tenantId: string): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
export declare function setSyncAccessListener(value: SyncAccessListener | undefined): void;
|
|
17
|
+
export declare function getSyncAccessListener(): SyncAccessListener | undefined;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-access.registry.js","sourceRoot":"","sources":["../../../../src/core/common/persistence/sync-access.registry.ts"],"names":[],"mappings":"AAwCA,IAAI,QAAwC,CAAC;AAG7C,MAAM,UAAU,qBAAqB,CAAC,KAAqC;IACzE,QAAQ,GAAG,KAAK,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,qBAAqB;IACnC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { IndexDescriptor, ModelDescriptor, SyncDescriptor, SyncIdFormat } from './model-descriptor.interface.js';
|
|
2
|
+
export type { SyncDescriptor, SyncIdFormat } from './model-descriptor.interface.js';
|
|
3
|
+
export type SyncConflictStrategy = 'custom' | 'lww' | 'merge' | 'reject';
|
|
4
|
+
export interface SyncOperationRoles {
|
|
5
|
+
create?: string[];
|
|
6
|
+
delete?: string[];
|
|
7
|
+
pull?: string[];
|
|
8
|
+
update?: string[];
|
|
9
|
+
}
|
|
10
|
+
export interface SyncModelOptions {
|
|
11
|
+
idFormat?: SyncIdFormat;
|
|
12
|
+
roles?: SyncOperationRoles;
|
|
13
|
+
scope?: string[];
|
|
14
|
+
strategy?: SyncConflictStrategy;
|
|
15
|
+
}
|
|
16
|
+
export declare const SYNC_VERSION_FIELD = "version";
|
|
17
|
+
export declare const SYNC_DELETED_FIELD = "deletedAt";
|
|
18
|
+
export declare const SYNC_CLOCK_FIELD = "syncAt";
|
|
19
|
+
export declare const SYNC_SEQUENCE_FIELD = "syncSeq";
|
|
20
|
+
export declare const SYNC_SEQUENCE_PENDING = -1;
|
|
21
|
+
export declare const SYNC_SYSTEM_FIELDS: readonly string[];
|
|
22
|
+
export declare function liveFilter(): {
|
|
23
|
+
deletedAt: null;
|
|
24
|
+
};
|
|
25
|
+
export declare function resolveSyncOptions(value: boolean | SyncModelOptions | undefined, model: string): SyncDescriptor | undefined;
|
|
26
|
+
export declare function withSyncDescriptor(descriptor: ModelDescriptor, sync: SyncDescriptor): ModelDescriptor;
|
|
27
|
+
export declare function liveUniqueIndex(index: IndexDescriptor): IndexDescriptor;
|
|
28
|
+
export declare function withSequenceField(descriptor: ModelDescriptor): ModelDescriptor;
|
|
29
|
+
export declare function isLiveFilter(filter: unknown): boolean;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
const SYNC_STRATEGIES = ['custom', 'lww', 'merge', 'reject'];
|
|
2
|
+
const SYNC_OPERATIONS = ['create', 'delete', 'pull', 'update'];
|
|
3
|
+
export const SYNC_VERSION_FIELD = 'version';
|
|
4
|
+
export const SYNC_DELETED_FIELD = 'deletedAt';
|
|
5
|
+
export const SYNC_CLOCK_FIELD = 'syncAt';
|
|
6
|
+
export const SYNC_SEQUENCE_FIELD = 'syncSeq';
|
|
7
|
+
export const SYNC_SEQUENCE_PENDING = -1;
|
|
8
|
+
export const SYNC_SYSTEM_FIELDS = Object.freeze([
|
|
9
|
+
SYNC_VERSION_FIELD,
|
|
10
|
+
SYNC_DELETED_FIELD,
|
|
11
|
+
SYNC_CLOCK_FIELD,
|
|
12
|
+
SYNC_SEQUENCE_FIELD,
|
|
13
|
+
]);
|
|
14
|
+
export function liveFilter() {
|
|
15
|
+
return { [SYNC_DELETED_FIELD]: null };
|
|
16
|
+
}
|
|
17
|
+
export function resolveSyncOptions(value, model) {
|
|
18
|
+
if (value === undefined || value === false) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
const options = value === true ? {} : value;
|
|
22
|
+
if (!options || typeof options !== 'object') {
|
|
23
|
+
throw new Error(`@PersistedModel(${model}): sync must be true or an options object`);
|
|
24
|
+
}
|
|
25
|
+
const idFormat = options.idFormat ?? 'objectId';
|
|
26
|
+
if (idFormat !== 'objectId' && idFormat !== 'uuidv7') {
|
|
27
|
+
throw new Error(`@PersistedModel(${model}): sync.idFormat must be 'objectId' or 'uuidv7', got ${JSON.stringify(idFormat)}`);
|
|
28
|
+
}
|
|
29
|
+
const scope = options.scope ?? [];
|
|
30
|
+
if (!Array.isArray(scope) || scope.some((field) => typeof field !== 'string' || !field)) {
|
|
31
|
+
throw new Error(`@PersistedModel(${model}): sync.scope must be a list of field names`);
|
|
32
|
+
}
|
|
33
|
+
if (options.strategy !== undefined && !SYNC_STRATEGIES.includes(options.strategy)) {
|
|
34
|
+
throw new Error(`@PersistedModel(${model}): sync.strategy must be one of ${SYNC_STRATEGIES.join(', ')}, got ${JSON.stringify(options.strategy)}`);
|
|
35
|
+
}
|
|
36
|
+
if (options.roles !== undefined) {
|
|
37
|
+
const roles = options.roles;
|
|
38
|
+
const invalid = !roles ||
|
|
39
|
+
typeof roles !== 'object' ||
|
|
40
|
+
Object.entries(roles).some(([operation, list]) => !SYNC_OPERATIONS.includes(operation) ||
|
|
41
|
+
!Array.isArray(list) ||
|
|
42
|
+
list.some((role) => typeof role !== 'string' || !role));
|
|
43
|
+
if (invalid) {
|
|
44
|
+
throw new Error(`@PersistedModel(${model}): sync.roles maps ${SYNC_OPERATIONS.join(', ')} to lists of role names`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return { idFormat, scope: Object.freeze([...scope]) };
|
|
48
|
+
}
|
|
49
|
+
export function withSyncDescriptor(descriptor, sync) {
|
|
50
|
+
const name = descriptor.name;
|
|
51
|
+
for (const field of SYNC_SYSTEM_FIELDS) {
|
|
52
|
+
if (descriptor.fields[field]) {
|
|
53
|
+
throw new Error(`${name}: "${field}" is reserved on a synchronized model — rename the field`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
for (const field of sync.scope) {
|
|
57
|
+
if (!descriptor.fields[field]) {
|
|
58
|
+
throw new Error(`${name}: sync.scope names "${field}", which the model does not declare`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
const nestedUnique = descriptor.indexes.find((index) => index.options.unique === true && Object.keys(index.fields).some((path) => path.includes('.')));
|
|
62
|
+
if (nestedUnique) {
|
|
63
|
+
throw new Error(`${name}: a unique index inside an embedded object (${JSON.stringify(nestedUnique.fields)}) is not supported on a ` +
|
|
64
|
+
'synchronized model — declare the unique field on the model itself');
|
|
65
|
+
}
|
|
66
|
+
if (descriptor.indexes.some((index) => 'expireAfterSeconds' in index.options) ||
|
|
67
|
+
Object.values(descriptor.fields).some((field) => field.expiresAfterSeconds !== undefined)) {
|
|
68
|
+
throw new Error(`${name}: a synchronized model cannot expire records (TTL) — an expired record disappears without a tombstone, ` +
|
|
69
|
+
'and every client keeps it');
|
|
70
|
+
}
|
|
71
|
+
const fields = { ...descriptor.fields };
|
|
72
|
+
if (sync.idFormat === 'uuidv7' && fields._id) {
|
|
73
|
+
fields._id = { ...fields._id, kind: 'uuid' };
|
|
74
|
+
}
|
|
75
|
+
fields[SYNC_VERSION_FIELD] = systemField(SYNC_VERSION_FIELD, 'number', 1);
|
|
76
|
+
fields[SYNC_DELETED_FIELD] = systemField(SYNC_DELETED_FIELD, 'date', null);
|
|
77
|
+
return {
|
|
78
|
+
...descriptor,
|
|
79
|
+
fields,
|
|
80
|
+
indexes: descriptor.indexes.map((index) => liveUniqueIndex(index)),
|
|
81
|
+
sync,
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
export function liveUniqueIndex(index) {
|
|
85
|
+
if (index.options.unique !== true) {
|
|
86
|
+
return index;
|
|
87
|
+
}
|
|
88
|
+
const { sparse, ...options } = index.options;
|
|
89
|
+
const existing = options.partialFilterExpression ?? {};
|
|
90
|
+
const exists = sparse === true ? Object.fromEntries(Object.keys(index.fields).map((path) => [path, { $exists: true }])) : {};
|
|
91
|
+
return {
|
|
92
|
+
fields: { ...index.fields },
|
|
93
|
+
options: { ...options, partialFilterExpression: { ...existing, ...exists, ...liveFilter() } },
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
export function withSequenceField(descriptor) {
|
|
97
|
+
if (!descriptor.sync || descriptor.fields[SYNC_SEQUENCE_FIELD]) {
|
|
98
|
+
return descriptor;
|
|
99
|
+
}
|
|
100
|
+
const field = systemField(SYNC_SEQUENCE_FIELD, 'bigint', undefined);
|
|
101
|
+
return {
|
|
102
|
+
...descriptor,
|
|
103
|
+
fields: { ...descriptor.fields, [SYNC_SEQUENCE_FIELD]: field },
|
|
104
|
+
indexes: [
|
|
105
|
+
...descriptor.indexes,
|
|
106
|
+
{
|
|
107
|
+
fields: descriptor.tenantScoped ? { tenantId: 1, [SYNC_SEQUENCE_FIELD]: 1 } : { [SYNC_SEQUENCE_FIELD]: 1 },
|
|
108
|
+
options: {},
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
export function isLiveFilter(filter) {
|
|
114
|
+
if (!filter || typeof filter !== 'object') {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
const keys = Object.keys(filter);
|
|
118
|
+
return (keys.length === 1 &&
|
|
119
|
+
keys[0] === SYNC_DELETED_FIELD &&
|
|
120
|
+
filter[SYNC_DELETED_FIELD] === null);
|
|
121
|
+
}
|
|
122
|
+
function systemField(name, kind, value) {
|
|
123
|
+
return {
|
|
124
|
+
...(value === undefined ? {} : { default: value }),
|
|
125
|
+
hasDefault: value !== undefined,
|
|
126
|
+
index: false,
|
|
127
|
+
isArray: false,
|
|
128
|
+
kind,
|
|
129
|
+
lowercase: false,
|
|
130
|
+
name,
|
|
131
|
+
required: false,
|
|
132
|
+
select: true,
|
|
133
|
+
sparse: false,
|
|
134
|
+
trim: false,
|
|
135
|
+
unique: false,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=sync-model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-model.js","sourceRoot":"","sources":["../../../../src/core/common/persistence/sync-model.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { OnApplicationBootstrap, OnApplicationShutdown } from '@nestjs/common';
|
|
2
2
|
import { CronExpression, SchedulerRegistry } from '@nestjs/schedule';
|
|
3
|
+
import { CronJob } from 'cron';
|
|
3
4
|
import { CronJobConfigWithTimeZone } from '../interfaces/cron-job-config-with-time-zone.interface.js';
|
|
4
5
|
import { CronJobConfigWithUtcOffset } from '../interfaces/cron-job-config-with-utc-offset.interface.js';
|
|
5
6
|
import { Falsy } from '../types/falsy.type.js';
|
|
7
|
+
import type { LockStore } from '../persistence/lock-store.interface.js';
|
|
6
8
|
import type { CoreRedisService } from './core-redis.service.js';
|
|
7
9
|
import type { Redis } from 'ioredis';
|
|
8
10
|
import type { Connection } from 'mongoose';
|
|
@@ -20,12 +22,19 @@ export declare abstract class CoreCronJobs implements OnApplicationBootstrap, On
|
|
|
20
22
|
log: boolean;
|
|
21
23
|
};
|
|
22
24
|
runningJobs: Record<string, Date[]>;
|
|
25
|
+
protected bullJobOptions: Record<string, unknown>;
|
|
23
26
|
protected bullQueue?: any;
|
|
27
|
+
protected bullQueueConnection?: any;
|
|
28
|
+
protected bullScheduledJobs: Set<string>;
|
|
29
|
+
protected bullSchedulerCheck?: Promise<void>;
|
|
30
|
+
protected bullSchedulerCheckIntervalMs: number;
|
|
31
|
+
protected bullSchedulerCheckTimer?: ReturnType<typeof setInterval>;
|
|
24
32
|
protected bullWorker?: any;
|
|
25
33
|
protected dedupWarned: boolean;
|
|
26
34
|
protected jobConfigs: Record<string, CronJobConfigWithTimeZone>;
|
|
27
35
|
protected leaseIndexReady?: Promise<void>;
|
|
28
36
|
protected readonly leaseOwner: string;
|
|
37
|
+
protected readonly onBullQueueReady: () => void;
|
|
29
38
|
protected constructor(schedulerRegistry: SchedulerRegistry, cronJobs: Record<string, CronExpression | CronJobConfigWithTimeZone | CronJobConfigWithUtcOffset | Date | Falsy | string>, options?: CoreCronJobsOptions);
|
|
30
39
|
onApplicationBootstrap(): Promise<void>;
|
|
31
40
|
onApplicationShutdown(): Promise<void>;
|
|
@@ -38,13 +47,31 @@ export declare abstract class CoreCronJobs implements OnApplicationBootstrap, On
|
|
|
38
47
|
protected importBullMq(): Promise<any>;
|
|
39
48
|
protected initBullMq(): Promise<boolean>;
|
|
40
49
|
protected drainRunningJobs(timeoutMs?: number): Promise<void>;
|
|
50
|
+
protected trimBullJobBacklog(): Promise<void>;
|
|
41
51
|
protected removeStaleBullSchedulers(active: Set<string>): Promise<void>;
|
|
52
|
+
protected restoreBullSchedulers(): Promise<void>;
|
|
53
|
+
protected listBullSchedulerKeys(): Promise<Set<string> | undefined>;
|
|
54
|
+
protected bullSchedulerRemovedKey(name: string): string | undefined;
|
|
55
|
+
protected isBullSchedulerRemoved(name: string): Promise<boolean>;
|
|
56
|
+
protected markBullSchedulerRemoved(name: string): Promise<void>;
|
|
57
|
+
protected startBullSchedulerCheck(): void;
|
|
58
|
+
protected stopBullSchedulerCheck(): void;
|
|
42
59
|
protected startBullWorker(): void;
|
|
43
60
|
protected logSkippedTick(leaseKey: string): void;
|
|
44
61
|
protected registerBullJob(name: string, config: CronJobConfigWithTimeZone): Promise<void>;
|
|
62
|
+
protected upsertBullScheduler(name: string, config: CronJobConfigWithTimeZone): Promise<unknown>;
|
|
45
63
|
protected registerLocalJob(name: string, config: CronJobConfigWithTimeZone, distributed: boolean): void;
|
|
46
64
|
protected runDistributedTick(name: string, fireTime: Date | 'init' | 'manual'): Promise<void>;
|
|
47
65
|
protected runInitTick(name: string): void;
|
|
48
66
|
protected runTick(name: string): Promise<void>;
|
|
67
|
+
protected runsExclusively(config: CronJobConfigWithTimeZone): boolean;
|
|
68
|
+
protected acquireRunningLease(name: string): Promise<false | {
|
|
69
|
+
release: () => Promise<void>;
|
|
70
|
+
}>;
|
|
71
|
+
protected leaseStore(): Promise<LockStore | undefined>;
|
|
72
|
+
protected redisLeaseStore(redis: Redis): LockStore;
|
|
73
|
+
protected currentScheduledInstant(job: CronJob, remembered: number, fired: number): number;
|
|
74
|
+
protected nextScheduledInstant(job: CronJob): number | undefined;
|
|
75
|
+
protected logLocalJobsHint(names: string[]): void;
|
|
49
76
|
protected warnDedupInactive(): void;
|
|
50
77
|
}
|