@stratasync/server 0.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.
Files changed (90) hide show
  1. package/README.md +188 -0
  2. package/dist/bootstrap/bootstrap-service.d.ts +41 -0
  3. package/dist/bootstrap/bootstrap-service.d.ts.map +1 -0
  4. package/dist/bootstrap/bootstrap-service.js +411 -0
  5. package/dist/bootstrap/bootstrap-service.js.map +1 -0
  6. package/dist/config.d.ts +124 -0
  7. package/dist/config.d.ts.map +1 -0
  8. package/dist/config.js +10 -0
  9. package/dist/config.js.map +1 -0
  10. package/dist/create-sync-server.d.ts +5 -0
  11. package/dist/create-sync-server.d.ts.map +1 -0
  12. package/dist/create-sync-server.js +96 -0
  13. package/dist/create-sync-server.js.map +1 -0
  14. package/dist/dao/sync-dao.d.ts +64 -0
  15. package/dist/dao/sync-dao.d.ts.map +1 -0
  16. package/dist/dao/sync-dao.js +137 -0
  17. package/dist/dao/sync-dao.js.map +1 -0
  18. package/dist/db.d.ts +37 -0
  19. package/dist/db.d.ts.map +1 -0
  20. package/dist/db.js +2 -0
  21. package/dist/db.js.map +1 -0
  22. package/dist/delta/delta-publisher.d.ts +52 -0
  23. package/dist/delta/delta-publisher.d.ts.map +1 -0
  24. package/dist/delta/delta-publisher.js +217 -0
  25. package/dist/delta/delta-publisher.js.map +1 -0
  26. package/dist/delta/delta-service.d.ts +13 -0
  27. package/dist/delta/delta-service.d.ts.map +1 -0
  28. package/dist/delta/delta-service.js +36 -0
  29. package/dist/delta/delta-service.js.map +1 -0
  30. package/dist/fastify/index.d.ts +7 -0
  31. package/dist/fastify/index.d.ts.map +1 -0
  32. package/dist/fastify/index.js +5 -0
  33. package/dist/fastify/index.js.map +1 -0
  34. package/dist/fastify/middleware.d.ts +16 -0
  35. package/dist/fastify/middleware.d.ts.map +1 -0
  36. package/dist/fastify/middleware.js +101 -0
  37. package/dist/fastify/middleware.js.map +1 -0
  38. package/dist/fastify/routes.d.ts +17 -0
  39. package/dist/fastify/routes.d.ts.map +1 -0
  40. package/dist/fastify/routes.js +150 -0
  41. package/dist/fastify/routes.js.map +1 -0
  42. package/dist/fastify/validation.d.ts +59 -0
  43. package/dist/fastify/validation.d.ts.map +1 -0
  44. package/dist/fastify/validation.js +79 -0
  45. package/dist/fastify/validation.js.map +1 -0
  46. package/dist/index.d.ts +22 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +22 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/mutate/archive-mutation.d.ts +10 -0
  51. package/dist/mutate/archive-mutation.d.ts.map +1 -0
  52. package/dist/mutate/archive-mutation.js +14 -0
  53. package/dist/mutate/archive-mutation.js.map +1 -0
  54. package/dist/mutate/field-codecs.d.ts +15 -0
  55. package/dist/mutate/field-codecs.d.ts.map +1 -0
  56. package/dist/mutate/field-codecs.js +103 -0
  57. package/dist/mutate/field-codecs.js.map +1 -0
  58. package/dist/mutate/model-handlers.d.ts +32 -0
  59. package/dist/mutate/model-handlers.d.ts.map +1 -0
  60. package/dist/mutate/model-handlers.js +131 -0
  61. package/dist/mutate/model-handlers.js.map +1 -0
  62. package/dist/mutate/mutate-service.d.ts +30 -0
  63. package/dist/mutate/mutate-service.d.ts.map +1 -0
  64. package/dist/mutate/mutate-service.js +326 -0
  65. package/dist/mutate/mutate-service.js.map +1 -0
  66. package/dist/types.d.ts +101 -0
  67. package/dist/types.d.ts.map +1 -0
  68. package/dist/types.js +29 -0
  69. package/dist/types.js.map +1 -0
  70. package/dist/utils/composite-ids.d.ts +14 -0
  71. package/dist/utils/composite-ids.d.ts.map +1 -0
  72. package/dist/utils/composite-ids.js +15 -0
  73. package/dist/utils/composite-ids.js.map +1 -0
  74. package/dist/utils/dates.d.ts +8 -0
  75. package/dist/utils/dates.d.ts.map +1 -0
  76. package/dist/utils/dates.js +101 -0
  77. package/dist/utils/dates.js.map +1 -0
  78. package/dist/utils/sync-scope.d.ts +4 -0
  79. package/dist/utils/sync-scope.d.ts.map +1 -0
  80. package/dist/utils/sync-scope.js +17 -0
  81. package/dist/utils/sync-scope.js.map +1 -0
  82. package/dist/utils/sync-utils.d.ts +27 -0
  83. package/dist/utils/sync-utils.d.ts.map +1 -0
  84. package/dist/utils/sync-utils.js +94 -0
  85. package/dist/utils/sync-utils.js.map +1 -0
  86. package/dist/websocket/sync-websocket.d.ts +14 -0
  87. package/dist/websocket/sync-websocket.d.ts.map +1 -0
  88. package/dist/websocket/sync-websocket.js +326 -0
  89. package/dist/websocket/sync-websocket.js.map +1 -0
  90. package/package.json +70 -0
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Zod validation schemas for sync API endpoints
3
+ */
4
+ import { z } from "zod";
5
+ /**
6
+ * GET /sync/bootstrap - Bootstrap query params
7
+ */
8
+ export declare const BootstrapQuerySchema: z.ZodObject<{
9
+ onlyModels: z.ZodOptional<z.ZodString>;
10
+ schemaHash: z.ZodOptional<z.ZodString>;
11
+ syncGroups: z.ZodOptional<z.ZodString>;
12
+ }, z.core.$strip>;
13
+ export type BootstrapQuery = z.infer<typeof BootstrapQuerySchema>;
14
+ /**
15
+ * POST /sync/batch - Batch load request body
16
+ */
17
+ export declare const BatchLoadBodySchema: z.ZodObject<{
18
+ firstSyncId: z.ZodOptional<z.ZodString>;
19
+ requests: z.ZodArray<z.ZodUnion<readonly [z.ZodObject<{
20
+ indexedKey: z.ZodString;
21
+ keyValue: z.ZodString;
22
+ modelName: z.ZodString;
23
+ }, z.core.$strip>, z.ZodObject<{
24
+ groupId: z.ZodString;
25
+ modelName: z.ZodString;
26
+ }, z.core.$strip>]>>;
27
+ }, z.core.$strip>;
28
+ export type BatchLoadBody = z.infer<typeof BatchLoadBodySchema>;
29
+ /**
30
+ * GET /sync/deltas - Delta query params
31
+ */
32
+ export declare const DeltaQuerySchema: z.ZodObject<{
33
+ after: z.ZodOptional<z.ZodString>;
34
+ limit: z.ZodOptional<z.ZodString>;
35
+ syncGroups: z.ZodOptional<z.ZodString>;
36
+ }, z.core.$strip>;
37
+ export type DeltaQuery = z.infer<typeof DeltaQuerySchema>;
38
+ /**
39
+ * POST /sync/mutate - Mutate request body
40
+ */
41
+ export declare const MutateBodySchema: z.ZodObject<{
42
+ batchId: z.ZodString;
43
+ transactions: z.ZodArray<z.ZodObject<{
44
+ action: z.ZodEnum<{
45
+ INSERT: "INSERT";
46
+ UPDATE: "UPDATE";
47
+ DELETE: "DELETE";
48
+ ARCHIVE: "ARCHIVE";
49
+ UNARCHIVE: "UNARCHIVE";
50
+ }>;
51
+ clientId: z.ZodString;
52
+ clientTxId: z.ZodString;
53
+ modelId: z.ZodString;
54
+ modelName: z.ZodString;
55
+ payload: z.ZodRecord<z.ZodString, z.ZodUnknown>;
56
+ }, z.core.$strip>>;
57
+ }, z.core.$strip>;
58
+ export type MutateBody = z.infer<typeof MutateBodySchema>;
59
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/fastify/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;iBAI/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAqBlE;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;iBAQ9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;iBAI3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAyB1D;;GAEG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;iBAK3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Zod validation schemas for sync API endpoints
3
+ */
4
+ import { z } from "zod";
5
+ /**
6
+ * GET /sync/bootstrap - Bootstrap query params
7
+ */
8
+ export const BootstrapQuerySchema = z.object({
9
+ onlyModels: z.string().optional(),
10
+ schemaHash: z.string().optional(),
11
+ syncGroups: z.string().optional(),
12
+ });
13
+ /**
14
+ * Individual batch request -- either indexed (by key/value) or group-based
15
+ */
16
+ const BatchRequestIndexedSchema = z.object({
17
+ indexedKey: z.string().min(1),
18
+ keyValue: z.string().min(1),
19
+ modelName: z.string().min(1, "Model name is required"),
20
+ });
21
+ const BatchRequestGroupSchema = z.object({
22
+ groupId: z.string().min(1, "Group ID is required"),
23
+ modelName: z.string().min(1, "Model name is required"),
24
+ });
25
+ const BatchRequestSchema = z.union([
26
+ BatchRequestIndexedSchema,
27
+ BatchRequestGroupSchema,
28
+ ]);
29
+ /**
30
+ * POST /sync/batch - Batch load request body
31
+ */
32
+ export const BatchLoadBodySchema = z.object({
33
+ firstSyncId: z
34
+ .string()
35
+ .regex(/^\d+$/, "firstSyncId must be a numeric string")
36
+ .optional(),
37
+ requests: z
38
+ .array(BatchRequestSchema)
39
+ .min(1, "At least one request is required"),
40
+ });
41
+ /**
42
+ * GET /sync/deltas - Delta query params
43
+ */
44
+ export const DeltaQuerySchema = z.object({
45
+ after: z.string().regex(/^\d+$/, "After must be a numeric string").optional(),
46
+ limit: z.string().regex(/^\d+$/, "Limit must be a numeric string").optional(),
47
+ syncGroups: z.string().optional(),
48
+ });
49
+ /**
50
+ * Transaction action enum
51
+ */
52
+ const TransactionActionSchema = z.enum([
53
+ "INSERT",
54
+ "UPDATE",
55
+ "DELETE",
56
+ "ARCHIVE",
57
+ "UNARCHIVE",
58
+ ]);
59
+ /**
60
+ * Individual transaction in a mutate request
61
+ */
62
+ const TransactionSchema = z.object({
63
+ action: TransactionActionSchema,
64
+ clientId: z.string().min(1, "Client ID is required"),
65
+ clientTxId: z.string().min(1, "Client transaction ID is required"),
66
+ modelId: z.string().uuid("Model ID must be a valid UUID"),
67
+ modelName: z.string().min(1, "Model name is required"),
68
+ payload: z.record(z.string(), z.unknown()),
69
+ });
70
+ /**
71
+ * POST /sync/mutate - Mutate request body
72
+ */
73
+ export const MutateBodySchema = z.object({
74
+ batchId: z.string().min(1, "Batch ID is required"),
75
+ transactions: z
76
+ .array(TransactionSchema)
77
+ .min(1, "At least one transaction is required"),
78
+ });
79
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/fastify/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ export type { BootstrapRequest, DeltaPacket, GraphQLTransactionAction, ModelAction, MutateInput, MutateResult, SerializedSyncActionOutput, SyncActionOutput, SyncIdString, SyncUserContext, TransactionInput, TransactionResult, } from "./types.js";
2
+ export { mapGraphQLAction } from "./types.js";
3
+ export type { BootstrapFieldDef, BootstrapFilterContext, BootstrapModelConfig, CompositeMutateConfig, CursorConfig, FieldSpec, FieldType, MutationContext, RedisClient, StandardMutateConfig, SyncAuthConfig, SyncAuthPayload, SyncLogger, SyncModelConfig, SyncServer, SyncServerConfig, WebSocketConnectionContext, WebSocketHooks, } from "./config.js";
4
+ export { noopLogger } from "./config.js";
5
+ export { dateOnlyStringToEpoch, epochToDateOnlyString, toDateOnlyDateOrNull, toDateOnlyEpoch, toDateOnlyStringOrNull, toInstantDateOrNull, toInstantEpoch, } from "./utils/dates.js";
6
+ export { getColumn, parseSyncActionOutput, parseSyncIdString, serializeSyncActionOutput, serializeSyncId, toSyncActionOutput, } from "./utils/sync-utils.js";
7
+ export { dedupeSyncGroups, resolvePublishedDeltaGroups, resolveRequestedSyncGroups, } from "./utils/sync-scope.js";
8
+ export { createCompositeSyncId, DEFAULT_COMPOSITE_ID_NAMESPACE, } from "./utils/composite-ids.js";
9
+ export type { SyncDb, SyncDbSelectBuilder, SyncDbWhereResult } from "./db.js";
10
+ export { SyncDao } from "./dao/sync-dao.js";
11
+ export type { SyncActionInsert, SyncDaoTables } from "./dao/sync-dao.js";
12
+ export type { DeltaPublisherLike, DeltaSubscriberCallback, DeltaSubscriberLike, } from "./delta/delta-publisher.js";
13
+ export { createCompositeDeltaPublisher, createDeltaPublisher, createDeltaSubscriber, createInMemoryDeltaBus, createInMemoryDeltaPublisher, createInMemoryDeltaSubscriber, safeJsonStringify, } from "./delta/delta-publisher.js";
14
+ export { buildInsertData, buildUpdateData, parseTemporalInput, serializeSyncData, } from "./mutate/field-codecs.js";
15
+ export { handleArchiveMutation } from "./mutate/archive-mutation.js";
16
+ export type { ModelDef, MutationDelegate, StandardModelDef, CompositeModelDef, } from "./mutate/model-handlers.js";
17
+ export { createCompositeDelegate, createModelHandler, createStandardDelegate, } from "./mutate/model-handlers.js";
18
+ export { BootstrapService } from "./bootstrap/bootstrap-service.js";
19
+ export { DeltaService } from "./delta/delta-service.js";
20
+ export { MutateService } from "./mutate/mutate-service.js";
21
+ export { createSyncServer } from "./create-sync-server.js";
22
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,YAAY,EACV,gBAAgB,EAChB,WAAW,EACX,wBAAwB,EACxB,WAAW,EACX,WAAW,EACX,YAAY,EACZ,0BAA0B,EAC1B,gBAAgB,EAChB,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9C,YAAY,EACV,iBAAiB,EACjB,sBAAsB,EACtB,oBAAoB,EACpB,qBAAqB,EACrB,YAAY,EACZ,SAAS,EACT,SAAS,EACT,eAAe,EACf,WAAW,EACX,oBAAoB,EACpB,cAAc,EACd,eAAe,EACf,UAAU,EACV,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,0BAA0B,EAC1B,cAAc,GACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,mBAAmB,EACnB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,SAAS,EACT,qBAAqB,EACrB,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,EACf,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,gBAAgB,EAChB,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,qBAAqB,EACrB,8BAA8B,GAC/B,MAAM,0BAA0B,CAAC;AAGlC,YAAY,EAAE,MAAM,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAG9E,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAC5C,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAGzE,YAAY,EACV,kBAAkB,EAClB,uBAAuB,EACvB,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,6BAA6B,EAC7B,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,4BAA4B,EAC5B,6BAA6B,EAC7B,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EACL,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAGlC,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAGrE,YAAY,EACV,QAAQ,EACR,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAG3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,22 @@
1
+ export { mapGraphQLAction } from "./types.js";
2
+ export { noopLogger } from "./config.js";
3
+ // Utilities
4
+ export { dateOnlyStringToEpoch, epochToDateOnlyString, toDateOnlyDateOrNull, toDateOnlyEpoch, toDateOnlyStringOrNull, toInstantDateOrNull, toInstantEpoch, } from "./utils/dates.js";
5
+ export { getColumn, parseSyncActionOutput, parseSyncIdString, serializeSyncActionOutput, serializeSyncId, toSyncActionOutput, } from "./utils/sync-utils.js";
6
+ export { dedupeSyncGroups, resolvePublishedDeltaGroups, resolveRequestedSyncGroups, } from "./utils/sync-scope.js";
7
+ export { createCompositeSyncId, DEFAULT_COMPOSITE_ID_NAMESPACE, } from "./utils/composite-ids.js";
8
+ // DAO
9
+ export { SyncDao } from "./dao/sync-dao.js";
10
+ export { createCompositeDeltaPublisher, createDeltaPublisher, createDeltaSubscriber, createInMemoryDeltaBus, createInMemoryDeltaPublisher, createInMemoryDeltaSubscriber, safeJsonStringify, } from "./delta/delta-publisher.js";
11
+ // Field codecs
12
+ export { buildInsertData, buildUpdateData, parseTemporalInput, serializeSyncData, } from "./mutate/field-codecs.js";
13
+ // Archive mutation
14
+ export { handleArchiveMutation } from "./mutate/archive-mutation.js";
15
+ export { createCompositeDelegate, createModelHandler, createStandardDelegate, } from "./mutate/model-handlers.js";
16
+ // Services
17
+ export { BootstrapService } from "./bootstrap/bootstrap-service.js";
18
+ export { DeltaService } from "./delta/delta-service.js";
19
+ export { MutateService } from "./mutate/mutate-service.js";
20
+ // Factory
21
+ export { createSyncServer } from "./create-sync-server.js";
22
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAuB9C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,YAAY;AACZ,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,eAAe,EACf,sBAAsB,EACtB,mBAAmB,EACnB,cAAc,GACf,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,SAAS,EACT,qBAAqB,EACrB,iBAAiB,EACjB,yBAAyB,EACzB,eAAe,EACf,kBAAkB,GACnB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,gBAAgB,EAChB,2BAA2B,EAC3B,0BAA0B,GAC3B,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EACL,qBAAqB,EACrB,8BAA8B,GAC/B,MAAM,0BAA0B,CAAC;AAKlC,MAAM;AACN,OAAO,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAS5C,OAAO,EACL,6BAA6B,EAC7B,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,4BAA4B,EAC5B,6BAA6B,EAC7B,iBAAiB,GAClB,MAAM,4BAA4B,CAAC;AAEpC,eAAe;AACf,OAAO,EACL,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,iBAAiB,GAClB,MAAM,0BAA0B,CAAC;AAElC,mBAAmB;AACnB,OAAO,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AASrE,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,sBAAsB,GACvB,MAAM,4BAA4B,CAAC;AAEpC,WAAW;AACX,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAC;AACpE,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAE3D,UAAU;AACV,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,10 @@
1
+ interface ArchiveMutationOptions {
2
+ db: unknown;
3
+ modelId: string;
4
+ payload: Record<string, unknown>;
5
+ action: "A" | "V";
6
+ updateById: (db: unknown, id: string, data: Record<string, unknown>) => Promise<void>;
7
+ }
8
+ export declare const handleArchiveMutation: (options: ArchiveMutationOptions) => Promise<Record<string, unknown>>;
9
+ export {};
10
+ //# sourceMappingURL=archive-mutation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive-mutation.d.ts","sourceRoot":"","sources":["../../src/mutate/archive-mutation.ts"],"names":[],"mappings":"AAGA,UAAU,sBAAsB;IAC9B,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,MAAM,EAAE,GAAG,GAAG,GAAG,CAAC;IAClB,UAAU,EAAE,CACV,EAAE,EAAE,OAAO,EACX,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAC1B,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB;AAED,eAAO,MAAM,qBAAqB,GAChC,SAAS,sBAAsB,KAC9B,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAiBjC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { toInstantEpoch } from "../utils/dates.js";
2
+ import { parseTemporalInput } from "./field-codecs.js";
3
+ export const handleArchiveMutation = async (options) => {
4
+ if (options.action === "A") {
5
+ const archivedAt = parseTemporalInput("instant", options.payload.archivedAt, "archivedAt");
6
+ await options.updateById(options.db, options.modelId, { archivedAt });
7
+ return {
8
+ archivedAt: toInstantEpoch(archivedAt),
9
+ };
10
+ }
11
+ await options.updateById(options.db, options.modelId, { archivedAt: null });
12
+ return { archivedAt: null };
13
+ };
14
+ //# sourceMappingURL=archive-mutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"archive-mutation.js","sourceRoot":"","sources":["../../src/mutate/archive-mutation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAcvD,MAAM,CAAC,MAAM,qBAAqB,GAAG,KAAK,EACxC,OAA+B,EACG,EAAE;IACpC,IAAI,OAAO,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,kBAAkB,CACnC,SAAS,EACT,OAAO,CAAC,OAAO,CAAC,UAAU,EAC1B,YAAY,CACb,CAAC;QAEF,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;QAEtE,OAAO;YACL,UAAU,EAAE,cAAc,CAAC,UAAU,CAAC;SACvC,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5E,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;AAC9B,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ export type FieldType = "string" | "stringNull" | "number" | "date" | "dateNow" | "dateOnly";
2
+ export interface FieldSpec {
3
+ type: FieldType;
4
+ defaultValue?: unknown;
5
+ }
6
+ type TemporalInputKind = "dateOnly" | "instant";
7
+ export declare const parseTemporalInput: (kind: TemporalInputKind, value: unknown, key: string) => Date | null;
8
+ export declare const buildInsertData: (modelId: string | null, payload: Record<string, unknown>, fields: Record<string, FieldSpec>) => Record<string, unknown>;
9
+ export declare const buildUpdateData: (payload: Record<string, unknown>, allowedFields: Set<string>, fieldSpecs: Record<string, FieldSpec>) => Record<string, unknown>;
10
+ export declare const serializeSyncData: (data: Record<string, unknown>, fieldSpecs: Record<string, FieldSpec>, options?: {
11
+ modelId?: string | null;
12
+ keys?: Iterable<string>;
13
+ }) => Record<string, unknown>;
14
+ export {};
15
+ //# sourceMappingURL=field-codecs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-codecs.d.ts","sourceRoot":"","sources":["../../src/mutate/field-codecs.ts"],"names":[],"mappings":"AAOA,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,YAAY,GACZ,QAAQ,GACR,MAAM,GACN,SAAS,GACT,UAAU,CAAC;AAEf,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,SAAS,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,KAAK,iBAAiB,GAAG,UAAU,GAAG,SAAS,CAAC;AAEhD,eAAO,MAAM,kBAAkB,GAC7B,MAAM,iBAAiB,EACvB,OAAO,OAAO,EACd,KAAK,MAAM,KACV,IAAI,GAAG,IAmBT,CAAC;AAqDF,eAAO,MAAM,eAAe,GAC1B,SAAS,MAAM,GAAG,IAAI,EACtB,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,KAChC,MAAM,CAAC,MAAM,EAAE,OAAO,CAYxB,CAAC;AAEF,eAAO,MAAM,eAAe,GAC1B,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,eAAe,GAAG,CAAC,MAAM,CAAC,EAC1B,YAAY,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,KACpC,MAAM,CAAC,MAAM,EAAE,OAAO,CAYxB,CAAC;AAoBF,eAAO,MAAM,iBAAiB,GAC5B,MAAM,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,YAAY,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,EACrC,UAAS;IACP,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CACpB,KACL,MAAM,CAAC,MAAM,EAAE,OAAO,CAaxB,CAAC"}
@@ -0,0 +1,103 @@
1
+ import { toDateOnlyDateOrNull, toDateOnlyEpoch, toInstantDateOrNull, toInstantEpoch, } from "../utils/dates.js";
2
+ export const parseTemporalInput = (kind, value, key) => {
3
+ if (value === null || value === undefined) {
4
+ return null;
5
+ }
6
+ if (typeof value !== "number" || !Number.isFinite(value)) {
7
+ throw new TypeError(`Invalid ${kind} value for ${key}`);
8
+ }
9
+ const parsed = kind === "dateOnly"
10
+ ? toDateOnlyDateOrNull(value)
11
+ : toInstantDateOrNull(value);
12
+ if (parsed === null) {
13
+ throw new Error(`Invalid ${kind} value for ${key}`);
14
+ }
15
+ return parsed;
16
+ };
17
+ const coerceInsertValue = (key, raw, spec) => {
18
+ switch (spec.type) {
19
+ case "dateOnly": {
20
+ return parseTemporalInput("dateOnly", raw, key);
21
+ }
22
+ case "date": {
23
+ return parseTemporalInput("instant", raw, key);
24
+ }
25
+ case "dateNow": {
26
+ return raw === null || raw === undefined
27
+ ? new Date()
28
+ : parseTemporalInput("instant", raw, key);
29
+ }
30
+ case "number": {
31
+ return raw ?? spec.defaultValue ?? 0;
32
+ }
33
+ case "string": {
34
+ return raw ?? spec.defaultValue;
35
+ }
36
+ case "stringNull": {
37
+ return raw ?? null;
38
+ }
39
+ default: {
40
+ return raw ?? spec.defaultValue;
41
+ }
42
+ }
43
+ };
44
+ const coerceUpdateValue = (key, raw, spec) => {
45
+ switch (spec?.type) {
46
+ case "dateOnly": {
47
+ return parseTemporalInput("dateOnly", raw, key);
48
+ }
49
+ case "date":
50
+ case "dateNow": {
51
+ return parseTemporalInput("instant", raw, key);
52
+ }
53
+ default: {
54
+ return raw;
55
+ }
56
+ }
57
+ };
58
+ export const buildInsertData = (modelId, payload, fields) => {
59
+ const data = {};
60
+ if (modelId !== null) {
61
+ data.id = modelId;
62
+ }
63
+ for (const [column, spec] of Object.entries(fields)) {
64
+ data[column] = coerceInsertValue(column, payload[column], spec);
65
+ }
66
+ return data;
67
+ };
68
+ export const buildUpdateData = (payload, allowedFields, fieldSpecs) => {
69
+ const updateData = {};
70
+ for (const [key, value] of Object.entries(payload)) {
71
+ if (!allowedFields.has(key) || value === undefined) {
72
+ continue;
73
+ }
74
+ updateData[key] = coerceUpdateValue(key, value, fieldSpecs[key]);
75
+ }
76
+ return updateData;
77
+ };
78
+ const serializeSyncValue = (value, spec) => {
79
+ switch (spec?.type) {
80
+ case "dateOnly": {
81
+ return toDateOnlyEpoch(value);
82
+ }
83
+ case "date":
84
+ case "dateNow": {
85
+ return toInstantEpoch(value);
86
+ }
87
+ default: {
88
+ return value;
89
+ }
90
+ }
91
+ };
92
+ export const serializeSyncData = (data, fieldSpecs, options = {}) => {
93
+ const keys = options.keys ? [...options.keys] : Object.keys(data);
94
+ const serialized = {};
95
+ if (typeof options.modelId === "string") {
96
+ serialized.id = options.modelId;
97
+ }
98
+ for (const key of keys) {
99
+ serialized[key] = serializeSyncValue(data[key], fieldSpecs[key]);
100
+ }
101
+ return serialized;
102
+ };
103
+ //# sourceMappingURL=field-codecs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-codecs.js","sourceRoot":"","sources":["../../src/mutate/field-codecs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type { SQL } from "drizzle-orm";
2
+ import type { AnyPgTable } from "drizzle-orm/pg-core";
3
+ import type { ModelAction } from "../types.js";
4
+ import type { FieldSpec } from "./field-codecs.js";
5
+ export interface MutationDelegate {
6
+ insert: (db: unknown, data: Record<string, unknown>) => Promise<void>;
7
+ updateById?: (db: unknown, id: string, data: Record<string, unknown>) => Promise<void>;
8
+ deleteById?: (db: unknown, id: string) => Promise<void>;
9
+ deleteByPayload?: (db: unknown, payload: Record<string, unknown>) => Promise<void>;
10
+ }
11
+ export declare const createStandardDelegate: <TTable extends AnyPgTable>(table: TTable, idField: string) => MutationDelegate;
12
+ export declare const createCompositeDelegate: <TTable extends AnyPgTable>(table: TTable, buildDeleteWhere: (payload: Record<string, unknown>) => SQL<unknown>) => MutationDelegate;
13
+ export interface StandardModelDef {
14
+ kind: "standard";
15
+ delegate: MutationDelegate;
16
+ actions: Set<ModelAction>;
17
+ insertFields: Record<string, FieldSpec>;
18
+ updateFields?: Set<string>;
19
+ onBeforeInsert?: (db: unknown, modelId: string, payload: Record<string, unknown>, data: Record<string, unknown>) => Record<string, unknown> | Promise<Record<string, unknown>>;
20
+ onBeforeUpdate?: (db: unknown, modelId: string, payload: Record<string, unknown>, data: Record<string, unknown>) => Record<string, unknown> | Promise<Record<string, unknown>>;
21
+ }
22
+ export interface CompositeModelDef {
23
+ kind: "composite";
24
+ delegate: MutationDelegate;
25
+ actions: Set<ModelAction>;
26
+ insertFields: Record<string, FieldSpec>;
27
+ }
28
+ export type ModelDef = StandardModelDef | CompositeModelDef;
29
+ type ModelHandler = (db: unknown, modelId: string, payload: Record<string, unknown>, action: ModelAction) => Promise<Record<string, unknown>>;
30
+ export declare const createModelHandler: (def: ModelDef) => ModelHandler;
31
+ export {};
32
+ //# sourceMappingURL=model-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-handlers.d.ts","sourceRoot":"","sources":["../../src/mutate/model-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ import { eq } from "drizzle-orm";
2
+ import { getColumn } from "../utils/sync-utils.js";
3
+ import { handleArchiveMutation } from "./archive-mutation.js";
4
+ import { buildInsertData, buildUpdateData, serializeSyncData, } from "./field-codecs.js";
5
+ export const createStandardDelegate = (table, idField) => {
6
+ const idColumn = getColumn(table, idField);
7
+ return {
8
+ deleteById: async (db, id) => {
9
+ await db
10
+ .delete(table)
11
+ .where(eq(idColumn, id));
12
+ },
13
+ insert: async (db, data) => {
14
+ await db
15
+ .insert(table)
16
+ .values(data);
17
+ },
18
+ updateById: async (db, id, data) => {
19
+ await db
20
+ .update(table)
21
+ .set(data)
22
+ .where(eq(idColumn, id));
23
+ },
24
+ };
25
+ };
26
+ export const createCompositeDelegate = (table, buildDeleteWhere) => ({
27
+ deleteByPayload: async (db, payload) => {
28
+ await db
29
+ .delete(table)
30
+ .where(buildDeleteWhere(payload));
31
+ },
32
+ insert: async (db, data) => {
33
+ await db
34
+ .insert(table)
35
+ .values(data);
36
+ },
37
+ });
38
+ const handleInsert = async (db, def, modelId, payload) => {
39
+ const hasId = def.kind === "standard";
40
+ let data = buildInsertData(hasId ? modelId : null, payload, def.insertFields);
41
+ if (def.kind === "standard" && def.onBeforeInsert) {
42
+ data = await def.onBeforeInsert(db, modelId, payload, data);
43
+ }
44
+ await def.delegate.insert(db, data);
45
+ return serializeSyncData(data, def.insertFields, {
46
+ modelId: hasId ? modelId : null,
47
+ });
48
+ };
49
+ const handleUpdate = async (db, def, modelId, payload) => {
50
+ if (def.kind !== "standard" || !def.updateFields) {
51
+ throw new Error("Update not configured for this model");
52
+ }
53
+ if (!def.delegate.updateById) {
54
+ throw new Error("Update delegate missing for this model");
55
+ }
56
+ let updateData = buildUpdateData(payload, def.updateFields, def.insertFields);
57
+ if (def.onBeforeUpdate) {
58
+ updateData = await def.onBeforeUpdate(db, modelId, payload, updateData);
59
+ }
60
+ if (Object.keys(updateData).length === 0) {
61
+ return {};
62
+ }
63
+ await def.delegate.updateById(db, modelId, updateData);
64
+ return serializeSyncData(updateData, def.insertFields, {
65
+ keys: Object.keys(updateData),
66
+ });
67
+ };
68
+ const handleDelete = async (db, def, modelId, payload) => {
69
+ if (def.kind === "composite") {
70
+ if (!def.delegate.deleteByPayload) {
71
+ throw new Error("Composite delete delegate missing for this model");
72
+ }
73
+ await def.delegate.deleteByPayload(db, payload);
74
+ return payload;
75
+ }
76
+ if (!def.delegate.deleteById) {
77
+ throw new Error("Delete delegate missing for this model");
78
+ }
79
+ await def.delegate.deleteById(db, modelId);
80
+ return payload;
81
+ };
82
+ const getStandardUpdateDelegate = (def, actionLabel) => {
83
+ if (!def.delegate.updateById) {
84
+ throw new Error(`${actionLabel} delegate missing for this model`);
85
+ }
86
+ return def.delegate.updateById;
87
+ };
88
+ export const createModelHandler = (def) => (db, modelId, payload, action) => {
89
+ if (!def.actions.has(action)) {
90
+ throw new Error(`Unsupported action "${action}" for this model`);
91
+ }
92
+ switch (action) {
93
+ case "I": {
94
+ return handleInsert(db, def, modelId, payload);
95
+ }
96
+ case "U": {
97
+ return handleUpdate(db, def, modelId, payload);
98
+ }
99
+ case "D": {
100
+ return handleDelete(db, def, modelId, payload);
101
+ }
102
+ case "A": {
103
+ if (def.kind !== "standard") {
104
+ throw new Error("Archive not configured for this model");
105
+ }
106
+ return handleArchiveMutation({
107
+ action: "A",
108
+ db,
109
+ modelId,
110
+ payload,
111
+ updateById: getStandardUpdateDelegate(def, "Archive"),
112
+ });
113
+ }
114
+ case "V": {
115
+ if (def.kind !== "standard") {
116
+ throw new Error("Unarchive not configured for this model");
117
+ }
118
+ return handleArchiveMutation({
119
+ action: "V",
120
+ db,
121
+ modelId,
122
+ payload,
123
+ updateById: getStandardUpdateDelegate(def, "Unarchive"),
124
+ });
125
+ }
126
+ default: {
127
+ throw new Error(`Unknown action: ${action}`);
128
+ }
129
+ }
130
+ };
131
+ //# sourceMappingURL=model-handlers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-handlers.js","sourceRoot":"","sources":["../../src/mutate/model-handlers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { SyncLogger, SyncModelConfig } from "../config.js";
2
+ import type { SyncDao } from "../dao/sync-dao.js";
3
+ import type { MutateInput, MutateResult, SyncActionOutput, SyncUserContext, TransactionInput } from "../types.js";
4
+ export declare class MutateService {
5
+ private readonly dao;
6
+ private readonly db;
7
+ private readonly logger;
8
+ private readonly modelHandlers;
9
+ private readonly modelGroupKeys;
10
+ private readonly modelDelegates;
11
+ private readonly modelConfigs;
12
+ constructor(db: unknown, dao: SyncDao, models: Record<string, SyncModelConfig>, logger?: SyncLogger);
13
+ /**
14
+ * Resolve the groupId for a sync action.
15
+ */
16
+ private resolveGroupId;
17
+ private lookupGroupId;
18
+ private static validateGroupAccess;
19
+ private static createDuplicateTransactionResult;
20
+ private prepareTransaction;
21
+ private applyModelMutation;
22
+ private resolveAuthorizedGroupId;
23
+ private static publishSyncAction;
24
+ static validateTransaction(tx: TransactionInput): string[];
25
+ private static createSuccessResult;
26
+ private createSyncActionWithDeduplication;
27
+ private processTransaction;
28
+ mutate(context: SyncUserContext, input: MutateInput, onAction?: (action: SyncActionOutput) => void): Promise<MutateResult>;
29
+ }
30
+ //# sourceMappingURL=mutate-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutate-service.d.ts","sourceRoot":"","sources":["../../src/mutate/mutate-service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAEhE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EAEZ,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAEjB,MAAM,aAAa,CAAC;AAmFrB,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAU;IAC9B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAU;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAQ5B;IACF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAyB;IACxD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAA8B;IAC7D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;gBAG7D,EAAE,EAAE,OAAO,EACX,GAAG,EAAE,OAAO,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACvC,MAAM,GAAE,UAAuB;IAuEjC;;OAEG;YACW,cAAc;YA0Cd,aAAa;IAc3B,OAAO,CAAC,MAAM,CAAC,mBAAmB;IAelC,OAAO,CAAC,MAAM,CAAC,gCAAgC;IAoB/C,OAAO,CAAC,kBAAkB;YAwBZ,kBAAkB;YAkBlB,wBAAwB;IAsBtC,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAWhC,MAAM,CAAC,mBAAmB,CAAC,EAAE,EAAE,gBAAgB,GAAG,MAAM,EAAE;IA6B1D,OAAO,CAAC,MAAM,CAAC,mBAAmB;YAWpB,iCAAiC;YAoCjC,kBAAkB;IAyG1B,MAAM,CACV,OAAO,EAAE,eAAe,EACxB,KAAK,EAAE,WAAW,EAClB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,GAC5C,OAAO,CAAC,YAAY,CAAC;CAyCzB"}