@blokjs/trigger-pubsub 0.2.3 → 0.6.2
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/__tests__/integration/gcp-pubsub.real-emulator.test.ts +235 -0
- package/__tests__/integration/kafka-pubsub.real-kafka.test.ts +269 -0
- package/__tests__/integration/nats-pubsub.real-nats.test.ts +138 -0
- package/dist/PubSubTrigger.d.ts +43 -3
- package/dist/PubSubTrigger.js +70 -16
- package/dist/adapters/AWSSNSAdapter.d.ts +16 -0
- package/dist/adapters/AWSSNSAdapter.js +52 -9
- package/dist/adapters/AzureServiceBusAdapter.d.ts +15 -0
- package/dist/adapters/AzureServiceBusAdapter.js +44 -11
- package/dist/adapters/GCPPubSubAdapter.d.ts +16 -0
- package/dist/adapters/GCPPubSubAdapter.js +42 -8
- package/dist/adapters/KafkaPubSubAdapter.d.ts +53 -0
- package/dist/adapters/KafkaPubSubAdapter.js +168 -0
- package/dist/adapters/NATSPubSubAdapter.d.ts +52 -0
- package/dist/adapters/NATSPubSubAdapter.js +260 -0
- package/dist/adapters/RedisStreamsPubSubAdapter.d.ts +49 -0
- package/dist/adapters/RedisStreamsPubSubAdapter.js +193 -0
- package/dist/adapters/factory.d.ts +22 -0
- package/dist/adapters/factory.js +80 -0
- package/dist/index.d.ts +36 -45
- package/dist/index.js +39 -46
- package/package.json +22 -10
- package/src/PubSubTrigger.ts +84 -18
- package/src/adapters/AWSSNSAdapter.ts +76 -12
- package/src/adapters/AzureServiceBusAdapter.ts +57 -14
- package/src/adapters/GCPPubSubAdapter.ts +50 -10
- package/src/adapters/KafkaPubSubAdapter.ts +194 -0
- package/src/adapters/NATSPubSubAdapter.ts +326 -0
- package/src/adapters/RedisStreamsPubSubAdapter.ts +225 -0
- package/src/adapters/factory.test.ts +87 -0
- package/src/adapters/factory.ts +88 -0
- package/src/adapters/new-adapters.test.ts +108 -0
- package/src/index.ts +40 -41
- package/template/package.json +6 -6
- package/template/src/runner/PubSubServer.ts +2 -2
- package/template/src/workflows/messages/on-message.ts +38 -34
|
@@ -18,6 +18,16 @@ export class AzureServiceBusAdapter {
|
|
|
18
18
|
receivers = new Map();
|
|
19
19
|
connected = false;
|
|
20
20
|
config;
|
|
21
|
+
/**
|
|
22
|
+
* Type-narrowing accessor for `this.client`. Field is undefined until
|
|
23
|
+
* `connect()` runs.
|
|
24
|
+
*/
|
|
25
|
+
requireClient() {
|
|
26
|
+
if (!this.client) {
|
|
27
|
+
throw new Error("[AzureServiceBusAdapter] client is not initialised — call connect() first");
|
|
28
|
+
}
|
|
29
|
+
return this.client;
|
|
30
|
+
}
|
|
21
31
|
constructor(config) {
|
|
22
32
|
this.config = {
|
|
23
33
|
connectionString: config?.connectionString || process.env.AZURE_SERVICE_BUS_CONNECTION_STRING,
|
|
@@ -47,8 +57,7 @@ export class AzureServiceBusAdapter {
|
|
|
47
57
|
console.log("[AzureServiceBusAdapter] Connected to Azure Service Bus");
|
|
48
58
|
}
|
|
49
59
|
catch (error) {
|
|
50
|
-
throw new Error(`Failed to connect to Azure Service Bus: ${error.message}. `
|
|
51
|
-
`Make sure @azure/service-bus is installed: npm install @azure/service-bus`);
|
|
60
|
+
throw new Error(`Failed to connect to Azure Service Bus: ${error.message}. Make sure @azure/service-bus is installed: npm install @azure/service-bus`);
|
|
52
61
|
}
|
|
53
62
|
}
|
|
54
63
|
/**
|
|
@@ -63,7 +72,7 @@ export class AzureServiceBusAdapter {
|
|
|
63
72
|
await receiver.close();
|
|
64
73
|
}
|
|
65
74
|
this.receivers.clear();
|
|
66
|
-
await this.
|
|
75
|
+
await this.requireClient().close();
|
|
67
76
|
this.connected = false;
|
|
68
77
|
console.log("[AzureServiceBusAdapter] Disconnected from Azure Service Bus");
|
|
69
78
|
}
|
|
@@ -78,17 +87,18 @@ export class AzureServiceBusAdapter {
|
|
|
78
87
|
if (!this.connected) {
|
|
79
88
|
throw new Error("Not connected to Azure Service Bus. Call connect() first.");
|
|
80
89
|
}
|
|
90
|
+
const client = this.requireClient();
|
|
81
91
|
let receiver;
|
|
82
92
|
// Determine if this is a topic subscription or a queue
|
|
83
93
|
if (config.subscription && config.topic) {
|
|
84
94
|
// Topic with subscription
|
|
85
|
-
receiver =
|
|
95
|
+
receiver = client.createReceiver(config.topic, config.subscription, {
|
|
86
96
|
receiveMode: config.ack !== false ? "peekLock" : "receiveAndDelete",
|
|
87
97
|
});
|
|
88
98
|
}
|
|
89
99
|
else {
|
|
90
100
|
// Queue
|
|
91
|
-
receiver =
|
|
101
|
+
receiver = client.createReceiver(config.subscription || config.topic, {
|
|
92
102
|
receiveMode: config.ack !== false ? "peekLock" : "receiveAndDelete",
|
|
93
103
|
});
|
|
94
104
|
}
|
|
@@ -117,7 +127,8 @@ export class AzureServiceBusAdapter {
|
|
|
117
127
|
}
|
|
118
128
|
// Create pub/sub message
|
|
119
129
|
const pubsubMessage = {
|
|
120
|
-
|
|
130
|
+
// `messageId` may be string | number | Buffer per Azure SDK; coerce to string.
|
|
131
|
+
id: sbMessage.messageId !== undefined ? String(sbMessage.messageId) : uuid(),
|
|
121
132
|
body,
|
|
122
133
|
attributes,
|
|
123
134
|
raw: sbMessage,
|
|
@@ -139,9 +150,10 @@ export class AzureServiceBusAdapter {
|
|
|
139
150
|
console.error(`[AzureServiceBusAdapter] Error processing message: ${error.message}`);
|
|
140
151
|
}
|
|
141
152
|
};
|
|
142
|
-
// Error handler
|
|
143
|
-
|
|
144
|
-
|
|
153
|
+
// Error handler — Azure SDK passes a `ProcessErrorArgs` with the
|
|
154
|
+
// underlying error inside `args.error` plus contextual fields.
|
|
155
|
+
const processError = async (args) => {
|
|
156
|
+
console.error(`[AzureServiceBusAdapter] Error: ${args.error.message}`);
|
|
145
157
|
};
|
|
146
158
|
// Subscribe to messages
|
|
147
159
|
receiver.subscribe({
|
|
@@ -168,6 +180,27 @@ export class AzureServiceBusAdapter {
|
|
|
168
180
|
isConnected() {
|
|
169
181
|
return this.connected;
|
|
170
182
|
}
|
|
183
|
+
/**
|
|
184
|
+
* v0.7 PR 6 — publish to an Azure Service Bus topic.
|
|
185
|
+
*
|
|
186
|
+
* `partitionKey` maps to Service Bus's `partitionKey`; `orderingKey`
|
|
187
|
+
* maps to `sessionId` (for session-enabled topics).
|
|
188
|
+
*/
|
|
189
|
+
async publish(topic, payload, opts) {
|
|
190
|
+
if (!this.connected)
|
|
191
|
+
throw new Error("[blok][pubsub-azure] not connected. Call connect() first.");
|
|
192
|
+
const sender = this.requireClient().createSender(topic);
|
|
193
|
+
try {
|
|
194
|
+
await sender.sendMessages({
|
|
195
|
+
body: payload,
|
|
196
|
+
partitionKey: opts?.partitionKey,
|
|
197
|
+
sessionId: opts?.orderingKey,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
finally {
|
|
201
|
+
await sender.close();
|
|
202
|
+
}
|
|
203
|
+
}
|
|
171
204
|
/**
|
|
172
205
|
* Health check - verify Azure Service Bus connectivity
|
|
173
206
|
*/
|
|
@@ -176,7 +209,7 @@ export class AzureServiceBusAdapter {
|
|
|
176
209
|
return false;
|
|
177
210
|
try {
|
|
178
211
|
// Create a temporary receiver to test connectivity
|
|
179
|
-
const testReceiver = this.
|
|
212
|
+
const testReceiver = this.requireClient().createReceiver("$default", {
|
|
180
213
|
receiveMode: "peekLock",
|
|
181
214
|
});
|
|
182
215
|
await testReceiver.close();
|
|
@@ -189,4 +222,4 @@ export class AzureServiceBusAdapter {
|
|
|
189
222
|
}
|
|
190
223
|
}
|
|
191
224
|
export default AzureServiceBusAdapter;
|
|
192
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXp1cmVTZXJ2aWNlQnVzQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVycy9BenVyZVNlcnZpY2VCdXNBZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUdILE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBV2xDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHNCQUFzQjtJQUN6QixRQUFRLEdBQUcsT0FBZ0IsQ0FBQztJQUU3QixNQUFNLENBQU07SUFDWixTQUFTLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDeEMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNsQixNQUFNLENBQXdCO0lBRXRDLFlBQVksTUFBOEI7UUFDekMsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNiLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxnQkFBZ0IsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG1DQUFtQztZQUM3Rix1QkFBdUIsRUFDdEIsTUFBTSxFQUFFLHVCQUF1QixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkNBQTJDO1NBQzNGLENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsT0FBTztRQUNaLElBQUksSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPO1FBRTNCLElBQUksQ0FBQztZQUNKLHVDQUF1QztZQUN2QyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1lBRWhFLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUNsQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ2xFLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLHVC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RztJQUNILEtBQUssQ0FBQyxXQUFXO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRWxDLElBQUksQ0FBQztZQUNKLG1EQUFtRDtZQUNuRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLEVBQUU7Z0JBQzNELFdBQVcsRUFBRSxVQUFVO2FBQ3ZCLENBQUMsQ0FBQztZQUNILE1BQU0sWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzNCLE9BQU8sSUFBSSxDQUFDO1FBQ2IsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNSLGlFQUFpRTtZQUNqRSxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDdkIsQ0FBQztJQUNGLENBQUM7Q0FDRDtBQUVELGVBQWUsc0JBQXNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEF6dXJlU2VydmljZUJ1c0FkYXB0ZXIgLSBBenVyZSBTZXJ2aWNlIEJ1cyBhZGFwdGVyIGZvciBQdWJTdWJUcmlnZ2VyXG4gKlxuICogVXNlcyBAYXp1cmUvc2VydmljZS1idXMgZm9yIEF6dXJlIFNlcnZpY2UgQnVzIGNvbm5lY3Rpdml0eS5cbiAqIFJlcXVpcmVzOiBucG0gaW5zdGFsbCBAYXp1cmUvc2VydmljZS1idXNcbiAqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4gKiAtIEFaVVJFX1NFUlZJQ0VfQlVTX0NPTk5FQ1RJT05fU1RSSU5HOiBBenVyZSBTZXJ2aWNlIEJ1cyBjb25uZWN0aW9uIHN0cmluZ1xuICogLSBBWlVSRV9TRVJWSUNFX0JVU19GVUxMWV9RVUFMSUZJRURfTkFNRVNQQUNFOiBGdWxseSBxdWFsaWZpZWQgbmFtZXNwYWNlIChpZiB1c2luZyBEZWZhdWx0QXp1cmVDcmVkZW50aWFsKVxuICovXG5cbmltcG9ydCB0eXBlIHsgUHViU3ViVHJpZ2dlck9wdHMgfSBmcm9tIFwiQGJsb2tqcy9oZWxwZXJcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHR5cGUgeyBQdWJTdWJBZGFwdGVyLCBQdWJTdWJNZXNzYWdlIH0gZnJvbSBcIi4uL1B1YlN1YlRyaWdnZXJcIjtcblxuLyoqXG4gKiBBenVyZSBTZXJ2aWNlIEJ1cyBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXp1cmVTZXJ2aWNlQnVzQ29uZmlnIHtcblx0Y29ubmVjdGlvblN0cmluZz86IHN0cmluZztcblx0ZnVsbHlRdWFsaWZpZWROYW1lc3BhY2U/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQXp1cmVTZXJ2aWNlQnVzQWRhcHRlciAtIEF6dXJlIFNlcnZpY2UgQnVzIGltcGxlbWVudGF0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBBenVyZVNlcnZpY2VCdXNBZGFwdGVyIGltcGxlbWVudHMgUHViU3ViQWRhcHRlciB7XG5cdHJlYWRvbmx5IHByb3ZpZGVyID0gXCJhenVyZVwiIGFzIGNvbnN0O1xuXG5cdHByaXZhdGUgY2xpZW50OiBhbnk7XG5cdHByaXZhdGUgcmVjZWl2ZXJzOiBNYXA8c3RyaW5nLCBhbnk+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuXHRwcml2YXRlIGNvbmZpZzogQXp1cmVTZXJ2aWNlQnVzQ29uZmlnO1xuXG5cdGNvbnN0cnVjdG9yKGNvbmZpZz86IEF6dXJlU2VydmljZUJ1c0NvbmZpZykge1xuXHRcdHRoaXMuY29uZmlnID0ge1xuXHRcdFx0Y29ubmVjdGlvblN0cmluZzogY29uZmlnPy5jb25uZWN0aW9uU3RyaW5nIHx8IHByb2Nlc3MuZW52LkFaVVJFX1NFUlZJQ0VfQlVTX0NPTk5FQ1RJT05fU1RSSU5HLFxuXHRcdFx0ZnVsbHlRdWFsaWZpZWROYW1lc3BhY2U6XG5cdFx0XHRcdGNvbmZpZz8uZnVsbHlRdWFsaWZpZWROYW1lc3BhY2UgfHwgcHJvY2Vzcy5lbnYuQVpVUkVfU0VSVklDRV9CVVNfRlVMTFlfUVVBTElGSUVEX05BTUVTUEFDRSxcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbm5lY3QgdG8gQXp1cmUgU2VydmljZSBCdXNcblx0ICovXG5cdGFzeW5jIGNvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuY29ubmVjdGVkKSByZXR1cm47XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gRHluYW1pYyBpbXBvcnQgb2YgQGF6dXJlL3NlcnZpY2UtYnVzXG5cdFx0XHRjb25zdCB7IFNlcnZpY2VCdXNDbGllbnQgfSA9IGF3YWl0IGltcG9ydChcIkBhenVyZS9zZXJ2aWNlLWJ1c1wiKTtcblxuXHRcdFx0aWYgKHRoaXMuY29uZmlnLmNvbm5lY3Rpb25TdHJpbmcpIHtcblx0XHRcdFx0dGhpcy5jbGllbnQgPSBuZXcgU2VydmljZUJ1c0NsaWVudCh0aGlzLmNvbmZpZy5jb25uZWN0aW9uU3RyaW5nKTtcblx0XHRcdH0gZWxzZSBpZiAodGhpcy5jb25maWcuZnVsbHlRdWFsaWZpZWROYW1lc3BhY2UpIHtcblx0XHRcdFx0Ly8gV291bGQgbmVlZCBAYXp1cmUvaWRlbnRpdHkgZm9yIERlZmF1bHRBenVyZUNyZWRlbnRpYWxcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTWFuYWdlZCBpZGVudGl0eSBhdXRoZW50aWNhdGlvbiByZXF1aXJlcyBAYXp1cmUvaWRlbnRpdHkgcGFja2FnZVwiKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIkVpdGhlciBjb25uZWN0aW9uU3RyaW5nIG9yIGZ1bGx5UXVhbGlmaWVkTmFtZXNwYWNlIGlzIHJlcXVpcmVkXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmNvbm5lY3RlZCA9IHRydWU7XG5cdFx0XHRjb25zb2xlLmxvZyhcIltBenVyZVNlcnZpY2VCdXNBZGFwdGVyXSBDb25uZWN0ZWQgdG8gQXp1cmUgU2VydmljZSBCdXNcIik7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YEZhaWxlZCB0byBjb25uZWN0IHRvIEF6dXJlIFNlcnZpY2UgQnVzOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX0uIGAgK1xuXHRcdFx0XHRcdGBNYWtlIHN1cmUgQGF6dXJlL3NlcnZpY2UtYnVzIGlzIGluc3RhbGxlZDogbnBtIGluc3RhbGwgQGF6dXJlL3NlcnZpY2UtYnVzYCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERpc2Nvbm5lY3QgZnJvbSBBenVyZSBTZXJ2aWNlIEJ1c1xuXHQgKi9cblx0YXN5bmMgZGlzY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSByZXR1cm47XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gQ2xvc2UgYWxsIHJlY2VpdmVyc1xuXHRcdFx0Zm9yIChjb25zdCBbbmFtZSwgcmVjZWl2ZXJdIG9mIHRoaXMucmVjZWl2ZXJzKSB7XG5cdFx0XHRcdGF3YWl0IHJlY2VpdmVyLmNsb3NlKCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnJlY2VpdmVycy5jbGVhcigpO1xuXG5cdFx0XHRhd2FpdCB0aGlzLmNsaWVudC5jbG9zZSgpO1xuXHRcdFx0dGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcblx0XHRcdGNvbnNvbGUubG9nKFwiW0F6dXJlU2VydmljZUJ1c0FkYXB0ZXJdIERpc2Nvbm5lY3RlZCBmcm9tIEF6dXJlIFNlcnZpY2UgQnVzXCIpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKGBbQXp1cmVTZXJ2aWNlQnVzQWRhcHRlcl0gRXJyb3IgZGlzY29ubmVjdGluZzogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN1YnNjcmliZSB0byBhbiBBenVyZSBTZXJ2aWNlIEJ1cyB0b3BpYy9zdWJzY3JpcHRpb24gb3IgcXVldWVcblx0ICovXG5cdGFzeW5jIHN1YnNjcmliZShjb25maWc6IFB1YlN1YlRyaWdnZXJPcHRzLCBoYW5kbGVyOiAobWVzc2FnZTogUHViU3ViTWVzc2FnZSkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vdCBjb25uZWN0ZWQgdG8gQXp1cmUgU2VydmljZSBCdXMuIENhbGwgY29ubmVjdCgpIGZpcnN0LlwiKTtcblx0XHR9XG5cblx0XHRsZXQgcmVjZWl2ZXI6IGFueTtcblxuXHRcdC8vIERldGVybWluZSBpZiB0aGlzIGlzIGEgdG9waWMgc3Vic2NyaXB0aW9uIG9yIGEgcXVldWVcblx0XHRpZiAoY29uZmlnLnN1YnNjcmlwdGlvbiAmJiBjb25maWcudG9waWMpIHtcblx0XHRcdC8vIFRvcGljIHdpdGggc3Vic2NyaXB0aW9uXG5cdFx0XHRyZWNlaXZlciA9IHRoaXMuY2xpZW50LmNyZWF0ZVJlY2VpdmVyKGNvbmZpZy50b3BpYywgY29uZmlnLnN1YnNjcmlwdGlvbiwge1xuXHRcdFx0XHRyZWNlaXZlTW9kZTogY29uZmlnLmFjayAhPT0gZmFsc2UgPyBcInBlZWtMb2NrXCIgOiBcInJlY2VpdmVBbmREZWxldGVcIixcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBRdWV1ZVxuXHRcdFx0cmVjZWl2ZXIgPSB0aGlzLmNsaWVudC5jcmVhdGVSZWNlaXZlcihjb25maWcuc3Vic2NyaXB0aW9uIHx8IGNvbmZpZy50b3BpYywge1xuXHRcdFx0XHRyZWNlaXZlTW9kZTogY29uZmlnLmFjayAhPT0gZmFsc2UgPyBcInBlZWtMb2NrXCIgOiBcInJlY2VpdmVBbmREZWxldGVcIixcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGNvbnN0IHN1YnNjcmlwdGlvbktleSA9IGAke2NvbmZpZy50b3BpY30vJHtjb25maWcuc3Vic2NyaXB0aW9ufWA7XG5cblx0XHQvLyBNZXNzYWdlIGhhbmRsZXJcblx0XHRjb25zdCBwcm9jZXNzTWVzc2FnZSA9IGFzeW5jIChzYk1lc3NhZ2U6IGFueSkgPT4ge1xuXHRcdFx0Ly8gUGFyc2UgbWVzc2FnZSBib2R5XG5cdFx0XHRsZXQgYm9keTogdW5rbm93bjtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmICh0eXBlb2Ygc2JNZXNzYWdlLmJvZHkgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRib2R5ID0gSlNPTi5wYXJzZShzYk1lc3NhZ2UuYm9keSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ym9keSA9IHNiTWVzc2FnZS5ib2R5O1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0Ym9keSA9IHNiTWVzc2FnZS5ib2R5O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBFeHRyYWN0IGFwcGxpY2F0aW9uIHByb3BlcnRpZXMgYXMgYXR0cmlidXRlc1xuXHRcdFx0Y29uc3QgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXHRcdFx0aWYgKHNiTWVzc2FnZS5hcHBsaWNhdGlvblByb3BlcnRpZXMpIHtcblx0XHRcdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2JNZXNzYWdlLmFwcGxpY2F0aW9uUHJvcGVydGllcykpIHtcblx0XHRcdFx0XHRhdHRyaWJ1dGVzW2tleV0gPSBTdHJpbmcodmFsdWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIENyZWF0ZSBwdWIvc3ViIG1lc3NhZ2Vcblx0XHRcdGNvbnN0IHB1YnN1Yk1lc3NhZ2U6IFB1YlN1Yk1lc3NhZ2UgPSB7XG5cdFx0XHRcdGlkOiBzYk1lc3NhZ2UubWVzc2FnZUlkIHx8IHV1aWQoKSxcblx0XHRcdFx0Ym9keSxcblx0XHRcdFx0YXR0cmlidXRlcyxcblx0XHRcdFx0cmF3OiBzYk1lc3NhZ2UsXG5cdFx0XHRcdHRvcGljOiBjb25maWcudG9waWMsXG5cdFx0XHRcdHN1YnNjcmlwdGlvbjogY29uZmlnLnN1YnNjcmlwdGlvbixcblx0XHRcdFx0cHVibGlzaFRpbWU6IHNiTWVzc2FnZS5lbnF1ZXVlZFRpbWVVdGMgPyBuZXcgRGF0ZShzYk1lc3NhZ2UuZW5xdWV1ZWRUaW1lVXRjKSA6IG5ldyBEYXRlKCksXG5cdFx0XHRcdGFjazogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdGF3YWl0IHJlY2VpdmVyLmNvbXBsZXRlTWVzc2FnZShzYk1lc3NhZ2UpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRuYWNrOiBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgcmVjZWl2ZXIuYWJhbmRvbk1lc3NhZ2Uoc2JNZXNzYWdlKTtcblx0XHRcdFx0fSxcblx0XHRcdH07XG5cblx0XHRcdC8vIFByb2Nlc3MgbWVzc2FnZVxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgaGFuZGxlcihwdWJzdWJNZXNzYWdlKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoYFtBenVyZVNlcnZpY2VCdXNBZGFwdGVyXSBFcnJvciBwcm9jZXNzaW5nIG1lc3NhZ2U6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBFcnJvciBoYW5kbGVyXG5cdFx0Y29uc3QgcHJvY2Vzc0Vycm9yID0gYXN5bmMgKGVycm9yOiBFcnJvcikgPT4ge1xuXHRcdFx0Y29uc29sZS5lcnJvcihgW0F6dXJlU2VydmljZUJ1c0FkYXB0ZXJdIEVycm9yOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG5cdFx0fTtcblxuXHRcdC8vIFN1YnNjcmliZSB0byBtZXNzYWdlc1xuXHRcdHJlY2VpdmVyLnN1YnNjcmliZSh7XG5cdFx0XHRwcm9jZXNzTWVzc2FnZSxcblx0XHRcdHByb2Nlc3NFcnJvcixcblx0XHR9KTtcblxuXHRcdHRoaXMucmVjZWl2ZXJzLnNldChzdWJzY3JpcHRpb25LZXksIHJlY2VpdmVyKTtcblxuXHRcdGNvbnNvbGUubG9nKGBbQXp1cmVTZXJ2aWNlQnVzQWRhcHRlcl0gU3Vic2NyaWJlZCB0bzogJHtzdWJzY3JpcHRpb25LZXl9YCk7XG5cdH1cblxuXHQvKipcblx0ICogVW5zdWJzY3JpYmUgZnJvbSBBenVyZSBTZXJ2aWNlIEJ1c1xuXHQgKi9cblx0YXN5bmMgdW5zdWJzY3JpYmUoc3Vic2NyaXB0aW9uS2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCByZWNlaXZlciA9IHRoaXMucmVjZWl2ZXJzLmdldChzdWJzY3JpcHRpb25LZXkpO1xuXHRcdGlmIChyZWNlaXZlcikge1xuXHRcdFx0YXdhaXQgcmVjZWl2ZXIuY2xvc2UoKTtcblx0XHRcdHRoaXMucmVjZWl2ZXJzLmRlbGV0ZShzdWJzY3JpcHRpb25LZXkpO1xuXHRcdFx0Y29uc29sZS5sb2coYFtBenVyZVNlcnZpY2VCdXNBZGFwdGVyXSBVbnN1YnNjcmliZWQgZnJvbTogJHtzdWJzY3JpcHRpb25LZXl9YCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIGNvbm5lY3RlZCB0byBBenVyZSBTZXJ2aWNlIEJ1c1xuXHQgKi9cblx0aXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuY29ubmVjdGVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIEhlYWx0aCBjaGVjayAtIHZlcmlmeSBBenVyZSBTZXJ2aWNlIEJ1cyBjb25uZWN0aXZpdHlcblx0ICovXG5cdGFzeW5jIGhlYWx0aENoZWNrKCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHJldHVybiBmYWxzZTtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBDcmVhdGUgYSB0ZW1wb3JhcnkgcmVjZWl2ZXIgdG8gdGVzdCBjb25uZWN0aXZpdHlcblx0XHRcdGNvbnN0IHRlc3RSZWNlaXZlciA9IHRoaXMuY2xpZW50LmNyZWF0ZVJlY2VpdmVyKFwiJGRlZmF1bHRcIiwge1xuXHRcdFx0XHRyZWNlaXZlTW9kZTogXCJwZWVrTG9ja1wiLFxuXHRcdFx0fSk7XG5cdFx0XHRhd2FpdCB0ZXN0UmVjZWl2ZXIuY2xvc2UoKTtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0Ly8gUXVldWUgbWlnaHQgbm90IGV4aXN0IGJ1dCBjb25uZWN0aW9uIGlzIGhlYWx0aHkgaWYgd2UgZ290IGhlcmVcblx0XHRcdHJldHVybiB0aGlzLmNvbm5lY3RlZDtcblx0XHR9XG5cdH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQXp1cmVTZXJ2aWNlQnVzQWRhcHRlcjtcbiJdfQ==
|
|
225
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXp1cmVTZXJ2aWNlQnVzQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVycy9BenVyZVNlcnZpY2VCdXNBZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQVNILE9BQU8sRUFBRSxFQUFFLElBQUksSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBV2xDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLHNCQUFzQjtJQUN6QixRQUFRLEdBQUcsT0FBZ0IsQ0FBQztJQUU3QixNQUFNLENBQStCO0lBQ3JDLFNBQVMsR0FBb0MsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUN2RCxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLE1BQU0sQ0FBd0I7SUFFdEM7OztPQUdHO0lBQ0ssYUFBYTtRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkVBQTJFLENBQUMsQ0FBQztRQUM5RixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxZQUFZLE1BQThCO1FBQ3pDLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDYixnQkFBZ0IsRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQ0FBbUM7WUFDN0YsdUJBQXVCLEVBQ3RCLE1BQU0sRUFBRSx1QkFBdUIsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLDJDQUEyQztTQUMzRixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE9BQU87UUFDWixJQUFJLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTztRQUUzQixJQUFJLENBQUM7WUFDSix1Q0FBdUM7WUFDdkMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLEdBQUcsTUFBTSxNQUFNLENBQUMsb0JBQW9CLENBQUMsQ0FBQztZQUVoRSxJQUFJLElB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QUUsVUFBVTthQUN2QixDQUFDLENBQUM7WUFDSCxNQUFNLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUMzQixPQUFPLElBQUksQ0FBQztRQUNiLENBQUM7UUFBQyxNQUFNLENBQUM7WUFDUixpRUFBaUU7WUFDakUsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQ3ZCLENBQUM7SUFDRixDQUFDO0NBQ0Q7QUFFRCxlQUFlLHNCQUFzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBenVyZVNlcnZpY2VCdXNBZGFwdGVyIC0gQXp1cmUgU2VydmljZSBCdXMgYWRhcHRlciBmb3IgUHViU3ViVHJpZ2dlclxuICpcbiAqIFVzZXMgQGF6dXJlL3NlcnZpY2UtYnVzIGZvciBBenVyZSBTZXJ2aWNlIEJ1cyBjb25uZWN0aXZpdHkuXG4gKiBSZXF1aXJlczogbnBtIGluc3RhbGwgQGF6dXJlL3NlcnZpY2UtYnVzXG4gKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogLSBBWlVSRV9TRVJWSUNFX0JVU19DT05ORUNUSU9OX1NUUklORzogQXp1cmUgU2VydmljZSBCdXMgY29ubmVjdGlvbiBzdHJpbmdcbiAqIC0gQVpVUkVfU0VSVklDRV9CVVNfRlVMTFlfUVVBTElGSUVEX05BTUVTUEFDRTogRnVsbHkgcXVhbGlmaWVkIG5hbWVzcGFjZSAoaWYgdXNpbmcgRGVmYXVsdEF6dXJlQ3JlZGVudGlhbClcbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG5cdFByb2Nlc3NFcnJvckFyZ3MsXG5cdFNlcnZpY2VCdXNDbGllbnQsXG5cdFNlcnZpY2VCdXNSZWNlaXZlZE1lc3NhZ2UsXG5cdFNlcnZpY2VCdXNSZWNlaXZlcixcbn0gZnJvbSBcIkBhenVyZS9zZXJ2aWNlLWJ1c1wiO1xuaW1wb3J0IHR5cGUgeyBQdWJTdWJUcmlnZ2VyT3B0cyB9IGZyb20gXCJAYmxva2pzL2hlbHBlclwiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gXCJ1dWlkXCI7XG5pbXBvcnQgdHlwZSB7IFB1YlN1YkFkYXB0ZXIsIFB1YlN1Yk1lc3NhZ2UgfSBmcm9tIFwiLi4vUHViU3ViVHJpZ2dlclwiO1xuXG4vKipcbiAqIEF6dXJlIFNlcnZpY2UgQnVzIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBenVyZVNlcnZpY2VCdXNDb25maWcge1xuXHRjb25uZWN0aW9uU3RyaW5nPzogc3RyaW5nO1xuXHRmdWxseVF1YWxpZmllZE5hbWVzcGFjZT86IHN0cmluZztcbn1cblxuLyoqXG4gKiBBenVyZVNlcnZpY2VCdXNBZGFwdGVyIC0gQXp1cmUgU2VydmljZSBCdXMgaW1wbGVtZW50YXRpb25cbiAqL1xuZXhwb3J0IGNsYXNzIEF6dXJlU2VydmljZUJ1c0FkYXB0ZXIgaW1wbGVtZW50cyBQdWJTdWJBZGFwdGVyIHtcblx0cmVhZG9ubHkgcHJvdmlkZXIgPSBcImF6dXJlXCIgYXMgY29uc3Q7XG5cblx0cHJpdmF0ZSBjbGllbnQ6IFNlcnZpY2VCdXNDbGllbnQgfCB1bmRlZmluZWQ7XG5cdHByaXZhdGUgcmVjZWl2ZXJzOiBNYXA8c3RyaW5nLCBTZXJ2aWNlQnVzUmVjZWl2ZXI+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuXHRwcml2YXRlIGNvbmZpZzogQXp1cmVTZXJ2aWNlQnVzQ29uZmlnO1xuXG5cdC8qKlxuXHQgKiBUeXBlLW5hcnJvd2luZyBhY2Nlc3NvciBmb3IgYHRoaXMuY2xpZW50YC4gRmllbGQgaXMgdW5kZWZpbmVkIHVudGlsXG5cdCAqIGBjb25uZWN0KClgIHJ1bnMuXG5cdCAqL1xuXHRwcml2YXRlIHJlcXVpcmVDbGllbnQoKTogU2VydmljZUJ1c0NsaWVudCB7XG5cdFx0aWYgKCF0aGlzLmNsaWVudCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiW0F6dXJlU2VydmljZUJ1c0FkYXB0ZXJdIGNsaWVudCBpcyBub3QgaW5pdGlhbGlzZWQg4oCUIGNhbGwgY29ubmVjdCgpIGZpcnN0XCIpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5jbGllbnQ7XG5cdH1cblxuXHRjb25zdHJ1Y3Rvcihjb25maWc/OiBBenVyZVNlcnZpY2VCdXNDb25maWcpIHtcblx0XHR0aGlzLmNvbmZpZyA9IHtcblx0XHRcdGNvbm5lY3Rpb25TdHJpbmc6IGNvbmZpZz8uY29ubmVjdGlvblN0cmluZyB8fCBwcm9jZXNzLmVudi5BWlVSRV9TRVJWSUNFX0JVU19DT05ORUNUSU9OX1NUUklORyxcblx0XHRcdGZ1bGx5UXVhbGlmaWVkTmFtZXNwYWNlOlxuXHRcdFx0XHRjb25maWc/LmZ1bGx5UXVhbGlmaWVkTmFtZXNwYWNlIHx8IHByb2Nlc3MuZW52LkFaVVJFX1NFUlZJQ0VfQlVTX0ZVTExZX1FVQUxJRklFRF9OQU1FU1BBQ0UsXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb25uZWN0IHRvIEF6dXJlIFNlcnZpY2UgQnVzXG5cdCAqL1xuXHRhc3luYyBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICh0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIER5bmFtaWMgaW1wb3J0IG9mIEBhenVyZS9zZXJ2aWNlLWJ1c1xuXHRcdFx0Y29uc3QgeyBTZXJ2aWNlQnVzQ2xpZW50IH0gPSBhd2FpdCBpbXBvcnQoXCJAYXp1cmUvc2VydmljZS1idXNcIik7XG5cblx0XHRcdGlmICh0aGlzLmNvbmZpZy5jb25uZWN0aW9uU3RyaW5nKSB7XG5cdFx0XHRcdHRoaXMuY2xpZW50ID0gbmV3IFNlcnZpY2VCdXNDbGllbnQodGhpcy5jb25maWcuY29ubmVjdGlvblN0cmluZyk7XG5cdFx0XHR9IGVsc2UgaWYgKHRoaXMuY29uZmlnLmZ1bGx5UXVhbGlmaWVkTmFtZXNwYWNlKSB7XG5cdFx0XHRcdC8vIFdvdWxkIG5lZWQgQGF6dXJlL2lkZW50aXR5IGZvciBEZWZhdWx0QXp1cmVDcmVkZW50aWFsXG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcIk1hbmFnZWQgaWRlbnRpdHkgYXV0aGVudGljYXRpb24gcmVxdWlyZXMgQGF6dXJlL2lkZW50aXR5IHBhY2thZ2VcIik7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJFaXRoZXIgY29ubmVjdGlvblN0cmluZyBvciBmdWxseVF1YWxpZmllZE5hbWVzcGFjZSBpcyByZXF1aXJlZFwiKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuXHRcdFx0Y29uc29sZS5sb2coXCJbQXp1cmVTZXJ2aWNlQnVzQWRhcHRlcl0gQ29ubmVjdGVkIHRvIEF6dXJlIFNlcnZpY2UgQnVzXCIpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdGBGYWlsZWQgdG8gY29ubmVjdCB0byBBenVyZSBTZXJ2aWNlIEJ1czogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9LiBNYWtlIHN1cmUgQGF6dXJlL3NlcnZpY2UtYnVzIGlzIGluc3RhbGxlZDogbnBtIGluc3RhbGwgQGF6dXJlL3NlcnZpY2UtYnVzYCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIERpc2Nvbm5lY3QgZnJvbSBBenVyZSBTZXJ2aWNlIEJ1c1xuXHQgKi9cblx0YXN5bmMgZGlzY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSByZXR1cm47XG5cblx0XHR0cnkge1xuXHRcdFx0Ly8gQ2xvc2UgYWxsIHJlY2VpdmVyc1xuXHRcdFx0Zm9yIChjb25zdCBbbmFtZSwgcmVjZWl2ZXJdIG9mIHRoaXMucmVjZWl2ZXJzKSB7XG5cdFx0XHRcdGF3YWl0IHJlY2VpdmVyLmNsb3NlKCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnJlY2VpdmVycy5jbGVhcigpO1xuXG5cdFx0XHRhd2FpdCB0aGlzLnJlcXVpcmVDbGllbnQoKS5jbG9zZSgpO1xuXHRcdFx0dGhpcy5jb25uZWN0ZWQgPSBmYWxzZTtcblx0XHRcdGNvbnNvbGUubG9nKFwiW0F6dXJlU2VydmljZUJ1c0FkYXB0ZXJdIERpc2Nvbm5lY3RlZCBmcm9tIEF6dXJlIFNlcnZpY2UgQnVzXCIpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRjb25zb2xlLmVycm9yKGBbQXp1cmVTZXJ2aWNlQnVzQWRhcHRlcl0gRXJyb3IgZGlzY29ubmVjdGluZzogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9YCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIFN1YnNjcmliZSB0byBhbiBBenVyZSBTZXJ2aWNlIEJ1cyB0b3BpYy9zdWJzY3JpcHRpb24gb3IgcXVldWVcblx0ICovXG5cdGFzeW5jIHN1YnNjcmliZShjb25maWc6IFB1YlN1YlRyaWdnZXJPcHRzLCBoYW5kbGVyOiAobWVzc2FnZTogUHViU3ViTWVzc2FnZSkgPT4gUHJvbWlzZTx2b2lkPik6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcIk5vdCBjb25uZWN0ZWQgdG8gQXp1cmUgU2VydmljZSBCdXMuIENhbGwgY29ubmVjdCgpIGZpcnN0LlwiKTtcblx0XHR9XG5cblx0XHRjb25zdCBjbGllbnQgPSB0aGlzLnJlcXVpcmVDbGllbnQoKTtcblx0XHRsZXQgcmVjZWl2ZXI6IFNlcnZpY2VCdXNSZWNlaXZlcjtcblxuXHRcdC8vIERldGVybWluZSBpZiB0aGlzIGlzIGEgdG9waWMgc3Vic2NyaXB0aW9uIG9yIGEgcXVldWVcblx0XHRpZiAoY29uZmlnLnN1YnNjcmlwdGlvbiAmJiBjb25maWcudG9waWMpIHtcblx0XHRcdC8vIFRvcGljIHdpdGggc3Vic2NyaXB0aW9uXG5cdFx0XHRyZWNlaXZlciA9IGNsaWVudC5jcmVhdGVSZWNlaXZlcihjb25maWcudG9waWMsIGNvbmZpZy5zdWJzY3JpcHRpb24sIHtcblx0XHRcdFx0cmVjZWl2ZU1vZGU6IGNvbmZpZy5hY2sgIT09IGZhbHNlID8gXCJwZWVrTG9ja1wiIDogXCJyZWNlaXZlQW5kRGVsZXRlXCIsXG5cdFx0XHR9KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gUXVldWVcblx0XHRcdHJlY2VpdmVyID0gY2xpZW50LmNyZWF0ZVJlY2VpdmVyKGNvbmZpZy5zdWJzY3JpcHRpb24gfHwgY29uZmlnLnRvcGljLCB7XG5cdFx0XHRcdHJlY2VpdmVNb2RlOiBjb25maWcuYWNrICE9PSBmYWxzZSA/IFwicGVla0xvY2tcIiA6IFwicmVjZWl2ZUFuZERlbGV0ZVwiLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0Y29uc3Qgc3Vic2NyaXB0aW9uS2V5ID0gYCR7Y29uZmlnLnRvcGljfS8ke2NvbmZpZy5zdWJzY3JpcHRpb259YDtcblxuXHRcdC8vIE1lc3NhZ2UgaGFuZGxlclxuXHRcdGNvbnN0IHByb2Nlc3NNZXNzYWdlID0gYXN5bmMgKHNiTWVzc2FnZTogU2VydmljZUJ1c1JlY2VpdmVkTWVzc2FnZSkgPT4ge1xuXHRcdFx0Ly8gUGFyc2UgbWVzc2FnZSBib2R5XG5cdFx0XHRsZXQgYm9keTogdW5rbm93bjtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmICh0eXBlb2Ygc2JNZXNzYWdlLmJvZHkgPT09IFwic3RyaW5nXCIpIHtcblx0XHRcdFx0XHRib2R5ID0gSlNPTi5wYXJzZShzYk1lc3NhZ2UuYm9keSk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ym9keSA9IHNiTWVzc2FnZS5ib2R5O1xuXHRcdFx0XHR9XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0Ym9keSA9IHNiTWVzc2FnZS5ib2R5O1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBFeHRyYWN0IGFwcGxpY2F0aW9uIHByb3BlcnRpZXMgYXMgYXR0cmlidXRlc1xuXHRcdFx0Y29uc3QgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXHRcdFx0aWYgKHNiTWVzc2FnZS5hcHBsaWNhdGlvblByb3BlcnRpZXMpIHtcblx0XHRcdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2JNZXNzYWdlLmFwcGxpY2F0aW9uUHJvcGVydGllcykpIHtcblx0XHRcdFx0XHRhdHRyaWJ1dGVzW2tleV0gPSBTdHJpbmcodmFsdWUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIENyZWF0ZSBwdWIvc3ViIG1lc3NhZ2Vcblx0XHRcdGNvbnN0IHB1YnN1Yk1lc3NhZ2U6IFB1YlN1Yk1lc3NhZ2UgPSB7XG5cdFx0XHRcdC8vIGBtZXNzYWdlSWRgIG1heSBiZSBzdHJpbmcgfCBudW1iZXIgfCBCdWZmZXIgcGVyIEF6dXJlIFNESzsgY29lcmNlIHRvIHN0cmluZy5cblx0XHRcdFx0aWQ6IHNiTWVzc2FnZS5tZXNzYWdlSWQgIT09IHVuZGVmaW5lZCA/IFN0cmluZyhzYk1lc3NhZ2UubWVzc2FnZUlkKSA6IHV1aWQoKSxcblx0XHRcdFx0Ym9keSxcblx0XHRcdFx0YXR0cmlidXRlcyxcblx0XHRcdFx0cmF3OiBzYk1lc3NhZ2UsXG5cdFx0XHRcdHRvcGljOiBjb25maWcudG9waWMsXG5cdFx0XHRcdHN1YnNjcmlwdGlvbjogY29uZmlnLnN1YnNjcmlwdGlvbixcblx0XHRcdFx0cHVibGlzaFRpbWU6IHNiTWVzc2FnZS5lbnF1ZXVlZFRpbWVVdGMgPyBuZXcgRGF0ZShzYk1lc3NhZ2UuZW5xdWV1ZWRUaW1lVXRjKSA6IG5ldyBEYXRlKCksXG5cdFx0XHRcdGFjazogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdGF3YWl0IHJlY2VpdmVyLmNvbXBsZXRlTWVzc2FnZShzYk1lc3NhZ2UpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRuYWNrOiBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0YXdhaXQgcmVjZWl2ZXIuYWJhbmRvbk1lc3NhZ2Uoc2JNZXNzYWdlKTtcblx0XHRcdFx0fSxcblx0XHRcdH07XG5cblx0XHRcdC8vIFByb2Nlc3MgbWVzc2FnZVxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgaGFuZGxlcihwdWJzdWJNZXNzYWdlKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoYFtBenVyZVNlcnZpY2VCdXNBZGFwdGVyXSBFcnJvciBwcm9jZXNzaW5nIG1lc3NhZ2U6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBFcnJvciBoYW5kbGVyIOKAlCBBenVyZSBTREsgcGFzc2VzIGEgYFByb2Nlc3NFcnJvckFyZ3NgIHdpdGggdGhlXG5cdFx0Ly8gdW5kZXJseWluZyBlcnJvciBpbnNpZGUgYGFyZ3MuZXJyb3JgIHBsdXMgY29udGV4dHVhbCBmaWVsZHMuXG5cdFx0Y29uc3QgcHJvY2Vzc0Vycm9yID0gYXN5bmMgKGFyZ3M6IFByb2Nlc3NFcnJvckFyZ3MpID0+IHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYFtBenVyZVNlcnZpY2VCdXNBZGFwdGVyXSBFcnJvcjogJHthcmdzLmVycm9yLm1lc3NhZ2V9YCk7XG5cdFx0fTtcblxuXHRcdC8vIFN1YnNjcmliZSB0byBtZXNzYWdlc1xuXHRcdHJlY2VpdmVyLnN1YnNjcmliZSh7XG5cdFx0XHRwcm9jZXNzTWVzc2FnZSxcblx0XHRcdHByb2Nlc3NFcnJvcixcblx0XHR9KTtcblxuXHRcdHRoaXMucmVjZWl2ZXJzLnNldChzdWJzY3JpcHRpb25LZXksIHJlY2VpdmVyKTtcblxuXHRcdGNvbnNvbGUubG9nKGBbQXp1cmVTZXJ2aWNlQnVzQWRhcHRlcl0gU3Vic2NyaWJlZCB0bzogJHtzdWJzY3JpcHRpb25LZXl9YCk7XG5cdH1cblxuXHQvKipcblx0ICogVW5zdWJzY3JpYmUgZnJvbSBBenVyZSBTZXJ2aWNlIEJ1c1xuXHQgKi9cblx0YXN5bmMgdW5zdWJzY3JpYmUoc3Vic2NyaXB0aW9uS2V5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCByZWNlaXZlciA9IHRoaXMucmVjZWl2ZXJzLmdldChzdWJzY3JpcHRpb25LZXkpO1xuXHRcdGlmIChyZWNlaXZlcikge1xuXHRcdFx0YXdhaXQgcmVjZWl2ZXIuY2xvc2UoKTtcblx0XHRcdHRoaXMucmVjZWl2ZXJzLmRlbGV0ZShzdWJzY3JpcHRpb25LZXkpO1xuXHRcdFx0Y29uc29sZS5sb2coYFtBenVyZVNlcnZpY2VCdXNBZGFwdGVyXSBVbnN1YnNjcmliZWQgZnJvbTogJHtzdWJzY3JpcHRpb25LZXl9YCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIGNvbm5lY3RlZCB0byBBenVyZSBTZXJ2aWNlIEJ1c1xuXHQgKi9cblx0aXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuY29ubmVjdGVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIHYwLjcgUFIgNiDigJQgcHVibGlzaCB0byBhbiBBenVyZSBTZXJ2aWNlIEJ1cyB0b3BpYy5cblx0ICpcblx0ICogYHBhcnRpdGlvbktleWAgbWFwcyB0byBTZXJ2aWNlIEJ1cydzIGBwYXJ0aXRpb25LZXlgOyBgb3JkZXJpbmdLZXlgXG5cdCAqIG1hcHMgdG8gYHNlc3Npb25JZGAgKGZvciBzZXNzaW9uLWVuYWJsZWQgdG9waWNzKS5cblx0ICovXG5cdGFzeW5jIHB1Ymxpc2goXG5cdFx0dG9waWM6IHN0cmluZyxcblx0XHRwYXlsb2FkOiB1bmtub3duLFxuXHRcdG9wdHM/OiB7IHBhcnRpdGlvbktleT86IHN0cmluZzsgb3JkZXJpbmdLZXk/OiBzdHJpbmcgfSxcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgdGhyb3cgbmV3IEVycm9yKFwiW2Jsb2tdW3B1YnN1Yi1henVyZV0gbm90IGNvbm5lY3RlZC4gQ2FsbCBjb25uZWN0KCkgZmlyc3QuXCIpO1xuXHRcdGNvbnN0IHNlbmRlciA9IHRoaXMucmVxdWlyZUNsaWVudCgpLmNyZWF0ZVNlbmRlcih0b3BpYyk7XG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHNlbmRlci5zZW5kTWVzc2FnZXMoe1xuXHRcdFx0XHRib2R5OiBwYXlsb2FkLFxuXHRcdFx0XHRwYXJ0aXRpb25LZXk6IG9wdHM/LnBhcnRpdGlvbktleSxcblx0XHRcdFx0c2Vzc2lvbklkOiBvcHRzPy5vcmRlcmluZ0tleSxcblx0XHRcdH0pO1xuXHRcdH0gZmluYWxseSB7XG5cdFx0XHRhd2FpdCBzZW5kZXIuY2xvc2UoKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogSGVhbHRoIGNoZWNrIC0gdmVyaWZ5IEF6dXJlIFNlcnZpY2UgQnVzIGNvbm5lY3Rpdml0eVxuXHQgKi9cblx0YXN5bmMgaGVhbHRoQ2hlY2soKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIENyZWF0ZSBhIHRlbXBvcmFyeSByZWNlaXZlciB0byB0ZXN0IGNvbm5lY3Rpdml0eVxuXHRcdFx0Y29uc3QgdGVzdFJlY2VpdmVyID0gdGhpcy5yZXF1aXJlQ2xpZW50KCkuY3JlYXRlUmVjZWl2ZXIoXCIkZGVmYXVsdFwiLCB7XG5cdFx0XHRcdHJlY2VpdmVNb2RlOiBcInBlZWtMb2NrXCIsXG5cdFx0XHR9KTtcblx0XHRcdGF3YWl0IHRlc3RSZWNlaXZlci5jbG9zZSgpO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHQvLyBRdWV1ZSBtaWdodCBub3QgZXhpc3QgYnV0IGNvbm5lY3Rpb24gaXMgaGVhbHRoeSBpZiB3ZSBnb3QgaGVyZVxuXHRcdFx0cmV0dXJuIHRoaXMuY29ubmVjdGVkO1xuXHRcdH1cblx0fVxufVxuXG5leHBvcnQgZGVmYXVsdCBBenVyZVNlcnZpY2VCdXNBZGFwdGVyO1xuIl19
|
|
@@ -30,6 +30,11 @@ export declare class GCPPubSubAdapter implements PubSubAdapter {
|
|
|
30
30
|
private subscriptions;
|
|
31
31
|
private connected;
|
|
32
32
|
private config;
|
|
33
|
+
/**
|
|
34
|
+
* Type-narrowing accessor for `this.client`. Field is undefined until
|
|
35
|
+
* `connect()` runs.
|
|
36
|
+
*/
|
|
37
|
+
private requireClient;
|
|
33
38
|
constructor(config?: GCPPubSubConfig);
|
|
34
39
|
/**
|
|
35
40
|
* Connect to GCP Pub/Sub
|
|
@@ -51,6 +56,17 @@ export declare class GCPPubSubAdapter implements PubSubAdapter {
|
|
|
51
56
|
* Check if connected to GCP Pub/Sub
|
|
52
57
|
*/
|
|
53
58
|
isConnected(): boolean;
|
|
59
|
+
/**
|
|
60
|
+
* v0.7 PR 6 — publish to a GCP Pub/Sub topic.
|
|
61
|
+
*
|
|
62
|
+
* `partitionKey` / `orderingKey` map to GCP's `orderingKey` (the
|
|
63
|
+
* topic must have message ordering enabled — otherwise the field
|
|
64
|
+
* is ignored by the broker).
|
|
65
|
+
*/
|
|
66
|
+
publish(topic: string, payload: unknown, opts?: {
|
|
67
|
+
partitionKey?: string;
|
|
68
|
+
orderingKey?: string;
|
|
69
|
+
}): Promise<void>;
|
|
54
70
|
/**
|
|
55
71
|
* Health check - verify GCP Pub/Sub connectivity
|
|
56
72
|
*/
|
|
@@ -19,6 +19,16 @@ export class GCPPubSubAdapter {
|
|
|
19
19
|
subscriptions = new Map();
|
|
20
20
|
connected = false;
|
|
21
21
|
config;
|
|
22
|
+
/**
|
|
23
|
+
* Type-narrowing accessor for `this.client`. Field is undefined until
|
|
24
|
+
* `connect()` runs.
|
|
25
|
+
*/
|
|
26
|
+
requireClient() {
|
|
27
|
+
if (!this.client) {
|
|
28
|
+
throw new Error("[GCPPubSubAdapter] client is not initialised — call connect() first");
|
|
29
|
+
}
|
|
30
|
+
return this.client;
|
|
31
|
+
}
|
|
22
32
|
constructor(config) {
|
|
23
33
|
this.config = {
|
|
24
34
|
projectId: config?.projectId || process.env.GOOGLE_CLOUD_PROJECT,
|
|
@@ -42,8 +52,7 @@ export class GCPPubSubAdapter {
|
|
|
42
52
|
console.log(`[GCPPubSubAdapter] Connected to GCP Pub/Sub: ${this.config.projectId}`);
|
|
43
53
|
}
|
|
44
54
|
catch (error) {
|
|
45
|
-
throw new Error(`Failed to connect to GCP Pub/Sub: ${error.message}. `
|
|
46
|
-
`Make sure @google-cloud/pubsub is installed: npm install @google-cloud/pubsub`);
|
|
55
|
+
throw new Error(`Failed to connect to GCP Pub/Sub: ${error.message}. Make sure @google-cloud/pubsub is installed: npm install @google-cloud/pubsub`);
|
|
47
56
|
}
|
|
48
57
|
}
|
|
49
58
|
/**
|
|
@@ -58,7 +67,7 @@ export class GCPPubSubAdapter {
|
|
|
58
67
|
await subscription.close();
|
|
59
68
|
}
|
|
60
69
|
this.subscriptions.clear();
|
|
61
|
-
await this.
|
|
70
|
+
await this.requireClient().close();
|
|
62
71
|
this.connected = false;
|
|
63
72
|
console.log("[GCPPubSubAdapter] Disconnected from GCP Pub/Sub");
|
|
64
73
|
}
|
|
@@ -73,13 +82,21 @@ export class GCPPubSubAdapter {
|
|
|
73
82
|
if (!this.connected) {
|
|
74
83
|
throw new Error("Not connected to GCP Pub/Sub. Call connect() first.");
|
|
75
84
|
}
|
|
85
|
+
if (!config.subscription) {
|
|
86
|
+
throw new Error("[GCPPubSubAdapter] `subscription` is required — must be the GCP subscription name.");
|
|
87
|
+
}
|
|
76
88
|
const subscriptionName = config.subscription;
|
|
77
|
-
// Get the subscription
|
|
78
|
-
|
|
89
|
+
// Get the subscription. The GCP SDK calls the per-subscription
|
|
90
|
+
// deadline `maxAckDeadline` (a `Duration`); our author-facing
|
|
91
|
+
// field is `ackDeadline` (seconds) for parity with other
|
|
92
|
+
// providers. `Duration` is the GCP SDK's tc39-Temporal-shaped
|
|
93
|
+
// shim — construct via `Duration.from({seconds})`.
|
|
94
|
+
const { Duration } = await import("@google-cloud/pubsub");
|
|
95
|
+
const subscription = this.requireClient().subscription(subscriptionName, {
|
|
79
96
|
flowControl: {
|
|
80
97
|
maxMessages: config.maxMessages || 10,
|
|
81
98
|
},
|
|
82
|
-
|
|
99
|
+
maxAckDeadline: Duration.from({ seconds: config.ackDeadline || 30 }),
|
|
83
100
|
});
|
|
84
101
|
// Message handler
|
|
85
102
|
const messageHandler = async (gcpMessage) => {
|
|
@@ -144,6 +161,23 @@ export class GCPPubSubAdapter {
|
|
|
144
161
|
isConnected() {
|
|
145
162
|
return this.connected;
|
|
146
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* v0.7 PR 6 — publish to a GCP Pub/Sub topic.
|
|
166
|
+
*
|
|
167
|
+
* `partitionKey` / `orderingKey` map to GCP's `orderingKey` (the
|
|
168
|
+
* topic must have message ordering enabled — otherwise the field
|
|
169
|
+
* is ignored by the broker).
|
|
170
|
+
*/
|
|
171
|
+
async publish(topic, payload, opts) {
|
|
172
|
+
if (!this.connected)
|
|
173
|
+
throw new Error("[blok][pubsub-gcp] not connected. Call connect() first.");
|
|
174
|
+
const body = typeof payload === "string" ? payload : JSON.stringify(payload);
|
|
175
|
+
const t = this.requireClient().topic(topic);
|
|
176
|
+
await t.publishMessage({
|
|
177
|
+
data: Buffer.from(body),
|
|
178
|
+
orderingKey: opts?.orderingKey ?? opts?.partitionKey,
|
|
179
|
+
});
|
|
180
|
+
}
|
|
147
181
|
/**
|
|
148
182
|
* Health check - verify GCP Pub/Sub connectivity
|
|
149
183
|
*/
|
|
@@ -152,7 +186,7 @@ export class GCPPubSubAdapter {
|
|
|
152
186
|
return false;
|
|
153
187
|
try {
|
|
154
188
|
// List subscriptions as a health check
|
|
155
|
-
const [subscriptions] = await this.
|
|
189
|
+
const [subscriptions] = await this.requireClient().getSubscriptions({ pageSize: 1 });
|
|
156
190
|
return true;
|
|
157
191
|
}
|
|
158
192
|
catch {
|
|
@@ -161,4 +195,4 @@ export class GCPPubSubAdapter {
|
|
|
161
195
|
}
|
|
162
196
|
}
|
|
163
197
|
export default GCPPubSubAdapter;
|
|
164
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR0NQUHViU3ViQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVycy9HQ1BQdWJTdWJBZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFHSCxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQWNsQzs7R0FFRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFDbkIsUUFBUSxHQUFHLEtBQWMsQ0FBQztJQUUzQixNQUFNLENBQU07SUFDWixhQUFhLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUM7SUFDNUMsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUNsQixNQUFNLENBQWtCO0lBRWhDLFlBQVksTUFBd0I7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRztZQUNiLFNBQVMsRUFBRSxNQUFNLEVBQUUsU0FBUyxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CO1lBQ2hFLFdBQVcsRUFBRSxNQUFNLEVBQUUsV0FBVztTQUNoQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLE9BQU87UUFDWixJQUFJLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTztRQUUzQixJQUFJLENBQUM7WUFDSix5Q0FBeUM7WUFDekMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLE1BQU0sTUFBTSxDQUFDLHNCQUFzQixDQUFDLENBQUM7WUFFeEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQztnQkFDeEIsU0FBUyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUztnQkFDaEMsV0FBVyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVzthQUNwQyxDQUFDLENBQUM7WUFFSCxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztZQUN0QixPQUFPLENBQUMsR0FBRyxDQUFDLGdEQUFnRCxJQUFJLENBQUMsTUFBTSxDQUFD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SUFDRixDQUFDO0lBRUQ7O09BRUc7SUFDSCxXQUFXO1FBQ1YsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxXQUFXO1FBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRWxDLElBQUksQ0FBQztZQUNKLHVDQUF1QztZQUN2QyxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUUsT0FBTyxJQUFJLENBQUM7UUFDYixDQUFDO1FBQUMsTUFBTSxDQUFDO1lBQ1IsT0FBTyxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0YsQ0FBQztDQUNEO0FBRUQsZUFBZSxnQkFBZ0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR0NQUHViU3ViQWRhcHRlciAtIEdvb2dsZSBDbG91ZCBQdWIvU3ViIGFkYXB0ZXIgZm9yIFB1YlN1YlRyaWdnZXJcbiAqXG4gKiBVc2VzIEBnb29nbGUtY2xvdWQvcHVic3ViIGZvciBHQ1AgUHViL1N1YiBjb25uZWN0aXZpdHkuXG4gKiBSZXF1aXJlczogbnBtIGluc3RhbGwgQGdvb2dsZS1jbG91ZC9wdWJzdWJcbiAqXG4gKiBFbnZpcm9ubWVudCB2YXJpYWJsZXM6XG4gKiAtIEdPT0dMRV9DTE9VRF9QUk9KRUNUOiBHQ1AgcHJvamVjdCBJRFxuICogLSBHT09HTEVfQVBQTElDQVRJT05fQ1JFREVOVElBTFM6IFBhdGggdG8gc2VydmljZSBhY2NvdW50IGtleSBmaWxlIChvcHRpb25hbCBpZiB1c2luZyBkZWZhdWx0IGNyZWRlbnRpYWxzKVxuICogLSBQVUJTVUJfRU1VTEFUT1JfSE9TVDogUHViL1N1YiBlbXVsYXRvciBob3N0IGZvciBsb2NhbCBkZXZlbG9wbWVudCAob3B0aW9uYWwpXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBQdWJTdWJUcmlnZ2VyT3B0cyB9IGZyb20gXCJAYmxva2pzL2hlbHBlclwiO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gXCJ1dWlkXCI7XG5pbXBvcnQgdHlwZSB7IFB1YlN1YkFkYXB0ZXIsIFB1YlN1Yk1lc3NhZ2UgfSBmcm9tIFwiLi4vUHViU3ViVHJpZ2dlclwiO1xuXG4vKipcbiAqIEdDUCBQdWIvU3ViIGNvbmZpZ3VyYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBHQ1BQdWJTdWJDb25maWcge1xuXHRwcm9qZWN0SWQ/OiBzdHJpbmc7XG5cdGNyZWRlbnRpYWxzPzoge1xuXHRcdGNsaWVudF9lbWFpbDogc3RyaW5nO1xuXHRcdHByaXZhdGVfa2V5OiBzdHJpbmc7XG5cdH07XG59XG5cbi8qKlxuICogR0NQUHViU3ViQWRhcHRlciAtIEdvb2dsZSBDbG91ZCBQdWIvU3ViIGltcGxlbWVudGF0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBHQ1BQdWJTdWJBZGFwdGVyIGltcGxlbWVudHMgUHViU3ViQWRhcHRlciB7XG5cdHJlYWRvbmx5IHByb3ZpZGVyID0gXCJnY3BcIiBhcyBjb25zdDtcblxuXHRwcml2YXRlIGNsaWVudDogYW55O1xuXHRwcml2YXRlIHN1YnNjcmlwdGlvbnM6IE1hcDxzdHJpbmcsIGFueT4gPSBuZXcgTWFwKCk7XG5cdHByaXZhdGUgY29ubmVjdGVkID0gZmFsc2U7XG5cdHByaXZhdGUgY29uZmlnOiBHQ1BQdWJTdWJDb25maWc7XG5cblx0Y29uc3RydWN0b3IoY29uZmlnPzogR0NQUHViU3ViQ29uZmlnKSB7XG5cdFx0dGhpcy5jb25maWcgPSB7XG5cdFx0XHRwcm9qZWN0SWQ6IGNvbmZpZz8ucHJvamVjdElkIHx8IHByb2Nlc3MuZW52LkdPT0dMRV9DTE9VRF9QUk9KRUNULFxuXHRcdFx0Y3JlZGVudGlhbHM6IGNvbmZpZz8uY3JlZGVudGlhbHMsXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDb25uZWN0IHRvIEdDUCBQdWIvU3ViXG5cdCAqL1xuXHRhc3luYyBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICh0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIER5bmFtaWMgaW1wb3J0IG9mIEBnb29nbGUtY2xvdWQvcHVic3ViXG5cdFx0XHRjb25zdCB7IFB1YlN1YiB9ID0gYXdhaXQgaW1wb3J0KFwiQGdvb2dsZS1jbG91ZC9wdWJzdWJcIik7XG5cblx0XHRcdHRoaXMuY2xpZW50ID0gbmV3IFB1YlN1Yih7XG5cdFx0XHRcdHByb2plY3RJZDogdGhpcy5jb25maWcucHJvamVjdElkLFxuXHRcdFx0XHRjcmVkZW50aWFsczogdGhpcy5jb25maWcuY3JlZGVudGlhbHMsXG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5jb25uZWN0ZWQgPSB0cnVlO1xuXHRcdFx0Y29uc29sZS5sb2coYFtHQ1BQdWJTdWJBZGFwdGVyXSBDb25uZWN0ZWQgdG8gR0NQIFB1Yi9TdWI6ICR7dGhpcy5jb25maWcucHJvamVjdElkfWApO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdGBGYWlsZWQgdG8gY29ubmVjdCB0byBHQ1AgUHViL1N1YjogJHsoZXJyb3IgYXMgRXJyb3IpLm1lc3NhZ2V9LiBgICtcblx0XHRcdFx0XHRgTWFrZSBzdXJlIEBnb29nbGUtY2xvdWQvcHVic3ViIGlzIGluc3RhbGxlZDogbnBtIGluc3RhbGwgQGdvb2dsZS1jbG91ZC9wdWJzdWJgLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGlzY29ubmVjdCBmcm9tIEdDUCBQdWIvU3ViXG5cdCAqL1xuXHRhc3luYyBkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHJldHVybjtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBDbG9zZSBhbGwgc3Vic2NyaXB0aW9uc1xuXHRcdFx0Zm9yIChjb25zdCBbbmFtZSwgc3Vic2NyaXB0aW9uXSBvZiB0aGlzLnN1YnNjcmlwdGlvbnMpIHtcblx0XHRcdFx0YXdhaXQgc3Vic2NyaXB0aW9uLmNsb3NlKCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnN1YnNjcmlwdGlvbnMuY2xlYXIoKTtcblxuXHRcdFx0YXdhaXQgdGhpcy5jbGllbnQuY2xvc2UoKTtcblx0XHRcdHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG5cdFx0XHRjb25zb2xlLmxvZyhcIltHQ1BQdWJTdWJBZGFwdGVyXSBEaXNjb25uZWN0ZWQgZnJvbSBHQ1AgUHViL1N1YlwiKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Y29uc29sZS5lcnJvcihgW0dDUFB1YlN1YkFkYXB0ZXJdIEVycm9yIGRpc2Nvbm5lY3Rpbmc6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTdWJzY3JpYmUgdG8gYSBHQ1AgUHViL1N1YiB0b3BpY1xuXHQgKi9cblx0YXN5bmMgc3Vic2NyaWJlKGNvbmZpZzogUHViU3ViVHJpZ2dlck9wdHMsIGhhbmRsZXI6IChtZXNzYWdlOiBQdWJTdWJNZXNzYWdlKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTm90IGNvbm5lY3RlZCB0byBHQ1AgUHViL1N1Yi4gQ2FsbCBjb25uZWN0KCkgZmlyc3QuXCIpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHN1YnNjcmlwdGlvbk5hbWUgPSBjb25maWcuc3Vic2NyaXB0aW9uO1xuXG5cdFx0Ly8gR2V0IHRoZSBzdWJzY3JpcHRpb25cblx0XHRjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLmNsaWVudC5zdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uTmFtZSwge1xuXHRcdFx0Zmxvd0NvbnRyb2w6IHtcblx0XHRcdFx0bWF4TWVzc2FnZXM6IGNvbmZpZy5tYXhNZXNzYWdlcyB8fCAxMCxcblx0XHRcdH0sXG5cdFx0XHRhY2tEZWFkbGluZTogY29uZmlnLmFja0RlYWRsaW5lIHx8IDMwLFxuXHRcdH0pO1xuXG5cdFx0Ly8gTWVzc2FnZSBoYW5kbGVyXG5cdFx0Y29uc3QgbWVzc2FnZUhhbmRsZXIgPSBhc3luYyAoZ2NwTWVzc2FnZTogYW55KSA9PiB7XG5cdFx0XHQvLyBQYXJzZSBtZXNzYWdlIGRhdGFcblx0XHRcdGxldCBib2R5OiB1bmtub3duO1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0Y29uc3QgZGF0YSA9IGdjcE1lc3NhZ2UuZGF0YS50b1N0cmluZygpO1xuXHRcdFx0XHRib2R5ID0gSlNPTi5wYXJzZShkYXRhKTtcblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHRib2R5ID0gZ2NwTWVzc2FnZS5kYXRhLnRvU3RyaW5nKCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENyZWF0ZSBwdWIvc3ViIG1lc3NhZ2Vcblx0XHRcdGNvbnN0IHB1YnN1Yk1lc3NhZ2U6IFB1YlN1Yk1lc3NhZ2UgPSB7XG5cdFx0XHRcdGlkOiBnY3BNZXNzYWdlLmlkIHx8IHV1aWQoKSxcblx0XHRcdFx0Ym9keSxcblx0XHRcdFx0YXR0cmlidXRlczogZ2NwTWVzc2FnZS5hdHRyaWJ1dGVzIHx8IHt9LFxuXHRcdFx0XHRyYXc6IGdjcE1lc3NhZ2UsXG5cdFx0XHRcdHRvcGljOiBjb25maWcudG9waWMsXG5cdFx0XHRcdHN1YnNjcmlwdGlvbjogc3Vic2NyaXB0aW9uTmFtZSxcblx0XHRcdFx0cHVibGlzaFRpbWU6IGdjcE1lc3NhZ2UucHVibGlzaFRpbWUgPyBuZXcgRGF0ZShnY3BNZXNzYWdlLnB1Ymxpc2hUaW1lKSA6IG5ldyBEYXRlKCksXG5cdFx0XHRcdGFjazogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdGdjcE1lc3NhZ2UuYWNrKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdG5hY2s6IGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRnY3BNZXNzYWdlLm5hY2soKTtcblx0XHRcdFx0fSxcblx0XHRcdH07XG5cblx0XHRcdC8vIFByb2Nlc3MgbWVzc2FnZVxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0YXdhaXQgaGFuZGxlcihwdWJzdWJNZXNzYWdlKTtcblx0XHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRcdGNvbnNvbGUuZXJyb3IoYFtHQ1BQdWJTdWJBZGFwdGVyXSBFcnJvciBwcm9jZXNzaW5nIG1lc3NhZ2U6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHQvLyBFcnJvciBoYW5kbGVyXG5cdFx0Y29uc3QgZXJyb3JIYW5kbGVyID0gKGVycm9yOiBFcnJvcikgPT4ge1xuXHRcdFx0Y29uc29sZS5lcnJvcihgW0dDUFB1YlN1YkFkYXB0ZXJdIFN1YnNjcmlwdGlvbiBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuXHRcdH07XG5cblx0XHQvLyBBdHRhY2ggbGlzdGVuZXJzXG5cdFx0c3Vic2NyaXB0aW9uLm9uKFwibWVzc2FnZVwiLCBtZXNzYWdlSGFuZGxlcik7XG5cdFx0c3Vic2NyaXB0aW9uLm9uKFwiZXJyb3JcIiwgZXJyb3JIYW5kbGVyKTtcblxuXHRcdC8vIFN0b3JlIHN1YnNjcmlwdGlvbiByZWZlcmVuY2Vcblx0XHR0aGlzLnN1YnNjcmlwdGlvbnMuc2V0KHN1YnNjcmlwdGlvbk5hbWUsIHN1YnNjcmlwdGlvbik7XG5cblx0XHRjb25zb2xlLmxvZyhgW0dDUFB1YlN1YkFkYXB0ZXJdIFN1YnNjcmliZWQgdG86ICR7c3Vic2NyaXB0aW9uTmFtZX1gKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBVbnN1YnNjcmliZSBmcm9tIGEgR0NQIFB1Yi9TdWIgc3Vic2NyaXB0aW9uXG5cdCAqL1xuXHRhc3luYyB1bnN1YnNjcmliZShzdWJzY3JpcHRpb25OYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRjb25zdCBzdWJzY3JpcHRpb24gPSB0aGlzLnN1YnNjcmlwdGlvbnMuZ2V0KHN1YnNjcmlwdGlvbk5hbWUpO1xuXHRcdGlmIChzdWJzY3JpcHRpb24pIHtcblx0XHRcdGF3YWl0IHN1YnNjcmlwdGlvbi5jbG9zZSgpO1xuXHRcdFx0dGhpcy5zdWJzY3JpcHRpb25zLmRlbGV0ZShzdWJzY3JpcHRpb25OYW1lKTtcblx0XHRcdGNvbnNvbGUubG9nKGBbR0NQUHViU3ViQWRhcHRlcl0gVW5zdWJzY3JpYmVkIGZyb206ICR7c3Vic2NyaXB0aW9uTmFtZX1gKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQ2hlY2sgaWYgY29ubmVjdGVkIHRvIEdDUCBQdWIvU3ViXG5cdCAqL1xuXHRpc0Nvbm5lY3RlZCgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5jb25uZWN0ZWQ7XG5cdH1cblxuXHQvKipcblx0ICogSGVhbHRoIGNoZWNrIC0gdmVyaWZ5IEdDUCBQdWIvU3ViIGNvbm5lY3Rpdml0eVxuXHQgKi9cblx0YXN5bmMgaGVhbHRoQ2hlY2soKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIExpc3Qgc3Vic2NyaXB0aW9ucyBhcyBhIGhlYWx0aCBjaGVja1xuXHRcdFx0Y29uc3QgW3N1YnNjcmlwdGlvbnNdID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0U3Vic2NyaXB0aW9ucyh7IHBhZ2VTaXplOiAxIH0pO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdDUFB1YlN1YkFkYXB0ZXI7XG4iXX0=
|
|
198
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR0NQUHViU3ViQWRhcHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hZGFwdGVycy9HQ1BQdWJTdWJBZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7O0dBVUc7QUFJSCxPQUFPLEVBQUUsRUFBRSxJQUFJLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQWNsQzs7R0FFRztBQUNILE1BQU0sT0FBTyxnQkFBZ0I7SUFDbkIsUUFBUSxHQUFHLEtBQWMsQ0FBQztJQUUzQixNQUFNLENBQXFCO0lBQzNCLGFBQWEsR0FBOEIsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNyRCxTQUFTLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLE1BQU0sQ0FBa0I7SUFFaEM7OztPQUdHO0lBQ0ssYUFBYTtRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQUMscUVBQXFFLENBQUMsQ0FBQztRQUN4RixDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxZQUFZLE1BQXdCO1FBQ25DLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDYixTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsSUFBSSxPQUFPLENBQUMsR0FBRyxDQUFDLG9CQUFvQjtZQUNoRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFdBQVc7U0FDaEMsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxPQUFPO1FBQ1osSUFBSSxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU87UUFFM0IsSUFBSSxDQUFDO1lBQ0oseUNBQXlDO1lBQ3pDLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBRXhELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUM7Z0JBQ3hCLFNBQVMsRUFBRSxJQUFJLENBQUMs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LElBQUksRUFBRSxXQUFXLElBQUksSUFBSSxFQUFFLFlBQVk7U0FDcEQsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFdBQVc7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFFbEMsSUFBSSxDQUFDO1lBQ0osdUNBQXVDO1lBQ3ZDLE1BQU0sQ0FBQyxhQUFhLENBQUMsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JGLE9BQU8sSUFBSSxDQUFDO1FBQ2IsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNSLE9BQU8sS0FBSyxDQUFDO1FBQ2QsQ0FBQztJQUNGLENBQUM7Q0FDRDtBQUVELGVBQWUsZ0JBQWdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdDUFB1YlN1YkFkYXB0ZXIgLSBHb29nbGUgQ2xvdWQgUHViL1N1YiBhZGFwdGVyIGZvciBQdWJTdWJUcmlnZ2VyXG4gKlxuICogVXNlcyBAZ29vZ2xlLWNsb3VkL3B1YnN1YiBmb3IgR0NQIFB1Yi9TdWIgY29ubmVjdGl2aXR5LlxuICogUmVxdWlyZXM6IG5wbSBpbnN0YWxsIEBnb29nbGUtY2xvdWQvcHVic3ViXG4gKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogLSBHT09HTEVfQ0xPVURfUFJPSkVDVDogR0NQIHByb2plY3QgSURcbiAqIC0gR09PR0xFX0FQUExJQ0FUSU9OX0NSRURFTlRJQUxTOiBQYXRoIHRvIHNlcnZpY2UgYWNjb3VudCBrZXkgZmlsZSAob3B0aW9uYWwgaWYgdXNpbmcgZGVmYXVsdCBjcmVkZW50aWFscylcbiAqIC0gUFVCU1VCX0VNVUxBVE9SX0hPU1Q6IFB1Yi9TdWIgZW11bGF0b3IgaG9zdCBmb3IgbG9jYWwgZGV2ZWxvcG1lbnQgKG9wdGlvbmFsKVxuICovXG5cbmltcG9ydCB0eXBlIHsgUHViU3ViVHJpZ2dlck9wdHMgfSBmcm9tIFwiQGJsb2tqcy9oZWxwZXJcIjtcbmltcG9ydCB0eXBlIHsgTWVzc2FnZSwgUHViU3ViLCBTdWJzY3JpcHRpb24gfSBmcm9tIFwiQGdvb2dsZS1jbG91ZC9wdWJzdWJcIjtcbmltcG9ydCB7IHY0IGFzIHV1aWQgfSBmcm9tIFwidXVpZFwiO1xuaW1wb3J0IHR5cGUgeyBQdWJTdWJBZGFwdGVyLCBQdWJTdWJNZXNzYWdlIH0gZnJvbSBcIi4uL1B1YlN1YlRyaWdnZXJcIjtcblxuLyoqXG4gKiBHQ1AgUHViL1N1YiBjb25maWd1cmF0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR0NQUHViU3ViQ29uZmlnIHtcblx0cHJvamVjdElkPzogc3RyaW5nO1xuXHRjcmVkZW50aWFscz86IHtcblx0XHRjbGllbnRfZW1haWw6IHN0cmluZztcblx0XHRwcml2YXRlX2tleTogc3RyaW5nO1xuXHR9O1xufVxuXG4vKipcbiAqIEdDUFB1YlN1YkFkYXB0ZXIgLSBHb29nbGUgQ2xvdWQgUHViL1N1YiBpbXBsZW1lbnRhdGlvblxuICovXG5leHBvcnQgY2xhc3MgR0NQUHViU3ViQWRhcHRlciBpbXBsZW1lbnRzIFB1YlN1YkFkYXB0ZXIge1xuXHRyZWFkb25seSBwcm92aWRlciA9IFwiZ2NwXCIgYXMgY29uc3Q7XG5cblx0cHJpdmF0ZSBjbGllbnQ6IFB1YlN1YiB8IHVuZGVmaW5lZDtcblx0cHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBNYXA8c3RyaW5nLCBTdWJzY3JpcHRpb24+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuXHRwcml2YXRlIGNvbmZpZzogR0NQUHViU3ViQ29uZmlnO1xuXG5cdC8qKlxuXHQgKiBUeXBlLW5hcnJvd2luZyBhY2Nlc3NvciBmb3IgYHRoaXMuY2xpZW50YC4gRmllbGQgaXMgdW5kZWZpbmVkIHVudGlsXG5cdCAqIGBjb25uZWN0KClgIHJ1bnMuXG5cdCAqL1xuXHRwcml2YXRlIHJlcXVpcmVDbGllbnQoKTogUHViU3ViIHtcblx0XHRpZiAoIXRoaXMuY2xpZW50KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXCJbR0NQUHViU3ViQWRhcHRlcl0gY2xpZW50IGlzIG5vdCBpbml0aWFsaXNlZCDigJQgY2FsbCBjb25uZWN0KCkgZmlyc3RcIik7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmNsaWVudDtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKGNvbmZpZz86IEdDUFB1YlN1YkNvbmZpZykge1xuXHRcdHRoaXMuY29uZmlnID0ge1xuXHRcdFx0cHJvamVjdElkOiBjb25maWc/LnByb2plY3RJZCB8fCBwcm9jZXNzLmVudi5HT09HTEVfQ0xPVURfUFJPSkVDVCxcblx0XHRcdGNyZWRlbnRpYWxzOiBjb25maWc/LmNyZWRlbnRpYWxzLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQ29ubmVjdCB0byBHQ1AgUHViL1N1YlxuXHQgKi9cblx0YXN5bmMgY29ubmVjdCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy5jb25uZWN0ZWQpIHJldHVybjtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBEeW5hbWljIGltcG9ydCBvZiBAZ29vZ2xlLWNsb3VkL3B1YnN1YlxuXHRcdFx0Y29uc3QgeyBQdWJTdWIgfSA9IGF3YWl0IGltcG9ydChcIkBnb29nbGUtY2xvdWQvcHVic3ViXCIpO1xuXG5cdFx0XHR0aGlzLmNsaWVudCA9IG5ldyBQdWJTdWIoe1xuXHRcdFx0XHRwcm9qZWN0SWQ6IHRoaXMuY29uZmlnLnByb2plY3RJZCxcblx0XHRcdFx0Y3JlZGVudGlhbHM6IHRoaXMuY29uZmlnLmNyZWRlbnRpYWxzLFxuXHRcdFx0fSk7XG5cblx0XHRcdHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcblx0XHRcdGNvbnNvbGUubG9nKGBbR0NQUHViU3ViQWRhcHRlcl0gQ29ubmVjdGVkIHRvIEdDUCBQdWIvU3ViOiAke3RoaXMuY29uZmlnLnByb2plY3RJZH1gKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFxuXHRcdFx0XHRgRmFpbGVkIHRvIGNvbm5lY3QgdG8gR0NQIFB1Yi9TdWI6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfS4gTWFrZSBzdXJlIEBnb29nbGUtY2xvdWQvcHVic3ViIGlzIGluc3RhbGxlZDogbnBtIGluc3RhbGwgQGdvb2dsZS1jbG91ZC9wdWJzdWJgLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogRGlzY29ubmVjdCBmcm9tIEdDUCBQdWIvU3ViXG5cdCAqL1xuXHRhc3luYyBkaXNjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHJldHVybjtcblxuXHRcdHRyeSB7XG5cdFx0XHQvLyBDbG9zZSBhbGwgc3Vic2NyaXB0aW9uc1xuXHRcdFx0Zm9yIChjb25zdCBbbmFtZSwgc3Vic2NyaXB0aW9uXSBvZiB0aGlzLnN1YnNjcmlwdGlvbnMpIHtcblx0XHRcdFx0YXdhaXQgc3Vic2NyaXB0aW9uLmNsb3NlKCk7XG5cdFx0XHR9XG5cdFx0XHR0aGlzLnN1YnNjcmlwdGlvbnMuY2xlYXIoKTtcblxuXHRcdFx0YXdhaXQgdGhpcy5yZXF1aXJlQ2xpZW50KCkuY2xvc2UoKTtcblx0XHRcdHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG5cdFx0XHRjb25zb2xlLmxvZyhcIltHQ1BQdWJTdWJBZGFwdGVyXSBEaXNjb25uZWN0ZWQgZnJvbSBHQ1AgUHViL1N1YlwiKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Y29uc29sZS5lcnJvcihgW0dDUFB1YlN1YkFkYXB0ZXJdIEVycm9yIGRpc2Nvbm5lY3Rpbmc6ICR7KGVycm9yIGFzIEVycm9yKS5tZXNzYWdlfWApO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBTdWJzY3JpYmUgdG8gYSBHQ1AgUHViL1N1YiB0b3BpY1xuXHQgKi9cblx0YXN5bmMgc3Vic2NyaWJlKGNvbmZpZzogUHViU3ViVHJpZ2dlck9wdHMsIGhhbmRsZXI6IChtZXNzYWdlOiBQdWJTdWJNZXNzYWdlKSA9PiBQcm9taXNlPHZvaWQ+KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiTm90IGNvbm5lY3RlZCB0byBHQ1AgUHViL1N1Yi4gQ2FsbCBjb25uZWN0KCkgZmlyc3QuXCIpO1xuXHRcdH1cblxuXHRcdGlmICghY29uZmlnLnN1YnNjcmlwdGlvbikge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKFwiW0dDUFB1YlN1YkFkYXB0ZXJdIGBzdWJzY3JpcHRpb25gIGlzIHJlcXVpcmVkIOKAlCBtdXN0IGJlIHRoZSBHQ1Agc3Vic2NyaXB0aW9uIG5hbWUuXCIpO1xuXHRcdH1cblx0XHRjb25zdCBzdWJzY3JpcHRpb25OYW1lID0gY29uZmlnLnN1YnNjcmlwdGlvbjtcblxuXHRcdC8vIEdldCB0aGUgc3Vic2NyaXB0aW9uLiBUaGUgR0NQIFNESyBjYWxscyB0aGUgcGVyLXN1YnNjcmlwdGlvblxuXHRcdC8vIGRlYWRsaW5lIGBtYXhBY2tEZWFkbGluZWAgKGEgYER1cmF0aW9uYCk7IG91ciBhdXRob3ItZmFjaW5nXG5cdFx0Ly8gZmllbGQgaXMgYGFja0RlYWRsaW5lYCAoc2Vjb25kcykgZm9yIHBhcml0eSB3aXRoIG90aGVyXG5cdFx0Ly8gcHJvdmlkZXJzLiBgRHVyYXRpb25gIGlzIHRoZSBHQ1AgU0RLJ3MgdGMzOS1UZW1wb3JhbC1zaGFwZWRcblx0XHQvLyBzaGltIOKAlCBjb25zdHJ1Y3QgdmlhIGBEdXJhdGlvbi5mcm9tKHtzZWNvbmRzfSlgLlxuXHRcdGNvbnN0IHsgRHVyYXRpb24gfSA9IGF3YWl0IGltcG9ydChcIkBnb29nbGUtY2xvdWQvcHVic3ViXCIpO1xuXHRcdGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMucmVxdWlyZUNsaWVudCgpLnN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb25OYW1lLCB7XG5cdFx0XHRmbG93Q29udHJvbDoge1xuXHRcdFx0XHRtYXhNZXNzYWdlczogY29uZmlnLm1heE1lc3NhZ2VzIHx8IDEwLFxuXHRcdFx0fSxcblx0XHRcdG1heEFja0RlYWRsaW5lOiBEdXJhdGlvbi5mcm9tKHsgc2Vjb25kczogY29uZmlnLmFja0RlYWRsaW5lIHx8IDMwIH0pLFxuXHRcdH0pO1xuXG5cdFx0Ly8gTWVzc2FnZSBoYW5kbGVyXG5cdFx0Y29uc3QgbWVzc2FnZUhhbmRsZXIgPSBhc3luYyAoZ2NwTWVzc2FnZTogTWVzc2FnZSkgPT4ge1xuXHRcdFx0Ly8gUGFyc2UgbWVzc2FnZSBkYXRhXG5cdFx0XHRsZXQgYm9keTogdW5rbm93bjtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGNvbnN0IGRhdGEgPSBnY3BNZXNzYWdlLmRhdGEudG9TdHJpbmcoKTtcblx0XHRcdFx0Ym9keSA9IEpTT04ucGFyc2UoZGF0YSk7XG5cdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0Ym9keSA9IGdjcE1lc3NhZ2UuZGF0YS50b1N0cmluZygpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDcmVhdGUgcHViL3N1YiBtZXNzYWdlXG5cdFx0XHRjb25zdCBwdWJzdWJNZXNzYWdlOiBQdWJTdWJNZXNzYWdlID0ge1xuXHRcdFx0XHRpZDogZ2NwTWVzc2FnZS5pZCB8fCB1dWlkKCksXG5cdFx0XHRcdGJvZHksXG5cdFx0XHRcdGF0dHJpYnV0ZXM6IGdjcE1lc3NhZ2UuYXR0cmlidXRlcyB8fCB7fSxcblx0XHRcdFx0cmF3OiBnY3BNZXNzYWdlLFxuXHRcdFx0XHR0b3BpYzogY29uZmlnLnRvcGljLFxuXHRcdFx0XHRzdWJzY3JpcHRpb246IHN1YnNjcmlwdGlvbk5hbWUsXG5cdFx0XHRcdHB1Ymxpc2hUaW1lOiBnY3BNZXNzYWdlLnB1Ymxpc2hUaW1lID8gbmV3IERhdGUoZ2NwTWVzc2FnZS5wdWJsaXNoVGltZSkgOiBuZXcgRGF0ZSgpLFxuXHRcdFx0XHRhY2s6IGFzeW5jICgpID0+IHtcblx0XHRcdFx0XHRnY3BNZXNzYWdlLmFjaygpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRuYWNrOiBhc3luYyAoKSA9PiB7XG5cdFx0XHRcdFx0Z2NwTWVzc2FnZS5uYWNrKCk7XG5cdFx0XHRcdH0sXG5cdFx0XHR9O1xuXG5cdFx0XHQvLyBQcm9jZXNzIG1lc3NhZ2Vcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGhhbmRsZXIocHVic3ViTWVzc2FnZSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRjb25zb2xlLmVycm9yKGBbR0NQUHViU3ViQWRhcHRlcl0gRXJyb3IgcHJvY2Vzc2luZyBtZXNzYWdlOiAkeyhlcnJvciBhcyBFcnJvcikubWVzc2FnZX1gKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Ly8gRXJyb3IgaGFuZGxlclxuXHRcdGNvbnN0IGVycm9ySGFuZGxlciA9IChlcnJvcjogRXJyb3IpID0+IHtcblx0XHRcdGNvbnNvbGUuZXJyb3IoYFtHQ1BQdWJTdWJBZGFwdGVyXSBTdWJzY3JpcHRpb24gZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcblx0XHR9O1xuXG5cdFx0Ly8gQXR0YWNoIGxpc3RlbmVyc1xuXHRcdHN1YnNjcmlwdGlvbi5vbihcIm1lc3NhZ2VcIiwgbWVzc2FnZUhhbmRsZXIpO1xuXHRcdHN1YnNjcmlwdGlvbi5vbihcImVycm9yXCIsIGVycm9ySGFuZGxlcik7XG5cblx0XHQvLyBTdG9yZSBzdWJzY3JpcHRpb24gcmVmZXJlbmNlXG5cdFx0dGhpcy5zdWJzY3JpcHRpb25zLnNldChzdWJzY3JpcHRpb25OYW1lLCBzdWJzY3JpcHRpb24pO1xuXG5cdFx0Y29uc29sZS5sb2coYFtHQ1BQdWJTdWJBZGFwdGVyXSBTdWJzY3JpYmVkIHRvOiAke3N1YnNjcmlwdGlvbk5hbWV9YCk7XG5cdH1cblxuXHQvKipcblx0ICogVW5zdWJzY3JpYmUgZnJvbSBhIEdDUCBQdWIvU3ViIHN1YnNjcmlwdGlvblxuXHQgKi9cblx0YXN5bmMgdW5zdWJzY3JpYmUoc3Vic2NyaXB0aW9uTmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgc3Vic2NyaXB0aW9uID0gdGhpcy5zdWJzY3JpcHRpb25zLmdldChzdWJzY3JpcHRpb25OYW1lKTtcblx0XHRpZiAoc3Vic2NyaXB0aW9uKSB7XG5cdFx0XHRhd2FpdCBzdWJzY3JpcHRpb24uY2xvc2UoKTtcblx0XHRcdHRoaXMuc3Vic2NyaXB0aW9ucy5kZWxldGUoc3Vic2NyaXB0aW9uTmFtZSk7XG5cdFx0XHRjb25zb2xlLmxvZyhgW0dDUFB1YlN1YkFkYXB0ZXJdIFVuc3Vic2NyaWJlZCBmcm9tOiAke3N1YnNjcmlwdGlvbk5hbWV9YCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIENoZWNrIGlmIGNvbm5lY3RlZCB0byBHQ1AgUHViL1N1YlxuXHQgKi9cblx0aXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuY29ubmVjdGVkO1xuXHR9XG5cblx0LyoqXG5cdCAqIHYwLjcgUFIgNiDigJQgcHVibGlzaCB0byBhIEdDUCBQdWIvU3ViIHRvcGljLlxuXHQgKlxuXHQgKiBgcGFydGl0aW9uS2V5YCAvIGBvcmRlcmluZ0tleWAgbWFwIHRvIEdDUCdzIGBvcmRlcmluZ0tleWAgKHRoZVxuXHQgKiB0b3BpYyBtdXN0IGhhdmUgbWVzc2FnZSBvcmRlcmluZyBlbmFibGVkIOKAlCBvdGhlcndpc2UgdGhlIGZpZWxkXG5cdCAqIGlzIGlnbm9yZWQgYnkgdGhlIGJyb2tlcikuXG5cdCAqL1xuXHRhc3luYyBwdWJsaXNoKFxuXHRcdHRvcGljOiBzdHJpbmcsXG5cdFx0cGF5bG9hZDogdW5rbm93bixcblx0XHRvcHRzPzogeyBwYXJ0aXRpb25LZXk/OiBzdHJpbmc7IG9yZGVyaW5nS2V5Pzogc3RyaW5nIH0sXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQpIHRocm93IG5ldyBFcnJvcihcIltibG9rXVtwdWJzdWItZ2NwXSBub3QgY29ubmVjdGVkLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0Y29uc3QgYm9keSA9IHR5cGVvZiBwYXlsb2FkID09PSBcInN0cmluZ1wiID8gcGF5bG9hZCA6IEpTT04uc3RyaW5naWZ5KHBheWxvYWQpO1xuXHRcdGNvbnN0IHQgPSB0aGlzLnJlcXVpcmVDbGllbnQoKS50b3BpYyh0b3BpYyk7XG5cdFx0YXdhaXQgdC5wdWJsaXNoTWVzc2FnZSh7XG5cdFx0XHRkYXRhOiBCdWZmZXIuZnJvbShib2R5KSxcblx0XHRcdG9yZGVyaW5nS2V5OiBvcHRzPy5vcmRlcmluZ0tleSA/PyBvcHRzPy5wYXJ0aXRpb25LZXksXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogSGVhbHRoIGNoZWNrIC0gdmVyaWZ5IEdDUCBQdWIvU3ViIGNvbm5lY3Rpdml0eVxuXHQgKi9cblx0YXN5bmMgaGVhbHRoQ2hlY2soKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgcmV0dXJuIGZhbHNlO1xuXG5cdFx0dHJ5IHtcblx0XHRcdC8vIExpc3Qgc3Vic2NyaXB0aW9ucyBhcyBhIGhlYWx0aCBjaGVja1xuXHRcdFx0Y29uc3QgW3N1YnNjcmlwdGlvbnNdID0gYXdhaXQgdGhpcy5yZXF1aXJlQ2xpZW50KCkuZ2V0U3Vic2NyaXB0aW9ucyh7IHBhZ2VTaXplOiAxIH0pO1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEdDUFB1YlN1YkFkYXB0ZXI7XG4iXX0=
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KafkaPubSubAdapter — v0.7 PR 6 — Pub/Sub adapter backed by Apache
|
|
3
|
+
* Kafka via `kafkajs`.
|
|
4
|
+
*
|
|
5
|
+
* Pub/Sub vs Worker semantics: this adapter uses **per-subscriber
|
|
6
|
+
* consumer groups** so multiple subscribers each receive every message
|
|
7
|
+
* (fan-out). When `consumerGroup` is explicitly set, all subscribers
|
|
8
|
+
* share that group and compete (1 of N gets each message).
|
|
9
|
+
*
|
|
10
|
+
* Replay cursors via `startFrom`:
|
|
11
|
+
* - `"earliest"` → `fromBeginning: true` on first subscribe.
|
|
12
|
+
* - `"latest"` (default) → only new messages.
|
|
13
|
+
* - `{seq: N}` / `{timestamp: ms}` — provider-specific. Cleanest
|
|
14
|
+
* long-term path is Kafka's `admin.seek({offset|timestamp})` post-
|
|
15
|
+
* subscribe; v1 honors `earliest` / `latest` and `{seq}` via
|
|
16
|
+
* `auto.offset.reset` only.
|
|
17
|
+
*
|
|
18
|
+
* Requires `kafkajs` as a peer dependency.
|
|
19
|
+
*
|
|
20
|
+
* Environment variables:
|
|
21
|
+
* - `KAFKA_BROKERS` — comma-separated (default `localhost:9092`).
|
|
22
|
+
* - `KAFKA_CLIENT_ID` — default `"blok-pubsub"`.
|
|
23
|
+
* - `KAFKA_SASL_USERNAME` / `KAFKA_SASL_PASSWORD` — SASL/PLAIN.
|
|
24
|
+
* - `KAFKA_SSL` — `"true"` enables TLS.
|
|
25
|
+
*/
|
|
26
|
+
import type { PubSubTriggerOpts } from "@blokjs/helper";
|
|
27
|
+
import type { PubSubAdapter, PubSubMessage } from "../PubSubTrigger";
|
|
28
|
+
export interface KafkaPubSubConfig {
|
|
29
|
+
brokers: string[];
|
|
30
|
+
clientId: string;
|
|
31
|
+
saslUsername?: string;
|
|
32
|
+
saslPassword?: string;
|
|
33
|
+
ssl: boolean;
|
|
34
|
+
}
|
|
35
|
+
export declare class KafkaPubSubAdapter implements PubSubAdapter {
|
|
36
|
+
readonly provider: "kafka";
|
|
37
|
+
private readonly config;
|
|
38
|
+
private kafka;
|
|
39
|
+
private producer;
|
|
40
|
+
private consumers;
|
|
41
|
+
private connected;
|
|
42
|
+
constructor(config?: Partial<KafkaPubSubConfig>);
|
|
43
|
+
connect(): Promise<void>;
|
|
44
|
+
disconnect(): Promise<void>;
|
|
45
|
+
subscribe(config: PubSubTriggerOpts, handler: (message: PubSubMessage) => Promise<void>): Promise<void>;
|
|
46
|
+
unsubscribe(subscription: string): Promise<void>;
|
|
47
|
+
publish(topic: string, payload: unknown, opts?: {
|
|
48
|
+
partitionKey?: string;
|
|
49
|
+
orderingKey?: string;
|
|
50
|
+
}): Promise<void>;
|
|
51
|
+
isConnected(): boolean;
|
|
52
|
+
healthCheck(): Promise<boolean>;
|
|
53
|
+
}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* KafkaPubSubAdapter — v0.7 PR 6 — Pub/Sub adapter backed by Apache
|
|
3
|
+
* Kafka via `kafkajs`.
|
|
4
|
+
*
|
|
5
|
+
* Pub/Sub vs Worker semantics: this adapter uses **per-subscriber
|
|
6
|
+
* consumer groups** so multiple subscribers each receive every message
|
|
7
|
+
* (fan-out). When `consumerGroup` is explicitly set, all subscribers
|
|
8
|
+
* share that group and compete (1 of N gets each message).
|
|
9
|
+
*
|
|
10
|
+
* Replay cursors via `startFrom`:
|
|
11
|
+
* - `"earliest"` → `fromBeginning: true` on first subscribe.
|
|
12
|
+
* - `"latest"` (default) → only new messages.
|
|
13
|
+
* - `{seq: N}` / `{timestamp: ms}` — provider-specific. Cleanest
|
|
14
|
+
* long-term path is Kafka's `admin.seek({offset|timestamp})` post-
|
|
15
|
+
* subscribe; v1 honors `earliest` / `latest` and `{seq}` via
|
|
16
|
+
* `auto.offset.reset` only.
|
|
17
|
+
*
|
|
18
|
+
* Requires `kafkajs` as a peer dependency.
|
|
19
|
+
*
|
|
20
|
+
* Environment variables:
|
|
21
|
+
* - `KAFKA_BROKERS` — comma-separated (default `localhost:9092`).
|
|
22
|
+
* - `KAFKA_CLIENT_ID` — default `"blok-pubsub"`.
|
|
23
|
+
* - `KAFKA_SASL_USERNAME` / `KAFKA_SASL_PASSWORD` — SASL/PLAIN.
|
|
24
|
+
* - `KAFKA_SSL` — `"true"` enables TLS.
|
|
25
|
+
*/
|
|
26
|
+
import { v4 as uuid } from "uuid";
|
|
27
|
+
export class KafkaPubSubAdapter {
|
|
28
|
+
provider = "kafka";
|
|
29
|
+
config;
|
|
30
|
+
// biome-ignore lint/suspicious/noExplicitAny: kafkajs's exported `Kafka` constructor is loosely typed.
|
|
31
|
+
kafka = null;
|
|
32
|
+
// biome-ignore lint/suspicious/noExplicitAny: producer is created lazily and typed loosely.
|
|
33
|
+
producer = null;
|
|
34
|
+
consumers = new Map();
|
|
35
|
+
connected = false;
|
|
36
|
+
constructor(config) {
|
|
37
|
+
this.config = {
|
|
38
|
+
brokers: config?.brokers ?? (process.env.KAFKA_BROKERS ?? "localhost:9092").split(",").map((s) => s.trim()),
|
|
39
|
+
clientId: config?.clientId ?? process.env.KAFKA_CLIENT_ID ?? "blok-pubsub",
|
|
40
|
+
saslUsername: config?.saslUsername ?? process.env.KAFKA_SASL_USERNAME,
|
|
41
|
+
saslPassword: config?.saslPassword ?? process.env.KAFKA_SASL_PASSWORD,
|
|
42
|
+
ssl: config?.ssl ?? process.env.KAFKA_SSL === "true",
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
async connect() {
|
|
46
|
+
if (this.connected)
|
|
47
|
+
return;
|
|
48
|
+
try {
|
|
49
|
+
// biome-ignore lint/suspicious/noExplicitAny: kafkajs is a runtime peer dep.
|
|
50
|
+
const kafkajs = await import("kafkajs");
|
|
51
|
+
const sasl = this.config.saslUsername && this.config.saslPassword
|
|
52
|
+
? { mechanism: "plain", username: this.config.saslUsername, password: this.config.saslPassword }
|
|
53
|
+
: undefined;
|
|
54
|
+
this.kafka = new kafkajs.Kafka({
|
|
55
|
+
clientId: this.config.clientId,
|
|
56
|
+
brokers: this.config.brokers,
|
|
57
|
+
ssl: this.config.ssl,
|
|
58
|
+
sasl,
|
|
59
|
+
});
|
|
60
|
+
this.producer = this.kafka.producer();
|
|
61
|
+
await this.producer.connect();
|
|
62
|
+
this.connected = true;
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
throw new Error(`[blok][pubsub-kafka] connect failed: ${err.message}. Install kafkajs as a peer dependency: bun add kafkajs`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async disconnect() {
|
|
69
|
+
if (!this.connected)
|
|
70
|
+
return;
|
|
71
|
+
for (const consumer of this.consumers.values()) {
|
|
72
|
+
try {
|
|
73
|
+
await consumer.disconnect();
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
/* ignore */
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
this.consumers.clear();
|
|
80
|
+
try {
|
|
81
|
+
await this.producer?.disconnect();
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
/* ignore */
|
|
85
|
+
}
|
|
86
|
+
this.producer = null;
|
|
87
|
+
this.connected = false;
|
|
88
|
+
}
|
|
89
|
+
async subscribe(config, handler) {
|
|
90
|
+
if (!this.connected)
|
|
91
|
+
throw new Error("[blok][pubsub-kafka] not connected. Call connect() first.");
|
|
92
|
+
// Fan-out: distinct group id per subscriber instance. Competing-
|
|
93
|
+
// consumer: explicit consumerGroup shared across all subscribers.
|
|
94
|
+
const groupId = config.consumerGroup ?? `blok-fanout-${uuid().slice(0, 8)}-${config.topic.replace(/[^a-zA-Z0-9_]/g, "_")}`;
|
|
95
|
+
const consumer = this.kafka.consumer({ groupId });
|
|
96
|
+
await consumer.connect();
|
|
97
|
+
const fromBeginning = config.startFrom === "earliest";
|
|
98
|
+
await consumer.subscribe({ topic: config.topic, fromBeginning });
|
|
99
|
+
this.consumers.set(`${config.topic}#${groupId}`, consumer);
|
|
100
|
+
await consumer.run({
|
|
101
|
+
autoCommit: config.ack !== false,
|
|
102
|
+
eachMessage: async ({ message, }) => {
|
|
103
|
+
const text = message.value?.toString("utf8") ?? "";
|
|
104
|
+
let body = text;
|
|
105
|
+
try {
|
|
106
|
+
body = text.length > 0 ? JSON.parse(text) : null;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
/* leave as text */
|
|
110
|
+
}
|
|
111
|
+
const attributes = {};
|
|
112
|
+
if (message.headers) {
|
|
113
|
+
for (const [k, v] of Object.entries(message.headers))
|
|
114
|
+
attributes[k] = v?.toString("utf8") ?? "";
|
|
115
|
+
}
|
|
116
|
+
const msg = {
|
|
117
|
+
id: `${config.topic}:${message.offset}`,
|
|
118
|
+
body,
|
|
119
|
+
attributes,
|
|
120
|
+
raw: message,
|
|
121
|
+
topic: config.topic,
|
|
122
|
+
subscription: groupId,
|
|
123
|
+
publishTime: new Date(Number.parseInt(message.timestamp, 10)),
|
|
124
|
+
ack: async () => {
|
|
125
|
+
/* autoCommit handles ack */
|
|
126
|
+
},
|
|
127
|
+
nack: async () => {
|
|
128
|
+
/* kafkajs has no per-message nack; the offset commit is suppressed by throwing */
|
|
129
|
+
},
|
|
130
|
+
};
|
|
131
|
+
// On handler failure: re-throw so kafkajs suppresses the
|
|
132
|
+
// offset commit; the consumer will re-poll the message
|
|
133
|
+
// on the next cycle. The throw is intentional.
|
|
134
|
+
await handler(msg);
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
}
|
|
138
|
+
async unsubscribe(subscription) {
|
|
139
|
+
const consumer = this.consumers.get(subscription);
|
|
140
|
+
if (!consumer)
|
|
141
|
+
return;
|
|
142
|
+
try {
|
|
143
|
+
await consumer.stop();
|
|
144
|
+
await consumer.disconnect();
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
/* ignore */
|
|
148
|
+
}
|
|
149
|
+
this.consumers.delete(subscription);
|
|
150
|
+
}
|
|
151
|
+
async publish(topic, payload, opts) {
|
|
152
|
+
if (!this.connected || !this.producer)
|
|
153
|
+
throw new Error("[blok][pubsub-kafka] not connected. Call connect() first.");
|
|
154
|
+
const body = typeof payload === "string" ? payload : JSON.stringify(payload);
|
|
155
|
+
const key = opts?.partitionKey ?? opts?.orderingKey;
|
|
156
|
+
await this.producer.send({
|
|
157
|
+
topic,
|
|
158
|
+
messages: [{ key, value: body }],
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
isConnected() {
|
|
162
|
+
return this.connected;
|
|
163
|
+
}
|
|
164
|
+
async healthCheck() {
|
|
165
|
+
return this.connected;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiS2Fma2FQdWJTdWJBZGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2FkYXB0ZXJzL0thZmthUHViU3ViQWRhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBR0gsT0FBTyxFQUFFLEVBQUUsSUFBSSxJQUFJLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFnQmxDLE1BQU0sT0FBTyxrQkFBa0I7SUFDckIsUUFBUSxHQUFHLE9BQWdCLENBQUM7SUFDcEIsTUFBTSxDQUFvQjtJQUMzQyx1R0FBdUc7SUFDL0YsS0FBSyxHQUFRLElBQUksQ0FBQztJQUMxQiw0RkFBNEY7SUFDcEYsUUFBUSxHQUFRLElBQUksQ0FBQztJQUNyQixTQUFTLEdBQXFDLElBQUksR0FBRyxFQUFFLENBQUM7SUFDeEQsU0FBUyxHQUFHLEtBQUssQ0FBQztJQUUxQixZQUFZLE1BQW1DO1FBQzlDLElBQUksQ0FBQyxNQUFNLEdBQUc7WUFDYixPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxJQUFJLGdCQUFnQixDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQzNHLFFBQVEsRUFBRSxNQUFNLEVBQUUsUUFBUSxJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLGFBQWE7WUFDMUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUI7WUFDckUsWUFBWSxFQUFFLE1BQU0sRUFBRSxZQUFZLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxtQkFBbUI7WUFDckUsR0FBRyxFQUFFLE1BQU0sRUFBRSxHQUFHLElBQUksT0FBTyxDQUFDLEdBQUcsQ0FBQyxT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UUFDcEgsTUFBTSxJQUFJLEdBQUcsT0FBTyxPQUFPLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0UsTUFBTSxHQUFHLEdBQUcsSUFBSSxFQUFFLFlBQVksSUFBSSxJQUFJLEVBQUUsV0FBVyxDQUFDO1FBQ3BELE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDeEIsS0FBSztZQUNMLFFBQVEsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsQ0FBQztTQUNoQyxDQUFDLENBQUM7SUFDSixDQUFDO0lBRUQsV0FBVztRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN2QixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVc7UUFDaEIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3ZCLENBQUM7Q0FDRCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogS2Fma2FQdWJTdWJBZGFwdGVyIOKAlCB2MC43IFBSIDYg4oCUIFB1Yi9TdWIgYWRhcHRlciBiYWNrZWQgYnkgQXBhY2hlXG4gKiBLYWZrYSB2aWEgYGthZmthanNgLlxuICpcbiAqIFB1Yi9TdWIgdnMgV29ya2VyIHNlbWFudGljczogdGhpcyBhZGFwdGVyIHVzZXMgKipwZXItc3Vic2NyaWJlclxuICogY29uc3VtZXIgZ3JvdXBzKiogc28gbXVsdGlwbGUgc3Vic2NyaWJlcnMgZWFjaCByZWNlaXZlIGV2ZXJ5IG1lc3NhZ2VcbiAqIChmYW4tb3V0KS4gV2hlbiBgY29uc3VtZXJHcm91cGAgaXMgZXhwbGljaXRseSBzZXQsIGFsbCBzdWJzY3JpYmVyc1xuICogc2hhcmUgdGhhdCBncm91cCBhbmQgY29tcGV0ZSAoMSBvZiBOIGdldHMgZWFjaCBtZXNzYWdlKS5cbiAqXG4gKiBSZXBsYXkgY3Vyc29ycyB2aWEgYHN0YXJ0RnJvbWA6XG4gKiAgIC0gYFwiZWFybGllc3RcImAg4oaSIGBmcm9tQmVnaW5uaW5nOiB0cnVlYCBvbiBmaXJzdCBzdWJzY3JpYmUuXG4gKiAgIC0gYFwibGF0ZXN0XCJgIChkZWZhdWx0KSDihpIgb25seSBuZXcgbWVzc2FnZXMuXG4gKiAgIC0gYHtzZXE6IE59YCAvIGB7dGltZXN0YW1wOiBtc31gIOKAlCBwcm92aWRlci1zcGVjaWZpYy4gQ2xlYW5lc3RcbiAqICAgICBsb25nLXRlcm0gcGF0aCBpcyBLYWZrYSdzIGBhZG1pbi5zZWVrKHtvZmZzZXR8dGltZXN0YW1wfSlgIHBvc3QtXG4gKiAgICAgc3Vic2NyaWJlOyB2MSBob25vcnMgYGVhcmxpZXN0YCAvIGBsYXRlc3RgIGFuZCBge3NlcX1gIHZpYVxuICogICAgIGBhdXRvLm9mZnNldC5yZXNldGAgb25seS5cbiAqXG4gKiBSZXF1aXJlcyBga2Fma2Fqc2AgYXMgYSBwZWVyIGRlcGVuZGVuY3kuXG4gKlxuICogRW52aXJvbm1lbnQgdmFyaWFibGVzOlxuICogICAtIGBLQUZLQV9CUk9LRVJTYCAgICAgICAgICAg4oCUIGNvbW1hLXNlcGFyYXRlZCAoZGVmYXVsdCBgbG9jYWxob3N0OjkwOTJgKS5cbiAqICAgLSBgS0FGS0FfQ0xJRU5UX0lEYCAgICAgICAgIOKAlCBkZWZhdWx0IGBcImJsb2stcHVic3ViXCJgLlxuICogICAtIGBLQUZLQV9TQVNMX1VTRVJOQU1FYCAvIGBLQUZLQV9TQVNMX1BBU1NXT1JEYCAg4oCUIFNBU0wvUExBSU4uXG4gKiAgIC0gYEtBRktBX1NTTGAgICAgICAgICAgICAgICDigJQgYFwidHJ1ZVwiYCBlbmFibGVzIFRMUy5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IFB1YlN1YlRyaWdnZXJPcHRzIH0gZnJvbSBcIkBibG9ranMvaGVscGVyXCI7XG5pbXBvcnQgeyB2NCBhcyB1dWlkIH0gZnJvbSBcInV1aWRcIjtcbmltcG9ydCB0eXBlIHsgUHViU3ViQWRhcHRlciwgUHViU3ViTWVzc2FnZSB9IGZyb20gXCIuLi9QdWJTdWJUcmlnZ2VyXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgS2Fma2FQdWJTdWJDb25maWcge1xuXHRicm9rZXJzOiBzdHJpbmdbXTtcblx0Y2xpZW50SWQ6IHN0cmluZztcblx0c2FzbFVzZXJuYW1lPzogc3RyaW5nO1xuXHRzYXNsUGFzc3dvcmQ/OiBzdHJpbmc7XG5cdHNzbDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEthZmthQ29uc3VtZXJIYW5kbGUge1xuXHRkaXNjb25uZWN0OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXHRzdG9wOiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG5leHBvcnQgY2xhc3MgS2Fma2FQdWJTdWJBZGFwdGVyIGltcGxlbWVudHMgUHViU3ViQWRhcHRlciB7XG5cdHJlYWRvbmx5IHByb3ZpZGVyID0gXCJrYWZrYVwiIGFzIGNvbnN0O1xuXHRwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogS2Fma2FQdWJTdWJDb25maWc7XG5cdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9FeHBsaWNpdEFueToga2Fma2FqcydzIGV4cG9ydGVkIGBLYWZrYWAgY29uc3RydWN0b3IgaXMgbG9vc2VseSB0eXBlZC5cblx0cHJpdmF0ZSBrYWZrYTogYW55ID0gbnVsbDtcblx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0V4cGxpY2l0QW55OiBwcm9kdWNlciBpcyBjcmVhdGVkIGxhemlseSBhbmQgdHlwZWQgbG9vc2VseS5cblx0cHJpdmF0ZSBwcm9kdWNlcjogYW55ID0gbnVsbDtcblx0cHJpdmF0ZSBjb25zdW1lcnM6IE1hcDxzdHJpbmcsIEthZmthQ29uc3VtZXJIYW5kbGU+ID0gbmV3IE1hcCgpO1xuXHRwcml2YXRlIGNvbm5lY3RlZCA9IGZhbHNlO1xuXG5cdGNvbnN0cnVjdG9yKGNvbmZpZz86IFBhcnRpYWw8S2Fma2FQdWJTdWJDb25maWc+KSB7XG5cdFx0dGhpcy5jb25maWcgPSB7XG5cdFx0XHRicm9rZXJzOiBjb25maWc/LmJyb2tlcnMgPz8gKHByb2Nlc3MuZW52LktBRktBX0JST0tFUlMgPz8gXCJsb2NhbGhvc3Q6OTA5MlwiKS5zcGxpdChcIixcIikubWFwKChzKSA9PiBzLnRyaW0oKSksXG5cdFx0XHRjbGllbnRJZDogY29uZmlnPy5jbGllbnRJZCA/PyBwcm9jZXNzLmVudi5LQUZLQV9DTElFTlRfSUQgPz8gXCJibG9rLXB1YnN1YlwiLFxuXHRcdFx0c2FzbFVzZXJuYW1lOiBjb25maWc/LnNhc2xVc2VybmFtZSA/PyBwcm9jZXNzLmVudi5LQUZLQV9TQVNMX1VTRVJOQU1FLFxuXHRcdFx0c2FzbFBhc3N3b3JkOiBjb25maWc/LnNhc2xQYXNzd29yZCA/PyBwcm9jZXNzLmVudi5LQUZLQV9TQVNMX1BBU1NXT1JELFxuXHRcdFx0c3NsOiBjb25maWc/LnNzbCA/PyBwcm9jZXNzLmVudi5LQUZLQV9TU0wgPT09IFwidHJ1ZVwiLFxuXHRcdH07XG5cdH1cblxuXHRhc3luYyBjb25uZWN0KCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICh0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXHRcdHRyeSB7XG5cdFx0XHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vRXhwbGljaXRBbnk6IGthZmthanMgaXMgYSBydW50aW1lIHBlZXIgZGVwLlxuXHRcdFx0Y29uc3Qga2Fma2FqczogYW55ID0gYXdhaXQgaW1wb3J0KFwia2Fma2Fqc1wiKTtcblx0XHRcdGNvbnN0IHNhc2wgPVxuXHRcdFx0XHR0aGlzLmNvbmZpZy5zYXNsVXNlcm5hbWUgJiYgdGhpcy5jb25maWcuc2FzbFBhc3N3b3JkXG5cdFx0XHRcdFx0PyB7IG1lY2hhbmlzbTogXCJwbGFpblwiLCB1c2VybmFtZTogdGhpcy5jb25maWcuc2FzbFVzZXJuYW1lLCBwYXNzd29yZDogdGhpcy5jb25maWcuc2FzbFBhc3N3b3JkIH1cblx0XHRcdFx0XHQ6IHVuZGVmaW5lZDtcblx0XHRcdHRoaXMua2Fma2EgPSBuZXcga2Fma2Fqcy5LYWZrYSh7XG5cdFx0XHRcdGNsaWVudElkOiB0aGlzLmNvbmZpZy5jbGllbnRJZCxcblx0XHRcdFx0YnJva2VyczogdGhpcy5jb25maWcuYnJva2Vycyxcblx0XHRcdFx0c3NsOiB0aGlzLmNvbmZpZy5zc2wsXG5cdFx0XHRcdHNhc2wsXG5cdFx0XHR9KTtcblx0XHRcdHRoaXMucHJvZHVjZXIgPSB0aGlzLmthZmthLnByb2R1Y2VyKCk7XG5cdFx0XHRhd2FpdCB0aGlzLnByb2R1Y2VyLmNvbm5lY3QoKTtcblx0XHRcdHRoaXMuY29ubmVjdGVkID0gdHJ1ZTtcblx0XHR9IGNhdGNoIChlcnIpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YFtibG9rXVtwdWJzdWIta2Fma2FdIGNvbm5lY3QgZmFpbGVkOiAkeyhlcnIgYXMgRXJyb3IpLm1lc3NhZ2V9LiBJbnN0YWxsIGthZmthanMgYXMgYSBwZWVyIGRlcGVuZGVuY3k6IGJ1biBhZGQga2Fma2Fqc2AsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdGFzeW5jIGRpc2Nvbm5lY3QoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKCF0aGlzLmNvbm5lY3RlZCkgcmV0dXJuO1xuXHRcdGZvciAoY29uc3QgY29uc3VtZXIgb2YgdGhpcy5jb25zdW1lcnMudmFsdWVzKCkpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdGF3YWl0IGNvbnN1bWVyLmRpc2Nvbm5lY3QoKTtcblx0XHRcdH0gY2F0Y2gge1xuXHRcdFx0XHQvKiBpZ25vcmUgKi9cblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5jb25zdW1lcnMuY2xlYXIoKTtcblx0XHR0cnkge1xuXHRcdFx0YXdhaXQgdGhpcy5wcm9kdWNlcj8uZGlzY29ubmVjdCgpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0LyogaWdub3JlICovXG5cdFx0fVxuXHRcdHRoaXMucHJvZHVjZXIgPSBudWxsO1xuXHRcdHRoaXMuY29ubmVjdGVkID0gZmFsc2U7XG5cdH1cblxuXHRhc3luYyBzdWJzY3JpYmUoY29uZmlnOiBQdWJTdWJUcmlnZ2VyT3B0cywgaGFuZGxlcjogKG1lc3NhZ2U6IFB1YlN1Yk1lc3NhZ2UpID0+IFByb21pc2U8dm9pZD4pOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAoIXRoaXMuY29ubmVjdGVkKSB0aHJvdyBuZXcgRXJyb3IoXCJbYmxva11bcHVic3ViLWthZmthXSBub3QgY29ubmVjdGVkLiBDYWxsIGNvbm5lY3QoKSBmaXJzdC5cIik7XG5cdFx0Ly8gRmFuLW91dDogZGlzdGluY3QgZ3JvdXAgaWQgcGVyIHN1YnNjcmliZXIgaW5zdGFuY2UuIENvbXBldGluZy1cblx0XHQvLyBjb25zdW1lcjogZXhwbGljaXQgY29uc3VtZXJHcm91cCBzaGFyZWQgYWNyb3NzIGFsbCBzdWJzY3JpYmVycy5cblx0XHRjb25zdCBncm91cElkID1cblx0XHRcdGNvbmZpZy5jb25zdW1lckdyb3VwID8/IGBibG9rLWZhbm91dC0ke3V1aWQoKS5zbGljZSgwLCA4KX0tJHtjb25maWcudG9waWMucmVwbGFjZSgvW15hLXpBLVowLTlfXS9nLCBcIl9cIil9YDtcblx0XHRjb25zdCBjb25zdW1lciA9IHRoaXMua2Fma2EuY29uc3VtZXIoeyBncm91cElkIH0pO1xuXHRcdGF3YWl0IGNvbnN1bWVyLmNvbm5lY3QoKTtcblx0XHRjb25zdCBmcm9tQmVnaW5uaW5nID0gY29uZmlnLnN0YXJ0RnJvbSA9PT0gXCJlYXJsaWVzdFwiO1xuXHRcdGF3YWl0IGNvbnN1bWVyLnN1YnNjcmliZSh7IHRvcGljOiBjb25maWcudG9waWMsIGZyb21CZWdpbm5pbmcgfSk7XG5cdFx0dGhpcy5jb25zdW1lcnMuc2V0KGAke2NvbmZpZy50b3BpY30jJHtncm91cElkfWAsIGNvbnN1bWVyKTtcblxuXHRcdGF3YWl0IGNvbnN1bWVyLnJ1bih7XG5cdFx0XHRhdXRvQ29tbWl0OiBjb25maWcuYWNrICE9PSBmYWxzZSxcblx0XHRcdGVhY2hNZXNzYWdlOiBhc3luYyAoe1xuXHRcdFx0XHRtZXNzYWdlLFxuXHRcdFx0fToge1xuXHRcdFx0XHRtZXNzYWdlOiB7IGtleT86IEJ1ZmZlcjsgdmFsdWU/OiBCdWZmZXI7IG9mZnNldDogc3RyaW5nOyB0aW1lc3RhbXA6IHN0cmluZzsgaGVhZGVycz86IFJlY29yZDxzdHJpbmcsIEJ1ZmZlcj4gfTtcblx0XHRcdH0pID0+IHtcblx0XHRcdFx0Y29uc3QgdGV4dCA9IG1lc3NhZ2UudmFsdWU/LnRvU3RyaW5nKFwidXRmOFwiKSA/PyBcIlwiO1xuXHRcdFx0XHRsZXQgYm9keTogdW5rbm93biA9IHRleHQ7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Ym9keSA9IHRleHQubGVuZ3RoID4gMCA/IEpTT04ucGFyc2UodGV4dCkgOiBudWxsO1xuXHRcdFx0XHR9IGNhdGNoIHtcblx0XHRcdFx0XHQvKiBsZWF2ZSBhcyB0ZXh0ICovXG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgYXR0cmlidXRlczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXHRcdFx0XHRpZiAobWVzc2FnZS5oZWFkZXJzKSB7XG5cdFx0XHRcdFx0Zm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMobWVzc2FnZS5oZWFkZXJzKSkgYXR0cmlidXRlc1trXSA9IHY/LnRvU3RyaW5nKFwidXRmOFwiKSA/PyBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvbnN0IG1zZzogUHViU3ViTWVzc2FnZSA9IHtcblx0XHRcdFx0XHRpZDogYCR7Y29uZmlnLnRvcGljfToke21lc3NhZ2Uub2Zmc2V0fWAsXG5cdFx0XHRcdFx0Ym9keSxcblx0XHRcdFx0XHRhdHRyaWJ1dGVzLFxuXHRcdFx0XHRcdHJhdzogbWVzc2FnZSxcblx0XHRcdFx0XHR0b3BpYzogY29uZmlnLnRvcGljLFxuXHRcdFx0XHRcdHN1YnNjcmlwdGlvbjogZ3JvdXBJZCxcblx0XHRcdFx0XHRwdWJsaXNoVGltZTogbmV3IERhdGUoTnVtYmVyLnBhcnNlSW50KG1lc3NhZ2UudGltZXN0YW1wLCAxMCkpLFxuXHRcdFx0XHRcdGFjazogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0LyogYXV0b0NvbW1pdCBoYW5kbGVzIGFjayAqL1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0bmFjazogYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHRcdFx0Lyoga2Fma2FqcyBoYXMgbm8gcGVyLW1lc3NhZ2UgbmFjazsgdGhlIG9mZnNldCBjb21taXQgaXMgc3VwcHJlc3NlZCBieSB0aHJvd2luZyAqL1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH07XG5cdFx0XHRcdC8vIE9uIGhhbmRsZXIgZmFpbHVyZTogcmUtdGhyb3cgc28ga2Fma2FqcyBzdXBwcmVzc2VzIHRoZVxuXHRcdFx0XHQvLyBvZmZzZXQgY29tbWl0OyB0aGUgY29uc3VtZXIgd2lsbCByZS1wb2xsIHRoZSBtZXNzYWdlXG5cdFx0XHRcdC8vIG9uIHRoZSBuZXh0IGN5Y2xlLiBUaGUgdGhyb3cgaXMgaW50ZW50aW9uYWwuXG5cdFx0XHRcdGF3YWl0IGhhbmRsZXIobXNnKTtcblx0XHRcdH0sXG5cdFx0fSk7XG5cdH1cblxuXHRhc3luYyB1bnN1YnNjcmliZShzdWJzY3JpcHRpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IGNvbnN1bWVyID0gdGhpcy5jb25zdW1lcnMuZ2V0KHN1YnNjcmlwdGlvbik7XG5cdFx0aWYgKCFjb25zdW1lcikgcmV0dXJuO1xuXHRcdHRyeSB7XG5cdFx0XHRhd2FpdCBjb25zdW1lci5zdG9wKCk7XG5cdFx0XHRhd2FpdCBjb25zdW1lci5kaXNjb25uZWN0KCk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHQvKiBpZ25vcmUgKi9cblx0XHR9XG5cdFx0dGhpcy5jb25zdW1lcnMuZGVsZXRlKHN1YnNjcmlwdGlvbik7XG5cdH1cblxuXHRhc3luYyBwdWJsaXNoKFxuXHRcdHRvcGljOiBzdHJpbmcsXG5cdFx0cGF5bG9hZDogdW5rbm93bixcblx0XHRvcHRzPzogeyBwYXJ0aXRpb25LZXk/OiBzdHJpbmc7IG9yZGVyaW5nS2V5Pzogc3RyaW5nIH0sXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICghdGhpcy5jb25uZWN0ZWQgfHwgIXRoaXMucHJvZHVjZXIpIHRocm93IG5ldyBFcnJvcihcIltibG9rXVtwdWJzdWIta2Fma2FdIG5vdCBjb25uZWN0ZWQuIENhbGwgY29ubmVjdCgpIGZpcnN0LlwiKTtcblx0XHRjb25zdCBib2R5ID0gdHlwZW9mIHBheWxvYWQgPT09IFwic3RyaW5nXCIgPyBwYXlsb2FkIDogSlNPTi5zdHJpbmdpZnkocGF5bG9hZCk7XG5cdFx0Y29uc3Qga2V5ID0gb3B0cz8ucGFydGl0aW9uS2V5ID8/IG9wdHM/Lm9yZGVyaW5nS2V5O1xuXHRcdGF3YWl0IHRoaXMucHJvZHVjZXIuc2VuZCh7XG5cdFx0XHR0b3BpYyxcblx0XHRcdG1lc3NhZ2VzOiBbeyBrZXksIHZhbHVlOiBib2R5IH1dLFxuXHRcdH0pO1xuXHR9XG5cblx0aXNDb25uZWN0ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuY29ubmVjdGVkO1xuXHR9XG5cblx0YXN5bmMgaGVhbHRoQ2hlY2soKTogUHJvbWlzZTxib29sZWFuPiB7XG5cdFx0cmV0dXJuIHRoaXMuY29ubmVjdGVkO1xuXHR9XG59XG4iXX0=
|