velocious 1.0.487 → 1.0.488
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/src/sync/sync-api-client-types.d.ts +182 -0
- package/build/src/sync/sync-api-client-types.d.ts.map +1 -0
- package/build/src/sync/sync-api-client-types.js +3 -0
- package/build/src/sync/sync-api-client.d.ts +188 -0
- package/build/src/sync/sync-api-client.d.ts.map +1 -0
- package/build/src/sync/sync-api-client.js +307 -0
- package/build/src/sync/sync-api-controller.d.ts +78 -0
- package/build/src/sync/sync-api-controller.d.ts.map +1 -0
- package/build/src/sync/sync-api-controller.js +142 -0
- package/build/src/sync/sync-model-change-feed-service.d.ts +131 -0
- package/build/src/sync/sync-model-change-feed-service.d.ts.map +1 -0
- package/build/src/sync/sync-model-change-feed-service.js +212 -0
- package/build/sync/sync-api-client-types.js +77 -0
- package/build/sync/sync-api-client.js +342 -0
- package/build/sync/sync-api-controller.js +161 -0
- package/build/sync/sync-model-change-feed-service.js +244 -0
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +4 -4
- package/src/sync/sync-api-client-types.js +77 -0
- package/src/sync/sync-api-client.js +342 -0
- package/src/sync/sync-api-controller.js +161 -0
- package/src/sync/sync-model-change-feed-service.js +244 -0
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
export type SyncCursor = {
|
|
2
|
+
id: string | null;
|
|
3
|
+
serverSequence: number | null;
|
|
4
|
+
updatedAt: string;
|
|
5
|
+
} | null;
|
|
6
|
+
export type SyncChangeEnvelope = {
|
|
7
|
+
/**
|
|
8
|
+
* - Sync data payload.
|
|
9
|
+
*/
|
|
10
|
+
data: () => unknown;
|
|
11
|
+
/**
|
|
12
|
+
* - Sync row identifier.
|
|
13
|
+
*/
|
|
14
|
+
id: () => unknown;
|
|
15
|
+
/**
|
|
16
|
+
* - Resource identifier.
|
|
17
|
+
*/
|
|
18
|
+
resourceId: () => unknown;
|
|
19
|
+
/**
|
|
20
|
+
* - Resource type name.
|
|
21
|
+
*/
|
|
22
|
+
resourceType: () => string | null;
|
|
23
|
+
/**
|
|
24
|
+
* - Sync operation type.
|
|
25
|
+
*/
|
|
26
|
+
syncType: () => string;
|
|
27
|
+
};
|
|
28
|
+
export type SyncChangeApplyResult = {
|
|
29
|
+
/**
|
|
30
|
+
* - Whether the local store changed.
|
|
31
|
+
*/
|
|
32
|
+
changed: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* - Applied resource type override.
|
|
35
|
+
*/
|
|
36
|
+
resourceType?: string | null | undefined;
|
|
37
|
+
};
|
|
38
|
+
export type SyncResourceConfig = {
|
|
39
|
+
/**
|
|
40
|
+
* - Optional post-save hook.
|
|
41
|
+
*/
|
|
42
|
+
afterApply?: ((args: {
|
|
43
|
+
attributes: Record<string, unknown>;
|
|
44
|
+
data: Record<string, unknown>;
|
|
45
|
+
record: unknown;
|
|
46
|
+
sync: SyncChangeEnvelope;
|
|
47
|
+
}) => Promise<boolean | void> | boolean | void) | undefined;
|
|
48
|
+
/**
|
|
49
|
+
* - Allowed attributes builder.
|
|
50
|
+
*/
|
|
51
|
+
attributes: (args: {
|
|
52
|
+
data: Record<string, unknown>;
|
|
53
|
+
record: unknown;
|
|
54
|
+
sync: SyncChangeEnvelope;
|
|
55
|
+
}) => Promise<Record<string, unknown>> | Record<string, unknown>;
|
|
56
|
+
/**
|
|
57
|
+
* - Whether this resource is sync-enabled.
|
|
58
|
+
*/
|
|
59
|
+
enabled: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* - Optional upsert finder.
|
|
62
|
+
*/
|
|
63
|
+
findRecord?: ((args: {
|
|
64
|
+
data: Record<string, unknown>;
|
|
65
|
+
resourceId: unknown;
|
|
66
|
+
sync: SyncChangeEnvelope;
|
|
67
|
+
}) => Promise<unknown> | unknown) | undefined;
|
|
68
|
+
/**
|
|
69
|
+
* - Optional destroy finder.
|
|
70
|
+
*/
|
|
71
|
+
findRecordForDelete?: ((args: {
|
|
72
|
+
resourceId: unknown;
|
|
73
|
+
sync: SyncChangeEnvelope;
|
|
74
|
+
}) => Promise<unknown> | unknown) | undefined;
|
|
75
|
+
/**
|
|
76
|
+
* - Velocious model class.
|
|
77
|
+
*/
|
|
78
|
+
modelClass: unknown;
|
|
79
|
+
};
|
|
80
|
+
export type SyncChangesRequest = {
|
|
81
|
+
/**
|
|
82
|
+
* - Auth token.
|
|
83
|
+
*/
|
|
84
|
+
authenticationToken: string;
|
|
85
|
+
/**
|
|
86
|
+
* - Last seen row id.
|
|
87
|
+
*/
|
|
88
|
+
afterId?: string | null | undefined;
|
|
89
|
+
/**
|
|
90
|
+
* - Last seen server sequence.
|
|
91
|
+
*/
|
|
92
|
+
afterServerSequence?: number | undefined;
|
|
93
|
+
/**
|
|
94
|
+
* - Last seen timestamp.
|
|
95
|
+
*/
|
|
96
|
+
afterUpdatedAt?: string | undefined;
|
|
97
|
+
/**
|
|
98
|
+
* - Page size.
|
|
99
|
+
*/
|
|
100
|
+
limit: number;
|
|
101
|
+
/**
|
|
102
|
+
* - Snapshot upper-bound row id.
|
|
103
|
+
*/
|
|
104
|
+
upToId?: string | null | undefined;
|
|
105
|
+
/**
|
|
106
|
+
* - Snapshot upper-bound server sequence.
|
|
107
|
+
*/
|
|
108
|
+
upToServerSequence?: number | undefined;
|
|
109
|
+
/**
|
|
110
|
+
* - Snapshot upper-bound timestamp.
|
|
111
|
+
*/
|
|
112
|
+
upToUpdatedAt?: string | undefined;
|
|
113
|
+
};
|
|
114
|
+
export type SyncChangesResponse = {
|
|
115
|
+
/**
|
|
116
|
+
* - Error message.
|
|
117
|
+
*/
|
|
118
|
+
errorMessage?: string | undefined;
|
|
119
|
+
/**
|
|
120
|
+
* - Next cursor.
|
|
121
|
+
*/
|
|
122
|
+
nextCursor?: Record<string, any> | SyncCursor | undefined;
|
|
123
|
+
/**
|
|
124
|
+
* - Response status.
|
|
125
|
+
*/
|
|
126
|
+
status?: string | undefined;
|
|
127
|
+
/**
|
|
128
|
+
* - Sync rows.
|
|
129
|
+
*/
|
|
130
|
+
syncs?: unknown[] | undefined;
|
|
131
|
+
/**
|
|
132
|
+
* - Snapshot upper-bound cursor.
|
|
133
|
+
*/
|
|
134
|
+
upToCursor?: Record<string, any> | SyncCursor | undefined;
|
|
135
|
+
};
|
|
136
|
+
export type SyncChangesResult = {
|
|
137
|
+
/**
|
|
138
|
+
* - Whether any local record changed.
|
|
139
|
+
*/
|
|
140
|
+
changed: boolean;
|
|
141
|
+
/**
|
|
142
|
+
* - Applied page count.
|
|
143
|
+
*/
|
|
144
|
+
pages: number;
|
|
145
|
+
/**
|
|
146
|
+
* - Changed flags by resource type.
|
|
147
|
+
*/
|
|
148
|
+
resourceChanged: Record<string, boolean>;
|
|
149
|
+
/**
|
|
150
|
+
* - Applied counts by resource type.
|
|
151
|
+
*/
|
|
152
|
+
resourceCounts: Record<string, number>;
|
|
153
|
+
/**
|
|
154
|
+
* - Applied row count.
|
|
155
|
+
*/
|
|
156
|
+
syncedCount: number;
|
|
157
|
+
};
|
|
158
|
+
export type SyncReplayItem = {
|
|
159
|
+
/**
|
|
160
|
+
* - Sync id.
|
|
161
|
+
*/
|
|
162
|
+
id: string | number;
|
|
163
|
+
/**
|
|
164
|
+
* - Replay state.
|
|
165
|
+
*/
|
|
166
|
+
syncState: string;
|
|
167
|
+
};
|
|
168
|
+
export type SyncReplayResponse = {
|
|
169
|
+
/**
|
|
170
|
+
* - Error message.
|
|
171
|
+
*/
|
|
172
|
+
errorMessage?: string | undefined;
|
|
173
|
+
/**
|
|
174
|
+
* - Response status.
|
|
175
|
+
*/
|
|
176
|
+
status?: string | undefined;
|
|
177
|
+
/**
|
|
178
|
+
* - Replay results.
|
|
179
|
+
*/
|
|
180
|
+
syncs?: SyncReplayItem[] | undefined;
|
|
181
|
+
};
|
|
182
|
+
//# sourceMappingURL=sync-api-client-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-api-client-types.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-api-client-types.js"],"names":[],"mappings":"yBAMc;IAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAC,GAAG,IAAI;;;;;UAI5E,MAAM,OAAO;;;;QACb,MAAM,OAAO;;;;gBACb,MAAM,OAAO;;;;kBACb,MAAM,MAAM,GAAG,IAAI;;;;cACnB,MAAM,MAAM;;;;;;aAKZ,OAAO;;;;;;;;;;yBAMA;QAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,MAAM,EAAE,OAAC,CAAC;QAAC,IAAI,EAAE,kBAAkB,CAAA;KAAC,KAAK,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,OAAO,GAAG,IAAI;;;;gBAC7J,CAAC,IAAI,EAAE;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,MAAM,EAAE,OAAC,CAAC;QAAC,IAAI,EAAE,kBAAkB,CAAA;KAAC,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;aAC1I,OAAO;;;;yBACA;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,UAAU,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,kBAAkB,CAAA;KAAC,KAAK,OAAO,CAAC,OAAC,CAAC,GAAG,OAAC;;;;kCACjG;QAAC,UAAU,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,kBAAkB,CAAA;KAAC,KAAK,OAAO,CAAC,OAAC,CAAC,GAAG,OAAC;;;;gBACzE,OAAC;;;;;;yBAKD,MAAM;;;;;;;;;;;;;;;;WAIN,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aAiBN,OAAO;;;;WACP,MAAM;;;;qBACN,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;;;oBACvB,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;;;;iBACtB,MAAM;;;;;;QAKN,MAAM,GAAG,MAAM;;;;eACf,MAAM"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
export {};
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1hcGktY2xpZW50LXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1hcGktY2xpZW50LXR5cGVzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqXG4gKiBAbW9kdWxlIHN5bmMtYXBpLWNsaWVudC10eXBlc1xuICovXG5cbi8qKiBAdHlwZWRlZiB7e2lkOiBzdHJpbmcgfCBudWxsLCBzZXJ2ZXJTZXF1ZW5jZTogbnVtYmVyIHwgbnVsbCwgdXBkYXRlZEF0OiBzdHJpbmd9IHwgbnVsbH0gU3luY0N1cnNvciAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNDaGFuZ2VFbnZlbG9wZVxuICogQHByb3BlcnR5IHsoKSA9PiB1bmtub3dufSBkYXRhIC0gU3luYyBkYXRhIHBheWxvYWQuXG4gKiBAcHJvcGVydHkgeygpID0+IHVua25vd259IGlkIC0gU3luYyByb3cgaWRlbnRpZmllci5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdW5rbm93bn0gcmVzb3VyY2VJZCAtIFJlc291cmNlIGlkZW50aWZpZXIuXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZyB8IG51bGx9IHJlc291cmNlVHlwZSAtIFJlc291cmNlIHR5cGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBzeW5jVHlwZSAtIFN5bmMgb3BlcmF0aW9uIHR5cGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jQ2hhbmdlQXBwbHlSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY2hhbmdlZCAtIFdoZXRoZXIgdGhlIGxvY2FsIHN0b3JlIGNoYW5nZWQuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IFtyZXNvdXJjZVR5cGVdIC0gQXBwbGllZCByZXNvdXJjZSB0eXBlIG92ZXJyaWRlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3luY1Jlc291cmNlQ29uZmlnXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7YXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByZWNvcmQ6ID8sIHN5bmM6IFN5bmNDaGFuZ2VFbnZlbG9wZX0pID0+IFByb21pc2U8Ym9vbGVhbiB8IHZvaWQ+IHwgYm9vbGVhbiB8IHZvaWR9IFthZnRlckFwcGx5XSAtIE9wdGlvbmFsIHBvc3Qtc2F2ZSBob29rLlxuICogQHByb3BlcnR5IHsoYXJnczoge2RhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LCByZWNvcmQ6ID8sIHN5bmM6IFN5bmNDaGFuZ2VFbnZlbG9wZX0pID0+IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHwgUmVjb3JkPHN0cmluZywgdW5rbm93bj59IGF0dHJpYnV0ZXMgLSBBbGxvd2VkIGF0dHJpYnV0ZXMgYnVpbGRlci5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZW5hYmxlZCAtIFdoZXRoZXIgdGhpcyByZXNvdXJjZSBpcyBzeW5jLWVuYWJsZWQuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiB7ZGF0YTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIHJlc291cmNlSWQ6IHVua25vd24sIHN5bmM6IFN5bmNDaGFuZ2VFbnZlbG9wZX0pID0+IFByb21pc2U8Pz4gfCA/fSBbZmluZFJlY29yZF0gLSBPcHRpb25hbCB1cHNlcnQgZmluZGVyLlxuICogQHByb3BlcnR5IHsoYXJnczoge3Jlc291cmNlSWQ6IHVua25vd24sIHN5bmM6IFN5bmNDaGFuZ2VFbnZlbG9wZX0pID0+IFByb21pc2U8Pz4gfCA/fSBbZmluZFJlY29yZEZvckRlbGV0ZV0gLSBPcHRpb25hbCBkZXN0cm95IGZpbmRlci5cbiAqIEBwcm9wZXJ0eSB7P30gbW9kZWxDbGFzcyAtIFZlbG9jaW91cyBtb2RlbCBjbGFzcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNDaGFuZ2VzUmVxdWVzdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGF1dGhlbnRpY2F0aW9uVG9rZW4gLSBBdXRoIHRva2VuLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSBbYWZ0ZXJJZF0gLSBMYXN0IHNlZW4gcm93IGlkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFthZnRlclNlcnZlclNlcXVlbmNlXSAtIExhc3Qgc2VlbiBzZXJ2ZXIgc2VxdWVuY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FmdGVyVXBkYXRlZEF0XSAtIExhc3Qgc2VlbiB0aW1lc3RhbXAuXG4gKiBAcHJvcGVydHkge251bWJlcn0gbGltaXQgLSBQYWdlIHNpemUuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IFt1cFRvSWRdIC0gU25hcHNob3QgdXBwZXItYm91bmQgcm93IGlkLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt1cFRvU2VydmVyU2VxdWVuY2VdIC0gU25hcHNob3QgdXBwZXItYm91bmQgc2VydmVyIHNlcXVlbmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt1cFRvVXBkYXRlZEF0XSAtIFNuYXBzaG90IHVwcGVyLWJvdW5kIHRpbWVzdGFtcC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNDaGFuZ2VzUmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXJyb3JNZXNzYWdlXSAtIEVycm9yIG1lc3NhZ2UuXG4gKiBAcHJvcGVydHkge1N5bmNDdXJzb3IgfCBSZWNvcmQ8c3RyaW5nLCA/Pn0gW25leHRDdXJzb3JdIC0gTmV4dCBjdXJzb3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N0YXR1c10gLSBSZXNwb25zZSBzdGF0dXMuXG4gKiBAcHJvcGVydHkge0FycmF5PHVua25vd24+fSBbc3luY3NdIC0gU3luYyByb3dzLlxuICogQHByb3BlcnR5IHtTeW5jQ3Vyc29yIHwgUmVjb3JkPHN0cmluZywgPz59IFt1cFRvQ3Vyc29yXSAtIFNuYXBzaG90IHVwcGVyLWJvdW5kIGN1cnNvci5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNDaGFuZ2VzUmVzdWx0XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNoYW5nZWQgLSBXaGV0aGVyIGFueSBsb2NhbCByZWNvcmQgY2hhbmdlZC5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBwYWdlcyAtIEFwcGxpZWQgcGFnZSBjb3VudC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgYm9vbGVhbj59IHJlc291cmNlQ2hhbmdlZCAtIENoYW5nZWQgZmxhZ3MgYnkgcmVzb3VyY2UgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgbnVtYmVyPn0gcmVzb3VyY2VDb3VudHMgLSBBcHBsaWVkIGNvdW50cyBieSByZXNvdXJjZSB0eXBlLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN5bmNlZENvdW50IC0gQXBwbGllZCByb3cgY291bnQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jUmVwbGF5SXRlbVxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudW1iZXJ9IGlkIC0gU3luYyBpZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzeW5jU3RhdGUgLSBSZXBsYXkgc3RhdGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jUmVwbGF5UmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXJyb3JNZXNzYWdlXSAtIEVycm9yIG1lc3NhZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N0YXR1c10gLSBSZXNwb25zZSBzdGF0dXMuXG4gKiBAcHJvcGVydHkge0FycmF5PFN5bmNSZXBsYXlJdGVtPn0gW3N5bmNzXSAtIFJlcGxheSByZXN1bHRzLlxuICovXG5cbmV4cG9ydCB7fVxuIl19
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/** @typedef {import("./sync-api-client-types.js").SyncChangeApplyResult} SyncChangeApplyResult */
|
|
2
|
+
/** @typedef {import("./sync-api-client-types.js").SyncChangeEnvelope} SyncChangeEnvelope */
|
|
3
|
+
/** @typedef {import("./sync-api-client-types.js").SyncChangesRequest} SyncChangesRequest */
|
|
4
|
+
/** @typedef {import("./sync-api-client-types.js").SyncChangesResponse} SyncChangesResponse */
|
|
5
|
+
/** @typedef {import("./sync-api-client-types.js").SyncChangesResult} SyncChangesResult */
|
|
6
|
+
/** @typedef {import("./sync-api-client-types.js").SyncCursor} SyncCursor */
|
|
7
|
+
/** @typedef {import("./sync-api-client-types.js").SyncReplayItem} SyncReplayItem */
|
|
8
|
+
/** @typedef {import("./sync-api-client-types.js").SyncReplayResponse} SyncReplayResponse */
|
|
9
|
+
/** @typedef {import("./sync-api-client-types.js").SyncResourceConfig} SyncResourceConfig */
|
|
10
|
+
/**
|
|
11
|
+
* Generic client-side helper for replaying pending sync envelopes through the
|
|
12
|
+
* framework-owned `/velocious/sync/replay` endpoint. Apps provide only local
|
|
13
|
+
* persistence/auth hooks.
|
|
14
|
+
*/
|
|
15
|
+
export default class SyncApiClient {
|
|
16
|
+
/**
|
|
17
|
+
* Pulls backend sync changes in stable pages, applies them locally, and stores
|
|
18
|
+
* the acknowledged cursor. Apps provide only auth, persistence, transport, and
|
|
19
|
+
* resource policy hooks.
|
|
20
|
+
* @param {object} args - Pull args.
|
|
21
|
+
* @param {string} args.authenticationToken - Auth token to send with change requests.
|
|
22
|
+
* @param {number} [args.batchSize] - Max syncs per request. Defaults to 100.
|
|
23
|
+
* @param {() => Promise<SyncCursor | string | null | undefined>} args.loadCursor - Loads the persisted local cursor.
|
|
24
|
+
* @param {(cursor: SyncCursor) => Promise<void>} args.saveCursor - Persists the final acknowledged cursor.
|
|
25
|
+
* @param {(payload: SyncChangesRequest) => Promise<SyncChangesResponse>} args.postChanges - Posts one changes request.
|
|
26
|
+
* @param {(sync: SyncChangeEnvelope) => Promise<SyncChangeApplyResult>} args.applySync - Applies one normalized sync row locally.
|
|
27
|
+
* @param {(progress: {pages: number, syncedCount: number}) => void} [args.onProgress] - Progress callback.
|
|
28
|
+
* @returns {Promise<SyncChangesResult>} Pull result.
|
|
29
|
+
*/
|
|
30
|
+
static pullChanges(args: {
|
|
31
|
+
authenticationToken: string;
|
|
32
|
+
batchSize?: number | undefined;
|
|
33
|
+
loadCursor: () => Promise<SyncCursor | string | null | undefined>;
|
|
34
|
+
saveCursor: (cursor: SyncCursor) => Promise<void>;
|
|
35
|
+
postChanges: (payload: SyncChangesRequest) => Promise<SyncChangesResponse>;
|
|
36
|
+
applySync: (sync: SyncChangeEnvelope) => Promise<SyncChangeApplyResult>;
|
|
37
|
+
onProgress?: ((progress: {
|
|
38
|
+
pages: number;
|
|
39
|
+
syncedCount: number;
|
|
40
|
+
}) => void) | undefined;
|
|
41
|
+
}): Promise<SyncChangesResult>;
|
|
42
|
+
/**
|
|
43
|
+
* Fetches and validates one backend sync changes page.
|
|
44
|
+
* @param {object} args - Page args.
|
|
45
|
+
* @param {SyncCursor} args.afterCursor - Last acknowledged cursor.
|
|
46
|
+
* @param {string} args.authenticationToken - Auth token.
|
|
47
|
+
* @param {number} args.batchSize - Page size.
|
|
48
|
+
* @param {(payload: SyncChangesRequest) => Promise<SyncChangesResponse>} args.postChanges - Changes poster.
|
|
49
|
+
* @param {SyncCursor} args.upToCursor - Snapshot upper-bound cursor.
|
|
50
|
+
* @returns {Promise<{nextCursor: SyncCursor, syncs: SyncChangeEnvelope[], upToCursor: SyncCursor}>} Normalized changes page.
|
|
51
|
+
*/
|
|
52
|
+
static changesPage({ afterCursor, authenticationToken, batchSize, postChanges, upToCursor }: {
|
|
53
|
+
afterCursor: SyncCursor;
|
|
54
|
+
authenticationToken: string;
|
|
55
|
+
batchSize: number;
|
|
56
|
+
postChanges: (payload: SyncChangesRequest) => Promise<SyncChangesResponse>;
|
|
57
|
+
upToCursor: SyncCursor;
|
|
58
|
+
}): Promise<{
|
|
59
|
+
nextCursor: SyncCursor;
|
|
60
|
+
syncs: SyncChangeEnvelope[];
|
|
61
|
+
upToCursor: SyncCursor;
|
|
62
|
+
}>;
|
|
63
|
+
/**
|
|
64
|
+
* Checks API response status and shape for change-feed pulls.
|
|
65
|
+
* @param {SyncChangesResponse} response - Changes response.
|
|
66
|
+
* @returns {void}
|
|
67
|
+
*/
|
|
68
|
+
static ensureSuccessfulChangesResponse(response: SyncChangesResponse): void;
|
|
69
|
+
/**
|
|
70
|
+
* Converts a cursor into request params with the given prefix.
|
|
71
|
+
* @param {"after" | "upTo"} prefix - Request field prefix.
|
|
72
|
+
* @param {SyncCursor} cursor - Cursor to serialize.
|
|
73
|
+
* @returns {Record<string, string | number | null>} Request params.
|
|
74
|
+
*/
|
|
75
|
+
static cursorPayload(prefix: "after" | "upTo", cursor: SyncCursor): Record<string, string | number | null>;
|
|
76
|
+
/**
|
|
77
|
+
* Parses a persisted or response cursor payload.
|
|
78
|
+
* @param {SyncCursor | string | Record<string, ?> | null | undefined} payload - Cursor payload.
|
|
79
|
+
* @returns {SyncCursor} Parsed cursor.
|
|
80
|
+
*/
|
|
81
|
+
static syncCursorFromPayload(payload: SyncCursor | string | Record<string, unknown> | null | undefined): SyncCursor;
|
|
82
|
+
/**
|
|
83
|
+
* Builds a normalized sync row adapter.
|
|
84
|
+
* @param {?} payload - Raw sync payload.
|
|
85
|
+
* @returns {SyncChangeEnvelope} Sync row adapter.
|
|
86
|
+
*/
|
|
87
|
+
static syncEnvelopeFromPayload(payload: unknown): SyncChangeEnvelope;
|
|
88
|
+
/**
|
|
89
|
+
* Builds an app-configured resource applier for pulled sync rows. The sync
|
|
90
|
+
* mechanics stay here; apps only declare which models/attributes/hooks are
|
|
91
|
+
* allowed for each resource type.
|
|
92
|
+
* @param {Record<string, SyncResourceConfig>} resources - Resource policy map.
|
|
93
|
+
* @returns {(sync: SyncChangeEnvelope) => Promise<SyncChangeApplyResult>} Sync apply callback.
|
|
94
|
+
*/
|
|
95
|
+
static resourceApplier(resources: Record<string, SyncResourceConfig>): (sync: SyncChangeEnvelope) => Promise<SyncChangeApplyResult>;
|
|
96
|
+
/**
|
|
97
|
+
* Applies one sync row using declarative resource policy.
|
|
98
|
+
* @param {{resources: Record<string, SyncResourceConfig>, sync: SyncChangeEnvelope}} args - Apply args.
|
|
99
|
+
* @returns {Promise<SyncChangeApplyResult>} Apply result.
|
|
100
|
+
*/
|
|
101
|
+
static applyResourceSync({ resources, sync }: {
|
|
102
|
+
resources: Record<string, SyncResourceConfig>;
|
|
103
|
+
sync: SyncChangeEnvelope;
|
|
104
|
+
}): Promise<SyncChangeApplyResult>;
|
|
105
|
+
/**
|
|
106
|
+
* Destroys a synced resource via its declared model policy.
|
|
107
|
+
* @param {{resource: SyncResourceConfig, sync: SyncChangeEnvelope}} args - Destroy args.
|
|
108
|
+
* @returns {Promise<boolean>} Whether a local row was destroyed.
|
|
109
|
+
*/
|
|
110
|
+
static destroySyncedResource({ resource, sync }: {
|
|
111
|
+
resource: SyncResourceConfig;
|
|
112
|
+
sync: SyncChangeEnvelope;
|
|
113
|
+
}): Promise<boolean>;
|
|
114
|
+
/**
|
|
115
|
+
* Parses the embedded sync data JSON/object.
|
|
116
|
+
* @param {SyncChangeEnvelope} sync - Sync row.
|
|
117
|
+
* @returns {Record<string, unknown>} Sync data object.
|
|
118
|
+
*/
|
|
119
|
+
static syncData(sync: SyncChangeEnvelope): Record<string, unknown>;
|
|
120
|
+
/**
|
|
121
|
+
* Drains pending sync records in stable order and marks acknowledged rows.
|
|
122
|
+
* @param {object} args - Replay args.
|
|
123
|
+
* @param {string} args.authenticationToken - Auth token to send with replay requests.
|
|
124
|
+
* @param {number} [args.batchSize] - Max syncs per request. Defaults to 100.
|
|
125
|
+
* @param {() => Promise<Array<unknown>>} args.pendingSyncs - Loads pending local sync rows in replay order.
|
|
126
|
+
* @param {(sync: unknown) => string | number | null | undefined} args.syncId - Returns the local sync id.
|
|
127
|
+
* @param {(sync: unknown) => Record<string, ?>} args.syncPayload - Builds the API sync envelope.
|
|
128
|
+
* @param {(payload: {authenticationToken: string, syncs: Array<Record<string, ?>>}) => Promise<SyncReplayResponse>} args.postReplay - Posts one replay request.
|
|
129
|
+
* @param {(sync: unknown, response: SyncReplayItem) => Promise<void>} args.markSuccessful - Marks one sync as successful locally.
|
|
130
|
+
* @returns {Promise<void>} Resolves after all batches are replayed.
|
|
131
|
+
*/
|
|
132
|
+
static replayPending(args: {
|
|
133
|
+
authenticationToken: string;
|
|
134
|
+
batchSize?: number | undefined;
|
|
135
|
+
pendingSyncs: () => Promise<Array<unknown>>;
|
|
136
|
+
syncId: (sync: unknown) => string | number | null | undefined;
|
|
137
|
+
syncPayload: (sync: unknown) => Record<string, unknown>;
|
|
138
|
+
postReplay: (payload: {
|
|
139
|
+
authenticationToken: string;
|
|
140
|
+
syncs: Array<Record<string, unknown>>;
|
|
141
|
+
}) => Promise<SyncReplayResponse>;
|
|
142
|
+
markSuccessful: (sync: unknown, response: SyncReplayItem) => Promise<void>;
|
|
143
|
+
}): Promise<void>;
|
|
144
|
+
/**
|
|
145
|
+
* Replays one batch of syncs.
|
|
146
|
+
* @param {object} args - Replay args.
|
|
147
|
+
* @param {string} args.authenticationToken - Auth token.
|
|
148
|
+
* @param {Array<unknown>} args.pendingSyncs - Batch syncs.
|
|
149
|
+
* @param {(sync: unknown) => string | number | null | undefined} args.syncId - Sync id getter.
|
|
150
|
+
* @param {(sync: unknown) => Record<string, ?>} args.syncPayload - Payload builder.
|
|
151
|
+
* @param {(payload: {authenticationToken: string, syncs: Array<Record<string, ?>>}) => Promise<SyncReplayResponse>} args.postReplay - Replay poster.
|
|
152
|
+
* @param {(sync: unknown, response: SyncReplayItem) => Promise<void>} args.markSuccessful - Success hook.
|
|
153
|
+
* @returns {Promise<void>} Resolves after the batch is acknowledged.
|
|
154
|
+
*/
|
|
155
|
+
static replayBatch(args: {
|
|
156
|
+
authenticationToken: string;
|
|
157
|
+
pendingSyncs: Array<unknown>;
|
|
158
|
+
syncId: (sync: unknown) => string | number | null | undefined;
|
|
159
|
+
syncPayload: (sync: unknown) => Record<string, unknown>;
|
|
160
|
+
postReplay: (payload: {
|
|
161
|
+
authenticationToken: string;
|
|
162
|
+
syncs: Array<Record<string, unknown>>;
|
|
163
|
+
}) => Promise<SyncReplayResponse>;
|
|
164
|
+
markSuccessful: (sync: unknown, response: SyncReplayItem) => Promise<void>;
|
|
165
|
+
}): Promise<void>;
|
|
166
|
+
/**
|
|
167
|
+
* Checks API response status and shape.
|
|
168
|
+
* @param {SyncReplayResponse} response - Replay response.
|
|
169
|
+
* @returns {void}
|
|
170
|
+
*/
|
|
171
|
+
static ensureSuccessfulResponse(response: SyncReplayResponse): void;
|
|
172
|
+
/**
|
|
173
|
+
* Normalizes a positive batch size.
|
|
174
|
+
* @param {number | undefined} batchSize - Batch size.
|
|
175
|
+
* @returns {number} Positive batch size.
|
|
176
|
+
*/
|
|
177
|
+
static normalizedBatchSize(batchSize: number | undefined): number;
|
|
178
|
+
}
|
|
179
|
+
export type SyncChangeApplyResult = import("./sync-api-client-types.js").SyncChangeApplyResult;
|
|
180
|
+
export type SyncChangeEnvelope = import("./sync-api-client-types.js").SyncChangeEnvelope;
|
|
181
|
+
export type SyncChangesRequest = import("./sync-api-client-types.js").SyncChangesRequest;
|
|
182
|
+
export type SyncChangesResponse = import("./sync-api-client-types.js").SyncChangesResponse;
|
|
183
|
+
export type SyncChangesResult = import("./sync-api-client-types.js").SyncChangesResult;
|
|
184
|
+
export type SyncCursor = import("./sync-api-client-types.js").SyncCursor;
|
|
185
|
+
export type SyncReplayItem = import("./sync-api-client-types.js").SyncReplayItem;
|
|
186
|
+
export type SyncReplayResponse = import("./sync-api-client-types.js").SyncReplayResponse;
|
|
187
|
+
export type SyncResourceConfig = import("./sync-api-client-types.js").SyncResourceConfig;
|
|
188
|
+
//# sourceMappingURL=sync-api-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-api-client.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-api-client.js"],"names":[],"mappings":"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"}
|