velocious 1.0.502 → 1.0.503

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 (45) hide show
  1. package/build/application.js +2 -0
  2. package/build/src/application.d.ts.map +1 -1
  3. package/build/src/application.js +3 -1
  4. package/build/src/sync/sync-change-fanout.d.ts +71 -0
  5. package/build/src/sync/sync-change-fanout.d.ts.map +1 -0
  6. package/build/src/sync/sync-change-fanout.js +54 -0
  7. package/build/src/sync/sync-client-types.d.ts +4 -0
  8. package/build/src/sync/sync-client-types.d.ts.map +1 -1
  9. package/build/src/sync/sync-client-types.js +1 -1
  10. package/build/src/sync/sync-client.d.ts.map +1 -1
  11. package/build/src/sync/sync-client.js +7 -3
  12. package/build/src/sync/sync-envelope-replay-service.d.ts +15 -4
  13. package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
  14. package/build/src/sync/sync-envelope-replay-service.js +60 -42
  15. package/build/src/sync/sync-publish-suppression.d.ts +31 -0
  16. package/build/src/sync/sync-publish-suppression.d.ts.map +1 -0
  17. package/build/src/sync/sync-publish-suppression.js +54 -0
  18. package/build/src/sync/sync-publisher-types.d.ts +146 -0
  19. package/build/src/sync/sync-publisher-types.d.ts.map +1 -0
  20. package/build/src/sync/sync-publisher-types.js +3 -0
  21. package/build/src/sync/sync-publisher.d.ts +137 -0
  22. package/build/src/sync/sync-publisher.d.ts.map +1 -0
  23. package/build/src/sync/sync-publisher.js +305 -0
  24. package/build/src/testing/test-runner.d.ts +8 -0
  25. package/build/src/testing/test-runner.d.ts.map +1 -1
  26. package/build/src/testing/test-runner.js +64 -2
  27. package/build/sync/sync-change-fanout.js +58 -0
  28. package/build/sync/sync-client-types.js +1 -0
  29. package/build/sync/sync-client.js +7 -2
  30. package/build/sync/sync-envelope-replay-service.js +60 -41
  31. package/build/sync/sync-publish-suppression.js +59 -0
  32. package/build/sync/sync-publisher-types.js +64 -0
  33. package/build/sync/sync-publisher.js +351 -0
  34. package/build/testing/test-runner.js +69 -1
  35. package/build/tsconfig.tsbuildinfo +1 -1
  36. package/package.json +1 -1
  37. package/src/application.js +2 -0
  38. package/src/sync/sync-change-fanout.js +58 -0
  39. package/src/sync/sync-client-types.js +1 -0
  40. package/src/sync/sync-client.js +7 -2
  41. package/src/sync/sync-envelope-replay-service.js +60 -41
  42. package/src/sync/sync-publish-suppression.js +59 -0
  43. package/src/sync/sync-publisher-types.js +64 -0
  44. package/src/sync/sync-publisher.js +351 -0
  45. package/src/testing/test-runner.js +69 -1
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Args resolved against a publish declaration's broadcasts after a published
3
+ * server-side mutation commits.
4
+ */
5
+ export type SyncPublishBroadcastArgs = {
6
+ /**
7
+ * - Payload snapshotted through the declaration's `serialize(record)` at mutation time.
8
+ */
9
+ data: Record<string, unknown>;
10
+ /**
11
+ * - Mutation operation that published.
12
+ */
13
+ operation: "create" | "update" | "destroy";
14
+ /**
15
+ * - Mutated server model record.
16
+ */
17
+ record: unknown;
18
+ /**
19
+ * - Published resource id.
20
+ */
21
+ resourceId: string;
22
+ /**
23
+ * - Published resource type.
24
+ */
25
+ resourceType: string;
26
+ /**
27
+ * - Upserted sync/change row.
28
+ */
29
+ syncRow: unknown;
30
+ /**
31
+ * - Published sync type ("update" for creates/updates, "delete" for destroys).
32
+ */
33
+ syncType: string;
34
+ };
35
+ /**
36
+ * One declarative broadcast fanned out after a published server-side mutation
37
+ * commits — same shape the replay service's injected broadcaster consumes.
38
+ */
39
+ export type SyncPublishBroadcast = {
40
+ /**
41
+ * - Channel name or resolver.
42
+ */
43
+ channel: string | ((args: SyncPublishBroadcastArgs) => string);
44
+ /**
45
+ * - Channel routing params.
46
+ */
47
+ broadcastParams: (args: SyncPublishBroadcastArgs) => Record<string, unknown>;
48
+ /**
49
+ * - Broadcast body.
50
+ */
51
+ body: (args: SyncPublishBroadcastArgs) => unknown;
52
+ /**
53
+ * - Optional gate; skipped when it returns false.
54
+ */
55
+ when?: ((args: SyncPublishBroadcastArgs) => boolean) | undefined;
56
+ };
57
+ /**
58
+ * Server-side publish declaration on a model's `static sync`, consumed by
59
+ * `SyncPublisher.fromConfiguration(...)`. Publishing is on for models
60
+ * declaring it (server-side creates and updates write to the sync change
61
+ * feed and broadcast automatically once their transaction commits);
62
+ * `publish: false` opts a model out explicitly.
63
+ */
64
+ export type SyncPublishDeclarationConfig = {
65
+ /**
66
+ * - Builds the published payload snapshot from the mutated record (snapshotted at mutation time).
67
+ */
68
+ serialize: (record: unknown) => Record<string, unknown> | Promise<Record<string, unknown>>;
69
+ /**
70
+ * - Resolves the event scope persisted to the sync row's event_id column.
71
+ */
72
+ eventId?: ((record: unknown) => string | number | null | Promise<string | number | null>) | undefined;
73
+ /**
74
+ * - Declarative broadcasts fanned out after the sync row is upserted.
75
+ */
76
+ broadcasts?: SyncPublishBroadcast[] | undefined;
77
+ /**
78
+ * - Published operations. Defaults to creates and updates; destroys are opt-in because a server destroy is often cleanup rather than a synced delete.
79
+ */
80
+ operations?: ("update" | "destroy" | "create")[] | undefined;
81
+ /**
82
+ * - Published resource type. Defaults to the model name.
83
+ */
84
+ resourceType?: string | undefined;
85
+ };
86
+ export type SyncPublishDeclaration = false | SyncPublishDeclarationConfig;
87
+ /**
88
+ * Options for building a sync publisher. Published resources are derived from
89
+ * the configuration's registered models (`static sync` publish declarations).
90
+ */
91
+ export type SyncPublisherOptions = {
92
+ /**
93
+ * - Sync model column linking rows to a device actor. Published server-origin rows set it to null (no device to echo). Defaults to "authentication_token_id".
94
+ */
95
+ actorForeignKeyColumn?: string | undefined;
96
+ /**
97
+ * - Delivers declared broadcasts. Defaults to the configuration's channel broadcast.
98
+ */
99
+ broadcaster?: ((broadcast: {
100
+ channel: string;
101
+ params: Record<string, unknown>;
102
+ body: unknown;
103
+ }) => Promise<void>) | undefined;
104
+ /**
105
+ * - Configuration owning the registered models. Defaults to the current configuration.
106
+ */
107
+ configuration?: import("../configuration.js").default | undefined;
108
+ /**
109
+ * - Reports post-commit publish failures. Defaults to loud logging.
110
+ */
111
+ onError?: ((error: Error) => void) | undefined;
112
+ /**
113
+ * - Sync/change model override. Defaults to the registered "Sync" model.
114
+ */
115
+ syncModel?: unknown;
116
+ };
117
+ /**
118
+ * Internal derived publish policy for one resource — not an app-facing API.
119
+ */
120
+ export type SyncPublisherResourceConfig = {
121
+ /**
122
+ * - Declared broadcasts.
123
+ */
124
+ broadcasts: SyncPublishBroadcast[] | undefined;
125
+ /**
126
+ * - Event scope resolver.
127
+ */
128
+ eventId: SyncPublishDeclarationConfig["eventId"] | undefined;
129
+ /**
130
+ * - Server model class for this resource.
131
+ */
132
+ modelClass: unknown;
133
+ /**
134
+ * - Published operations.
135
+ */
136
+ operations: Array<"create" | "update" | "destroy">;
137
+ /**
138
+ * - Published resource type.
139
+ */
140
+ resourceType: string;
141
+ /**
142
+ * - Payload snapshot builder.
143
+ */
144
+ serialize: SyncPublishDeclarationConfig["serialize"];
145
+ };
146
+ //# sourceMappingURL=sync-publisher-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-publisher-types.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-publisher-types.js"],"names":[],"mappings":";;;;;;;;UAMc,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;;;;eACjB,QAAQ,GAAG,QAAQ,GAAG,SAAS;;;;YAC/B,OAAC;;;;gBACD,MAAM;;;;kBACN,MAAM;;;;aACN,OAAC;;;;cACD,MAAM;;;;;;;;;;aAON,MAAM,GAAG,CAAC,CAAC,IAAI,EAAE,wBAAwB,KAAK,MAAM,CAAC;;;;qBACrD,CAAC,IAAI,EAAE,wBAAwB,KAAK,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC;;;;UACrD,CAAC,IAAI,EAAE,wBAAwB,KAAK,OAAC;;;;mBAC9B,wBAAwB,KAAK,OAAO;;;;;;;;;;;;;eAU3C,CAAC,MAAM,EAAE,OAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;;;;wBACpD,OAAC,KAAK,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;;;;;;;;;;;;;;qCAMvE,KAAK,GAAG,4BAA4B;;;;;;;;;;;;;+BAOxB;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;QAAC,IAAI,EAAE,OAAC,CAAA;KAAC,KAAK,OAAO,CAAC,IAAI,CAAC;;;;;;;;uBAE3E,KAAK,KAAK,IAAI;;;;gBACtB,OAAC;;;;;;;;;gBAMD,oBAAoB,EAAE,GAAG,SAAS;;;;aAClC,4BAA4B,CAAC,SAAS,CAAC,GAAG,SAAS;;;;gBACnD,OAAC;;;;gBACD,KAAK,CAAC,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;;;;kBACtC,MAAM;;;;eACN,4BAA4B,CAAC,WAAW,CAAC"}
@@ -0,0 +1,3 @@
1
+ // @ts-check
2
+ export {};
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wdWJsaXNoZXItdHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9zeW5jLXB1Ymxpc2hlci10eXBlcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQXJncyByZXNvbHZlZCBhZ2FpbnN0IGEgcHVibGlzaCBkZWNsYXJhdGlvbidzIGJyb2FkY2FzdHMgYWZ0ZXIgYSBwdWJsaXNoZWRcbiAqIHNlcnZlci1zaWRlIG11dGF0aW9uIGNvbW1pdHMuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jUHVibGlzaEJyb2FkY2FzdEFyZ3NcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgPz59IGRhdGEgLSBQYXlsb2FkIHNuYXBzaG90dGVkIHRocm91Z2ggdGhlIGRlY2xhcmF0aW9uJ3MgYHNlcmlhbGl6ZShyZWNvcmQpYCBhdCBtdXRhdGlvbiB0aW1lLlxuICogQHByb3BlcnR5IHtcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwifSBvcGVyYXRpb24gLSBNdXRhdGlvbiBvcGVyYXRpb24gdGhhdCBwdWJsaXNoZWQuXG4gKiBAcHJvcGVydHkgez99IHJlY29yZCAtIE11dGF0ZWQgc2VydmVyIG1vZGVsIHJlY29yZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZXNvdXJjZUlkIC0gUHVibGlzaGVkIHJlc291cmNlIGlkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlc291cmNlVHlwZSAtIFB1Ymxpc2hlZCByZXNvdXJjZSB0eXBlLlxuICogQHByb3BlcnR5IHs/fSBzeW5jUm93IC0gVXBzZXJ0ZWQgc3luYy9jaGFuZ2Ugcm93LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN5bmNUeXBlIC0gUHVibGlzaGVkIHN5bmMgdHlwZSAoXCJ1cGRhdGVcIiBmb3IgY3JlYXRlcy91cGRhdGVzLCBcImRlbGV0ZVwiIGZvciBkZXN0cm95cykuXG4gKi9cblxuLyoqXG4gKiBPbmUgZGVjbGFyYXRpdmUgYnJvYWRjYXN0IGZhbm5lZCBvdXQgYWZ0ZXIgYSBwdWJsaXNoZWQgc2VydmVyLXNpZGUgbXV0YXRpb25cbiAqIGNvbW1pdHMg4oCUIHNhbWUgc2hhcGUgdGhlIHJlcGxheSBzZXJ2aWNlJ3MgaW5qZWN0ZWQgYnJvYWRjYXN0ZXIgY29uc3VtZXMuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jUHVibGlzaEJyb2FkY2FzdFxuICogQHByb3BlcnR5IHtzdHJpbmcgfCAoKGFyZ3M6IFN5bmNQdWJsaXNoQnJvYWRjYXN0QXJncykgPT4gc3RyaW5nKX0gY2hhbm5lbCAtIENoYW5uZWwgbmFtZSBvciByZXNvbHZlci5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IFN5bmNQdWJsaXNoQnJvYWRjYXN0QXJncykgPT4gUmVjb3JkPHN0cmluZywgPz59IGJyb2FkY2FzdFBhcmFtcyAtIENoYW5uZWwgcm91dGluZyBwYXJhbXMuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiBTeW5jUHVibGlzaEJyb2FkY2FzdEFyZ3MpID0+ID99IGJvZHkgLSBCcm9hZGNhc3QgYm9keS5cbiAqIEBwcm9wZXJ0eSB7KGFyZ3M6IFN5bmNQdWJsaXNoQnJvYWRjYXN0QXJncykgPT4gYm9vbGVhbn0gW3doZW5dIC0gT3B0aW9uYWwgZ2F0ZTsgc2tpcHBlZCB3aGVuIGl0IHJldHVybnMgZmFsc2UuXG4gKi9cblxuLyoqXG4gKiBTZXJ2ZXItc2lkZSBwdWJsaXNoIGRlY2xhcmF0aW9uIG9uIGEgbW9kZWwncyBgc3RhdGljIHN5bmNgLCBjb25zdW1lZCBieVxuICogYFN5bmNQdWJsaXNoZXIuZnJvbUNvbmZpZ3VyYXRpb24oLi4uKWAuIFB1Ymxpc2hpbmcgaXMgb24gZm9yIG1vZGVsc1xuICogZGVjbGFyaW5nIGl0IChzZXJ2ZXItc2lkZSBjcmVhdGVzIGFuZCB1cGRhdGVzIHdyaXRlIHRvIHRoZSBzeW5jIGNoYW5nZVxuICogZmVlZCBhbmQgYnJvYWRjYXN0IGF1dG9tYXRpY2FsbHkgb25jZSB0aGVpciB0cmFuc2FjdGlvbiBjb21taXRzKTtcbiAqIGBwdWJsaXNoOiBmYWxzZWAgb3B0cyBhIG1vZGVsIG91dCBleHBsaWNpdGx5LlxuICogQHR5cGVkZWYge29iamVjdH0gU3luY1B1Ymxpc2hEZWNsYXJhdGlvbkNvbmZpZ1xuICogQHByb3BlcnR5IHsocmVjb3JkOiA/KSA9PiBSZWNvcmQ8c3RyaW5nLCA/PiB8IFByb21pc2U8UmVjb3JkPHN0cmluZywgPz4+fSBzZXJpYWxpemUgLSBCdWlsZHMgdGhlIHB1Ymxpc2hlZCBwYXlsb2FkIHNuYXBzaG90IGZyb20gdGhlIG11dGF0ZWQgcmVjb3JkIChzbmFwc2hvdHRlZCBhdCBtdXRhdGlvbiB0aW1lKS5cbiAqIEBwcm9wZXJ0eSB7KHJlY29yZDogPykgPT4gc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgbnVsbD59IFtldmVudElkXSAtIFJlc29sdmVzIHRoZSBldmVudCBzY29wZSBwZXJzaXN0ZWQgdG8gdGhlIHN5bmMgcm93J3MgZXZlbnRfaWQgY29sdW1uLlxuICogQHByb3BlcnR5IHtTeW5jUHVibGlzaEJyb2FkY2FzdFtdfSBbYnJvYWRjYXN0c10gLSBEZWNsYXJhdGl2ZSBicm9hZGNhc3RzIGZhbm5lZCBvdXQgYWZ0ZXIgdGhlIHN5bmMgcm93IGlzIHVwc2VydGVkLlxuICogQHByb3BlcnR5IHtBcnJheTxcImNyZWF0ZVwiIHwgXCJ1cGRhdGVcIiB8IFwiZGVzdHJveVwiPn0gW29wZXJhdGlvbnNdIC0gUHVibGlzaGVkIG9wZXJhdGlvbnMuIERlZmF1bHRzIHRvIGNyZWF0ZXMgYW5kIHVwZGF0ZXM7IGRlc3Ryb3lzIGFyZSBvcHQtaW4gYmVjYXVzZSBhIHNlcnZlciBkZXN0cm95IGlzIG9mdGVuIGNsZWFudXAgcmF0aGVyIHRoYW4gYSBzeW5jZWQgZGVsZXRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyZXNvdXJjZVR5cGVdIC0gUHVibGlzaGVkIHJlc291cmNlIHR5cGUuIERlZmF1bHRzIHRvIHRoZSBtb2RlbCBuYW1lLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7ZmFsc2UgfCBTeW5jUHVibGlzaERlY2xhcmF0aW9uQ29uZmlnfSBTeW5jUHVibGlzaERlY2xhcmF0aW9uICovXG5cbi8qKlxuICogT3B0aW9ucyBmb3IgYnVpbGRpbmcgYSBzeW5jIHB1Ymxpc2hlci4gUHVibGlzaGVkIHJlc291cmNlcyBhcmUgZGVyaXZlZCBmcm9tXG4gKiB0aGUgY29uZmlndXJhdGlvbidzIHJlZ2lzdGVyZWQgbW9kZWxzIChgc3RhdGljIHN5bmNgIHB1Ymxpc2ggZGVjbGFyYXRpb25zKS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNQdWJsaXNoZXJPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FjdG9yRm9yZWlnbktleUNvbHVtbl0gLSBTeW5jIG1vZGVsIGNvbHVtbiBsaW5raW5nIHJvd3MgdG8gYSBkZXZpY2UgYWN0b3IuIFB1Ymxpc2hlZCBzZXJ2ZXItb3JpZ2luIHJvd3Mgc2V0IGl0IHRvIG51bGwgKG5vIGRldmljZSB0byBlY2hvKS4gRGVmYXVsdHMgdG8gXCJhdXRoZW50aWNhdGlvbl90b2tlbl9pZFwiLlxuICogQHByb3BlcnR5IHsoYnJvYWRjYXN0OiB7Y2hhbm5lbDogc3RyaW5nLCBwYXJhbXM6IFJlY29yZDxzdHJpbmcsID8+LCBib2R5OiA/fSkgPT4gUHJvbWlzZTx2b2lkPn0gW2Jyb2FkY2FzdGVyXSAtIERlbGl2ZXJzIGRlY2xhcmVkIGJyb2FkY2FzdHMuIERlZmF1bHRzIHRvIHRoZSBjb25maWd1cmF0aW9uJ3MgY2hhbm5lbCBicm9hZGNhc3QuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4uL2NvbmZpZ3VyYXRpb24uanNcIikuZGVmYXVsdH0gW2NvbmZpZ3VyYXRpb25dIC0gQ29uZmlndXJhdGlvbiBvd25pbmcgdGhlIHJlZ2lzdGVyZWQgbW9kZWxzLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHsoZXJyb3I6IEVycm9yKSA9PiB2b2lkfSBbb25FcnJvcl0gLSBSZXBvcnRzIHBvc3QtY29tbWl0IHB1Ymxpc2ggZmFpbHVyZXMuIERlZmF1bHRzIHRvIGxvdWQgbG9nZ2luZy5cbiAqIEBwcm9wZXJ0eSB7P30gW3N5bmNNb2RlbF0gLSBTeW5jL2NoYW5nZSBtb2RlbCBvdmVycmlkZS4gRGVmYXVsdHMgdG8gdGhlIHJlZ2lzdGVyZWQgXCJTeW5jXCIgbW9kZWwuXG4gKi9cblxuLyoqXG4gKiBJbnRlcm5hbCBkZXJpdmVkIHB1Ymxpc2ggcG9saWN5IGZvciBvbmUgcmVzb3VyY2Ug4oCUIG5vdCBhbiBhcHAtZmFjaW5nIEFQSS5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNQdWJsaXNoZXJSZXNvdXJjZUNvbmZpZ1xuICogQHByb3BlcnR5IHtTeW5jUHVibGlzaEJyb2FkY2FzdFtdIHwgdW5kZWZpbmVkfSBicm9hZGNhc3RzIC0gRGVjbGFyZWQgYnJvYWRjYXN0cy5cbiAqIEBwcm9wZXJ0eSB7U3luY1B1Ymxpc2hEZWNsYXJhdGlvbkNvbmZpZ1tcImV2ZW50SWRcIl0gfCB1bmRlZmluZWR9IGV2ZW50SWQgLSBFdmVudCBzY29wZSByZXNvbHZlci5cbiAqIEBwcm9wZXJ0eSB7P30gbW9kZWxDbGFzcyAtIFNlcnZlciBtb2RlbCBjbGFzcyBmb3IgdGhpcyByZXNvdXJjZS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8XCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIj59IG9wZXJhdGlvbnMgLSBQdWJsaXNoZWQgb3BlcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZXNvdXJjZVR5cGUgLSBQdWJsaXNoZWQgcmVzb3VyY2UgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U3luY1B1Ymxpc2hEZWNsYXJhdGlvbkNvbmZpZ1tcInNlcmlhbGl6ZVwiXX0gc2VyaWFsaXplIC0gUGF5bG9hZCBzbmFwc2hvdCBidWlsZGVyLlxuICovXG5cbmV4cG9ydCB7fVxuIl19
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Declarative server-side sync publisher — the server mirror of the client's
3
+ * track-by-default mutation tracking.
4
+ *
5
+ * Server models declare what to publish through `static sync`'s `publish`
6
+ * key, and Velocious writes every committed server-side change to the sync
7
+ * change feed (model-backed Sync-row upsert with server re-sequencing) and
8
+ * fans out the declared broadcasts, so devices receive server-origin changes
9
+ * without app code calling manual upsert/broadcast helpers:
10
+ *
11
+ * static sync = {
12
+ * publish: {
13
+ * serialize: (event) => ({id: event.id(), eventPin: event.eventPin()}),
14
+ * eventId: (event) => event.id(),
15
+ * broadcasts: [{channel: "ticket-scans", broadcastParams: ..., body: ...}]
16
+ * }
17
+ * }
18
+ *
19
+ * Replayed device mutations never double-publish: the framework's routed
20
+ * replay apply marks its written records through `markServerApply(record)`
21
+ * (see sync-publish-suppression.js), and app code applying already-synced
22
+ * data can use `markServerApply`/`withoutPublishing` the same way.
23
+ */
24
+ export default class SyncPublisher {
25
+ /**
26
+ * Builds a sync publisher derived from the given configuration. Alias for
27
+ * `new SyncPublisher({configuration, ...options})`.
28
+ * @param {Configuration} [configuration] - Configuration owning the registered models. Defaults to the current configuration.
29
+ * @param {Omit<import("./sync-publisher-types.js").SyncPublisherOptions, "configuration">} [options] - Optional overrides.
30
+ * @returns {SyncPublisher} Sync publisher derived from the configuration.
31
+ */
32
+ static fromConfiguration(configuration?: Configuration, options?: Omit<import("./sync-publisher-types.js").SyncPublisherOptions, "configuration">): SyncPublisher;
33
+ /**
34
+ * Starts (and memoizes per configuration) the sync publisher for a server
35
+ * boot: no-op when no registered model declares a publish config, guarded so
36
+ * repeated boots with the same configuration register the publish callbacks
37
+ * only once.
38
+ * @param {Configuration} configuration - Configuration owning the registered models.
39
+ * @returns {Promise<SyncPublisher | null>} Started publisher, or null when no models declare publish.
40
+ */
41
+ static startFromConfiguration(configuration: Configuration): Promise<SyncPublisher | null>;
42
+ /**
43
+ * Builds the sync publisher by deriving published resources from the
44
+ * configuration's registered models: every model declaring `static sync`
45
+ * with a `publish` declaration becomes a published resource
46
+ * (`publish: false` opts out). The sync/change model is the registered
47
+ * "Sync" model and broadcasts default to the configuration's channel
48
+ * broadcast.
49
+ * @param {import("./sync-publisher-types.js").SyncPublisherOptions} [options] - Optional overrides.
50
+ */
51
+ constructor(options?: import("./sync-publisher-types.js").SyncPublisherOptions);
52
+ /** @type {{actorForeignKeyColumn: string, broadcaster: import("./sync-publisher-types.js").SyncPublisherOptions["broadcaster"], configuration: Configuration, onError: import("./sync-publisher-types.js").SyncPublisherOptions["onError"], resources: Record<string, import("./sync-publisher-types.js").SyncPublisherResourceConfig>, syncModel: ?}} */
53
+ config: {
54
+ actorForeignKeyColumn: string;
55
+ broadcaster: import("./sync-publisher-types.js").SyncPublisherOptions["broadcaster"];
56
+ configuration: Configuration;
57
+ onError: import("./sync-publisher-types.js").SyncPublisherOptions["onError"];
58
+ resources: Record<string, import("./sync-publisher-types.js").SyncPublisherResourceConfig>;
59
+ syncModel: unknown;
60
+ };
61
+ /** @type {Array<{callback: (record: ?) => Promise<void>, callbackName: "afterCreate" | "afterUpdate" | "afterDestroy", modelClass: ?}>} */
62
+ _publishedCallbacks: Array<{
63
+ callback: (record: unknown) => Promise<void>;
64
+ callbackName: "afterCreate" | "afterUpdate" | "afterDestroy";
65
+ modelClass: unknown;
66
+ }>;
67
+ /** @type {Logger | null} */
68
+ _logger: Logger | null;
69
+ _started: boolean;
70
+ /**
71
+ * Registers the publish callbacks for every published resource: server-side
72
+ * creates and updates (destroys when opted in) upsert a sync change row and
73
+ * fan out the declared broadcasts once their transaction commits.
74
+ * @returns {Promise<void>}
75
+ */
76
+ start(): Promise<void>;
77
+ /**
78
+ * Unregisters all publish callbacks (tests, shutdown).
79
+ * @returns {void}
80
+ */
81
+ stop(): void;
82
+ /**
83
+ * Builds the lifecycle callback publishing one server-side mutation. The
84
+ * published payload (declaration `serialize`), event scope, and sync type
85
+ * are snapshotted at mutation-callback time, so afterSave hooks assigning
86
+ * unsaved attributes (or any later drift on the record) cannot change what
87
+ * gets published vs what was committed. Persisting and broadcasting are
88
+ * deferred through the model connection's afterCommit hook so they only run
89
+ * once the mutation's transaction has committed (immediately when no
90
+ * transaction is open) - rolled-back mutations never publish. Post-commit
91
+ * publish failures are reported without rethrowing into the driver's
92
+ * afterCommit chain (see reportAfterCommitError).
93
+ * @param {{operation: "create" | "update" | "destroy", resourceConfig: import("./sync-publisher-types.js").SyncPublisherResourceConfig}} args - Operation and resource config.
94
+ * @returns {(record: ?) => Promise<void>} Lifecycle callback.
95
+ */
96
+ publishedMutationCallback({ operation, resourceConfig }: {
97
+ operation: "create" | "update" | "destroy";
98
+ resourceConfig: import("./sync-publisher-types.js").SyncPublisherResourceConfig;
99
+ }): (record: unknown) => Promise<void>;
100
+ /**
101
+ * Upserts the published server-origin sync row for a resource identity:
102
+ * server-origin rows carry a null actor column (no device to echo the
103
+ * change back to), so repeated server changes to one resource reuse and
104
+ * re-sequence one feed row.
105
+ * @param {Record<string, ?>} attributes - Snapshotted sync row attributes.
106
+ * @returns {Promise<?>} Upserted sync row.
107
+ */
108
+ upsertPublishedSyncRow(attributes: Record<string, unknown>): Promise<unknown>;
109
+ /**
110
+ * Returns the broadcaster delivering declared broadcasts: the injected one,
111
+ * or the configuration's channel broadcast awaited through the pending
112
+ * broadcast queue.
113
+ * @returns {NonNullable<import("./sync-publisher-types.js").SyncPublisherOptions["broadcaster"]>} Broadcast deliverer.
114
+ */
115
+ broadcaster(): NonNullable<import("./sync-publisher-types.js").SyncPublisherOptions["broadcaster"]>;
116
+ /**
117
+ * Reports a post-commit publish failure. The transaction has already
118
+ * committed when afterCommit callbacks run, so rethrowing here would poison
119
+ * the driver's awaited afterCommit chain (breaking unrelated callbacks) -
120
+ * instead the failure goes to the configured onError hook, or is emitted on
121
+ * the configuration's framework-error/all-error channels (so production bug
122
+ * reporting via `configuration.getErrorEvents()` sees a broken publish
123
+ * path) and logged loudly through the publisher's logger when none is
124
+ * configured.
125
+ * @param {Error} error - Post-commit publish failure.
126
+ * @returns {Promise<void>}
127
+ */
128
+ reportAfterCommitError(error: Error): Promise<void>;
129
+ /**
130
+ * Returns the lazily built publisher logger.
131
+ * @returns {Logger} Publisher logger.
132
+ */
133
+ logger(): Logger;
134
+ }
135
+ import Configuration from "../configuration.js";
136
+ import Logger from "../logger.js";
137
+ //# sourceMappingURL=sync-publisher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-publisher.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-publisher.js"],"names":[],"mappings":"AAwBA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH;IAgDE;;;;;;OAMG;IACH,yCAJW,aAAa,YACb,IAAI,CAAC,OAAO,2BAA2B,EAAE,oBAAoB,EAAE,eAAe,CAAC,GAC7E,aAAa,CAIzB;IAED;;;;;;;OAOG;IACH,6CAHW,aAAa,GACX,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAezC;IA/ED;;;;;;;;OAQG;IACH,sBAFW,OAAO,2BAA2B,EAAE,oBAAoB,EAsClE;IAPC,0VAA0V;IAC1V,QADW;QAAC,qBAAqB,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,OAAO,2BAA2B,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC;QAAC,aAAa,EAAE,aAAa,CAAC;QAAC,OAAO,EAAE,OAAO,2BAA2B,EAAE,oBAAoB,CAAC,SAAS,CAAC,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,2BAA2B,EAAE,2BAA2B,CAAC,CAAC;QAAC,SAAS,EAAE,OAAC,CAAA;KAAC,CACnO;IACnH,2IAA2I;IAC3I,qBADW,KAAK,CAAC;QAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QAAC,YAAY,EAAE,aAAa,GAAG,aAAa,GAAG,cAAc,CAAC;QAAC,UAAU,EAAE,OAAC,CAAA;KAAC,CAAC,CAC1G;IAC7B,4BAA4B;IAC5B,SADW,MAAM,GAAG,IAAI,CACL;IACnB,kBAAqB;IAqCvB;;;;;OAKG;IACH,SAFa,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;OAGG;IACH,QAFa,IAAI,CAShB;IAED;;;;;;;;;;;;;OAaG;IACH,yDAHW;QAAC,SAAS,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;QAAC,cAAc,EAAE,OAAO,2BAA2B,EAAE,2BAA2B,CAAA;KAAC,GAC3H,CAAC,MAAM,EAAE,OAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAyCxC;IAED;;;;;;;OAOG;IACH,mCAHW,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,GACf,OAAO,CAAC,OAAC,CAAC,CAYtB;IAED;;;;;OAKG;IACH,eAFa,WAAW,CAAC,OAAO,2BAA2B,EAAE,oBAAoB,CAAC,aAAa,CAAC,CAAC,CAShG;IAED;;;;;;;;;;;OAWG;IACH,8BAHW,KAAK,GACH,OAAO,CAAC,IAAI,CAAC,CAgBzB;IAED;;;OAGG;IACH,UAFa,MAAM,CAMlB;CACF;0BAjSyB,qBAAqB;mBAC5B,cAAc"}