@xemahq/temporal-runtime 0.5.2 → 0.7.0
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/README.md +154 -11
- package/dist/bin/controller-token-publisher.d.ts +3 -0
- package/dist/bin/controller-token-publisher.d.ts.map +1 -0
- package/dist/bin/controller-token-publisher.js +18 -0
- package/dist/bin/controller-token-publisher.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/access-token.d.ts +11 -0
- package/dist/lib/access-token.d.ts.map +1 -0
- package/dist/lib/access-token.js +30 -0
- package/dist/lib/access-token.js.map +1 -0
- package/dist/lib/base-temporal-client.service.d.ts +3 -2
- package/dist/lib/base-temporal-client.service.d.ts.map +1 -1
- package/dist/lib/base-temporal-client.service.js +5 -5
- package/dist/lib/base-temporal-client.service.js.map +1 -1
- package/dist/lib/biome-worker.d.ts +83 -0
- package/dist/lib/biome-worker.d.ts.map +1 -0
- package/dist/lib/biome-worker.js +253 -0
- package/dist/lib/biome-worker.js.map +1 -0
- package/dist/lib/bounded-retry.d.ts +22 -0
- package/dist/lib/bounded-retry.d.ts.map +1 -0
- package/dist/lib/bounded-retry.js +67 -0
- package/dist/lib/bounded-retry.js.map +1 -0
- package/dist/lib/client-credentials-token-source.d.ts +23 -0
- package/dist/lib/client-credentials-token-source.d.ts.map +1 -0
- package/dist/lib/client-credentials-token-source.js +108 -0
- package/dist/lib/client-credentials-token-source.js.map +1 -0
- package/dist/lib/connection.d.ts +48 -9
- package/dist/lib/connection.d.ts.map +1 -1
- package/dist/lib/connection.js +153 -41
- package/dist/lib/connection.js.map +1 -1
- package/dist/lib/controller-token-publisher.d.ts +51 -0
- package/dist/lib/controller-token-publisher.d.ts.map +1 -0
- package/dist/lib/controller-token-publisher.js +116 -0
- package/dist/lib/controller-token-publisher.js.map +1 -0
- package/dist/lib/fairness-constants.d.ts +3 -0
- package/dist/lib/fairness-constants.d.ts.map +1 -0
- package/dist/lib/fairness-constants.js +6 -0
- package/dist/lib/fairness-constants.js.map +1 -0
- package/dist/lib/fairness.d.ts +13 -0
- package/dist/lib/fairness.d.ts.map +1 -0
- package/dist/lib/fairness.js +56 -0
- package/dist/lib/fairness.js.map +1 -0
- package/dist/lib/namespace.d.ts +4 -0
- package/dist/lib/namespace.d.ts.map +1 -0
- package/dist/lib/namespace.js +18 -0
- package/dist/lib/namespace.js.map +1 -0
- package/dist/lib/org-erasure.d.ts +13 -0
- package/dist/lib/org-erasure.d.ts.map +1 -0
- package/dist/lib/org-erasure.js +68 -0
- package/dist/lib/org-erasure.js.map +1 -0
- package/dist/lib/proactive-token-refresher.d.ts +47 -0
- package/dist/lib/proactive-token-refresher.d.ts.map +1 -0
- package/dist/lib/proactive-token-refresher.js +147 -0
- package/dist/lib/proactive-token-refresher.js.map +1 -0
- package/dist/lib/search-attribute-constants.d.ts +3 -0
- package/dist/lib/search-attribute-constants.d.ts.map +1 -0
- package/dist/lib/search-attribute-constants.js +6 -0
- package/dist/lib/search-attribute-constants.js.map +1 -0
- package/dist/lib/search-attributes.d.ts +4 -18
- package/dist/lib/search-attributes.d.ts.map +1 -1
- package/dist/lib/search-attributes.js +33 -40
- package/dist/lib/search-attributes.js.map +1 -1
- package/dist/lib/standalone-activity.d.ts +23 -0
- package/dist/lib/standalone-activity.d.ts.map +1 -0
- package/dist/lib/standalone-activity.js +48 -0
- package/dist/lib/standalone-activity.js.map +1 -0
- package/dist/lib/versioned-worker.d.ts +26 -0
- package/dist/lib/versioned-worker.d.ts.map +1 -0
- package/dist/lib/versioned-worker.js +60 -0
- package/dist/lib/versioned-worker.js.map +1 -0
- package/dist/lib/worker-deployment-version.d.ts +8 -0
- package/dist/lib/worker-deployment-version.d.ts.map +1 -0
- package/dist/lib/worker-deployment-version.js +45 -0
- package/dist/lib/worker-deployment-version.js.map +1 -0
- package/dist/lib/worker.d.ts +7 -7
- package/dist/lib/worker.d.ts.map +1 -1
- package/dist/lib/worker.js +33 -37
- package/dist/lib/worker.js.map +1 -1
- package/dist/lib/workflow-interceptors/fairness-guard.d.ts +4 -0
- package/dist/lib/workflow-interceptors/fairness-guard.d.ts.map +1 -0
- package/dist/lib/workflow-interceptors/fairness-guard.js +65 -0
- package/dist/lib/workflow-interceptors/fairness-guard.js.map +1 -0
- package/dist/lib/workflow-interceptors/fairness-propagation.d.ts +3 -0
- package/dist/lib/workflow-interceptors/fairness-propagation.d.ts.map +1 -0
- package/dist/lib/workflow-interceptors/fairness-propagation.js +6 -0
- package/dist/lib/workflow-interceptors/fairness-propagation.js.map +1 -0
- package/dist/lib/workflow-interceptors/org-fairness-required.d.ts +3 -0
- package/dist/lib/workflow-interceptors/org-fairness-required.d.ts.map +1 -0
- package/dist/lib/workflow-interceptors/org-fairness-required.js +6 -0
- package/dist/lib/workflow-interceptors/org-fairness-required.js.map +1 -0
- package/dist/lib/workflow-interceptors/org-search-attribute.d.ts +3 -0
- package/dist/lib/workflow-interceptors/org-search-attribute.d.ts.map +1 -0
- package/dist/lib/workflow-interceptors/org-search-attribute.js +49 -0
- package/dist/lib/workflow-interceptors/org-search-attribute.js.map +1 -0
- package/dist/lib/workflow-purity.d.ts +27 -0
- package/dist/lib/workflow-purity.d.ts.map +1 -0
- package/dist/lib/workflow-purity.js +115 -0
- package/dist/lib/workflow-purity.js.map +1 -0
- package/package.json +21 -10
|
@@ -0,0 +1,253 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BiomeWorkerError = exports.BiomeWorkerErrorCode = void 0;
|
|
4
|
+
exports.defineBiomeWorker = defineBiomeWorker;
|
|
5
|
+
exports.composeBiomeWorkers = composeBiomeWorkers;
|
|
6
|
+
const node_path_1 = require("node:path");
|
|
7
|
+
const biome_1 = require("@xemahq/contracts/biome");
|
|
8
|
+
const deployment_1 = require("@xemahq/contracts/deployment");
|
|
9
|
+
const process_topology_1 = require("@xemahq/contracts/process-topology");
|
|
10
|
+
const workflow_1 = require("@xemahq/contracts/workflow");
|
|
11
|
+
const fairness_1 = require("./fairness");
|
|
12
|
+
const versioned_worker_1 = require("./versioned-worker");
|
|
13
|
+
const worker_1 = require("./worker");
|
|
14
|
+
const worker_deployment_version_1 = require("./worker-deployment-version");
|
|
15
|
+
var BiomeWorkerErrorCode;
|
|
16
|
+
(function (BiomeWorkerErrorCode) {
|
|
17
|
+
BiomeWorkerErrorCode["ProtocolNotWorkerV2"] = "protocol-not-worker-v2";
|
|
18
|
+
BiomeWorkerErrorCode["ImplementationMismatch"] = "implementation-mismatch";
|
|
19
|
+
BiomeWorkerErrorCode["NexusMismatch"] = "nexus-mismatch";
|
|
20
|
+
BiomeWorkerErrorCode["InvalidComponentKey"] = "invalid-component-key";
|
|
21
|
+
BiomeWorkerErrorCode["DuplicateComponent"] = "duplicate-component";
|
|
22
|
+
BiomeWorkerErrorCode["DuplicateTaskQueue"] = "duplicate-task-queue";
|
|
23
|
+
BiomeWorkerErrorCode["MixedTrustDomains"] = "mixed-trust-domains";
|
|
24
|
+
BiomeWorkerErrorCode["EmptyComposition"] = "empty-composition";
|
|
25
|
+
})(BiomeWorkerErrorCode || (exports.BiomeWorkerErrorCode = BiomeWorkerErrorCode = {}));
|
|
26
|
+
class BiomeWorkerError extends Error {
|
|
27
|
+
code;
|
|
28
|
+
constructor(code, message) {
|
|
29
|
+
super(`[${code}] ${message}`);
|
|
30
|
+
this.code = code;
|
|
31
|
+
this.name = 'BiomeWorkerError';
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
exports.BiomeWorkerError = BiomeWorkerError;
|
|
35
|
+
const COMPONENT_KEY_PATTERN = /^[a-z][a-z0-9-]*$/;
|
|
36
|
+
const FAIRNESS_INTERCEPTOR_MODULE = {
|
|
37
|
+
[biome_1.BiomeWorkerTaskQueueFairness.Org]: (0, node_path_1.join)(__dirname, 'workflow-interceptors', 'org-fairness-required'),
|
|
38
|
+
[biome_1.BiomeWorkerTaskQueueFairness.None]: (0, node_path_1.join)(__dirname, 'workflow-interceptors', 'fairness-propagation'),
|
|
39
|
+
};
|
|
40
|
+
function nexusKey(service, version) {
|
|
41
|
+
return `${service}@${version}`;
|
|
42
|
+
}
|
|
43
|
+
function servesAny(queues, kind) {
|
|
44
|
+
return queues.some((queue) => queue.serves.includes(kind));
|
|
45
|
+
}
|
|
46
|
+
function defineBiomeWorker(options) {
|
|
47
|
+
if (!COMPONENT_KEY_PATTERN.test(options.componentKey)) {
|
|
48
|
+
throw new BiomeWorkerError(BiomeWorkerErrorCode.InvalidComponentKey, `component key ${JSON.stringify(options.componentKey)} must be kebab-case.`);
|
|
49
|
+
}
|
|
50
|
+
const where = `${options.biomeId}/${options.componentKey}`;
|
|
51
|
+
const parsed = biome_1.BiomeWorkerProtocolSchema.safeParse(options.protocol);
|
|
52
|
+
if (!parsed.success ||
|
|
53
|
+
parsed.data.kind !== biome_1.BiomeComponentProtocolKind.Worker ||
|
|
54
|
+
parsed.data.revision !== 'v2') {
|
|
55
|
+
throw new BiomeWorkerError(BiomeWorkerErrorCode.ProtocolNotWorkerV2, `${where}: the protocol must be a worker protocol at revision v2` +
|
|
56
|
+
(parsed.success
|
|
57
|
+
? ` (got revision ${parsed.data.revision}).`
|
|
58
|
+
: `: ${parsed.error.message}`));
|
|
59
|
+
}
|
|
60
|
+
const protocol = parsed.data;
|
|
61
|
+
const declared = protocol.taskQueues;
|
|
62
|
+
for (const [kind, supplied, field] of [
|
|
63
|
+
[
|
|
64
|
+
biome_1.BiomeWorkerTaskQueueServes.Workflows,
|
|
65
|
+
options.workflowsPath,
|
|
66
|
+
'workflowsPath',
|
|
67
|
+
],
|
|
68
|
+
[biome_1.BiomeWorkerTaskQueueServes.Activities, options.activities, 'activities'],
|
|
69
|
+
]) {
|
|
70
|
+
const needed = servesAny(declared, kind);
|
|
71
|
+
if (needed !== (supplied !== undefined)) {
|
|
72
|
+
throw new BiomeWorkerError(BiomeWorkerErrorCode.ImplementationMismatch, needed
|
|
73
|
+
? `${where}: a task queue serves '${kind}' but no ${field} was supplied.`
|
|
74
|
+
: `${where}: ${field} was supplied but no task queue serves '${kind}'.`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
const provides = protocol.nexus?.provides ?? [];
|
|
78
|
+
const supplied = options.nexusServices ?? [];
|
|
79
|
+
const suppliedByKey = new Map();
|
|
80
|
+
for (const impl of supplied) {
|
|
81
|
+
const key = nexusKey(impl.service, impl.version);
|
|
82
|
+
if (suppliedByKey.has(key)) {
|
|
83
|
+
throw new BiomeWorkerError(BiomeWorkerErrorCode.NexusMismatch, `${where}: Nexus service ${key} was supplied twice.`);
|
|
84
|
+
}
|
|
85
|
+
suppliedByKey.set(key, impl);
|
|
86
|
+
}
|
|
87
|
+
const declaredKeys = new Set(provides.map((p) => nexusKey(p.service, p.version)));
|
|
88
|
+
const undeclared = [...suppliedByKey.keys()].filter((k) => !declaredKeys.has(k));
|
|
89
|
+
const unimplemented = [...declaredKeys].filter((k) => !suppliedByKey.has(k));
|
|
90
|
+
if (undeclared.length > 0 || unimplemented.length > 0) {
|
|
91
|
+
throw new BiomeWorkerError(BiomeWorkerErrorCode.NexusMismatch, `${where}: Nexus handlers must match nexus.provides exactly` +
|
|
92
|
+
(unimplemented.length > 0
|
|
93
|
+
? `; declared but not supplied: ${unimplemented.join(', ')}`
|
|
94
|
+
: '') +
|
|
95
|
+
(undeclared.length > 0
|
|
96
|
+
? `; supplied but not declared: ${undeclared.join(', ')}`
|
|
97
|
+
: '') +
|
|
98
|
+
'.');
|
|
99
|
+
}
|
|
100
|
+
const queues = declared.map((queue) => {
|
|
101
|
+
const nexusServices = provides
|
|
102
|
+
.filter((p) => p.taskQueue === queue.name)
|
|
103
|
+
.map((p) => suppliedByKey.get(nexusKey(p.service, p.version)));
|
|
104
|
+
if (queue.serves.includes(biome_1.BiomeWorkerTaskQueueServes.Nexus) &&
|
|
105
|
+
nexusServices.length === 0) {
|
|
106
|
+
throw new BiomeWorkerError(BiomeWorkerErrorCode.NexusMismatch, `${where}: task queue ${queue.name} serves 'nexus' but no nexus.provides entry names it.`);
|
|
107
|
+
}
|
|
108
|
+
return Object.freeze({
|
|
109
|
+
name: queue.name,
|
|
110
|
+
taskQueue: (0, workflow_1.biomeTaskQueue)(options.biomeId, queue.name),
|
|
111
|
+
serves: Object.freeze([...queue.serves]),
|
|
112
|
+
fairness: queue.fairness,
|
|
113
|
+
nexusServices: Object.freeze(nexusServices),
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
return Object.freeze({
|
|
117
|
+
biomeId: options.biomeId,
|
|
118
|
+
componentKey: options.componentKey,
|
|
119
|
+
origin: options.origin,
|
|
120
|
+
queues: Object.freeze(queues),
|
|
121
|
+
...(options.workflowsPath !== undefined
|
|
122
|
+
? { workflowsPath: options.workflowsPath }
|
|
123
|
+
: {}),
|
|
124
|
+
...(options.activities !== undefined
|
|
125
|
+
? { activities: options.activities }
|
|
126
|
+
: {}),
|
|
127
|
+
workflowInterceptorModules: Object.freeze([
|
|
128
|
+
...(options.workflowInterceptorModules ?? []),
|
|
129
|
+
]),
|
|
130
|
+
activityInterceptors: Object.freeze([
|
|
131
|
+
...(options.activityInterceptors ?? []),
|
|
132
|
+
]),
|
|
133
|
+
...(options.payloadCodec !== undefined
|
|
134
|
+
? { payloadCodec: options.payloadCodec }
|
|
135
|
+
: {}),
|
|
136
|
+
...(options.sinks !== undefined ? { sinks: options.sinks } : {}),
|
|
137
|
+
tuning: Object.freeze({ ...(options.tuning ?? {}) }),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
async function composeBiomeWorkers(options) {
|
|
141
|
+
const { definitions } = options;
|
|
142
|
+
if (definitions.length === 0) {
|
|
143
|
+
throw new BiomeWorkerError(BiomeWorkerErrorCode.EmptyComposition, 'composeBiomeWorkers needs at least one definition.');
|
|
144
|
+
}
|
|
145
|
+
const deploymentId = (0, deployment_1.parseDeploymentId)(options.deploymentId);
|
|
146
|
+
const version = (0, worker_deployment_version_1.assertWorkerDeploymentVersion)(options.version);
|
|
147
|
+
const components = new Set();
|
|
148
|
+
const taskQueues = new Set();
|
|
149
|
+
const domains = new Map();
|
|
150
|
+
for (const def of definitions) {
|
|
151
|
+
const component = `${def.biomeId}/${def.componentKey}`;
|
|
152
|
+
if (components.has(component)) {
|
|
153
|
+
throw new BiomeWorkerError(BiomeWorkerErrorCode.DuplicateComponent, `${component} is composed twice.`);
|
|
154
|
+
}
|
|
155
|
+
components.add(component);
|
|
156
|
+
for (const queue of def.queues) {
|
|
157
|
+
if (taskQueues.has(queue.taskQueue)) {
|
|
158
|
+
throw new BiomeWorkerError(BiomeWorkerErrorCode.DuplicateTaskQueue, `task queue ${queue.taskQueue} is polled by two composed definitions.`);
|
|
159
|
+
}
|
|
160
|
+
taskQueues.add(queue.taskQueue);
|
|
161
|
+
}
|
|
162
|
+
const domain = (0, process_topology_1.resolveTrustDomain)(def.biomeId, def.origin, options.trustPolicy);
|
|
163
|
+
domains.set(domain, [...(domains.get(domain) ?? []), component]);
|
|
164
|
+
}
|
|
165
|
+
if (domains.size !== 1) {
|
|
166
|
+
throw new BiomeWorkerError(BiomeWorkerErrorCode.MixedTrustDomains, 'one process is one trust domain, but the composed definitions resolve to ' +
|
|
167
|
+
[...domains].map(([d, c]) => `${d} (${c.join(', ')})`).join(' and ') +
|
|
168
|
+
'.');
|
|
169
|
+
}
|
|
170
|
+
const trustDomain = [...domains.keys()][0];
|
|
171
|
+
const namespace = (0, workflow_1.workflowNamespaceForTrustDomain)(deploymentId, trustDomain);
|
|
172
|
+
const bundles = new Map();
|
|
173
|
+
async function bundleFor(def, fairness) {
|
|
174
|
+
const key = `${def.biomeId}/${def.componentKey}#${fairness}`;
|
|
175
|
+
const cached = bundles.get(key);
|
|
176
|
+
if (cached !== undefined) {
|
|
177
|
+
return cached;
|
|
178
|
+
}
|
|
179
|
+
const bundle = await (0, worker_1.bundlePlatformWorkflows)(def.workflowsPath, {
|
|
180
|
+
workflowInterceptorModules: [
|
|
181
|
+
FAIRNESS_INTERCEPTOR_MODULE[fairness],
|
|
182
|
+
...def.workflowInterceptorModules,
|
|
183
|
+
],
|
|
184
|
+
});
|
|
185
|
+
bundles.set(key, bundle);
|
|
186
|
+
return bundle;
|
|
187
|
+
}
|
|
188
|
+
const workers = [];
|
|
189
|
+
for (const def of definitions) {
|
|
190
|
+
for (const queue of def.queues) {
|
|
191
|
+
const servesWorkflows = queue.serves.includes(biome_1.BiomeWorkerTaskQueueServes.Workflows);
|
|
192
|
+
const servesActivities = queue.serves.includes(biome_1.BiomeWorkerTaskQueueServes.Activities);
|
|
193
|
+
const worker = await (0, versioned_worker_1.createVersionedWorker)({
|
|
194
|
+
connection: options.connection,
|
|
195
|
+
namespace,
|
|
196
|
+
taskQueue: queue.taskQueue,
|
|
197
|
+
version,
|
|
198
|
+
identity: (0, versioned_worker_1.platformWorkerIdentity)(`xema-biome-worker-${def.biomeId}-${def.componentKey}`, namespace, queue.taskQueue),
|
|
199
|
+
...(servesWorkflows
|
|
200
|
+
? { workflowBundle: await bundleFor(def, queue.fairness) }
|
|
201
|
+
: {}),
|
|
202
|
+
...(servesActivities ? { activities: def.activities } : {}),
|
|
203
|
+
...(queue.nexusServices.length > 0
|
|
204
|
+
? { nexusServices: queue.nexusServices.map((n) => n.handler) }
|
|
205
|
+
: {}),
|
|
206
|
+
activityInterceptors: [
|
|
207
|
+
...(queue.fairness === biome_1.BiomeWorkerTaskQueueFairness.Org
|
|
208
|
+
? [fairness_1.orgFairnessActivityInterceptor]
|
|
209
|
+
: []),
|
|
210
|
+
...def.activityInterceptors,
|
|
211
|
+
],
|
|
212
|
+
...(def.payloadCodec !== undefined
|
|
213
|
+
? { payloadCodec: def.payloadCodec }
|
|
214
|
+
: {}),
|
|
215
|
+
...(def.sinks !== undefined ? { sinks: def.sinks } : {}),
|
|
216
|
+
...def.tuning,
|
|
217
|
+
});
|
|
218
|
+
workers.push(Object.freeze({
|
|
219
|
+
biomeId: def.biomeId,
|
|
220
|
+
componentKey: def.componentKey,
|
|
221
|
+
taskQueue: queue.taskQueue,
|
|
222
|
+
worker,
|
|
223
|
+
}));
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
function shutdown() {
|
|
227
|
+
for (const { worker } of workers) {
|
|
228
|
+
if (worker.getState() === 'RUNNING') {
|
|
229
|
+
worker.shutdown();
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
async function run() {
|
|
234
|
+
const runs = workers.map(({ worker }) => worker.run());
|
|
235
|
+
try {
|
|
236
|
+
await Promise.all(runs);
|
|
237
|
+
}
|
|
238
|
+
catch (error) {
|
|
239
|
+
shutdown();
|
|
240
|
+
await Promise.allSettled(runs);
|
|
241
|
+
throw error;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return Object.freeze({
|
|
245
|
+
trustDomain,
|
|
246
|
+
namespace,
|
|
247
|
+
version,
|
|
248
|
+
workers: Object.freeze(workers),
|
|
249
|
+
run,
|
|
250
|
+
shutdown,
|
|
251
|
+
});
|
|
252
|
+
}
|
|
253
|
+
//# sourceMappingURL=biome-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"biome-worker.js","sourceRoot":"","sources":["../../src/lib/biome-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export interface BoundedRetryPolicy {
|
|
2
|
+
readonly attempts: number;
|
|
3
|
+
readonly initialDelayMs: number;
|
|
4
|
+
readonly maxDelayMs: number;
|
|
5
|
+
}
|
|
6
|
+
export declare const DEFAULT_BOUNDED_RETRY_POLICY: BoundedRetryPolicy;
|
|
7
|
+
export interface RetryClock {
|
|
8
|
+
now(): number;
|
|
9
|
+
setTimeout(callback: () => void, ms: number): unknown;
|
|
10
|
+
clearTimeout(handle: unknown): void;
|
|
11
|
+
}
|
|
12
|
+
export declare const SYSTEM_CLOCK: RetryClock;
|
|
13
|
+
export declare function backoffDelayMs(policy: BoundedRetryPolicy, failedAttempt: number): number;
|
|
14
|
+
export declare function sleep(clock: RetryClock, ms: number): Promise<void>;
|
|
15
|
+
export declare class BoundedRetryExhaustedError extends Error {
|
|
16
|
+
readonly operation: string;
|
|
17
|
+
readonly attempts: number;
|
|
18
|
+
constructor(operation: string, attempts: number, cause: unknown);
|
|
19
|
+
}
|
|
20
|
+
export declare function assertBoundedRetryPolicy(policy: BoundedRetryPolicy): void;
|
|
21
|
+
export declare function withBoundedRetry<T>(operationName: string, operation: () => Promise<T>, policy: BoundedRetryPolicy, clock: RetryClock, onAttemptFailed?: (attempt: number, error: unknown, nextDelayMs: number) => void): Promise<T>;
|
|
22
|
+
//# sourceMappingURL=bounded-retry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounded-retry.d.ts","sourceRoot":"","sources":["../../src/lib/bounded-retry.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,kBAAkB;IAEjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAEhC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAGD,eAAO,MAAM,4BAA4B,EAAE,kBAI1C,CAAC;AAGF,MAAM,WAAW,UAAU;IACzB,GAAG,IAAI,MAAM,CAAC;IACd,UAAU,CAAC,QAAQ,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IACtD,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;CACrC;AAED,eAAO,MAAM,YAAY,EAAE,UAU1B,CAAC;AAEF,wBAAgB,cAAc,CAAC,MAAM,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAExF;AAED,wBAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIlE;AAGD,qBAAa,0BAA2B,SAAQ,KAAK;IAEjD,QAAQ,CAAC,SAAS,EAAE,MAAM;IAC1B,QAAQ,CAAC,QAAQ,EAAE,MAAM;gBADhB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EACzB,KAAK,EAAE,OAAO;CAUjB;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAOzE;AAOD,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,aAAa,EAAE,MAAM,EACrB,SAAS,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAC3B,MAAM,EAAE,kBAAkB,EAC1B,KAAK,EAAE,UAAU,EACjB,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,KAAK,IAAI,GAC/E,OAAO,CAAC,CAAC,CAAC,CAeZ"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BoundedRetryExhaustedError = exports.SYSTEM_CLOCK = exports.DEFAULT_BOUNDED_RETRY_POLICY = void 0;
|
|
4
|
+
exports.backoffDelayMs = backoffDelayMs;
|
|
5
|
+
exports.sleep = sleep;
|
|
6
|
+
exports.assertBoundedRetryPolicy = assertBoundedRetryPolicy;
|
|
7
|
+
exports.withBoundedRetry = withBoundedRetry;
|
|
8
|
+
exports.DEFAULT_BOUNDED_RETRY_POLICY = {
|
|
9
|
+
attempts: 6,
|
|
10
|
+
initialDelayMs: 1_000,
|
|
11
|
+
maxDelayMs: 15_000,
|
|
12
|
+
};
|
|
13
|
+
exports.SYSTEM_CLOCK = {
|
|
14
|
+
now: () => Date.now(),
|
|
15
|
+
setTimeout: (callback, ms) => {
|
|
16
|
+
const handle = setTimeout(callback, ms);
|
|
17
|
+
handle.unref();
|
|
18
|
+
return handle;
|
|
19
|
+
},
|
|
20
|
+
clearTimeout: (handle) => clearTimeout(handle),
|
|
21
|
+
};
|
|
22
|
+
function backoffDelayMs(policy, failedAttempt) {
|
|
23
|
+
return Math.min(policy.maxDelayMs, policy.initialDelayMs * 2 ** (failedAttempt - 1));
|
|
24
|
+
}
|
|
25
|
+
function sleep(clock, ms) {
|
|
26
|
+
return new Promise((resolve) => {
|
|
27
|
+
clock.setTimeout(resolve, ms);
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
class BoundedRetryExhaustedError extends Error {
|
|
31
|
+
operation;
|
|
32
|
+
attempts;
|
|
33
|
+
constructor(operation, attempts, cause) {
|
|
34
|
+
super(`${operation} failed after ${attempts} attempt(s): ${cause instanceof Error ? cause.message : String(cause)}`, { cause });
|
|
35
|
+
this.operation = operation;
|
|
36
|
+
this.attempts = attempts;
|
|
37
|
+
this.name = 'BoundedRetryExhaustedError';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
exports.BoundedRetryExhaustedError = BoundedRetryExhaustedError;
|
|
41
|
+
function assertBoundedRetryPolicy(policy) {
|
|
42
|
+
if (!Number.isInteger(policy.attempts) || policy.attempts < 1) {
|
|
43
|
+
throw new Error(`Bounded retry attempts must be an integer >= 1 (got ${policy.attempts}).`);
|
|
44
|
+
}
|
|
45
|
+
if (policy.initialDelayMs < 0 || policy.maxDelayMs < policy.initialDelayMs) {
|
|
46
|
+
throw new Error('Bounded retry delays must satisfy 0 <= initialDelayMs <= maxDelayMs.');
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
async function withBoundedRetry(operationName, operation, policy, clock, onAttemptFailed) {
|
|
50
|
+
assertBoundedRetryPolicy(policy);
|
|
51
|
+
let lastError;
|
|
52
|
+
for (let attempt = 1; attempt <= policy.attempts; attempt += 1) {
|
|
53
|
+
try {
|
|
54
|
+
return await operation();
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
lastError = error;
|
|
58
|
+
if (attempt === policy.attempts)
|
|
59
|
+
break;
|
|
60
|
+
const delay = backoffDelayMs(policy, attempt);
|
|
61
|
+
onAttemptFailed?.(attempt, error, delay);
|
|
62
|
+
await sleep(clock, delay);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
throw new BoundedRetryExhaustedError(operationName, policy.attempts, lastError);
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=bounded-retry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bounded-retry.js","sourceRoot":"","sources":["../../src/lib/bounded-retry.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type AccessTokenSource } from './access-token';
|
|
2
|
+
export interface ClientCredentialsOptions {
|
|
3
|
+
readonly tokenEndpoint: string;
|
|
4
|
+
readonly clientId: string;
|
|
5
|
+
readonly clientSecretFile: string;
|
|
6
|
+
readonly audience: string;
|
|
7
|
+
readonly requestTimeoutMs?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface ClientCredentialsDeps {
|
|
10
|
+
readonly fetch?: typeof fetch;
|
|
11
|
+
readonly readSecretFile?: (path: string) => Promise<string>;
|
|
12
|
+
readonly now?: () => number;
|
|
13
|
+
}
|
|
14
|
+
export declare class ClientCredentialsTokenError extends Error {
|
|
15
|
+
readonly status: number | undefined;
|
|
16
|
+
constructor(message: string, options?: {
|
|
17
|
+
status?: number;
|
|
18
|
+
cause?: unknown;
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
export declare function createClientCredentialsTokenSource(options: ClientCredentialsOptions, deps?: ClientCredentialsDeps): AccessTokenSource;
|
|
22
|
+
export declare function validateClientCredentialsOptions(options: ClientCredentialsOptions): void;
|
|
23
|
+
//# sourceMappingURL=client-credentials-token-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-credentials-token-source.d.ts","sourceRoot":"","sources":["../../src/lib/client-credentials-token-source.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC;AAYxB,MAAM,WAAW,wBAAwB;IAEvC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAE/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAK1B,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAOlC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAE1B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAGD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;IAC9B,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAC5D,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B;AAKD,qBAAa,2BAA4B,SAAQ,KAAK;IACpD,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;gBAExB,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO;CAKhF;AAWD,wBAAgB,kCAAkC,CAChD,OAAO,EAAE,wBAAwB,EACjC,IAAI,GAAE,qBAA0B,GAC/B,iBAAiB,CAsCnB;AAuDD,wBAAgB,gCAAgC,CAAC,OAAO,EAAE,wBAAwB,GAAG,IAAI,CAmBxF"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ClientCredentialsTokenError = void 0;
|
|
4
|
+
exports.createClientCredentialsTokenSource = createClientCredentialsTokenSource;
|
|
5
|
+
exports.validateClientCredentialsOptions = validateClientCredentialsOptions;
|
|
6
|
+
const promises_1 = require("node:fs/promises");
|
|
7
|
+
const access_token_1 = require("./access-token");
|
|
8
|
+
const DEFAULT_REQUEST_TIMEOUT_MS = 10_000;
|
|
9
|
+
class ClientCredentialsTokenError extends Error {
|
|
10
|
+
status;
|
|
11
|
+
constructor(message, options = {}) {
|
|
12
|
+
super(message, options.cause === undefined ? undefined : { cause: options.cause });
|
|
13
|
+
this.name = 'ClientCredentialsTokenError';
|
|
14
|
+
this.status = options.status;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.ClientCredentialsTokenError = ClientCredentialsTokenError;
|
|
18
|
+
function createClientCredentialsTokenSource(options, deps = {}) {
|
|
19
|
+
validateClientCredentialsOptions(options);
|
|
20
|
+
const doFetch = deps.fetch ?? fetch;
|
|
21
|
+
const readSecret = deps.readSecretFile ?? ((path) => (0, promises_1.readFile)(path, 'utf8'));
|
|
22
|
+
const now = deps.now ?? Date.now;
|
|
23
|
+
const timeoutMs = options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS;
|
|
24
|
+
return async () => {
|
|
25
|
+
const secret = (await readSecret(options.clientSecretFile)).trim();
|
|
26
|
+
if (secret.length === 0) {
|
|
27
|
+
throw new ClientCredentialsTokenError(`Temporal client secret file ${options.clientSecretFile} is empty.`);
|
|
28
|
+
}
|
|
29
|
+
const sentAt = now();
|
|
30
|
+
const response = await doFetch(options.tokenEndpoint, {
|
|
31
|
+
method: 'POST',
|
|
32
|
+
headers: {
|
|
33
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
34
|
+
Accept: 'application/json',
|
|
35
|
+
},
|
|
36
|
+
body: new URLSearchParams({
|
|
37
|
+
grant_type: 'client_credentials',
|
|
38
|
+
client_id: options.clientId,
|
|
39
|
+
client_secret: secret,
|
|
40
|
+
}).toString(),
|
|
41
|
+
signal: AbortSignal.timeout(timeoutMs),
|
|
42
|
+
});
|
|
43
|
+
const text = await response.text();
|
|
44
|
+
if (!response.ok) {
|
|
45
|
+
throw new ClientCredentialsTokenError(`Temporal token request for client ${options.clientId} was refused ` +
|
|
46
|
+
`(HTTP ${response.status}): ${text.slice(0, 300)}`, { status: response.status });
|
|
47
|
+
}
|
|
48
|
+
return parseTokenResponse(text, options, sentAt);
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function parseTokenResponse(text, options, sentAt) {
|
|
52
|
+
let body;
|
|
53
|
+
try {
|
|
54
|
+
body = JSON.parse(text);
|
|
55
|
+
}
|
|
56
|
+
catch (cause) {
|
|
57
|
+
throw new ClientCredentialsTokenError(`Temporal token response for client ${options.clientId} is not JSON.`, { cause });
|
|
58
|
+
}
|
|
59
|
+
const record = (typeof body === 'object' && body !== null ? body : {});
|
|
60
|
+
const value = record['access_token'];
|
|
61
|
+
if (typeof value !== 'string' || value.length === 0) {
|
|
62
|
+
throw new ClientCredentialsTokenError(`Temporal token response for client ${options.clientId} carries no access_token.`);
|
|
63
|
+
}
|
|
64
|
+
const claims = (0, access_token_1.decodeAccessTokenClaims)(value);
|
|
65
|
+
if (!claims.aud.includes(options.audience)) {
|
|
66
|
+
throw new ClientCredentialsTokenError(`Temporal token for client ${options.clientId} does not carry the required ` +
|
|
67
|
+
`audience "${options.audience}" (aud=${JSON.stringify(claims.aud)}). ` +
|
|
68
|
+
'The frontend would refuse it; the issuer-side audience mapper is missing.');
|
|
69
|
+
}
|
|
70
|
+
const expiresIn = record['expires_in'];
|
|
71
|
+
let expiresAt;
|
|
72
|
+
if (typeof expiresIn === 'number' && expiresIn > 0) {
|
|
73
|
+
expiresAt = sentAt + expiresIn * 1000;
|
|
74
|
+
}
|
|
75
|
+
else if (claims.exp !== undefined) {
|
|
76
|
+
expiresAt = claims.exp * 1000;
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
throw new ClientCredentialsTokenError(`Temporal token for client ${options.clientId} has neither expires_in nor exp; ` +
|
|
80
|
+
'its refresh cannot be scheduled.');
|
|
81
|
+
}
|
|
82
|
+
if (expiresAt <= sentAt) {
|
|
83
|
+
throw new ClientCredentialsTokenError(`Temporal token for client ${options.clientId} was already expired when issued.`);
|
|
84
|
+
}
|
|
85
|
+
return { value, expiresAt };
|
|
86
|
+
}
|
|
87
|
+
function validateClientCredentialsOptions(options) {
|
|
88
|
+
let url;
|
|
89
|
+
try {
|
|
90
|
+
url = new URL(options.tokenEndpoint);
|
|
91
|
+
}
|
|
92
|
+
catch {
|
|
93
|
+
throw new Error(`Temporal token endpoint is not a URL: ${options.tokenEndpoint}`);
|
|
94
|
+
}
|
|
95
|
+
if (url.protocol !== 'https:' && url.protocol !== 'http:') {
|
|
96
|
+
throw new Error(`Temporal token endpoint must be http(s): ${options.tokenEndpoint}`);
|
|
97
|
+
}
|
|
98
|
+
for (const [name, value] of [
|
|
99
|
+
['clientId', options.clientId],
|
|
100
|
+
['clientSecretFile', options.clientSecretFile],
|
|
101
|
+
['audience', options.audience],
|
|
102
|
+
]) {
|
|
103
|
+
if (value.trim().length === 0) {
|
|
104
|
+
throw new Error(`Temporal client credentials: ${name} is required.`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=client-credentials-token-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-credentials-token-source.js","sourceRoot":"","sources":["../../src/lib/client-credentials-token-source.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/connection.d.ts
CHANGED
|
@@ -1,14 +1,53 @@
|
|
|
1
1
|
import { Connection } from '@temporalio/client';
|
|
2
2
|
import { NativeConnection } from '@temporalio/worker';
|
|
3
|
+
import type { AccessTokenSource } from './access-token';
|
|
4
|
+
import { type BoundedRetryPolicy, type RetryClock } from './bounded-retry';
|
|
5
|
+
import { type ClientCredentialsDeps, type ClientCredentialsOptions } from './client-credentials-token-source';
|
|
6
|
+
import type { TemporalEnvReader } from './namespace';
|
|
7
|
+
import { ProactiveTokenRefresher, type TokenRefresherLogger } from './proactive-token-refresher';
|
|
3
8
|
export interface TemporalConnectionOptions {
|
|
4
9
|
readonly address: string;
|
|
5
|
-
readonly tls
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
10
|
+
readonly tls: TemporalTlsOptions;
|
|
11
|
+
readonly credentials: ClientCredentialsOptions;
|
|
12
|
+
readonly connectRetry?: BoundedRetryPolicy;
|
|
13
|
+
}
|
|
14
|
+
export interface TemporalTlsOptions {
|
|
15
|
+
readonly serverCaPath: string;
|
|
16
|
+
readonly serverName?: string;
|
|
17
|
+
readonly clientCertPath?: string;
|
|
18
|
+
readonly clientKeyPath?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface TemporalConnectionDeps extends ClientCredentialsDeps {
|
|
21
|
+
readonly logger?: TokenRefresherLogger;
|
|
22
|
+
readonly clock?: RetryClock;
|
|
23
|
+
readonly onCredentialFailure?: (error: Error) => void;
|
|
24
|
+
readonly readFile?: (path: string) => Promise<Buffer>;
|
|
25
|
+
readonly tokenSource?: AccessTokenSource;
|
|
26
|
+
}
|
|
27
|
+
export interface TemporalWorkerConnection {
|
|
28
|
+
readonly connection: NativeConnection;
|
|
29
|
+
readonly tokens: ProactiveTokenRefresher;
|
|
30
|
+
close(): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
export interface TemporalClientConnection {
|
|
33
|
+
readonly connection: Connection;
|
|
34
|
+
readonly tokens: ProactiveTokenRefresher;
|
|
35
|
+
close(): Promise<void>;
|
|
36
|
+
}
|
|
37
|
+
export declare const TEMPORAL_CONNECTION_ENV: {
|
|
38
|
+
readonly address: "TEMPORAL_ADDRESS";
|
|
39
|
+
readonly tlsCaPath: "TEMPORAL_TLS_CA_PATH";
|
|
40
|
+
readonly tlsServerName: "TEMPORAL_TLS_SERVER_NAME";
|
|
41
|
+
readonly tlsClientCertPath: "TEMPORAL_TLS_CLIENT_CERT_PATH";
|
|
42
|
+
readonly tlsClientKeyPath: "TEMPORAL_TLS_CLIENT_KEY_PATH";
|
|
43
|
+
readonly tokenEndpoint: "TEMPORAL_AUTH_TOKEN_ENDPOINT";
|
|
44
|
+
readonly clientId: "TEMPORAL_AUTH_CLIENT_ID";
|
|
45
|
+
readonly clientSecretFile: "TEMPORAL_AUTH_CLIENT_SECRET_FILE";
|
|
46
|
+
readonly audience: "TEMPORAL_AUTH_AUDIENCE";
|
|
47
|
+
};
|
|
48
|
+
export declare function temporalClientCredentialsFromEnv(env: TemporalEnvReader): ClientCredentialsOptions;
|
|
49
|
+
export declare function temporalConnectionOptionsFromEnv(env: TemporalEnvReader): TemporalConnectionOptions;
|
|
50
|
+
export declare function validateTemporalConnectionOptions(options: TemporalConnectionOptions): void;
|
|
51
|
+
export declare function connectTemporalWorker(options: TemporalConnectionOptions, deps?: TemporalConnectionDeps): Promise<TemporalWorkerConnection>;
|
|
52
|
+
export declare function connectTemporalClient(options: TemporalConnectionOptions, deps?: TemporalConnectionDeps): Promise<TemporalClientConnection>;
|
|
14
53
|
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/lib/connection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../../src/lib/connection.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAkB,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAIL,KAAK,kBAAkB,EACvB,KAAK,UAAU,EAChB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAGL,KAAK,qBAAqB,EAC1B,KAAK,wBAAwB,EAC9B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EACL,uBAAuB,EACvB,KAAK,oBAAoB,EAC1B,MAAM,6BAA6B,CAAC;AAqBrC,MAAM,WAAW,yBAAyB;IAExC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,wBAAwB,CAAC;IAE/C,QAAQ,CAAC,YAAY,CAAC,EAAE,kBAAkB,CAAC;CAC5C;AAED,MAAM,WAAW,kBAAkB;IAEjC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAE9B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAE7B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AAGD,MAAM,WAAW,sBAAuB,SAAQ,qBAAqB;IACnE,QAAQ,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAC;IACvC,QAAQ,CAAC,KAAK,CAAC,EAAE,UAAU,CAAC;IAE5B,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACtD,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IAEtD,QAAQ,CAAC,WAAW,CAAC,EAAE,iBAAiB,CAAC;CAC1C;AAGD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,UAAU,EAAE,gBAAgB,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;IAEzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAGD,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,uBAAuB,CAAC;IAEzC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAGD,eAAO,MAAM,uBAAuB;;;;;;;;;;CAU1B,CAAC;AA2BX,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,iBAAiB,GAAG,wBAAwB,CASjG;AASD,wBAAgB,gCAAgC,CAAC,GAAG,EAAE,iBAAiB,GAAG,yBAAyB,CAwBlG;AAGD,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI,CAe1F;AA8DD,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,yBAAyB,EAClC,IAAI,GAAE,sBAA2B,GAChC,OAAO,CAAC,wBAAwB,CAAC,CA8BnC;AAOD,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,yBAAyB,EAClC,IAAI,GAAE,sBAA2B,GAChC,OAAO,CAAC,wBAAwB,CAAC,CAgCnC"}
|