velocious 1.0.502 → 1.0.504
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 +4 -0
- package/build/configuration-types.js +8 -8
- package/build/configuration.js +2 -2
- package/build/src/application.d.ts.map +1 -1
- package/build/src/application.js +5 -1
- package/build/src/configuration-types.d.ts +17 -17
- package/build/src/configuration-types.d.ts.map +1 -1
- package/build/src/configuration-types.js +9 -9
- package/build/src/configuration.d.ts +4 -4
- package/build/src/configuration.d.ts.map +1 -1
- package/build/src/configuration.js +3 -3
- 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-channel-name.d.ts +9 -0
- package/build/src/sync/sync-channel-name.d.ts.map +1 -0
- package/build/src/sync/sync-channel-name.js +10 -0
- package/build/src/sync/sync-client-types.d.ts +13 -6
- 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 +1 -1
- package/build/src/sync/sync-client.d.ts.map +1 -1
- package/build/src/sync/sync-client.js +8 -4
- 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-model-change-feed-service.d.ts +6 -1
- package/build/src/sync/sync-model-change-feed-service.d.ts.map +1 -1
- package/build/src/sync/sync-model-change-feed-service.js +15 -4
- 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 +178 -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 +160 -0
- package/build/src/sync/sync-publisher.d.ts.map +1 -0
- package/build/src/sync/sync-publisher.js +438 -0
- package/build/src/sync/sync-realtime-bridge.d.ts +33 -10
- package/build/src/sync/sync-realtime-bridge.d.ts.map +1 -1
- package/build/src/sync/sync-realtime-bridge.js +51 -12
- package/build/src/sync/sync-scope-attributes.d.ts +15 -0
- package/build/src/sync/sync-scope-attributes.d.ts.map +1 -0
- package/build/src/sync/sync-scope-attributes.js +24 -0
- package/build/src/sync/sync-websocket-channel.d.ts +58 -0
- package/build/src/sync/sync-websocket-channel.d.ts.map +1 -0
- package/build/src/sync/sync-websocket-channel.js +131 -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-channel-name.js +10 -0
- package/build/sync/sync-client-types.js +12 -5
- package/build/sync/sync-client.js +8 -3
- package/build/sync/sync-envelope-replay-service.js +60 -41
- package/build/sync/sync-model-change-feed-service.js +17 -3
- package/build/sync/sync-publish-suppression.js +59 -0
- package/build/sync/sync-publisher-types.js +84 -0
- package/build/sync/sync-publisher.js +502 -0
- package/build/sync/sync-realtime-bridge.js +56 -11
- package/build/sync/sync-scope-attributes.js +26 -0
- package/build/sync/sync-websocket-channel.js +146 -0
- package/build/testing/test-runner.js +69 -1
- package/build/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/application.js +4 -0
- package/src/configuration-types.js +8 -8
- package/src/configuration.js +2 -2
- package/src/sync/sync-change-fanout.js +58 -0
- package/src/sync/sync-channel-name.js +10 -0
- package/src/sync/sync-client-types.js +12 -5
- package/src/sync/sync-client.js +8 -3
- package/src/sync/sync-envelope-replay-service.js +60 -41
- package/src/sync/sync-model-change-feed-service.js +17 -3
- package/src/sync/sync-publish-suppression.js +59 -0
- package/src/sync/sync-publisher-types.js +84 -0
- package/src/sync/sync-publisher.js +502 -0
- package/src/sync/sync-realtime-bridge.js +56 -11
- package/src/sync/sync-scope-attributes.js +26 -0
- package/src/sync/sync-websocket-channel.js +146 -0
- package/src/testing/test-runner.js +69 -1
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// @ts-check
|
|
2
2
|
import VelociousError from "../velocious-error.js";
|
|
3
|
+
import { declaredSyncScopeAttributes } from "./sync-scope-attributes.js";
|
|
3
4
|
/**
|
|
4
5
|
* Generic cursor-paginated change feed over an app-owned sync/change model.
|
|
5
6
|
*
|
|
@@ -149,14 +150,20 @@ export default class SyncModelChangeFeedService {
|
|
|
149
150
|
return { id: String(this.recordValue(record, "id")), serverSequence: Number(this.recordValue(record, "serverSequence")), updatedAt: this.isoDate(this.recordValue(record, "updatedAt")) };
|
|
150
151
|
}
|
|
151
152
|
/**
|
|
152
|
-
* Serializes a record using the standard sync envelope shape
|
|
153
|
+
* Serializes a record using the standard sync envelope shape plus the sync
|
|
154
|
+
* model's declared scope-partition attributes (`static syncScopeAttributes`),
|
|
155
|
+
* each emitted under its own attribute name. Models declaring no scope
|
|
156
|
+
* attributes keep the deprecated 1.0.503 wire and emit `eventId`. Keys are
|
|
157
|
+
* sorted so a declared `["eventId"]` partition stays byte-identical with the
|
|
158
|
+
* 1.0.503 wire.
|
|
153
159
|
* @param {?} record - Sync/change record.
|
|
154
160
|
* @returns {Record<string, unknown>} Default serialized row.
|
|
155
161
|
*/
|
|
156
162
|
defaultSerializeRecord(record) {
|
|
157
|
-
|
|
163
|
+
const scopeAttributes = declaredSyncScopeAttributes(this.modelClass);
|
|
164
|
+
/** @type {Record<string, unknown>} */
|
|
165
|
+
const serialized = {
|
|
158
166
|
data: this.recordData(record),
|
|
159
|
-
eventId: this.recordValue(record, "eventId"),
|
|
160
167
|
id: this.recordValue(record, "id"),
|
|
161
168
|
resourceId: this.recordValue(record, "resourceId"),
|
|
162
169
|
resourceType: this.recordValue(record, "resourceType"),
|
|
@@ -164,6 +171,10 @@ export default class SyncModelChangeFeedService {
|
|
|
164
171
|
syncType: this.recordValue(record, "syncType"),
|
|
165
172
|
updatedAt: this.isoDate(this.recordValue(record, "updatedAt"))
|
|
166
173
|
};
|
|
174
|
+
for (const scopeAttribute of scopeAttributes || ["eventId"]) {
|
|
175
|
+
serialized[scopeAttribute] = this.recordValue(record, scopeAttribute);
|
|
176
|
+
}
|
|
177
|
+
return Object.fromEntries(Object.entries(serialized).sort(([leftKey], [rightKey]) => leftKey.localeCompare(rightKey)));
|
|
167
178
|
}
|
|
168
179
|
/**
|
|
169
180
|
* Reads and parses the record data payload.
|
|
@@ -209,4 +220,4 @@ export default class SyncModelChangeFeedService {
|
|
|
209
220
|
return date.toISOString();
|
|
210
221
|
}
|
|
211
222
|
}
|
|
212
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1tb2RlbC1jaGFuZ2UtZmVlZC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1tb2RlbC1jaGFuZ2UtZmVlZC1zZXJ2aWNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUVsRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3Qzs7Ozs7Ozs7O09BU0c7SUFDSCxZQUFZLEVBQUMsWUFBWSxHQUFHLElBQUksRUFBRSxRQUFRLEdBQUcsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBQztRQUNqRyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTtRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxJQUFJLENBQUE7UUFDcEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDN0YsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3JELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFFakQsSUFBSSxDQUFDLFVBQVU7WUFBRSxPQUFPLEVBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBQyxDQUFBO1FBRTFGLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQTtRQUNqRCxNQUFNLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQTtRQUNyQyxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUE7UUFFdEcsT0FBTztZQUNMLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLFVBQVU7WUFDVixLQUFLLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM1RCxVQUFVO1NBQ1gsQ0FBQTtJQUNILENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZUFBZSxDQUFDLEtBQUs7UUFDbkIsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLEVBQUU7WUFBRSxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUE7UUFFbkYsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBRTNCLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMvQyxNQUFNLGNBQWMsQ0FBQyxJQUFJLENBQUMsZ0RBQWdELEVBQUUsRUFBQyxJQUFJLEVBQUUsNEJBQTRCLEVBQUMsQ0FBQyxDQUFBO1FBQ25ILENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUN2QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCw0QkFBNEIsQ0FBQyxLQUFLLEVBQUUsSUFBSTtRQUN0QyxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRTtZQUFFLE9BQU8sSUFBSSxDQUFBO1FBRXRFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQTtRQUU3QixJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDbkQsTUFBTSxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSw4QkFBOEIsRUFBRSxFQUFDLElBQUksRUFBRSw2QkFBNkIsRUFBQyxDQUFDLENBQUE7UUFDekcsQ0FBQztRQUVELE9BQU8sT0FBTyxDQUFBO0lBQ2hCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxLQUFLLENBQUMsaUJBQWlCO1FBQ3JCLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLDRCQUE0QixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsa0JBQWtCLEVBQUUsb0JBQW9CLENBQUMsQ0FBQTtRQUVsSCxJQUFJLGtCQUFrQixLQUFLLElBQUksSUFBSSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxLQUFLLFFBQVEsSUFBSSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzNILE9BQU8sRUFBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBQyxDQUFBO1FBQzNHLENBQUM7UUFFRCxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEtBQUssUUFBUSxJQUFJLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDNUYsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBQyxDQUFDLENBQUE7WUFFekUsSUFBSSxVQUFVO2dCQUFFLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUN6RCxDQUFDO1FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUNsRSxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGlCQUFpQixDQUFDLENBQUE7UUFDeEUsTUFBTSxhQUFhLEdBQUcsTUFBTSxLQUFLO2FBQzlCLEtBQUssQ0FBQyxHQUFHLEtBQUssSUFBSSxvQkFBb0IsT0FBTyxDQUFDO2FBQzlDLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDUixPQUFPLEVBQUUsQ0FBQTtRQUVaLElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFM0MsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQy9DLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsU0FBUyxDQUFDLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBQztRQUMzQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUE7UUFDaEMsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQTtRQUMzQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQTtRQUM1RCxNQUFNLG9CQUFvQixHQUFHLEdBQUcsS0FBSyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFBO1FBQ2hGLE1BQU0sZUFBZSxHQUFHLEdBQUcsS0FBSyxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQTtRQUN0RSxNQUFNLFFBQVEsR0FBRyxHQUFHLEtBQUssSUFBSSxNQUFNLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUE7UUFFdkQsS0FBSzthQUNGLEtBQUssQ0FBQyxHQUFHLG9CQUFvQixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7YUFDOUUsS0FBSyxDQUFDLEdBQUcsb0JBQW9CLE1BQU0sQ0FBQzthQUNwQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUE7UUFFZixNQUFNLG1CQUFtQixHQUFHLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLG1CQUFtQixFQUFFLHFCQUFxQixDQUFDLENBQUE7UUFFckgsSUFBSSxtQkFBbUIsS0FBSyxJQUFJLEVBQUUsQ0FBQztZQUNqQyxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsb0JBQW9CLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMvRSxDQUFDO2FBQU0sSUFBSSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUMvRixNQUFNLHdCQUF3QixHQUFHLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEtBQUssUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxLQUFLLEVBQUUsSUFBSSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUE7WUFFekwsSUFBSSx3QkFBd0IsSUFBSSxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxLQUFLLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDdEcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLGVBQWUsTUFBTSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFFBQVEsZUFBZSxNQUFNLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxRQUFRLE1BQU0sTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUNoTixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLGVBQWUsT0FBTyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ2xGLENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsV0FBVztRQUNULE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBRXZDLElBQUksSUFBSSxDQUFDLFVBQVU7WUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQTtRQUU3QyxPQUFPLEtBQUssQ0FBQTtJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsZUFBZSxDQUFDLE1BQU07UUFDcEIsT0FBTyxFQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLGdCQUFnQixDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQyxFQUFDLENBQUE7SUFDekwsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxzQkFBc0IsQ0FBQyxNQUFNO1FBQzNCLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFDN0IsT0FBTyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQztZQUM1QyxFQUFFLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDO1lBQ2xDLFVBQVUsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUM7WUFDbEQsWUFBWSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQztZQUN0RCxjQUFjLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUM7WUFDMUQsUUFBUSxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQztZQUM5QyxTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztTQUMvRCxDQUFBO0lBQ0gsQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsTUFBTTtRQUNmLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBRTdDLElBQUksSUFBSSxLQUFLLEVBQUUsSUFBSSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFDbkUsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRO1lBQUUsT0FBTyxJQUFJLENBQUE7UUFFekMsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFBO0lBQ3pCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFdBQVcsQ0FBQyxNQUFNLEVBQUUsSUFBSTtRQUN0QixJQUFJLENBQUMsTUFBTSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMscUNBQXFDLENBQUMsQ0FBQTtRQUN4RCxDQUFDO1FBRUQsTUFBTSxZQUFZLEdBQUcsZ0NBQWdDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM5RCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDakMsTUFBTSxLQUFLLEdBQUcsT0FBTyxNQUFNLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUE7UUFFekUsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsSUFBSSxHQUFHLENBQUMsQ0FBQTtRQUN6RCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUE7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxLQUFLO1FBQ1gsTUFBTSxJQUFJLEdBQUcsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRXpILElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxtREFBbUQsRUFBRSxFQUFDLElBQUksRUFBRSwwQkFBMEIsRUFBQyxDQUFDLENBQUE7UUFDcEgsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQzNCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgVmVsb2Npb3VzRXJyb3IgZnJvbSBcIi4uL3ZlbG9jaW91cy1lcnJvci5qc1wiXG5cbi8qKlxuICogR2VuZXJpYyBjdXJzb3ItcGFnaW5hdGVkIGNoYW5nZSBmZWVkIG92ZXIgYW4gYXBwLW93bmVkIHN5bmMvY2hhbmdlIG1vZGVsLlxuICpcbiAqIEFwcHMgcHJvdmlkZSB0aGUgbW9kZWwgYW5kIG9wdGlvbmFsIHNjb3Bpbmcvc2VyaWFsaXphdGlvbiBob29rcy4gVmVsb2Npb3VzIG93bnNcbiAqIGN1cnNvciBwYXJzaW5nLCBzbmFwc2hvdCBoaWdoLXdhdGVyIHJlc29sdXRpb24sIHN0YWJsZSBvcmRlcmluZywgcGFnZSBsaW1pdHMsXG4gKiBhbmQgcmVzcG9uc2Ugc2hhcGUgZm9yIGAvdmVsb2Npb3VzL3N5bmMvY2hhbmdlc2Agc3R5bGUgZW5kcG9pbnRzLlxuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTeW5jTW9kZWxDaGFuZ2VGZWVkU2VydmljZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgZ2VuZXJpYyBzeW5jLW1vZGVsIGNoYW5nZS1mZWVkIHNlcnZpY2UuXG4gICAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gU2VydmljZSBhcmd1bWVudHMuXG4gICAqIEBwYXJhbSB7dHlwZW9mIGltcG9ydChcIi4uL2RhdGFiYXNlL3JlY29yZC9pbmRleC5qc1wiKS5kZWZhdWx0fSBhcmdzLm1vZGVsQ2xhc3MgLSBTeW5jL2NoYW5nZSBtb2RlbCBjbGFzcy5cbiAgICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gYXJncy5wYXJhbXMgLSBSZXF1ZXN0IHBhcmFtcy5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLmRlZmF1bHRMaW1pdF0gLSBEZWZhdWx0IHBhZ2Ugc2l6ZS5cbiAgICogQHBhcmFtIHtudW1iZXJ9IFthcmdzLm1heExpbWl0XSAtIE1heGltdW0gcGFnZSBzaXplLlxuICAgKiBAcGFyYW0geyhyZWNvcmQ6ID8pID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+fSBbYXJncy5zZXJpYWxpemVSZWNvcmRdIC0gUmVjb3JkIHNlcmlhbGl6ZXIuXG4gICAqIEBwYXJhbSB7ZnVuY3Rpb24oe3F1ZXJ5OiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSk6IHZvaWR9IFthcmdzLnNjb3BlUXVlcnldIC0gQXBwbGllcyBhcHAtb3duZWQgdmlzaWJpbGl0eSBzY29wZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKHtkZWZhdWx0TGltaXQgPSAxMDAwLCBtYXhMaW1pdCA9IDEwMDAsIG1vZGVsQ2xhc3MsIHBhcmFtcywgc2NvcGVRdWVyeSwgc2VyaWFsaXplUmVjb3JkfSkge1xuICAgIHRoaXMuZGVmYXVsdExpbWl0ID0gZGVmYXVsdExpbWl0XG4gICAgdGhpcy5tYXhMaW1pdCA9IG1heExpbWl0XG4gICAgdGhpcy5tb2RlbENsYXNzID0gbW9kZWxDbGFzc1xuICAgIHRoaXMucGFyYW1zID0gcGFyYW1zXG4gICAgdGhpcy5zY29wZVF1ZXJ5ID0gc2NvcGVRdWVyeSB8fCBudWxsXG4gICAgdGhpcy5zZXJpYWxpemVSZWNvcmQgPSBzZXJpYWxpemVSZWNvcmQgfHwgKChyZWNvcmQpID0+IHRoaXMuZGVmYXVsdFNlcmlhbGl6ZVJlY29yZChyZWNvcmQpKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIHN0YWJsZSBjaGFuZ2UtZmVlZCBwYWdlLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTx7c3RhdHVzOiBzdHJpbmcsIG5leHRDdXJzb3I6IHtpZDogc3RyaW5nLCBzZXJ2ZXJTZXF1ZW5jZTogbnVtYmVyLCB1cGRhdGVkQXQ6IHN0cmluZ30gfCBudWxsLCBzeW5jczogQXJyYXk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LCB1cFRvQ3Vyc29yOiB7aWQ6IHN0cmluZywgc2VydmVyU2VxdWVuY2U6IG51bWJlciwgdXBkYXRlZEF0OiBzdHJpbmd9IHwgbnVsbH0+fSBDaGFuZ2UtZmVlZCBwYWdlIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGNoYW5nZXMoKSB7XG4gICAgY29uc3QgbGltaXQgPSB0aGlzLm5vcm1hbGl6ZWRMaW1pdCh0aGlzLnBhcmFtcy5saW1pdClcbiAgICBjb25zdCB1cFRvQ3Vyc29yID0gYXdhaXQgdGhpcy5yZXNvbHZlVXBUb0N1cnNvcigpXG5cbiAgICBpZiAoIXVwVG9DdXJzb3IpIHJldHVybiB7c3RhdHVzOiBcInN1Y2Nlc3NcIiwgbmV4dEN1cnNvcjogbnVsbCwgc3luY3M6IFtdLCB1cFRvQ3Vyc29yOiBudWxsfVxuXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnBhZ2VRdWVyeSh7bGltaXQsIHVwVG9DdXJzb3J9KVxuICAgIGNvbnN0IHJlY29yZHMgPSBhd2FpdCBxdWVyeS50b0FycmF5KClcbiAgICBjb25zdCBuZXh0Q3Vyc29yID0gcmVjb3Jkcy5sZW5ndGggPiAwID8gdGhpcy5jdXJzb3JGb3JSZWNvcmQocmVjb3Jkc1tyZWNvcmRzLmxlbmd0aCAtIDFdKSA6IHVwVG9DdXJzb3JcblxuICAgIHJldHVybiB7XG4gICAgICBzdGF0dXM6IFwic3VjY2Vzc1wiLFxuICAgICAgbmV4dEN1cnNvcixcbiAgICAgIHN5bmNzOiByZWNvcmRzLm1hcCgocmVjb3JkKSA9PiB0aGlzLnNlcmlhbGl6ZVJlY29yZChyZWNvcmQpKSxcbiAgICAgIHVwVG9DdXJzb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm9ybWFsaXplcyB0aGUgcmVxdWVzdGVkIHBhZ2UgbGltaXQuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBSYXcgbGltaXQgcGFyYW0uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IE5vcm1hbGl6ZWQgcGFnZSBsaW1pdC5cbiAgICovXG4gIG5vcm1hbGl6ZWRMaW1pdCh2YWx1ZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBcIlwiKSByZXR1cm4gdGhpcy5kZWZhdWx0TGltaXRcblxuICAgIGNvbnN0IGxpbWl0ID0gTnVtYmVyKHZhbHVlKVxuXG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihsaW1pdCkgfHwgbGltaXQgPD0gMCkge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShcIlN5bmMgY2hhbmdlcyBsaW1pdCBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlci5cIiwge2NvZGU6IFwic3luYy1pbnZhbGlkLWNoYW5nZXMtbGltaXRcIn0pXG4gICAgfVxuXG4gICAgcmV0dXJuIE1hdGgubWluKGxpbWl0LCB0aGlzLm1heExpbWl0KVxuICB9XG5cbiAgLyoqXG4gICAqIFBhcnNlcyBhbiBvcHRpb25hbCBwb3NpdGl2ZSBpbnRlZ2VyIGN1cnNvciBmaWVsZC5cbiAgICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIFJhdyBpbnRlZ2VyIHBhcmFtLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFBhcmFtIG5hbWUgZm9yIGVycm9yIG1lc3NhZ2VzLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyIHwgbnVsbH0gUG9zaXRpdmUgaW50ZWdlciB2YWx1ZSwgb3IgbnVsbCB3aGVuIG9taXR0ZWQuXG4gICAqL1xuICBvcHRpb25hbFBvc2l0aXZlSW50ZWdlclBhcmFtKHZhbHVlLCBuYW1lKSB7XG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgfHwgdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IFwiXCIpIHJldHVybiBudWxsXG5cbiAgICBjb25zdCBpbnRlZ2VyID0gTnVtYmVyKHZhbHVlKVxuXG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihpbnRlZ2VyKSB8fCBpbnRlZ2VyIDw9IDApIHtcbiAgICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoYCR7bmFtZX0gbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuYCwge2NvZGU6IFwic3luYy1pbnZhbGlkLWNoYW5nZXMtY3Vyc29yXCJ9KVxuICAgIH1cblxuICAgIHJldHVybiBpbnRlZ2VyXG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGhpZ2gtd2F0ZXIgY3Vyc29yIHRoYXQgYm91bmRzIHRoZSBjdXJyZW50IGZlZWQgcGFnZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8e2lkOiBzdHJpbmcsIHNlcnZlclNlcXVlbmNlOiBudW1iZXIsIHVwZGF0ZWRBdDogc3RyaW5nfSB8IG51bGw+fSBTbmFwc2hvdCB1cHBlci1ib3VuZCBjdXJzb3IuXG4gICAqL1xuICBhc3luYyByZXNvbHZlVXBUb0N1cnNvcigpIHtcbiAgICBjb25zdCB1cFRvU2VydmVyU2VxdWVuY2UgPSB0aGlzLm9wdGlvbmFsUG9zaXRpdmVJbnRlZ2VyUGFyYW0odGhpcy5wYXJhbXMudXBUb1NlcnZlclNlcXVlbmNlLCBcInVwVG9TZXJ2ZXJTZXF1ZW5jZVwiKVxuXG4gICAgaWYgKHVwVG9TZXJ2ZXJTZXF1ZW5jZSAhPT0gbnVsbCAmJiB0eXBlb2YgdGhpcy5wYXJhbXMudXBUb1VwZGF0ZWRBdCA9PT0gXCJzdHJpbmdcIiAmJiB0eXBlb2YgdGhpcy5wYXJhbXMudXBUb0lkID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4ge2lkOiB0aGlzLnBhcmFtcy51cFRvSWQsIHNlcnZlclNlcXVlbmNlOiB1cFRvU2VydmVyU2VxdWVuY2UsIHVwZGF0ZWRBdDogdGhpcy5wYXJhbXMudXBUb1VwZGF0ZWRBdH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHRoaXMucGFyYW1zLnVwVG9VcGRhdGVkQXQgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHRoaXMucGFyYW1zLnVwVG9JZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgY29uc3QgdXBUb1JlY29yZCA9IGF3YWl0IHRoaXMubW9kZWxDbGFzcy5maW5kQnkoe2lkOiB0aGlzLnBhcmFtcy51cFRvSWR9KVxuXG4gICAgICBpZiAodXBUb1JlY29yZCkgcmV0dXJuIHRoaXMuY3Vyc29yRm9yUmVjb3JkKHVwVG9SZWNvcmQpXG4gICAgfVxuXG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnNjb3BlZFF1ZXJ5KClcbiAgICBjb25zdCB0YWJsZSA9IHF1ZXJ5LmRyaXZlci5xdW90ZVRhYmxlKHRoaXMubW9kZWxDbGFzcy50YWJsZU5hbWUoKSlcbiAgICBjb25zdCBzZXJ2ZXJTZXF1ZW5jZUNvbHVtbiA9IHF1ZXJ5LmRyaXZlci5xdW90ZUNvbHVtbihcInNlcnZlcl9zZXF1ZW5jZVwiKVxuICAgIGNvbnN0IGxhdGVzdFJlY29yZHMgPSBhd2FpdCBxdWVyeVxuICAgICAgLm9yZGVyKGAke3RhYmxlfS4ke3NlcnZlclNlcXVlbmNlQ29sdW1ufSBERVNDYClcbiAgICAgIC5saW1pdCgxKVxuICAgICAgLnRvQXJyYXkoKVxuXG4gICAgaWYgKGxhdGVzdFJlY29yZHMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbFxuXG4gICAgcmV0dXJuIHRoaXMuY3Vyc29yRm9yUmVjb3JkKGxhdGVzdFJlY29yZHNbMF0pXG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIHRoZSBvcmRlcmVkIGFuZCBjdXJzb3ItZmlsdGVyZWQgcGFnZSBxdWVyeS5cbiAgICogQHBhcmFtIHt7bGltaXQ6IG51bWJlciwgdXBUb0N1cnNvcjoge2lkOiBzdHJpbmcsIHNlcnZlclNlcXVlbmNlOiBudW1iZXIsIHVwZGF0ZWRBdDogc3RyaW5nfX19IGFyZ3MgLSBQYWdlIHF1ZXJ5IGFyZ3MuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBQYWdlIHF1ZXJ5LlxuICAgKi9cbiAgcGFnZVF1ZXJ5KHtsaW1pdCwgdXBUb0N1cnNvcn0pIHtcbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc2NvcGVkUXVlcnkoKVxuICAgIGNvbnN0IGRyaXZlciA9IHF1ZXJ5LmRyaXZlclxuICAgIGNvbnN0IHRhYmxlID0gZHJpdmVyLnF1b3RlVGFibGUodGhpcy5tb2RlbENsYXNzLnRhYmxlTmFtZSgpKVxuICAgIGNvbnN0IHNlcnZlclNlcXVlbmNlQ29sdW1uID0gYCR7dGFibGV9LiR7ZHJpdmVyLnF1b3RlQ29sdW1uKFwic2VydmVyX3NlcXVlbmNlXCIpfWBcbiAgICBjb25zdCB1cGRhdGVkQXRDb2x1bW4gPSBgJHt0YWJsZX0uJHtkcml2ZXIucXVvdGVDb2x1bW4oXCJ1cGRhdGVkX2F0XCIpfWBcbiAgICBjb25zdCBpZENvbHVtbiA9IGAke3RhYmxlfS4ke2RyaXZlci5xdW90ZUNvbHVtbihcImlkXCIpfWBcblxuICAgIHF1ZXJ5XG4gICAgICAud2hlcmUoYCR7c2VydmVyU2VxdWVuY2VDb2x1bW59IDw9ICR7ZHJpdmVyLnF1b3RlKHVwVG9DdXJzb3Iuc2VydmVyU2VxdWVuY2UpfWApXG4gICAgICAub3JkZXIoYCR7c2VydmVyU2VxdWVuY2VDb2x1bW59IEFTQ2ApXG4gICAgICAubGltaXQobGltaXQpXG5cbiAgICBjb25zdCBhZnRlclNlcnZlclNlcXVlbmNlID0gdGhpcy5vcHRpb25hbFBvc2l0aXZlSW50ZWdlclBhcmFtKHRoaXMucGFyYW1zLmFmdGVyU2VydmVyU2VxdWVuY2UsIFwiYWZ0ZXJTZXJ2ZXJTZXF1ZW5jZVwiKVxuXG4gICAgaWYgKGFmdGVyU2VydmVyU2VxdWVuY2UgIT09IG51bGwpIHtcbiAgICAgIHF1ZXJ5LndoZXJlKGAke3NlcnZlclNlcXVlbmNlQ29sdW1ufSA+ICR7ZHJpdmVyLnF1b3RlKGFmdGVyU2VydmVyU2VxdWVuY2UpfWApXG4gICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQgIT09IFwiXCIpIHtcbiAgICAgIGNvbnN0IGlzUGFnaW5nRXhpc3RpbmdTbmFwc2hvdCA9IHR5cGVvZiB0aGlzLnBhcmFtcy51cFRvVXBkYXRlZEF0ID09PSBcInN0cmluZ1wiICYmIHRoaXMucGFyYW1zLnVwVG9VcGRhdGVkQXQgIT09IFwiXCIgJiYgdHlwZW9mIHRoaXMucGFyYW1zLnVwVG9JZCA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLnBhcmFtcy51cFRvSWQgIT09IFwiXCJcblxuICAgICAgaWYgKGlzUGFnaW5nRXhpc3RpbmdTbmFwc2hvdCAmJiB0eXBlb2YgdGhpcy5wYXJhbXMuYWZ0ZXJJZCA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLnBhcmFtcy5hZnRlcklkICE9PSBcIlwiKSB7XG4gICAgICAgIHF1ZXJ5LndoZXJlKGAoJHt1cGRhdGVkQXRDb2x1bW59ID4gJHtkcml2ZXIucXVvdGUodGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQpfSBPUiAoJHt1cGRhdGVkQXRDb2x1bW59ID0gJHtkcml2ZXIucXVvdGUodGhpcy5wYXJhbXMuYWZ0ZXJVcGRhdGVkQXQpfSBBTkQgJHtpZENvbHVtbn0gPiAke2RyaXZlci5xdW90ZSh0aGlzLnBhcmFtcy5hZnRlcklkKX0pKWApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeS53aGVyZShgJHt1cGRhdGVkQXRDb2x1bW59ID49ICR7ZHJpdmVyLnF1b3RlKHRoaXMucGFyYW1zLmFmdGVyVXBkYXRlZEF0KX1gKVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBxdWVyeVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhIGJhc2UgcXVlcnkgd2l0aCBhcHAtb3duZWQgc2NvcGUgYXBwbGllZC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL2RhdGFiYXNlL3F1ZXJ5L21vZGVsLWNsYXNzLXF1ZXJ5LmpzXCIpLmRlZmF1bHR9IFNjb3BlZCBiYXNlIHF1ZXJ5LlxuICAgKi9cbiAgc2NvcGVkUXVlcnkoKSB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLm1vZGVsQ2xhc3Mud2hlcmUoe30pXG5cbiAgICBpZiAodGhpcy5zY29wZVF1ZXJ5KSB0aGlzLnNjb3BlUXVlcnkoe3F1ZXJ5fSlcblxuICAgIHJldHVybiBxdWVyeVxuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSByZWNvcmQgaW50byBhIHRyYW5zcG9ydCBjdXJzb3IuXG4gICAqIEBwYXJhbSB7P30gcmVjb3JkIC0gU3luYy9jaGFuZ2UgcmVjb3JkLlxuICAgKiBAcmV0dXJucyB7e2lkOiBzdHJpbmcsIHNlcnZlclNlcXVlbmNlOiBudW1iZXIsIHVwZGF0ZWRBdDogc3RyaW5nfX0gQ3Vyc29yIGZvciByb3cuXG4gICAqL1xuICBjdXJzb3JGb3JSZWNvcmQocmVjb3JkKSB7XG4gICAgcmV0dXJuIHtpZDogU3RyaW5nKHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcImlkXCIpKSwgc2VydmVyU2VxdWVuY2U6IE51bWJlcih0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJzZXJ2ZXJTZXF1ZW5jZVwiKSksIHVwZGF0ZWRBdDogdGhpcy5pc29EYXRlKHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInVwZGF0ZWRBdFwiKSl9XG4gIH1cblxuICAvKipcbiAgICogU2VyaWFsaXplcyBhIHJlY29yZCB1c2luZyB0aGUgc3RhbmRhcmQgc3luYyBlbnZlbG9wZSBzaGFwZS5cbiAgICogQHBhcmFtIHs/fSByZWNvcmQgLSBTeW5jL2NoYW5nZSByZWNvcmQuXG4gICAqIEByZXR1cm5zIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gRGVmYXVsdCBzZXJpYWxpemVkIHJvdy5cbiAgICovXG4gIGRlZmF1bHRTZXJpYWxpemVSZWNvcmQocmVjb3JkKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRhdGE6IHRoaXMucmVjb3JkRGF0YShyZWNvcmQpLFxuICAgICAgZXZlbnRJZDogdGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIFwiZXZlbnRJZFwiKSxcbiAgICAgIGlkOiB0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJpZFwiKSxcbiAgICAgIHJlc291cmNlSWQ6IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInJlc291cmNlSWRcIiksXG4gICAgICByZXNvdXJjZVR5cGU6IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInJlc291cmNlVHlwZVwiKSxcbiAgICAgIHNlcnZlclNlcXVlbmNlOiB0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJzZXJ2ZXJTZXF1ZW5jZVwiKSxcbiAgICAgIHN5bmNUeXBlOiB0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJzeW5jVHlwZVwiKSxcbiAgICAgIHVwZGF0ZWRBdDogdGhpcy5pc29EYXRlKHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInVwZGF0ZWRBdFwiKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYW5kIHBhcnNlcyB0aGUgcmVjb3JkIGRhdGEgcGF5bG9hZC5cbiAgICogQHBhcmFtIHs/fSByZWNvcmQgLSBTeW5jL2NoYW5nZSByZWNvcmQuXG4gICAqIEByZXR1cm5zIHt1bmtub3dufSBQYXJzZWQgZGF0YSB2YWx1ZS5cbiAgICovXG4gIHJlY29yZERhdGEocmVjb3JkKSB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcImRhdGFcIilcblxuICAgIGlmIChkYXRhID09PSBcIlwiIHx8IGRhdGEgPT09IG51bGwgfHwgZGF0YSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gbnVsbFxuICAgIGlmICh0eXBlb2YgZGF0YSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuIGRhdGFcblxuICAgIHJldHVybiBKU09OLnBhcnNlKGRhdGEpXG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgYSB2YWx1ZSBmcm9tIGVpdGhlciBhIHJlY29yZCBhY2Nlc3NvciBtZXRob2Qgb3IgcGxhaW4gcHJvcGVydHkuXG4gICAqIEBwYXJhbSB7P30gcmVjb3JkIC0gU3luYy9jaGFuZ2UgcmVjb3JkLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIENhbWVsLWNhc2VkIHZhbHVlL21ldGhvZCBuYW1lLlxuICAgKiBAcmV0dXJucyB7dW5rbm93bn0gUmVjb3JkIHZhbHVlLlxuICAgKi9cbiAgcmVjb3JkVmFsdWUocmVjb3JkLCBuYW1lKSB7XG4gICAgaWYgKCFyZWNvcmQgfHwgdHlwZW9mIHJlY29yZCAhPT0gXCJvYmplY3RcIikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiU3luYyBjaGFuZ2VzIHJvdyBtdXN0IGJlIGFuIG9iamVjdC5cIilcbiAgICB9XG5cbiAgICBjb25zdCByZWNvcmRPYmplY3QgPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsID8+fSAqLyAocmVjb3JkKVxuICAgIGNvbnN0IG1ldGhvZCA9IHJlY29yZE9iamVjdFtuYW1lXVxuICAgIGNvbnN0IHZhbHVlID0gdHlwZW9mIG1ldGhvZCA9PT0gXCJmdW5jdGlvblwiID8gbWV0aG9kLmNhbGwocmVjb3JkKSA6IG1ldGhvZFxuXG4gICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3luYyBjaGFuZ2VzIHJvdyBpcyBtaXNzaW5nICR7bmFtZX0uYClcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsdWVcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGRhdGUtbGlrZSB2YWx1ZSB0byBhbiBJU08gc3RyaW5nLlxuICAgKiBAcGFyYW0ge0RhdGUgfCBzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkIHwgdW5rbm93bn0gdmFsdWUgLSBEYXRlIHZhbHVlLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBJU08gZGF0ZS5cbiAgICovXG4gIGlzb0RhdGUodmFsdWUpIHtcbiAgICBjb25zdCBkYXRlID0gdmFsdWUgaW5zdGFuY2VvZiBEYXRlID8gdmFsdWUgOiBuZXcgRGF0ZSh0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgfHwgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiID8gdmFsdWUgOiAwKVxuXG4gICAgaWYgKE51bWJlci5pc05hTihkYXRlLmdldFRpbWUoKSkpIHtcbiAgICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoXCJTeW5jIGNoYW5nZXMgcm93IGhhcyBhbiBpbnZhbGlkIHVwZGF0ZWRfYXQgdmFsdWUuXCIsIHtjb2RlOiBcInN5bmMtaW52YWxpZC1jaGFuZ2VzLXJvd1wifSlcbiAgICB9XG5cbiAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpXG4gIH1cbn1cblxuIl19
|
|
223
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1tb2RlbC1jaGFuZ2UtZmVlZC1zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1tb2RlbC1jaGFuZ2UtZmVlZC1zZXJ2aWNlLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQTtBQUVsRCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQTtBQUV0RTs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsT0FBTyxPQUFPLDBCQUEwQjtJQUM3Qzs7Ozs7Ozs7O09BU0c7SUFDSCxZQUFZLEVBQUMsWUFBWSxHQUFHLElBQUksRUFBRSxRQUFRLEdBQUcsSUFBSSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBQztRQUNqRyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQTtRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUN4QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQTtRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQTtRQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxJQUFJLENBQUE7UUFDcEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxlQUFlLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUE7SUFDN0YsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1gsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO1FBQ3JELE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUE7UUFFakQsSUFBSSxDQUFDLFVBQVU7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ZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU8sQ0FBQyxLQUFLO1FBQ1gsTUFBTSxJQUFJLEdBQUcsS0FBSyxZQUFZLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssS0FBSyxRQUFRLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1FBRXpILElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2pDLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxtREFBbUQsRUFBRSxFQUFDLElBQUksRUFBRSwwQkFBMEIsRUFBQyxDQUFDLENBQUE7UUFDcEgsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQzNCLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8vIEB0cy1jaGVja1xuXG5pbXBvcnQgVmVsb2Npb3VzRXJyb3IgZnJvbSBcIi4uL3ZlbG9jaW91cy1lcnJvci5qc1wiXG5cbmltcG9ydCB7ZGVjbGFyZWRTeW5jU2NvcGVBdHRyaWJ1dGVzfSBmcm9tIFwiLi9zeW5jLXNjb3BlLWF0dHJpYnV0ZXMuanNcIlxuXG4vKipcbiAqIEdlbmVyaWMgY3Vyc29yLXBhZ2luYXRlZCBjaGFuZ2UgZmVlZCBvdmVyIGFuIGFwcC1vd25lZCBzeW5jL2NoYW5nZSBtb2RlbC5cbiAqXG4gKiBBcHBzIHByb3ZpZGUgdGhlIG1vZGVsIGFuZCBvcHRpb25hbCBzY29waW5nL3NlcmlhbGl6YXRpb24gaG9va3MuIFZlbG9jaW91cyBvd25zXG4gKiBjdXJzb3IgcGFyc2luZywgc25hcHNob3QgaGlnaC13YXRlciByZXNvbHV0aW9uLCBzdGFibGUgb3JkZXJpbmcsIHBhZ2UgbGltaXRzLFxuICogYW5kIHJlc3BvbnNlIHNoYXBlIGZvciBgL3ZlbG9jaW91cy9zeW5jL2NoYW5nZXNgIHN0eWxlIGVuZHBvaW50cy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3luY01vZGVsQ2hhbmdlRmVlZFNlcnZpY2Uge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIGdlbmVyaWMgc3luYy1tb2RlbCBjaGFuZ2UtZmVlZCBzZXJ2aWNlLlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJncyAtIFNlcnZpY2UgYXJndW1lbnRzLlxuICAgKiBAcGFyYW0ge3R5cGVvZiBpbXBvcnQoXCIuLi9kYXRhYmFzZS9yZWNvcmQvaW5kZXguanNcIikuZGVmYXVsdH0gYXJncy5tb2RlbENsYXNzIC0gU3luYy9jaGFuZ2UgbW9kZWwgY2xhc3MuXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IGFyZ3MucGFyYW1zIC0gUmVxdWVzdCBwYXJhbXMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5kZWZhdWx0TGltaXRdIC0gRGVmYXVsdCBwYWdlIHNpemUuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJncy5tYXhMaW1pdF0gLSBNYXhpbXVtIHBhZ2Ugc2l6ZS5cbiAgICogQHBhcmFtIHsocmVjb3JkOiA/KSA9PiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gW2FyZ3Muc2VyaWFsaXplUmVjb3JkXSAtIFJlY29yZCBzZXJpYWxpemVyLlxuICAgKiBAcGFyYW0ge2Z1bmN0aW9uKHtxdWVyeTogaW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0pOiB2b2lkfSBbYXJncy5zY29wZVF1ZXJ5XSAtIEFwcGxpZXMgYXBwLW93bmVkIHZpc2liaWxpdHkgc2NvcGUuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih7ZGVmYXVsdExpbWl0ID0gMTAwMCwgbWF4TGltaXQgPSAxMDAwLCBtb2RlbENsYXNzLCBwYXJhbXMsIHNjb3BlUXVlcnksIHNlcmlhbGl6ZVJlY29yZH0pIHtcbiAgICB0aGlzLmRlZmF1bHRMaW1pdCA9IGRlZmF1bHRMaW1pdFxuICAgIHRoaXMubWF4TGltaXQgPSBtYXhMaW1pdFxuICAgIHRoaXMubW9kZWxDbGFzcyA9IG1vZGVsQ2xhc3NcbiAgICB0aGlzLnBhcmFtcyA9IHBhcmFtc1xuICAgIHRoaXMuc2NvcGVRdWVyeSA9IHNjb3BlUXVlcnkgfHwgbnVsbFxuICAgIHRoaXMuc2VyaWFsaXplUmVjb3JkID0gc2VyaWFsaXplUmVjb3JkIHx8ICgocmVjb3JkKSA9PiB0aGlzLmRlZmF1bHRTZXJpYWxpemVSZWNvcmQocmVjb3JkKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBzdGFibGUgY2hhbmdlLWZlZWQgcGFnZS5cbiAgICogQHJldHVybnMge1Byb21pc2U8e3N0YXR1czogc3RyaW5nLCBuZXh0Q3Vyc29yOiB7aWQ6IHN0cmluZywgc2VydmVyU2VxdWVuY2U6IG51bWJlciwgdXBkYXRlZEF0OiBzdHJpbmd9IHwgbnVsbCwgc3luY3M6IEFycmF5PFJlY29yZDxzdHJpbmcsIHVua25vd24+PiwgdXBUb0N1cnNvcjoge2lkOiBzdHJpbmcsIHNlcnZlclNlcXVlbmNlOiBudW1iZXIsIHVwZGF0ZWRBdDogc3RyaW5nfSB8IG51bGx9Pn0gQ2hhbmdlLWZlZWQgcGFnZSByZXN1bHQuXG4gICAqL1xuICBhc3luYyBjaGFuZ2VzKCkge1xuICAgIGNvbnN0IGxpbWl0ID0gdGhpcy5ub3JtYWxpemVkTGltaXQodGhpcy5wYXJhbXMubGltaXQpXG4gICAgY29uc3QgdXBUb0N1cnNvciA9IGF3YWl0IHRoaXMucmVzb2x2ZVVwVG9DdXJzb3IoKVxuXG4gICAgaWYgKCF1cFRvQ3Vyc29yKSByZXR1cm4ge3N0YXR1czogXCJzdWNjZXNzXCIsIG5leHRDdXJzb3I6IG51bGwsIHN5bmNzOiBbXSwgdXBUb0N1cnNvcjogbnVsbH1cblxuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5wYWdlUXVlcnkoe2xpbWl0LCB1cFRvQ3Vyc29yfSlcbiAgICBjb25zdCByZWNvcmRzID0gYXdhaXQgcXVlcnkudG9BcnJheSgpXG4gICAgY29uc3QgbmV4dEN1cnNvciA9IHJlY29yZHMubGVuZ3RoID4gMCA/IHRoaXMuY3Vyc29yRm9yUmVjb3JkKHJlY29yZHNbcmVjb3Jkcy5sZW5ndGggLSAxXSkgOiB1cFRvQ3Vyc29yXG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhdHVzOiBcInN1Y2Nlc3NcIixcbiAgICAgIG5leHRDdXJzb3IsXG4gICAgICBzeW5jczogcmVjb3Jkcy5tYXAoKHJlY29yZCkgPT4gdGhpcy5zZXJpYWxpemVSZWNvcmQocmVjb3JkKSksXG4gICAgICB1cFRvQ3Vyc29yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZXMgdGhlIHJlcXVlc3RlZCBwYWdlIGxpbWl0LlxuICAgKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gUmF3IGxpbWl0IHBhcmFtLlxuICAgKiBAcmV0dXJucyB7bnVtYmVyfSBOb3JtYWxpemVkIHBhZ2UgbGltaXQuXG4gICAqL1xuICBub3JtYWxpemVkTGltaXQodmFsdWUpIHtcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gXCJcIikgcmV0dXJuIHRoaXMuZGVmYXVsdExpbWl0XG5cbiAgICBjb25zdCBsaW1pdCA9IE51bWJlcih2YWx1ZSlcblxuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIobGltaXQpIHx8IGxpbWl0IDw9IDApIHtcbiAgICAgIHRocm93IFZlbG9jaW91c0Vycm9yLnNhZmUoXCJTeW5jIGNoYW5nZXMgbGltaXQgbXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIuXCIsIHtjb2RlOiBcInN5bmMtaW52YWxpZC1jaGFuZ2VzLWxpbWl0XCJ9KVxuICAgIH1cblxuICAgIHJldHVybiBNYXRoLm1pbihsaW1pdCwgdGhpcy5tYXhMaW1pdClcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW4gb3B0aW9uYWwgcG9zaXRpdmUgaW50ZWdlciBjdXJzb3IgZmllbGQuXG4gICAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBSYXcgaW50ZWdlciBwYXJhbS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgLSBQYXJhbSBuYW1lIGZvciBlcnJvciBtZXNzYWdlcy5cbiAgICogQHJldHVybnMge251bWJlciB8IG51bGx9IFBvc2l0aXZlIGludGVnZXIgdmFsdWUsIG9yIG51bGwgd2hlbiBvbWl0dGVkLlxuICAgKi9cbiAgb3B0aW9uYWxQb3NpdGl2ZUludGVnZXJQYXJhbSh2YWx1ZSwgbmFtZSkge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSBcIlwiKSByZXR1cm4gbnVsbFxuXG4gICAgY29uc3QgaW50ZWdlciA9IE51bWJlcih2YWx1ZSlcblxuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIoaW50ZWdlcikgfHwgaW50ZWdlciA8PSAwKSB7XG4gICAgICB0aHJvdyBWZWxvY2lvdXNFcnJvci5zYWZlKGAke25hbWV9IG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLmAsIHtjb2RlOiBcInN5bmMtaW52YWxpZC1jaGFuZ2VzLWN1cnNvclwifSlcbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZWdlclxuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBoaWdoLXdhdGVyIGN1cnNvciB0aGF0IGJvdW5kcyB0aGUgY3VycmVudCBmZWVkIHBhZ2UuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPHtpZDogc3RyaW5nLCBzZXJ2ZXJTZXF1ZW5jZTogbnVtYmVyLCB1cGRhdGVkQXQ6IHN0cmluZ30gfCBudWxsPn0gU25hcHNob3QgdXBwZXItYm91bmQgY3Vyc29yLlxuICAgKi9cbiAgYXN5bmMgcmVzb2x2ZVVwVG9DdXJzb3IoKSB7XG4gICAgY29uc3QgdXBUb1NlcnZlclNlcXVlbmNlID0gdGhpcy5vcHRpb25hbFBvc2l0aXZlSW50ZWdlclBhcmFtKHRoaXMucGFyYW1zLnVwVG9TZXJ2ZXJTZXF1ZW5jZSwgXCJ1cFRvU2VydmVyU2VxdWVuY2VcIilcblxuICAgIGlmICh1cFRvU2VydmVyU2VxdWVuY2UgIT09IG51bGwgJiYgdHlwZW9mIHRoaXMucGFyYW1zLnVwVG9VcGRhdGVkQXQgPT09IFwic3RyaW5nXCIgJiYgdHlwZW9mIHRoaXMucGFyYW1zLnVwVG9JZCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgcmV0dXJuIHtpZDogdGhpcy5wYXJhbXMudXBUb0lkLCBzZXJ2ZXJTZXF1ZW5jZTogdXBUb1NlcnZlclNlcXVlbmNlLCB1cGRhdGVkQXQ6IHRoaXMucGFyYW1zLnVwVG9VcGRhdGVkQXR9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiB0aGlzLnBhcmFtcy51cFRvVXBkYXRlZEF0ID09PSBcInN0cmluZ1wiICYmIHR5cGVvZiB0aGlzLnBhcmFtcy51cFRvSWQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgIGNvbnN0IHVwVG9SZWNvcmQgPSBhd2FpdCB0aGlzLm1vZGVsQ2xhc3MuZmluZEJ5KHtpZDogdGhpcy5wYXJhbXMudXBUb0lkfSlcblxuICAgICAgaWYgKHVwVG9SZWNvcmQpIHJldHVybiB0aGlzLmN1cnNvckZvclJlY29yZCh1cFRvUmVjb3JkKVxuICAgIH1cblxuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zY29wZWRRdWVyeSgpXG4gICAgY29uc3QgdGFibGUgPSBxdWVyeS5kcml2ZXIucXVvdGVUYWJsZSh0aGlzLm1vZGVsQ2xhc3MudGFibGVOYW1lKCkpXG4gICAgY29uc3Qgc2VydmVyU2VxdWVuY2VDb2x1bW4gPSBxdWVyeS5kcml2ZXIucXVvdGVDb2x1bW4oXCJzZXJ2ZXJfc2VxdWVuY2VcIilcbiAgICBjb25zdCBsYXRlc3RSZWNvcmRzID0gYXdhaXQgcXVlcnlcbiAgICAgIC5vcmRlcihgJHt0YWJsZX0uJHtzZXJ2ZXJTZXF1ZW5jZUNvbHVtbn0gREVTQ2ApXG4gICAgICAubGltaXQoMSlcbiAgICAgIC50b0FycmF5KClcblxuICAgIGlmIChsYXRlc3RSZWNvcmRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGxcblxuICAgIHJldHVybiB0aGlzLmN1cnNvckZvclJlY29yZChsYXRlc3RSZWNvcmRzWzBdKVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgb3JkZXJlZCBhbmQgY3Vyc29yLWZpbHRlcmVkIHBhZ2UgcXVlcnkuXG4gICAqIEBwYXJhbSB7e2xpbWl0OiBudW1iZXIsIHVwVG9DdXJzb3I6IHtpZDogc3RyaW5nLCBzZXJ2ZXJTZXF1ZW5jZTogbnVtYmVyLCB1cGRhdGVkQXQ6IHN0cmluZ319fSBhcmdzIC0gUGFnZSBxdWVyeSBhcmdzLlxuICAgKiBAcmV0dXJucyB7aW1wb3J0KFwiLi4vZGF0YWJhc2UvcXVlcnkvbW9kZWwtY2xhc3MtcXVlcnkuanNcIikuZGVmYXVsdH0gUGFnZSBxdWVyeS5cbiAgICovXG4gIHBhZ2VRdWVyeSh7bGltaXQsIHVwVG9DdXJzb3J9KSB7XG4gICAgY29uc3QgcXVlcnkgPSB0aGlzLnNjb3BlZFF1ZXJ5KClcbiAgICBjb25zdCBkcml2ZXIgPSBxdWVyeS5kcml2ZXJcbiAgICBjb25zdCB0YWJsZSA9IGRyaXZlci5xdW90ZVRhYmxlKHRoaXMubW9kZWxDbGFzcy50YWJsZU5hbWUoKSlcbiAgICBjb25zdCBzZXJ2ZXJTZXF1ZW5jZUNvbHVtbiA9IGAke3RhYmxlfS4ke2RyaXZlci5xdW90ZUNvbHVtbihcInNlcnZlcl9zZXF1ZW5jZVwiKX1gXG4gICAgY29uc3QgdXBkYXRlZEF0Q29sdW1uID0gYCR7dGFibGV9LiR7ZHJpdmVyLnF1b3RlQ29sdW1uKFwidXBkYXRlZF9hdFwiKX1gXG4gICAgY29uc3QgaWRDb2x1bW4gPSBgJHt0YWJsZX0uJHtkcml2ZXIucXVvdGVDb2x1bW4oXCJpZFwiKX1gXG5cbiAgICBxdWVyeVxuICAgICAgLndoZXJlKGAke3NlcnZlclNlcXVlbmNlQ29sdW1ufSA8PSAke2RyaXZlci5xdW90ZSh1cFRvQ3Vyc29yLnNlcnZlclNlcXVlbmNlKX1gKVxuICAgICAgLm9yZGVyKGAke3NlcnZlclNlcXVlbmNlQ29sdW1ufSBBU0NgKVxuICAgICAgLmxpbWl0KGxpbWl0KVxuXG4gICAgY29uc3QgYWZ0ZXJTZXJ2ZXJTZXF1ZW5jZSA9IHRoaXMub3B0aW9uYWxQb3NpdGl2ZUludGVnZXJQYXJhbSh0aGlzLnBhcmFtcy5hZnRlclNlcnZlclNlcXVlbmNlLCBcImFmdGVyU2VydmVyU2VxdWVuY2VcIilcblxuICAgIGlmIChhZnRlclNlcnZlclNlcXVlbmNlICE9PSBudWxsKSB7XG4gICAgICBxdWVyeS53aGVyZShgJHtzZXJ2ZXJTZXF1ZW5jZUNvbHVtbn0gPiAke2RyaXZlci5xdW90ZShhZnRlclNlcnZlclNlcXVlbmNlKX1gKVxuICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMucGFyYW1zLmFmdGVyVXBkYXRlZEF0ID09PSBcInN0cmluZ1wiICYmIHRoaXMucGFyYW1zLmFmdGVyVXBkYXRlZEF0ICE9PSBcIlwiKSB7XG4gICAgICBjb25zdCBpc1BhZ2luZ0V4aXN0aW5nU25hcHNob3QgPSB0eXBlb2YgdGhpcy5wYXJhbXMudXBUb1VwZGF0ZWRBdCA9PT0gXCJzdHJpbmdcIiAmJiB0aGlzLnBhcmFtcy51cFRvVXBkYXRlZEF0ICE9PSBcIlwiICYmIHR5cGVvZiB0aGlzLnBhcmFtcy51cFRvSWQgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5wYXJhbXMudXBUb0lkICE9PSBcIlwiXG5cbiAgICAgIGlmIChpc1BhZ2luZ0V4aXN0aW5nU25hcHNob3QgJiYgdHlwZW9mIHRoaXMucGFyYW1zLmFmdGVySWQgPT09IFwic3RyaW5nXCIgJiYgdGhpcy5wYXJhbXMuYWZ0ZXJJZCAhPT0gXCJcIikge1xuICAgICAgICBxdWVyeS53aGVyZShgKCR7dXBkYXRlZEF0Q29sdW1ufSA+ICR7ZHJpdmVyLnF1b3RlKHRoaXMucGFyYW1zLmFmdGVyVXBkYXRlZEF0KX0gT1IgKCR7dXBkYXRlZEF0Q29sdW1ufSA9ICR7ZHJpdmVyLnF1b3RlKHRoaXMucGFyYW1zLmFmdGVyVXBkYXRlZEF0KX0gQU5EICR7aWRDb2x1bW59ID4gJHtkcml2ZXIucXVvdGUodGhpcy5wYXJhbXMuYWZ0ZXJJZCl9KSlgKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnkud2hlcmUoYCR7dXBkYXRlZEF0Q29sdW1ufSA+PSAke2RyaXZlci5xdW90ZSh0aGlzLnBhcmFtcy5hZnRlclVwZGF0ZWRBdCl9YClcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcXVlcnlcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBiYXNlIHF1ZXJ5IHdpdGggYXBwLW93bmVkIHNjb3BlIGFwcGxpZWQuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9kYXRhYmFzZS9xdWVyeS9tb2RlbC1jbGFzcy1xdWVyeS5qc1wiKS5kZWZhdWx0fSBTY29wZWQgYmFzZSBxdWVyeS5cbiAgICovXG4gIHNjb3BlZFF1ZXJ5KCkge1xuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5tb2RlbENsYXNzLndoZXJlKHt9KVxuXG4gICAgaWYgKHRoaXMuc2NvcGVRdWVyeSkgdGhpcy5zY29wZVF1ZXJ5KHtxdWVyeX0pXG5cbiAgICByZXR1cm4gcXVlcnlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVzIGEgcmVjb3JkIGludG8gYSB0cmFuc3BvcnQgY3Vyc29yLlxuICAgKiBAcGFyYW0gez99IHJlY29yZCAtIFN5bmMvY2hhbmdlIHJlY29yZC5cbiAgICogQHJldHVybnMge3tpZDogc3RyaW5nLCBzZXJ2ZXJTZXF1ZW5jZTogbnVtYmVyLCB1cGRhdGVkQXQ6IHN0cmluZ319IEN1cnNvciBmb3Igcm93LlxuICAgKi9cbiAgY3Vyc29yRm9yUmVjb3JkKHJlY29yZCkge1xuICAgIHJldHVybiB7aWQ6IFN0cmluZyh0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJpZFwiKSksIHNlcnZlclNlcXVlbmNlOiBOdW1iZXIodGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIFwic2VydmVyU2VxdWVuY2VcIikpLCB1cGRhdGVkQXQ6IHRoaXMuaXNvRGF0ZSh0aGlzLnJlY29yZFZhbHVlKHJlY29yZCwgXCJ1cGRhdGVkQXRcIikpfVxuICB9XG5cbiAgLyoqXG4gICAqIFNlcmlhbGl6ZXMgYSByZWNvcmQgdXNpbmcgdGhlIHN0YW5kYXJkIHN5bmMgZW52ZWxvcGUgc2hhcGUgcGx1cyB0aGUgc3luY1xuICAgKiBtb2RlbCdzIGRlY2xhcmVkIHNjb3BlLXBhcnRpdGlvbiBhdHRyaWJ1dGVzIChgc3RhdGljIHN5bmNTY29wZUF0dHJpYnV0ZXNgKSxcbiAgICogZWFjaCBlbWl0dGVkIHVuZGVyIGl0cyBvd24gYXR0cmlidXRlIG5hbWUuIE1vZGVscyBkZWNsYXJpbmcgbm8gc2NvcGVcbiAgICogYXR0cmlidXRlcyBrZWVwIHRoZSBkZXByZWNhdGVkIDEuMC41MDMgd2lyZSBhbmQgZW1pdCBgZXZlbnRJZGAuIEtleXMgYXJlXG4gICAqIHNvcnRlZCBzbyBhIGRlY2xhcmVkIGBbXCJldmVudElkXCJdYCBwYXJ0aXRpb24gc3RheXMgYnl0ZS1pZGVudGljYWwgd2l0aCB0aGVcbiAgICogMS4wLjUwMyB3aXJlLlxuICAgKiBAcGFyYW0gez99IHJlY29yZCAtIFN5bmMvY2hhbmdlIHJlY29yZC5cbiAgICogQHJldHVybnMge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBEZWZhdWx0IHNlcmlhbGl6ZWQgcm93LlxuICAgKi9cbiAgZGVmYXVsdFNlcmlhbGl6ZVJlY29yZChyZWNvcmQpIHtcbiAgICBjb25zdCBzY29wZUF0dHJpYnV0ZXMgPSBkZWNsYXJlZFN5bmNTY29wZUF0dHJpYnV0ZXModGhpcy5tb2RlbENsYXNzKVxuICAgIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovXG4gICAgY29uc3Qgc2VyaWFsaXplZCA9IHtcbiAgICAgIGRhdGE6IHRoaXMucmVjb3JkRGF0YShyZWNvcmQpLFxuICAgICAgaWQ6IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcImlkXCIpLFxuICAgICAgcmVzb3VyY2VJZDogdGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIFwicmVzb3VyY2VJZFwiKSxcbiAgICAgIHJlc291cmNlVHlwZTogdGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIFwicmVzb3VyY2VUeXBlXCIpLFxuICAgICAgc2VydmVyU2VxdWVuY2U6IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInNlcnZlclNlcXVlbmNlXCIpLFxuICAgICAgc3luY1R5cGU6IHRoaXMucmVjb3JkVmFsdWUocmVjb3JkLCBcInN5bmNUeXBlXCIpLFxuICAgICAgdXBkYXRlZEF0OiB0aGlzLmlzb0RhdGUodGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIFwidXBkYXRlZEF0XCIpKVxuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc2NvcGVBdHRyaWJ1dGUgb2Ygc2NvcGVBdHRyaWJ1dGVzIHx8IFtcImV2ZW50SWRcIl0pIHtcbiAgICAgIHNlcmlhbGl6ZWRbc2NvcGVBdHRyaWJ1dGVdID0gdGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIHNjb3BlQXR0cmlidXRlKVxuICAgIH1cblxuICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoc2VyaWFsaXplZCkuc29ydCgoW2xlZnRLZXldLCBbcmlnaHRLZXldKSA9PiBsZWZ0S2V5LmxvY2FsZUNvbXBhcmUocmlnaHRLZXkpKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhbmQgcGFyc2VzIHRoZSByZWNvcmQgZGF0YSBwYXlsb2FkLlxuICAgKiBAcGFyYW0gez99IHJlY29yZCAtIFN5bmMvY2hhbmdlIHJlY29yZC5cbiAgICogQHJldHVybnMge3Vua25vd259IFBhcnNlZCBkYXRhIHZhbHVlLlxuICAgKi9cbiAgcmVjb3JkRGF0YShyZWNvcmQpIHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5yZWNvcmRWYWx1ZShyZWNvcmQsIFwiZGF0YVwiKVxuXG4gICAgaWYgKGRhdGEgPT09IFwiXCIgfHwgZGF0YSA9PT0gbnVsbCB8fCBkYXRhID09PSB1bmRlZmluZWQpIHJldHVybiBudWxsXG4gICAgaWYgKHR5cGVvZiBkYXRhICE9PSBcInN0cmluZ1wiKSByZXR1cm4gZGF0YVxuXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoZGF0YSlcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkcyBhIHZhbHVlIGZyb20gZWl0aGVyIGEgcmVjb3JkIGFjY2Vzc29yIG1ldGhvZCBvciBwbGFpbiBwcm9wZXJ0eS5cbiAgICogQHBhcmFtIHs/fSByZWNvcmQgLSBTeW5jL2NoYW5nZSByZWNvcmQuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gQ2FtZWwtY2FzZWQgdmFsdWUvbWV0aG9kIG5hbWUuXG4gICAqIEByZXR1cm5zIHt1bmtub3dufSBSZWNvcmQgdmFsdWUuXG4gICAqL1xuICByZWNvcmRWYWx1ZShyZWNvcmQsIG5hbWUpIHtcbiAgICBpZiAoIXJlY29yZCB8fCB0eXBlb2YgcmVjb3JkICE9PSBcIm9iamVjdFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJTeW5jIGNoYW5nZXMgcm93IG11c3QgYmUgYW4gb2JqZWN0LlwiKVxuICAgIH1cblxuICAgIGNvbnN0IHJlY29yZE9iamVjdCA9IC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgPz59ICovIChyZWNvcmQpXG4gICAgY29uc3QgbWV0aG9kID0gcmVjb3JkT2JqZWN0W25hbWVdXG4gICAgY29uc3QgdmFsdWUgPSB0eXBlb2YgbWV0aG9kID09PSBcImZ1bmN0aW9uXCIgPyBtZXRob2QuY2FsbChyZWNvcmQpIDogbWV0aG9kXG5cbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW5jIGNoYW5nZXMgcm93IGlzIG1pc3NpbmcgJHtuYW1lfS5gKVxuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgZGF0ZS1saWtlIHZhbHVlIHRvIGFuIElTTyBzdHJpbmcuXG4gICAqIEBwYXJhbSB7RGF0ZSB8IHN0cmluZyB8IG51bGwgfCB1bmRlZmluZWQgfCB1bmtub3dufSB2YWx1ZSAtIERhdGUgdmFsdWUuXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9IElTTyBkYXRlLlxuICAgKi9cbiAgaXNvRGF0ZSh2YWx1ZSkge1xuICAgIGNvbnN0IGRhdGUgPSB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPyB2YWx1ZSA6IG5ldyBEYXRlKHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiB8fCB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCIgPyB2YWx1ZSA6IDApXG5cbiAgICBpZiAoTnVtYmVyLmlzTmFOKGRhdGUuZ2V0VGltZSgpKSkge1xuICAgICAgdGhyb3cgVmVsb2Npb3VzRXJyb3Iuc2FmZShcIlN5bmMgY2hhbmdlcyByb3cgaGFzIGFuIGludmFsaWQgdXBkYXRlZF9hdCB2YWx1ZS5cIiwge2NvZGU6IFwic3luYy1pbnZhbGlkLWNoYW5nZXMtcm93XCJ9KVxuICAgIH1cblxuICAgIHJldHVybiBkYXRlLnRvSVNPU3RyaW5nKClcbiAgfVxufVxuXG4iXX0=
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Marks one record as being written from an already-synced source so server
|
|
3
|
+
* publish callbacks skip it (record-precise suppression). The framework's
|
|
4
|
+
* routed sync replay apply uses this internally around every applied write, so
|
|
5
|
+
* replayed device mutations never publish a second, server-origin sync change.
|
|
6
|
+
* @param {?} record - Server model record about to be written.
|
|
7
|
+
* @returns {() => void} Release callback re-enabling publishing for the record.
|
|
8
|
+
*/
|
|
9
|
+
export function markServerApply(record: unknown): () => void;
|
|
10
|
+
/**
|
|
11
|
+
* Runs a callback with server publish callbacks suppressed - for code applying
|
|
12
|
+
* already-synced data outside the framework's replay apply (importers,
|
|
13
|
+
* backfills applying device-origin rows). Suppression covers the whole async
|
|
14
|
+
* duration of the callback (nested calls stack) and is process-wide while it
|
|
15
|
+
* runs: mutations from concurrently running requests are also suppressed for
|
|
16
|
+
* that window, so prefer `markServerApply(record)` when other flows can
|
|
17
|
+
* interleave.
|
|
18
|
+
* @template T
|
|
19
|
+
* @param {() => Promise<T> | T} callback - Work whose model writes should not publish sync changes.
|
|
20
|
+
* @returns {Promise<T>} The callback result.
|
|
21
|
+
*/
|
|
22
|
+
export function withoutPublishing<T>(callback: () => Promise<T> | T): Promise<T>;
|
|
23
|
+
/**
|
|
24
|
+
* Whether server publishing is currently suppressed for a record: either the
|
|
25
|
+
* record was marked as a server apply (`markServerApply`) or a
|
|
26
|
+
* `withoutPublishing` callback is running.
|
|
27
|
+
* @param {?} record - Server model record being written.
|
|
28
|
+
* @returns {boolean} Whether publishing is suppressed for the record.
|
|
29
|
+
*/
|
|
30
|
+
export function isPublishingSuppressed(record: unknown): boolean;
|
|
31
|
+
//# sourceMappingURL=sync-publish-suppression.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-publish-suppression.d.ts","sourceRoot":"","sources":["../../../src/sync/sync-publish-suppression.js"],"names":[],"mappings":"AAaA;;;;;;;GAOG;AACH,wCAHW,OAAC,GACC,MAAM,IAAI,CAMtB;AAED;;;;;;;;;;;GAWG;AACH,kCAJa,CAAC,YACH,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,GAClB,OAAO,CAAC,CAAC,CAAC,CAUtB;AAED;;;;;;GAMG;AACH,+CAHW,OAAC,GACC,OAAO,CAInB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
/**
|
|
3
|
+
* Records currently being written from an already-synced source (sync replay
|
|
4
|
+
* applies, importers applying device-origin data). Module-scoped so the
|
|
5
|
+
* framework's replay apply can mark records without holding a publisher
|
|
6
|
+
* instance.
|
|
7
|
+
* @type {WeakSet<object>}
|
|
8
|
+
*/
|
|
9
|
+
const serverApplyRecords = new WeakSet();
|
|
10
|
+
let withoutPublishingDepth = 0;
|
|
11
|
+
/**
|
|
12
|
+
* Marks one record as being written from an already-synced source so server
|
|
13
|
+
* publish callbacks skip it (record-precise suppression). The framework's
|
|
14
|
+
* routed sync replay apply uses this internally around every applied write, so
|
|
15
|
+
* replayed device mutations never publish a second, server-origin sync change.
|
|
16
|
+
* @param {?} record - Server model record about to be written.
|
|
17
|
+
* @returns {() => void} Release callback re-enabling publishing for the record.
|
|
18
|
+
*/
|
|
19
|
+
export function markServerApply(record) {
|
|
20
|
+
serverApplyRecords.add(record);
|
|
21
|
+
return () => serverApplyRecords.delete(record);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Runs a callback with server publish callbacks suppressed - for code applying
|
|
25
|
+
* already-synced data outside the framework's replay apply (importers,
|
|
26
|
+
* backfills applying device-origin rows). Suppression covers the whole async
|
|
27
|
+
* duration of the callback (nested calls stack) and is process-wide while it
|
|
28
|
+
* runs: mutations from concurrently running requests are also suppressed for
|
|
29
|
+
* that window, so prefer `markServerApply(record)` when other flows can
|
|
30
|
+
* interleave.
|
|
31
|
+
* @template T
|
|
32
|
+
* @param {() => Promise<T> | T} callback - Work whose model writes should not publish sync changes.
|
|
33
|
+
* @returns {Promise<T>} The callback result.
|
|
34
|
+
*/
|
|
35
|
+
export async function withoutPublishing(callback) {
|
|
36
|
+
withoutPublishingDepth++;
|
|
37
|
+
try {
|
|
38
|
+
return await callback();
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
withoutPublishingDepth--;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Whether server publishing is currently suppressed for a record: either the
|
|
46
|
+
* record was marked as a server apply (`markServerApply`) or a
|
|
47
|
+
* `withoutPublishing` callback is running.
|
|
48
|
+
* @param {?} record - Server model record being written.
|
|
49
|
+
* @returns {boolean} Whether publishing is suppressed for the record.
|
|
50
|
+
*/
|
|
51
|
+
export function isPublishingSuppressed(record) {
|
|
52
|
+
return withoutPublishingDepth > 0 || serverApplyRecords.has(record);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wdWJsaXNoLXN1cHByZXNzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N5bmMvc3luYy1wdWJsaXNoLXN1cHByZXNzaW9uLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWjs7Ozs7O0dBTUc7QUFDSCxNQUFNLGtCQUFrQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFFeEMsSUFBSSxzQkFBc0IsR0FBRyxDQUFDLENBQUE7QUFFOUI7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBTTtJQUNwQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUE7SUFFOUIsT0FBTyxHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7QUFDaEQsQ0FBQztBQUVEOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxpQkFBaUIsQ0FBQyxRQUFRO0lBQzlDLHNCQUFzQixFQUFFLENBQUE7SUFFeEIsSUFBSSxDQUFDO1FBQ0gsT0FBTyxNQUFNLFFBQVEsRUFBRSxDQUFBO0lBQ3pCLENBQUM7WUFBUyxDQUFDO1FBQ1Qsc0JBQXNCLEVBQUUsQ0FBQTtJQUMxQixDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxNQUFNO0lBQzNDLE9BQU8sc0JBQXNCLEdBQUcsQ0FBQyxJQUFJLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQTtBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogUmVjb3JkcyBjdXJyZW50bHkgYmVpbmcgd3JpdHRlbiBmcm9tIGFuIGFscmVhZHktc3luY2VkIHNvdXJjZSAoc3luYyByZXBsYXlcbiAqIGFwcGxpZXMsIGltcG9ydGVycyBhcHBseWluZyBkZXZpY2Utb3JpZ2luIGRhdGEpLiBNb2R1bGUtc2NvcGVkIHNvIHRoZVxuICogZnJhbWV3b3JrJ3MgcmVwbGF5IGFwcGx5IGNhbiBtYXJrIHJlY29yZHMgd2l0aG91dCBob2xkaW5nIGEgcHVibGlzaGVyXG4gKiBpbnN0YW5jZS5cbiAqIEB0eXBlIHtXZWFrU2V0PG9iamVjdD59XG4gKi9cbmNvbnN0IHNlcnZlckFwcGx5UmVjb3JkcyA9IG5ldyBXZWFrU2V0KClcblxubGV0IHdpdGhvdXRQdWJsaXNoaW5nRGVwdGggPSAwXG5cbi8qKlxuICogTWFya3Mgb25lIHJlY29yZCBhcyBiZWluZyB3cml0dGVuIGZyb20gYW4gYWxyZWFkeS1zeW5jZWQgc291cmNlIHNvIHNlcnZlclxuICogcHVibGlzaCBjYWxsYmFja3Mgc2tpcCBpdCAocmVjb3JkLXByZWNpc2Ugc3VwcHJlc3Npb24pLiBUaGUgZnJhbWV3b3JrJ3NcbiAqIHJvdXRlZCBzeW5jIHJlcGxheSBhcHBseSB1c2VzIHRoaXMgaW50ZXJuYWxseSBhcm91bmQgZXZlcnkgYXBwbGllZCB3cml0ZSwgc29cbiAqIHJlcGxheWVkIGRldmljZSBtdXRhdGlvbnMgbmV2ZXIgcHVibGlzaCBhIHNlY29uZCwgc2VydmVyLW9yaWdpbiBzeW5jIGNoYW5nZS5cbiAqIEBwYXJhbSB7P30gcmVjb3JkIC0gU2VydmVyIG1vZGVsIHJlY29yZCBhYm91dCB0byBiZSB3cml0dGVuLlxuICogQHJldHVybnMgeygpID0+IHZvaWR9IFJlbGVhc2UgY2FsbGJhY2sgcmUtZW5hYmxpbmcgcHVibGlzaGluZyBmb3IgdGhlIHJlY29yZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1hcmtTZXJ2ZXJBcHBseShyZWNvcmQpIHtcbiAgc2VydmVyQXBwbHlSZWNvcmRzLmFkZChyZWNvcmQpXG5cbiAgcmV0dXJuICgpID0+IHNlcnZlckFwcGx5UmVjb3Jkcy5kZWxldGUocmVjb3JkKVxufVxuXG4vKipcbiAqIFJ1bnMgYSBjYWxsYmFjayB3aXRoIHNlcnZlciBwdWJsaXNoIGNhbGxiYWNrcyBzdXBwcmVzc2VkIC0gZm9yIGNvZGUgYXBwbHlpbmdcbiAqIGFscmVhZHktc3luY2VkIGRhdGEgb3V0c2lkZSB0aGUgZnJhbWV3b3JrJ3MgcmVwbGF5IGFwcGx5IChpbXBvcnRlcnMsXG4gKiBiYWNrZmlsbHMgYXBwbHlpbmcgZGV2aWNlLW9yaWdpbiByb3dzKS4gU3VwcHJlc3Npb24gY292ZXJzIHRoZSB3aG9sZSBhc3luY1xuICogZHVyYXRpb24gb2YgdGhlIGNhbGxiYWNrIChuZXN0ZWQgY2FsbHMgc3RhY2spIGFuZCBpcyBwcm9jZXNzLXdpZGUgd2hpbGUgaXRcbiAqIHJ1bnM6IG11dGF0aW9ucyBmcm9tIGNvbmN1cnJlbnRseSBydW5uaW5nIHJlcXVlc3RzIGFyZSBhbHNvIHN1cHByZXNzZWQgZm9yXG4gKiB0aGF0IHdpbmRvdywgc28gcHJlZmVyIGBtYXJrU2VydmVyQXBwbHkocmVjb3JkKWAgd2hlbiBvdGhlciBmbG93cyBjYW5cbiAqIGludGVybGVhdmUuXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFQ+IHwgVH0gY2FsbGJhY2sgLSBXb3JrIHdob3NlIG1vZGVsIHdyaXRlcyBzaG91bGQgbm90IHB1Ymxpc2ggc3luYyBjaGFuZ2VzLlxuICogQHJldHVybnMge1Byb21pc2U8VD59IFRoZSBjYWxsYmFjayByZXN1bHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3aXRob3V0UHVibGlzaGluZyhjYWxsYmFjaykge1xuICB3aXRob3V0UHVibGlzaGluZ0RlcHRoKytcblxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBjYWxsYmFjaygpXG4gIH0gZmluYWxseSB7XG4gICAgd2l0aG91dFB1Ymxpc2hpbmdEZXB0aC0tXG4gIH1cbn1cblxuLyoqXG4gKiBXaGV0aGVyIHNlcnZlciBwdWJsaXNoaW5nIGlzIGN1cnJlbnRseSBzdXBwcmVzc2VkIGZvciBhIHJlY29yZDogZWl0aGVyIHRoZVxuICogcmVjb3JkIHdhcyBtYXJrZWQgYXMgYSBzZXJ2ZXIgYXBwbHkgKGBtYXJrU2VydmVyQXBwbHlgKSBvciBhXG4gKiBgd2l0aG91dFB1Ymxpc2hpbmdgIGNhbGxiYWNrIGlzIHJ1bm5pbmcuXG4gKiBAcGFyYW0gez99IHJlY29yZCAtIFNlcnZlciBtb2RlbCByZWNvcmQgYmVpbmcgd3JpdHRlbi5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHB1Ymxpc2hpbmcgaXMgc3VwcHJlc3NlZCBmb3IgdGhlIHJlY29yZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUHVibGlzaGluZ1N1cHByZXNzZWQocmVjb3JkKSB7XG4gIHJldHVybiB3aXRob3V0UHVibGlzaGluZ0RlcHRoID4gMCB8fCBzZXJ2ZXJBcHBseVJlY29yZHMuaGFzKHJlY29yZClcbn1cbiJdfQ==
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Args resolved against a publish declaration's deprecated broadcasts after a
|
|
3
|
+
* published 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 the standard sync envelope on the framework sync
|
|
62
|
+
* channel automatically once their transaction commits); `publish: true`
|
|
63
|
+
* opts in with all defaults and `publish: false` opts a model out explicitly.
|
|
64
|
+
*/
|
|
65
|
+
export type SyncPublishDeclarationConfig<TModel = any> = {
|
|
66
|
+
/**
|
|
67
|
+
* - Builds the published payload snapshot from the mutated record (snapshotted at mutation time). Defaults to the record's attributes with Date values serialized to ISO strings.
|
|
68
|
+
*/
|
|
69
|
+
serialize?: ((record: TModel) => Record<string, unknown> | Promise<Record<string, unknown>>) | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* - Record-attribute name overrides per scope attribute declared on the sync model's `static syncScopeAttributes`. By default each declared scope attribute reads the record's attribute of the same name when the model has one, else the record's own id (scope-root models).
|
|
72
|
+
*/
|
|
73
|
+
scopeAttributes?: Record<string, string> | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* - Deprecated 1.0.503 form: attribute-name string (or resolver function) persisted to a fixed event_id sync-row column and broadcast as a fixed `eventId` scoping param. Declare `static syncScopeAttributes` on the sync model plus `scopeAttributes` overrides instead.
|
|
76
|
+
*/
|
|
77
|
+
eventId?: string | ((record: TModel) => string | number | null | Promise<string | number | null>) | undefined;
|
|
78
|
+
/**
|
|
79
|
+
* - Deprecated: declarative app-channel broadcasts fanned out after the framework sync channel broadcast. The framework broadcast happens automatically; keep this only for legacy channels old app versions still subscribe.
|
|
80
|
+
*/
|
|
81
|
+
broadcasts?: SyncPublishBroadcast[] | undefined;
|
|
82
|
+
/**
|
|
83
|
+
* - Published operations. Defaults to creates and updates; destroys are opt-in because a server destroy is often cleanup rather than a synced delete.
|
|
84
|
+
*/
|
|
85
|
+
operations?: ("update" | "destroy" | "create")[] | undefined;
|
|
86
|
+
/**
|
|
87
|
+
* - Published resource type. Defaults to the model name.
|
|
88
|
+
*/
|
|
89
|
+
resourceType?: string | undefined;
|
|
90
|
+
};
|
|
91
|
+
/**
|
|
92
|
+
* Model-level publish declaration value: `true` publishes with all defaults,
|
|
93
|
+
* `false` opts out explicitly, an object customizes the published payload and scoping.
|
|
94
|
+
*/
|
|
95
|
+
export type SyncPublishDeclaration<TModel = any> = boolean | SyncPublishDeclarationConfig<TModel>;
|
|
96
|
+
/**
|
|
97
|
+
* Options for building a sync publisher. Published resources are derived from
|
|
98
|
+
* the configuration's registered models (`static sync` publish declarations).
|
|
99
|
+
*/
|
|
100
|
+
export type SyncPublisherOptions = {
|
|
101
|
+
/**
|
|
102
|
+
* - 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".
|
|
103
|
+
*/
|
|
104
|
+
actorForeignKeyColumn?: string | undefined;
|
|
105
|
+
/**
|
|
106
|
+
* - Delivers the framework sync channel broadcast and any deprecated declared broadcasts. Defaults to the configuration's channel broadcast.
|
|
107
|
+
*/
|
|
108
|
+
broadcaster?: ((broadcast: {
|
|
109
|
+
channel: string;
|
|
110
|
+
params: Record<string, unknown>;
|
|
111
|
+
body: unknown;
|
|
112
|
+
}) => Promise<void>) | undefined;
|
|
113
|
+
/**
|
|
114
|
+
* - Configuration owning the registered models. Defaults to the current configuration.
|
|
115
|
+
*/
|
|
116
|
+
configuration?: import("../configuration.js").default | undefined;
|
|
117
|
+
/**
|
|
118
|
+
* - Reports post-commit publish failures. Defaults to loud logging.
|
|
119
|
+
*/
|
|
120
|
+
onError?: ((error: Error) => void) | undefined;
|
|
121
|
+
/**
|
|
122
|
+
* - Sync/change model override. Defaults to the registered "Sync" model.
|
|
123
|
+
*/
|
|
124
|
+
syncModel?: unknown;
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* One derived scope-partition source for a published resource — not an
|
|
128
|
+
* app-facing API. The value is persisted to the sync row's `columnName` and
|
|
129
|
+
* broadcast under `scopeAttribute` on the framework sync channel.
|
|
130
|
+
*/
|
|
131
|
+
export type SyncPublisherScopePlanEntry = {
|
|
132
|
+
/**
|
|
133
|
+
* - Sync-row column persisting the scope value.
|
|
134
|
+
*/
|
|
135
|
+
columnName: string;
|
|
136
|
+
/**
|
|
137
|
+
* - Record attribute read for the scope value, or null when the record's own id is the scope (scope-root models).
|
|
138
|
+
*/
|
|
139
|
+
recordAttribute: string | null;
|
|
140
|
+
/**
|
|
141
|
+
* - Deprecated eventId resolver function.
|
|
142
|
+
*/
|
|
143
|
+
resolver: ((record: unknown) => string | number | null | Promise<string | number | null>) | undefined;
|
|
144
|
+
/**
|
|
145
|
+
* - Scope attribute name broadcast as the framework channel scoping param.
|
|
146
|
+
*/
|
|
147
|
+
scopeAttribute: string;
|
|
148
|
+
};
|
|
149
|
+
/**
|
|
150
|
+
* Internal derived publish policy for one resource — not an app-facing API.
|
|
151
|
+
*/
|
|
152
|
+
export type SyncPublisherResourceConfig = {
|
|
153
|
+
/**
|
|
154
|
+
* - Deprecated declared app-channel broadcasts.
|
|
155
|
+
*/
|
|
156
|
+
broadcasts: SyncPublishBroadcast[] | undefined;
|
|
157
|
+
/**
|
|
158
|
+
* - Server model class for this resource.
|
|
159
|
+
*/
|
|
160
|
+
modelClass: unknown;
|
|
161
|
+
/**
|
|
162
|
+
* - Published operations.
|
|
163
|
+
*/
|
|
164
|
+
operations: Array<"create" | "update" | "destroy">;
|
|
165
|
+
/**
|
|
166
|
+
* - Derived scope-partition plan.
|
|
167
|
+
*/
|
|
168
|
+
scopePlan: Array<SyncPublisherScopePlanEntry>;
|
|
169
|
+
/**
|
|
170
|
+
* - Payload snapshot builder (the declaration's serialize or the default attribute serializer).
|
|
171
|
+
*/
|
|
172
|
+
serialize: (record: unknown) => Record<string, unknown> | Promise<Record<string, unknown>>;
|
|
173
|
+
/**
|
|
174
|
+
* - Published resource type.
|
|
175
|
+
*/
|
|
176
|
+
resourceType: string;
|
|
177
|
+
};
|
|
178
|
+
//# 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;;;;;;;;;;aAQN,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;;;;;;;;;;yCAU3C,MAAM;;;;0BAEG,MAAM,KAAK,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;;;;;;;;iCAE/C,MAAM,KAAK,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;;;;;;;;;;;;;;;;;;mCAStF,MAAM,UACP,OAAO,GAAG,4BAA4B,CAAC,MAAM,CAAC;;;;;;;;;;;;;+BAQjC;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;;;;;;;;;;;gBAQD,MAAM;;;;qBACN,MAAM,GAAG,IAAI;;;;cACb,CAAC,CAAC,MAAM,EAAE,OAAC,KAAK,MAAM,GAAG,MAAM,GAAG,IAAI,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC,GAAG,SAAS;;;;oBACrF,MAAM;;;;;;;;;gBAMN,oBAAoB,EAAE,GAAG,SAAS;;;;gBAClC,OAAC;;;;gBACD,KAAK,CAAC,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;;;;eACtC,KAAK,CAAC,2BAA2B,CAAC;;;;eAClC,CAAC,MAAM,EAAE,OAAC,KAAK,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAC,CAAC,CAAC;;;;kBAC7D,MAAM"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
export {};
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luYy1wdWJsaXNoZXItdHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3luYy9zeW5jLXB1Ymxpc2hlci10eXBlcy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKlxuICogQXJncyByZXNvbHZlZCBhZ2FpbnN0IGEgcHVibGlzaCBkZWNsYXJhdGlvbidzIGRlcHJlY2F0ZWQgYnJvYWRjYXN0cyBhZnRlciBhXG4gKiBwdWJsaXNoZWQgc2VydmVyLXNpZGUgbXV0YXRpb24gY29tbWl0cy5cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN5bmNQdWJsaXNoQnJvYWRjYXN0QXJnc1xuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCA/Pn0gZGF0YSAtIFBheWxvYWQgc25hcHNob3R0ZWQgdGhyb3VnaCB0aGUgZGVjbGFyYXRpb24ncyBgc2VyaWFsaXplKHJlY29yZClgIGF0IG11dGF0aW9uIHRpbWUuXG4gKiBAcHJvcGVydHkge1wiY3JlYXRlXCIgfCBcInVwZGF0ZVwiIHwgXCJkZXN0cm95XCJ9IG9wZXJhdGlvbiAtIE11dGF0aW9uIG9wZXJhdGlvbiB0aGF0IHB1Ymxpc2hlZC5cbiAqIEBwcm9wZXJ0eSB7P30gcmVjb3JkIC0gTXV0YXRlZCBzZXJ2ZXIgbW9kZWwgcmVjb3JkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlc291cmNlSWQgLSBQdWJsaXNoZWQgcmVzb3VyY2UgaWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVzb3VyY2VUeXBlIC0gUHVibGlzaGVkIHJlc291cmNlIHR5cGUuXG4gKiBAcHJvcGVydHkgez99IHN5bmNSb3cgLSBVcHNlcnRlZCBzeW5jL2NoYW5nZSByb3cuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3luY1R5cGUgLSBQdWJsaXNoZWQgc3luYyB0eXBlIChcInVwZGF0ZVwiIGZvciBjcmVhdGVzL3VwZGF0ZXMsIFwiZGVsZXRlXCIgZm9yIGRlc3Ryb3lzKS5cbiAqL1xuXG4vKipcbiAqIE9uZSBkZWNsYXJhdGl2ZSBicm9hZGNhc3QgZmFubmVkIG91dCBhZnRlciBhIHB1Ymxpc2hlZCBzZXJ2ZXItc2lkZSBtdXRhdGlvblxuICogY29tbWl0cyDigJQgc2FtZSBzaGFwZSB0aGUgcmVwbGF5IHNlcnZpY2UncyBpbmplY3RlZCBicm9hZGNhc3RlciBjb25zdW1lcy5cbiAqIEBkZXByZWNhdGVkIFB1Ymxpc2hpbmcgYnJvYWRjYXN0cyB0aGUgc3RhbmRhcmQgc3luYyBlbnZlbG9wZSBvbiB0aGUgZnJhbWV3b3JrIHN5bmMgY2hhbm5lbCBhdXRvbWF0aWNhbGx5OyBkZWNsYXJlIGFwcC1jaGFubmVsIGJyb2FkY2FzdHMgb25seSBmb3IgbGVnYWN5IGNoYW5uZWxzIG9sZCBhcHAgdmVyc2lvbnMgc3RpbGwgc3Vic2NyaWJlLlxuICogQHR5cGVkZWYge29iamVjdH0gU3luY1B1Ymxpc2hCcm9hZGNhc3RcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgKChhcmdzOiBTeW5jUHVibGlzaEJyb2FkY2FzdEFyZ3MpID0+IHN0cmluZyl9IGNoYW5uZWwgLSBDaGFubmVsIG5hbWUgb3IgcmVzb2x2ZXIuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiBTeW5jUHVibGlzaEJyb2FkY2FzdEFyZ3MpID0+IFJlY29yZDxzdHJpbmcsID8+fSBicm9hZGNhc3RQYXJhbXMgLSBDaGFubmVsIHJvdXRpbmcgcGFyYW1zLlxuICogQHByb3BlcnR5IHsoYXJnczogU3luY1B1Ymxpc2hCcm9hZGNhc3RBcmdzKSA9PiA/fSBib2R5IC0gQnJvYWRjYXN0IGJvZHkuXG4gKiBAcHJvcGVydHkgeyhhcmdzOiBTeW5jUHVibGlzaEJyb2FkY2FzdEFyZ3MpID0+IGJvb2xlYW59IFt3aGVuXSAtIE9wdGlvbmFsIGdhdGU7IHNraXBwZWQgd2hlbiBpdCByZXR1cm5zIGZhbHNlLlxuICovXG5cbi8qKlxuICogU2VydmVyLXNpZGUgcHVibGlzaCBkZWNsYXJhdGlvbiBvbiBhIG1vZGVsJ3MgYHN0YXRpYyBzeW5jYCwgY29uc3VtZWQgYnlcbiAqIGBTeW5jUHVibGlzaGVyLmZyb21Db25maWd1cmF0aW9uKC4uLilgLiBQdWJsaXNoaW5nIGlzIG9uIGZvciBtb2RlbHNcbiAqIGRlY2xhcmluZyBpdCAoc2VydmVyLXNpZGUgY3JlYXRlcyBhbmQgdXBkYXRlcyB3cml0ZSB0byB0aGUgc3luYyBjaGFuZ2VcbiAqIGZlZWQgYW5kIGJyb2FkY2FzdCB0aGUgc3RhbmRhcmQgc3luYyBlbnZlbG9wZSBvbiB0aGUgZnJhbWV3b3JrIHN5bmNcbiAqIGNoYW5uZWwgYXV0b21hdGljYWxseSBvbmNlIHRoZWlyIHRyYW5zYWN0aW9uIGNvbW1pdHMpOyBgcHVibGlzaDogdHJ1ZWBcbiAqIG9wdHMgaW4gd2l0aCBhbGwgZGVmYXVsdHMgYW5kIGBwdWJsaXNoOiBmYWxzZWAgb3B0cyBhIG1vZGVsIG91dCBleHBsaWNpdGx5LlxuICogQHRlbXBsYXRlIFtUTW9kZWw9YW55XVxuICogQHR5cGVkZWYge29iamVjdH0gU3luY1B1Ymxpc2hEZWNsYXJhdGlvbkNvbmZpZ1xuICogQHByb3BlcnR5IHsocmVjb3JkOiBUTW9kZWwpID0+IFJlY29yZDxzdHJpbmcsID8+IHwgUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCA/Pj59IFtzZXJpYWxpemVdIC0gQnVpbGRzIHRoZSBwdWJsaXNoZWQgcGF5bG9hZCBzbmFwc2hvdCBmcm9tIHRoZSBtdXRhdGVkIHJlY29yZCAoc25hcHNob3R0ZWQgYXQgbXV0YXRpb24gdGltZSkuIERlZmF1bHRzIHRvIHRoZSByZWNvcmQncyBhdHRyaWJ1dGVzIHdpdGggRGF0ZSB2YWx1ZXMgc2VyaWFsaXplZCB0byBJU08gc3RyaW5ncy5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gW3Njb3BlQXR0cmlidXRlc10gLSBSZWNvcmQtYXR0cmlidXRlIG5hbWUgb3ZlcnJpZGVzIHBlciBzY29wZSBhdHRyaWJ1dGUgZGVjbGFyZWQgb24gdGhlIHN5bmMgbW9kZWwncyBgc3RhdGljIHN5bmNTY29wZUF0dHJpYnV0ZXNgLiBCeSBkZWZhdWx0IGVhY2ggZGVjbGFyZWQgc2NvcGUgYXR0cmlidXRlIHJlYWRzIHRoZSByZWNvcmQncyBhdHRyaWJ1dGUgb2YgdGhlIHNhbWUgbmFtZSB3aGVuIHRoZSBtb2RlbCBoYXMgb25lLCBlbHNlIHRoZSByZWNvcmQncyBvd24gaWQgKHNjb3BlLXJvb3QgbW9kZWxzKS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgKChyZWNvcmQ6IFRNb2RlbCkgPT4gc3RyaW5nIHwgbnVtYmVyIHwgbnVsbCB8IFByb21pc2U8c3RyaW5nIHwgbnVtYmVyIHwgbnVsbD4pfSBbZXZlbnRJZF0gLSBEZXByZWNhdGVkIDEuMC41MDMgZm9ybTogYXR0cmlidXRlLW5hbWUgc3RyaW5nIChvciByZXNvbHZlciBmdW5jdGlvbikgcGVyc2lzdGVkIHRvIGEgZml4ZWQgZXZlbnRfaWQgc3luYy1yb3cgY29sdW1uIGFuZCBicm9hZGNhc3QgYXMgYSBmaXhlZCBgZXZlbnRJZGAgc2NvcGluZyBwYXJhbS4gRGVjbGFyZSBgc3RhdGljIHN5bmNTY29wZUF0dHJpYnV0ZXNgIG9uIHRoZSBzeW5jIG1vZGVsIHBsdXMgYHNjb3BlQXR0cmlidXRlc2Agb3ZlcnJpZGVzIGluc3RlYWQuXG4gKiBAcHJvcGVydHkge1N5bmNQdWJsaXNoQnJvYWRjYXN0W119IFticm9hZGNhc3RzXSAtIERlcHJlY2F0ZWQ6IGRlY2xhcmF0aXZlIGFwcC1jaGFubmVsIGJyb2FkY2FzdHMgZmFubmVkIG91dCBhZnRlciB0aGUgZnJhbWV3b3JrIHN5bmMgY2hhbm5lbCBicm9hZGNhc3QuIFRoZSBmcmFtZXdvcmsgYnJvYWRjYXN0IGhhcHBlbnMgYXV0b21hdGljYWxseTsga2VlcCB0aGlzIG9ubHkgZm9yIGxlZ2FjeSBjaGFubmVscyBvbGQgYXBwIHZlcnNpb25zIHN0aWxsIHN1YnNjcmliZS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8XCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIj59IFtvcGVyYXRpb25zXSAtIFB1Ymxpc2hlZCBvcGVyYXRpb25zLiBEZWZhdWx0cyB0byBjcmVhdGVzIGFuZCB1cGRhdGVzOyBkZXN0cm95cyBhcmUgb3B0LWluIGJlY2F1c2UgYSBzZXJ2ZXIgZGVzdHJveSBpcyBvZnRlbiBjbGVhbnVwIHJhdGhlciB0aGFuIGEgc3luY2VkIGRlbGV0ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcmVzb3VyY2VUeXBlXSAtIFB1Ymxpc2hlZCByZXNvdXJjZSB0eXBlLiBEZWZhdWx0cyB0byB0aGUgbW9kZWwgbmFtZS5cbiAqL1xuXG4vKipcbiAqIE1vZGVsLWxldmVsIHB1Ymxpc2ggZGVjbGFyYXRpb24gdmFsdWU6IGB0cnVlYCBwdWJsaXNoZXMgd2l0aCBhbGwgZGVmYXVsdHMsXG4gKiBgZmFsc2VgIG9wdHMgb3V0IGV4cGxpY2l0bHksIGFuIG9iamVjdCBjdXN0b21pemVzIHRoZSBwdWJsaXNoZWQgcGF5bG9hZCBhbmQgc2NvcGluZy5cbiAqIEB0ZW1wbGF0ZSBbVE1vZGVsPWFueV1cbiAqIEB0eXBlZGVmIHtib29sZWFuIHwgU3luY1B1Ymxpc2hEZWNsYXJhdGlvbkNvbmZpZzxUTW9kZWw+fSBTeW5jUHVibGlzaERlY2xhcmF0aW9uXG4gKi9cblxuLyoqXG4gKiBPcHRpb25zIGZvciBidWlsZGluZyBhIHN5bmMgcHVibGlzaGVyLiBQdWJsaXNoZWQgcmVzb3VyY2VzIGFyZSBkZXJpdmVkIGZyb21cbiAqIHRoZSBjb25maWd1cmF0aW9uJ3MgcmVnaXN0ZXJlZCBtb2RlbHMgKGBzdGF0aWMgc3luY2AgcHVibGlzaCBkZWNsYXJhdGlvbnMpLlxuICogQHR5cGVkZWYge29iamVjdH0gU3luY1B1Ymxpc2hlck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYWN0b3JGb3JlaWduS2V5Q29sdW1uXSAtIFN5bmMgbW9kZWwgY29sdW1uIGxpbmtpbmcgcm93cyB0byBhIGRldmljZSBhY3Rvci4gUHVibGlzaGVkIHNlcnZlci1vcmlnaW4gcm93cyBzZXQgaXQgdG8gbnVsbCAobm8gZGV2aWNlIHRvIGVjaG8pLiBEZWZhdWx0cyB0byBcImF1dGhlbnRpY2F0aW9uX3Rva2VuX2lkXCIuXG4gKiBAcHJvcGVydHkgeyhicm9hZGNhc3Q6IHtjaGFubmVsOiBzdHJpbmcsIHBhcmFtczogUmVjb3JkPHN0cmluZywgPz4sIGJvZHk6ID99KSA9PiBQcm9taXNlPHZvaWQ+fSBbYnJvYWRjYXN0ZXJdIC0gRGVsaXZlcnMgdGhlIGZyYW1ld29yayBzeW5jIGNoYW5uZWwgYnJvYWRjYXN0IGFuZCBhbnkgZGVwcmVjYXRlZCBkZWNsYXJlZCBicm9hZGNhc3RzLiBEZWZhdWx0cyB0byB0aGUgY29uZmlndXJhdGlvbidzIGNoYW5uZWwgYnJvYWRjYXN0LlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCIuLi9jb25maWd1cmF0aW9uLmpzXCIpLmRlZmF1bHR9IFtjb25maWd1cmF0aW9uXSAtIENvbmZpZ3VyYXRpb24gb3duaW5nIHRoZSByZWdpc3RlcmVkIG1vZGVscy4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7KGVycm9yOiBFcnJvcikgPT4gdm9pZH0gW29uRXJyb3JdIC0gUmVwb3J0cyBwb3N0LWNvbW1pdCBwdWJsaXNoIGZhaWx1cmVzLiBEZWZhdWx0cyB0byBsb3VkIGxvZ2dpbmcuXG4gKiBAcHJvcGVydHkgez99IFtzeW5jTW9kZWxdIC0gU3luYy9jaGFuZ2UgbW9kZWwgb3ZlcnJpZGUuIERlZmF1bHRzIHRvIHRoZSByZWdpc3RlcmVkIFwiU3luY1wiIG1vZGVsLlxuICovXG5cbi8qKlxuICogT25lIGRlcml2ZWQgc2NvcGUtcGFydGl0aW9uIHNvdXJjZSBmb3IgYSBwdWJsaXNoZWQgcmVzb3VyY2Ug4oCUIG5vdCBhblxuICogYXBwLWZhY2luZyBBUEkuIFRoZSB2YWx1ZSBpcyBwZXJzaXN0ZWQgdG8gdGhlIHN5bmMgcm93J3MgYGNvbHVtbk5hbWVgIGFuZFxuICogYnJvYWRjYXN0IHVuZGVyIGBzY29wZUF0dHJpYnV0ZWAgb24gdGhlIGZyYW1ld29yayBzeW5jIGNoYW5uZWwuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jUHVibGlzaGVyU2NvcGVQbGFuRW50cnlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb2x1bW5OYW1lIC0gU3luYy1yb3cgY29sdW1uIHBlcnNpc3RpbmcgdGhlIHNjb3BlIHZhbHVlLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCBudWxsfSByZWNvcmRBdHRyaWJ1dGUgLSBSZWNvcmQgYXR0cmlidXRlIHJlYWQgZm9yIHRoZSBzY29wZSB2YWx1ZSwgb3IgbnVsbCB3aGVuIHRoZSByZWNvcmQncyBvd24gaWQgaXMgdGhlIHNjb3BlIChzY29wZS1yb290IG1vZGVscykuXG4gKiBAcHJvcGVydHkgeygocmVjb3JkOiA/KSA9PiBzdHJpbmcgfCBudW1iZXIgfCBudWxsIHwgUHJvbWlzZTxzdHJpbmcgfCBudW1iZXIgfCBudWxsPikgfCB1bmRlZmluZWR9IHJlc29sdmVyIC0gRGVwcmVjYXRlZCBldmVudElkIHJlc29sdmVyIGZ1bmN0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNjb3BlQXR0cmlidXRlIC0gU2NvcGUgYXR0cmlidXRlIG5hbWUgYnJvYWRjYXN0IGFzIHRoZSBmcmFtZXdvcmsgY2hhbm5lbCBzY29waW5nIHBhcmFtLlxuICovXG5cbi8qKlxuICogSW50ZXJuYWwgZGVyaXZlZCBwdWJsaXNoIHBvbGljeSBmb3Igb25lIHJlc291cmNlIOKAlCBub3QgYW4gYXBwLWZhY2luZyBBUEkuXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTeW5jUHVibGlzaGVyUmVzb3VyY2VDb25maWdcbiAqIEBwcm9wZXJ0eSB7U3luY1B1Ymxpc2hCcm9hZGNhc3RbXSB8IHVuZGVmaW5lZH0gYnJvYWRjYXN0cyAtIERlcHJlY2F0ZWQgZGVjbGFyZWQgYXBwLWNoYW5uZWwgYnJvYWRjYXN0cy5cbiAqIEBwcm9wZXJ0eSB7P30gbW9kZWxDbGFzcyAtIFNlcnZlciBtb2RlbCBjbGFzcyBmb3IgdGhpcyByZXNvdXJjZS5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8XCJjcmVhdGVcIiB8IFwidXBkYXRlXCIgfCBcImRlc3Ryb3lcIj59IG9wZXJhdGlvbnMgLSBQdWJsaXNoZWQgb3BlcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7QXJyYXk8U3luY1B1Ymxpc2hlclNjb3BlUGxhbkVudHJ5Pn0gc2NvcGVQbGFuIC0gRGVyaXZlZCBzY29wZS1wYXJ0aXRpb24gcGxhbi5cbiAqIEBwcm9wZXJ0eSB7KHJlY29yZDogPykgPT4gUmVjb3JkPHN0cmluZywgPz4gfCBQcm9taXNlPFJlY29yZDxzdHJpbmcsID8+Pn0gc2VyaWFsaXplIC0gUGF5bG9hZCBzbmFwc2hvdCBidWlsZGVyICh0aGUgZGVjbGFyYXRpb24ncyBzZXJpYWxpemUgb3IgdGhlIGRlZmF1bHQgYXR0cmlidXRlIHNlcmlhbGl6ZXIpLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHJlc291cmNlVHlwZSAtIFB1Ymxpc2hlZCByZXNvdXJjZSB0eXBlLlxuICovXG5cbmV4cG9ydCB7fVxuIl19
|
|
@@ -0,0 +1,160 @@
|
|
|
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
|
+
* broadcasts the standard sync envelope (`{echoOrigin, syncs: [...]}`) on the
|
|
9
|
+
* framework sync channel ({@link VELOCIOUS_SYNC_CHANNEL}) scoped by the
|
|
10
|
+
* change's derived scope-partition values, so devices receive server-origin
|
|
11
|
+
* changes without app code declaring channels or calling manual
|
|
12
|
+
* upsert/broadcast helpers:
|
|
13
|
+
*
|
|
14
|
+
* static sync = {publish: true} // default payload (attributes) + default scope partition
|
|
15
|
+
* static sync = {publish: {serialize: (record) => ({id: record.id(), pin: record.pin()})}}
|
|
16
|
+
*
|
|
17
|
+
* The scope partition comes from the sync model's `static
|
|
18
|
+
* syncScopeAttributes` declaration (for example `["eventId"]` or
|
|
19
|
+
* `["accountId"]` — Velocious has no built-in partition name): each declared
|
|
20
|
+
* scope attribute reads the record's attribute of the same name when the
|
|
21
|
+
* model has one, else the record's own id (scope-root models), overridable
|
|
22
|
+
* per model through `publish: {scopeAttributes: {accountId: "ownerId"}}`.
|
|
23
|
+
* The pre-framework-channel `broadcasts` list and the `eventId`
|
|
24
|
+
* string/resolver-function declaration forms keep working but are deprecated.
|
|
25
|
+
*
|
|
26
|
+
* Replayed device mutations never double-publish: the framework's routed
|
|
27
|
+
* replay apply marks its written records through `markServerApply(record)`
|
|
28
|
+
* (see sync-publish-suppression.js), and app code applying already-synced
|
|
29
|
+
* data can use `markServerApply`/`withoutPublishing` the same way.
|
|
30
|
+
*/
|
|
31
|
+
export default class SyncPublisher {
|
|
32
|
+
/**
|
|
33
|
+
* Builds a sync publisher derived from the given configuration. Alias for
|
|
34
|
+
* `new SyncPublisher({configuration, ...options})`.
|
|
35
|
+
* @param {Configuration} [configuration] - Configuration owning the registered models. Defaults to the current configuration.
|
|
36
|
+
* @param {Omit<import("./sync-publisher-types.js").SyncPublisherOptions, "configuration">} [options] - Optional overrides.
|
|
37
|
+
* @returns {SyncPublisher} Sync publisher derived from the configuration.
|
|
38
|
+
*/
|
|
39
|
+
static fromConfiguration(configuration?: Configuration, options?: Omit<import("./sync-publisher-types.js").SyncPublisherOptions, "configuration">): SyncPublisher;
|
|
40
|
+
/**
|
|
41
|
+
* Starts (and memoizes per configuration) the sync publisher for a server
|
|
42
|
+
* boot: no-op when no registered model declares a publish config, guarded so
|
|
43
|
+
* repeated boots with the same configuration register the publish callbacks
|
|
44
|
+
* only once.
|
|
45
|
+
* @param {Configuration} configuration - Configuration owning the registered models.
|
|
46
|
+
* @returns {Promise<SyncPublisher | null>} Started publisher, or null when no models declare publish.
|
|
47
|
+
*/
|
|
48
|
+
static startFromConfiguration(configuration: Configuration): Promise<SyncPublisher | null>;
|
|
49
|
+
/**
|
|
50
|
+
* Builds the sync publisher by deriving published resources from the
|
|
51
|
+
* configuration's registered models: every model declaring `static sync`
|
|
52
|
+
* with a `publish` declaration becomes a published resource
|
|
53
|
+
* (`publish: false` opts out). The sync/change model is the registered
|
|
54
|
+
* "Sync" model and broadcasts default to the configuration's channel
|
|
55
|
+
* broadcast.
|
|
56
|
+
* @param {import("./sync-publisher-types.js").SyncPublisherOptions} [options] - Optional overrides.
|
|
57
|
+
*/
|
|
58
|
+
constructor(options?: import("./sync-publisher-types.js").SyncPublisherOptions);
|
|
59
|
+
/** @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: ?}} */
|
|
60
|
+
config: {
|
|
61
|
+
actorForeignKeyColumn: string;
|
|
62
|
+
broadcaster: import("./sync-publisher-types.js").SyncPublisherOptions["broadcaster"];
|
|
63
|
+
configuration: Configuration;
|
|
64
|
+
onError: import("./sync-publisher-types.js").SyncPublisherOptions["onError"];
|
|
65
|
+
resources: Record<string, import("./sync-publisher-types.js").SyncPublisherResourceConfig>;
|
|
66
|
+
syncModel: unknown;
|
|
67
|
+
};
|
|
68
|
+
/** @type {Array<{callback: (record: ?) => Promise<void>, callbackName: "afterCreate" | "afterUpdate" | "afterDestroy", modelClass: ?}>} */
|
|
69
|
+
_publishedCallbacks: Array<{
|
|
70
|
+
callback: (record: unknown) => Promise<void>;
|
|
71
|
+
callbackName: "afterCreate" | "afterUpdate" | "afterDestroy";
|
|
72
|
+
modelClass: unknown;
|
|
73
|
+
}>;
|
|
74
|
+
/** @type {Logger | null} */
|
|
75
|
+
_logger: Logger | null;
|
|
76
|
+
_started: boolean;
|
|
77
|
+
/**
|
|
78
|
+
* Registers the publish callbacks for every published resource: server-side
|
|
79
|
+
* creates and updates (destroys when opted in) upsert a sync change row and
|
|
80
|
+
* fan out the declared broadcasts once their transaction commits.
|
|
81
|
+
* @returns {Promise<void>}
|
|
82
|
+
*/
|
|
83
|
+
start(): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Unregisters all publish callbacks (tests, shutdown).
|
|
86
|
+
* @returns {void}
|
|
87
|
+
*/
|
|
88
|
+
stop(): void;
|
|
89
|
+
/**
|
|
90
|
+
* Builds the lifecycle callback publishing one server-side mutation. The
|
|
91
|
+
* published payload (declaration `serialize`), event scope, and sync type
|
|
92
|
+
* are snapshotted at mutation-callback time, so afterSave hooks assigning
|
|
93
|
+
* unsaved attributes (or any later drift on the record) cannot change what
|
|
94
|
+
* gets published vs what was committed. Persisting and broadcasting are
|
|
95
|
+
* deferred through the model connection's afterCommit hook so they only run
|
|
96
|
+
* once the mutation's transaction has committed (immediately when no
|
|
97
|
+
* transaction is open) - rolled-back mutations never publish. Post-commit
|
|
98
|
+
* publish failures are reported without rethrowing into the driver's
|
|
99
|
+
* afterCommit chain (see reportAfterCommitError).
|
|
100
|
+
* @param {{operation: "create" | "update" | "destroy", resourceConfig: import("./sync-publisher-types.js").SyncPublisherResourceConfig}} args - Operation and resource config.
|
|
101
|
+
* @returns {(record: ?) => Promise<void>} Lifecycle callback.
|
|
102
|
+
*/
|
|
103
|
+
publishedMutationCallback({ operation, resourceConfig }: {
|
|
104
|
+
operation: "create" | "update" | "destroy";
|
|
105
|
+
resourceConfig: import("./sync-publisher-types.js").SyncPublisherResourceConfig;
|
|
106
|
+
}): (record: unknown) => Promise<void>;
|
|
107
|
+
/**
|
|
108
|
+
* Resolves the scope-partition values for one published mutation from the
|
|
109
|
+
* resource's derived scope plan: each entry reads its record attribute (or
|
|
110
|
+
* the record's own id for scope-root models, or the deprecated resolver
|
|
111
|
+
* function). The values are persisted onto the sync row's partition columns
|
|
112
|
+
* and broadcast as the framework sync channel's scoping params.
|
|
113
|
+
* @param {{record: ?, resourceConfig: import("./sync-publisher-types.js").SyncPublisherResourceConfig}} args - Mutated record and resource config.
|
|
114
|
+
* @returns {Promise<{columns: Record<string, string | null>, params: Record<string, string | null>}>} Scope values keyed by sync-row column and by scope attribute.
|
|
115
|
+
*/
|
|
116
|
+
publishedScopeValues({ record, resourceConfig }: {
|
|
117
|
+
record: unknown;
|
|
118
|
+
resourceConfig: import("./sync-publisher-types.js").SyncPublisherResourceConfig;
|
|
119
|
+
}): Promise<{
|
|
120
|
+
columns: Record<string, string | null>;
|
|
121
|
+
params: Record<string, string | null>;
|
|
122
|
+
}>;
|
|
123
|
+
/**
|
|
124
|
+
* Upserts the published server-origin sync row for a resource identity:
|
|
125
|
+
* server-origin rows carry a null actor column (no device to echo the
|
|
126
|
+
* change back to), so repeated server changes to one resource reuse and
|
|
127
|
+
* re-sequence one feed row.
|
|
128
|
+
* @param {Record<string, ?>} attributes - Snapshotted sync row attributes.
|
|
129
|
+
* @returns {Promise<?>} Upserted sync row.
|
|
130
|
+
*/
|
|
131
|
+
upsertPublishedSyncRow(attributes: Record<string, unknown>): Promise<unknown>;
|
|
132
|
+
/**
|
|
133
|
+
* Returns the broadcaster delivering declared broadcasts: the injected one,
|
|
134
|
+
* or the configuration's channel broadcast awaited through the pending
|
|
135
|
+
* broadcast queue.
|
|
136
|
+
* @returns {NonNullable<import("./sync-publisher-types.js").SyncPublisherOptions["broadcaster"]>} Broadcast deliverer.
|
|
137
|
+
*/
|
|
138
|
+
broadcaster(): NonNullable<import("./sync-publisher-types.js").SyncPublisherOptions["broadcaster"]>;
|
|
139
|
+
/**
|
|
140
|
+
* Reports a post-commit publish failure. The transaction has already
|
|
141
|
+
* committed when afterCommit callbacks run, so rethrowing here would poison
|
|
142
|
+
* the driver's awaited afterCommit chain (breaking unrelated callbacks) -
|
|
143
|
+
* instead the failure goes to the configured onError hook, or is emitted on
|
|
144
|
+
* the configuration's framework-error/all-error channels (so production bug
|
|
145
|
+
* reporting via `configuration.getErrorEvents()` sees a broken publish
|
|
146
|
+
* path) and logged loudly through the publisher's logger when none is
|
|
147
|
+
* configured.
|
|
148
|
+
* @param {Error} error - Post-commit publish failure.
|
|
149
|
+
* @returns {Promise<void>}
|
|
150
|
+
*/
|
|
151
|
+
reportAfterCommitError(error: Error): Promise<void>;
|
|
152
|
+
/**
|
|
153
|
+
* Returns the lazily built publisher logger.
|
|
154
|
+
* @returns {Logger} Publisher logger.
|
|
155
|
+
*/
|
|
156
|
+
logger(): Logger;
|
|
157
|
+
}
|
|
158
|
+
import Configuration from "../configuration.js";
|
|
159
|
+
import Logger from "../logger.js";
|
|
160
|
+
//# 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":"AA0BA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;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,CA8CxC;IAED;;;;;;;;OAQG;IACH,iDAHW;QAAC,MAAM,EAAE,OAAC,CAAC;QAAC,cAAc,EAAE,OAAO,2BAA2B,EAAE,2BAA2B,CAAA;KAAC,GAC1F,OAAO,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAA;KAAC,CAAC,CA2BpG;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;0BAnVyB,qBAAqB;mBAC5B,cAAc"}
|