velocious 1.0.501 → 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.
- package/build/application.js +2 -0
- package/build/src/application.d.ts.map +1 -1
- package/build/src/application.js +3 -1
- package/build/src/sync/sync-change-fanout.d.ts +71 -0
- package/build/src/sync/sync-change-fanout.d.ts.map +1 -0
- package/build/src/sync/sync-change-fanout.js +54 -0
- package/build/src/sync/sync-client-types.d.ts +6 -2
- package/build/src/sync/sync-client-types.d.ts.map +1 -1
- package/build/src/sync/sync-client-types.js +1 -1
- package/build/src/sync/sync-client.d.ts +71 -4
- package/build/src/sync/sync-client.d.ts.map +1 -1
- package/build/src/sync/sync-client.js +126 -18
- package/build/src/sync/sync-envelope-replay-service.d.ts +15 -4
- package/build/src/sync/sync-envelope-replay-service.d.ts.map +1 -1
- package/build/src/sync/sync-envelope-replay-service.js +60 -42
- package/build/src/sync/sync-publish-suppression.d.ts +31 -0
- package/build/src/sync/sync-publish-suppression.d.ts.map +1 -0
- package/build/src/sync/sync-publish-suppression.js +54 -0
- package/build/src/sync/sync-publisher-types.d.ts +146 -0
- package/build/src/sync/sync-publisher-types.d.ts.map +1 -0
- package/build/src/sync/sync-publisher-types.js +3 -0
- package/build/src/sync/sync-publisher.d.ts +137 -0
- package/build/src/sync/sync-publisher.d.ts.map +1 -0
- package/build/src/sync/sync-publisher.js +305 -0
- package/build/src/testing/test-runner.d.ts +8 -0
- package/build/src/testing/test-runner.d.ts.map +1 -1
- package/build/src/testing/test-runner.js +64 -2
- package/build/sync/sync-change-fanout.js +58 -0
- package/build/sync/sync-client-types.js +3 -2
- package/build/sync/sync-client.js +136 -18
- package/build/sync/sync-envelope-replay-service.js +60 -41
- package/build/sync/sync-publish-suppression.js +59 -0
- package/build/sync/sync-publisher-types.js +64 -0
- package/build/sync/sync-publisher.js +351 -0
- package/build/testing/test-runner.js +69 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/application.js +2 -0
- package/src/sync/sync-change-fanout.js +58 -0
- package/src/sync/sync-client-types.js +3 -2
- package/src/sync/sync-client.js +136 -18
- package/src/sync/sync-envelope-replay-service.js +60 -41
- package/src/sync/sync-publish-suppression.js +59 -0
- package/src/sync/sync-publisher-types.js +64 -0
- package/src/sync/sync-publisher.js +351 -0
- 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"}
|