@diia-inhouse/workflow 1.17.11 → 2.5.1
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/dist/activities/index.d.ts +1 -0
- package/dist/activities/index.js +2 -18
- package/dist/activities/proxy.d.ts +34 -0
- package/dist/activities/proxy.js +16 -24
- package/dist/activity.d.ts +2 -0
- package/dist/activity.js +2 -15
- package/dist/cli/checkWorkflowDeterminism.js +249 -275
- package/dist/cli/determinism/errorClassifier.js +56 -60
- package/dist/cli/determinism/historyFiles.js +68 -97
- package/dist/cli/determinism/index.js +7 -19
- package/dist/cli/determinism/replayExecutor.js +114 -133
- package/dist/cli/determinism/replayOptions.js +13 -22
- package/dist/cli/determinism/report.js +55 -45
- package/dist/cli/determinism/reportPrinter.js +101 -138
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +79 -119
- package/dist/cli/syncTemporalSchedules.js +74 -91
- package/dist/cli/updateTemporalSchedule.js +43 -53
- package/dist/client.d.ts +3 -0
- package/dist/client.js +3 -19
- package/dist/common.d.ts +2 -0
- package/dist/common.js +2 -13
- package/dist/encryption/crypto.d.ts +7 -0
- package/dist/encryption/crypto.js +20 -22
- package/dist/encryption/dataConverter.d.ts +7 -0
- package/dist/encryption/dataConverter.js +15 -22
- package/dist/encryption/encryptionCodec.d.ts +31 -0
- package/dist/encryption/encryptionCodec.js +108 -124
- package/dist/encryption/index.d.ts +3 -0
- package/dist/encryption/index.js +4 -20
- package/dist/index.d.ts +7 -0
- package/dist/index.js +6 -42
- package/dist/instrumentation.js +6 -10
- package/dist/interceptors/asyncLocalStorageBridge.js +29 -66
- package/dist/interceptors/traceLogAttributes.d.ts +6 -0
- package/dist/interceptors/traceLogAttributes.js +16 -54
- package/dist/interceptors.d.ts +6 -0
- package/dist/interceptors.js +6 -8
- package/dist/interfaces/config.d.ts +58 -0
- package/dist/interfaces/index.d.ts +1 -0
- package/dist/interfaces/services/schedulesExporter.d.ts +96 -0
- package/dist/interfaces/services/worker.d.ts +60 -0
- package/dist/operations.d.ts +9 -0
- package/dist/operations.js +11 -75
- package/dist/services/client.d.ts +24 -0
- package/dist/services/client.js +89 -96
- package/dist/services/schedulesExporter.d.ts +101 -0
- package/dist/services/schedulesExporter.js +456 -0
- package/dist/services/worker/identity.d.ts +4 -0
- package/dist/services/worker/identity.js +6 -9
- package/dist/services/worker.d.ts +124 -0
- package/dist/services/worker.js +324 -304
- package/dist/services/workerHealth.d.ts +15 -0
- package/dist/services/workerHealth.js +26 -35
- package/dist/testing.d.ts +42 -0
- package/dist/testing.js +43 -54
- package/dist/worker.d.ts +9 -0
- package/dist/worker.js +7 -25
- package/package.json +40 -37
- package/dist/activities/index.js.map +0 -1
- package/dist/activities/proxy.js.map +0 -1
- package/dist/activity.js.map +0 -1
- package/dist/cli/checkWorkflowDeterminism.js.map +0 -1
- package/dist/cli/determinism/errorClassifier.js.map +0 -1
- package/dist/cli/determinism/historyFiles.js.map +0 -1
- package/dist/cli/determinism/index.js.map +0 -1
- package/dist/cli/determinism/replayExecutor.js.map +0 -1
- package/dist/cli/determinism/replayOptions.js.map +0 -1
- package/dist/cli/determinism/report.js.map +0 -1
- package/dist/cli/determinism/reportPrinter.js.map +0 -1
- package/dist/cli/determinism/types.js +0 -3
- package/dist/cli/determinism/types.js.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/syncTemporalSchedules.js.map +0 -1
- package/dist/cli/updateTemporalSchedule.js.map +0 -1
- package/dist/client.js.map +0 -1
- package/dist/common.js.map +0 -1
- package/dist/encryption/crypto.js.map +0 -1
- package/dist/encryption/dataConverter.js.map +0 -1
- package/dist/encryption/encryptionCodec.js.map +0 -1
- package/dist/encryption/index.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/instrumentation.js.map +0 -1
- package/dist/interceptors/asyncLocalStorageBridge.js.map +0 -1
- package/dist/interceptors/index.js +0 -8
- package/dist/interceptors/index.js.map +0 -1
- package/dist/interceptors/traceLogAttributes.js.map +0 -1
- package/dist/interceptors.js.map +0 -1
- package/dist/interfaces/config.js +0 -3
- package/dist/interfaces/config.js.map +0 -1
- package/dist/interfaces/index.js +0 -18
- package/dist/interfaces/index.js.map +0 -1
- package/dist/interfaces/services/worker.js +0 -3
- package/dist/interfaces/services/worker.js.map +0 -1
- package/dist/operations.js.map +0 -1
- package/dist/services/client.js.map +0 -1
- package/dist/services/index.js +0 -19
- package/dist/services/index.js.map +0 -1
- package/dist/services/worker/identity.js.map +0 -1
- package/dist/services/worker/index.js +0 -18
- package/dist/services/worker/index.js.map +0 -1
- package/dist/services/worker.js.map +0 -1
- package/dist/services/workerHealth.js.map +0 -1
- package/dist/testing.js.map +0 -1
- package/dist/types/activities/index.d.ts +0 -1
- package/dist/types/activities/proxy.d.ts +0 -35
- package/dist/types/activity.d.ts +0 -1
- package/dist/types/cli/checkWorkflowDeterminism.d.ts +0 -19
- package/dist/types/cli/determinism/errorClassifier.d.ts +0 -15
- package/dist/types/cli/determinism/historyFiles.d.ts +0 -18
- package/dist/types/cli/determinism/index.d.ts +0 -10
- package/dist/types/cli/determinism/replayExecutor.d.ts +0 -9
- package/dist/types/cli/determinism/replayOptions.d.ts +0 -7
- package/dist/types/cli/determinism/report.d.ts +0 -16
- package/dist/types/cli/determinism/reportPrinter.d.ts +0 -5
- package/dist/types/cli/determinism/types.d.ts +0 -44
- package/dist/types/cli/index.d.ts +0 -2
- package/dist/types/cli/syncTemporalSchedules.d.ts +0 -12
- package/dist/types/cli/updateTemporalSchedule.d.ts +0 -9
- package/dist/types/client.d.ts +0 -2
- package/dist/types/common.d.ts +0 -1
- package/dist/types/encryption/crypto.d.ts +0 -3
- package/dist/types/encryption/dataConverter.d.ts +0 -3
- package/dist/types/encryption/encryptionCodec.d.ts +0 -27
- package/dist/types/encryption/index.d.ts +0 -3
- package/dist/types/index.d.ts +0 -3
- package/dist/types/instrumentation.d.ts +0 -2
- package/dist/types/interceptors/asyncLocalStorageBridge.d.ts +0 -21
- package/dist/types/interceptors/index.d.ts +0 -2
- package/dist/types/interceptors/traceLogAttributes.d.ts +0 -2
- package/dist/types/interceptors.d.ts +0 -2
- package/dist/types/interfaces/config.d.ts +0 -38
- package/dist/types/interfaces/index.d.ts +0 -1
- package/dist/types/interfaces/services/worker.d.ts +0 -37
- package/dist/types/operations.d.ts +0 -5
- package/dist/types/services/client.d.ts +0 -20
- package/dist/types/services/index.d.ts +0 -2
- package/dist/types/services/worker/identity.d.ts +0 -1
- package/dist/types/services/worker/index.d.ts +0 -1
- package/dist/types/services/worker.d.ts +0 -113
- package/dist/types/services/workerHealth.d.ts +0 -11
- package/dist/types/testing.d.ts +0 -42
- package/dist/types/worker.d.ts +0 -3
- package/dist/worker.js.map +0 -1
|
@@ -1,125 +1,109 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import { decrypt, encrypt } from "./crypto.js";
|
|
2
|
+
import temporalProto from "@temporalio/proto";
|
|
3
|
+
import { webcrypto } from "node:crypto";
|
|
4
|
+
import { METADATA_ENCODING_KEY, ValueError } from "@temporalio/common";
|
|
5
|
+
import { decode, encode } from "@temporalio/common/lib/encoding.js";
|
|
6
|
+
import { DiiaLogger } from "@diia-inhouse/diia-logger";
|
|
7
|
+
//#region src/encryption/encryptionCodec.ts
|
|
8
|
+
const { temporal } = temporalProto;
|
|
9
|
+
var EncryptionCodec = class EncryptionCodec {
|
|
10
|
+
keys;
|
|
11
|
+
defaultKeyId;
|
|
12
|
+
envService;
|
|
13
|
+
logger;
|
|
14
|
+
batchSize;
|
|
15
|
+
encoding = "binary/encrypted";
|
|
16
|
+
metadataEncryptionKeyId = "encryption-key-id";
|
|
17
|
+
constructor(keys, defaultKeyId, envService, logger, options = {}) {
|
|
18
|
+
this.keys = keys;
|
|
19
|
+
this.defaultKeyId = defaultKeyId;
|
|
20
|
+
this.envService = envService;
|
|
21
|
+
this.logger = logger;
|
|
22
|
+
this.batchSize = options.batchSize ?? 50;
|
|
23
|
+
}
|
|
24
|
+
static async create(keyId, envService, options, logger = new DiiaLogger()) {
|
|
25
|
+
const storedKeys = /* @__PURE__ */ new Map();
|
|
26
|
+
const { vaultEnabled } = options;
|
|
27
|
+
if (!vaultEnabled) {
|
|
28
|
+
logger.info("Vault is disabled, extracting static keys from env for Temporal encryption");
|
|
29
|
+
const keys = JSON.parse(keyId);
|
|
30
|
+
for (const [fullKeyName, key] of Object.entries(keys)) storedKeys.set(fullKeyName, await EncryptionCodec.createCryptoKey(key));
|
|
31
|
+
const defaultKey = Object.keys(keys).toSorted((a, b) => {
|
|
32
|
+
const versionA = Number.parseInt(a.split("/").at(-1) || "0");
|
|
33
|
+
return Number.parseInt(b.split("/").at(-1) || "0") - versionA;
|
|
34
|
+
})[0];
|
|
35
|
+
return new this(storedKeys, defaultKey, envService, logger, options);
|
|
36
|
+
}
|
|
37
|
+
const { fullKeyName, key } = await envService.getTransitKey(keyId, { keyVersion: "latest" });
|
|
38
|
+
storedKeys.set(fullKeyName, await EncryptionCodec.createCryptoKey(key));
|
|
39
|
+
return new this(storedKeys, fullKeyName, envService, logger, options);
|
|
40
|
+
}
|
|
41
|
+
static async createCryptoKey(key) {
|
|
42
|
+
try {
|
|
43
|
+
const keyBuffer = Buffer.from(key, "base64");
|
|
44
|
+
return await webcrypto.subtle.importKey("raw", keyBuffer, {
|
|
45
|
+
name: "AES-GCM",
|
|
46
|
+
length: 256
|
|
47
|
+
}, true, ["encrypt", "decrypt"]);
|
|
48
|
+
} catch (err) {
|
|
49
|
+
throw new Error(`Failed to create crypto key: ${err.message}`, { cause: err });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
async refreshDefaultKey() {
|
|
53
|
+
const { name: keyId } = this.splitKeyId(this.defaultKeyId);
|
|
54
|
+
const { fullKeyName, key } = await this.envService.getTransitKey(keyId, { keyVersion: "latest" });
|
|
55
|
+
if (!this.keys.has(fullKeyName)) {
|
|
56
|
+
const newKey = await EncryptionCodec.createCryptoKey(key);
|
|
57
|
+
this.keys.set(fullKeyName, newKey);
|
|
58
|
+
this.defaultKeyId = fullKeyName;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
async encode(payloads) {
|
|
62
|
+
return await this.processBatch(payloads, async (payload) => ({
|
|
63
|
+
metadata: {
|
|
64
|
+
[METADATA_ENCODING_KEY]: encode(this.encoding),
|
|
65
|
+
[this.metadataEncryptionKeyId]: encode(this.defaultKeyId)
|
|
66
|
+
},
|
|
67
|
+
data: await encrypt(temporal.api.common.v1.Payload.encode(payload).finish(), this.keys.get(this.defaultKeyId))
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
async decode(payloads) {
|
|
71
|
+
return await this.processBatch(payloads, async (payload) => {
|
|
72
|
+
if (!payload.metadata || decode(payload.metadata[METADATA_ENCODING_KEY]) !== this.encoding) return payload;
|
|
73
|
+
if (!payload.data) throw new ValueError("Payload data is missing");
|
|
74
|
+
const keyIdBytes = payload.metadata[this.metadataEncryptionKeyId];
|
|
75
|
+
if (!keyIdBytes) throw new ValueError("Unable to decrypt Payload without encryption key id");
|
|
76
|
+
const keyId = decode(keyIdBytes);
|
|
77
|
+
let key = this.keys.get(keyId);
|
|
78
|
+
if (!key) {
|
|
79
|
+
const { name, version } = this.splitKeyId(keyId);
|
|
80
|
+
const { key: rawKey } = await this.envService.getTransitKey(name, { keyVersion: version });
|
|
81
|
+
this.logger.info(`Decryption key ${keyId} not found in cache, fetched from vault`);
|
|
82
|
+
key = await EncryptionCodec.createCryptoKey(rawKey);
|
|
83
|
+
this.keys.set(keyId, key);
|
|
84
|
+
}
|
|
85
|
+
const decryptedPayloadBytes = await decrypt(payload.data, key);
|
|
86
|
+
return temporal.api.common.v1.Payload.decode(decryptedPayloadBytes);
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
async processBatch(items, processor) {
|
|
90
|
+
const results = [];
|
|
91
|
+
for (let i = 0; i < items.length; i += this.batchSize) {
|
|
92
|
+
const batchPromises = items.slice(i, i + this.batchSize).map(processor);
|
|
93
|
+
const batchResults = await Promise.all(batchPromises);
|
|
94
|
+
results.push(...batchResults);
|
|
95
|
+
}
|
|
96
|
+
return results;
|
|
97
|
+
}
|
|
98
|
+
splitKeyId(fullKeyId) {
|
|
99
|
+
const name = fullKeyId.split("/").slice(0, -1).join("/");
|
|
100
|
+
const version = fullKeyId.split("/").at(-1);
|
|
101
|
+
if (!version || Number.isNaN(Number(version))) throw new Error(`Invalid key ID: ${fullKeyId}. Failed to get version`);
|
|
102
|
+
return {
|
|
103
|
+
name,
|
|
104
|
+
version
|
|
105
|
+
};
|
|
106
|
+
}
|
|
4
107
|
};
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const node_crypto_1 = require("node:crypto");
|
|
8
|
-
const common_1 = require("@temporalio/common");
|
|
9
|
-
const encoding_1 = require("@temporalio/common/lib/encoding");
|
|
10
|
-
const proto_1 = require("@temporalio/proto");
|
|
11
|
-
const diia_logger_1 = __importDefault(require("@diia-inhouse/diia-logger"));
|
|
12
|
-
const crypto_1 = require("./crypto");
|
|
13
|
-
class EncryptionCodec {
|
|
14
|
-
keys;
|
|
15
|
-
defaultKeyId;
|
|
16
|
-
envService;
|
|
17
|
-
logger;
|
|
18
|
-
batchSize;
|
|
19
|
-
encoding = 'binary/encrypted';
|
|
20
|
-
metadataEncryptionKeyId = 'encryption-key-id';
|
|
21
|
-
constructor(keys, defaultKeyId, envService, logger, options = {}) {
|
|
22
|
-
this.keys = keys;
|
|
23
|
-
this.defaultKeyId = defaultKeyId;
|
|
24
|
-
this.envService = envService;
|
|
25
|
-
this.logger = logger;
|
|
26
|
-
this.batchSize = options.batchSize ?? 50;
|
|
27
|
-
this.defaultKeyId = defaultKeyId;
|
|
28
|
-
}
|
|
29
|
-
static async create(keyId, envService, options, logger = new diia_logger_1.default()) {
|
|
30
|
-
const storedKeys = new Map();
|
|
31
|
-
const { vaultEnabled } = options;
|
|
32
|
-
if (!vaultEnabled) {
|
|
33
|
-
logger.info('Vault is disabled, extracting static keys from env for Temporal encryption');
|
|
34
|
-
const keys = JSON.parse(keyId);
|
|
35
|
-
for (const [fullKeyName, key] of Object.entries(keys)) {
|
|
36
|
-
storedKeys.set(fullKeyName, await EncryptionCodec.createCryptoKey(key));
|
|
37
|
-
}
|
|
38
|
-
const defaultKey = Object.keys(keys).toSorted((a, b) => {
|
|
39
|
-
const versionA = Number.parseInt(a.split('/').at(-1) || '0');
|
|
40
|
-
const versionB = Number.parseInt(b.split('/').at(-1) || '0');
|
|
41
|
-
return versionB - versionA;
|
|
42
|
-
})[0];
|
|
43
|
-
return new this(storedKeys, defaultKey, envService, logger, options);
|
|
44
|
-
}
|
|
45
|
-
const { fullKeyName, key } = await envService.getTransitKey(keyId, { keyVersion: 'latest' });
|
|
46
|
-
storedKeys.set(fullKeyName, await EncryptionCodec.createCryptoKey(key));
|
|
47
|
-
return new this(storedKeys, fullKeyName, envService, logger, options);
|
|
48
|
-
}
|
|
49
|
-
static async createCryptoKey(key) {
|
|
50
|
-
try {
|
|
51
|
-
const keyBuffer = Buffer.from(key, 'base64');
|
|
52
|
-
const cryptoKey = await node_crypto_1.webcrypto.subtle.importKey('raw', keyBuffer, {
|
|
53
|
-
name: 'AES-GCM',
|
|
54
|
-
length: 256,
|
|
55
|
-
}, true, ['encrypt', 'decrypt']);
|
|
56
|
-
return cryptoKey;
|
|
57
|
-
}
|
|
58
|
-
catch (err) {
|
|
59
|
-
throw new Error(`Failed to create crypto key: ${err.message}`);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
async refreshDefaultKey() {
|
|
63
|
-
const { name: keyId } = this.splitKeyId(this.defaultKeyId);
|
|
64
|
-
const { fullKeyName, key } = await this.envService.getTransitKey(keyId, { keyVersion: 'latest' });
|
|
65
|
-
if (!this.keys.has(fullKeyName)) {
|
|
66
|
-
const newKey = await EncryptionCodec.createCryptoKey(key);
|
|
67
|
-
this.keys.set(fullKeyName, newKey);
|
|
68
|
-
this.defaultKeyId = fullKeyName;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
async encode(payloads) {
|
|
72
|
-
return await this.processBatch(payloads, async (payload) => ({
|
|
73
|
-
metadata: {
|
|
74
|
-
[common_1.METADATA_ENCODING_KEY]: (0, encoding_1.encode)(this.encoding),
|
|
75
|
-
[this.metadataEncryptionKeyId]: (0, encoding_1.encode)(this.defaultKeyId),
|
|
76
|
-
},
|
|
77
|
-
data: await (0, crypto_1.encrypt)(proto_1.temporal.api.common.v1.Payload.encode(payload).finish(), this.keys.get(this.defaultKeyId)),
|
|
78
|
-
}));
|
|
79
|
-
}
|
|
80
|
-
async decode(payloads) {
|
|
81
|
-
return await this.processBatch(payloads, async (payload) => {
|
|
82
|
-
if (!payload.metadata || (0, encoding_1.decode)(payload.metadata[common_1.METADATA_ENCODING_KEY]) !== this.encoding) {
|
|
83
|
-
return payload;
|
|
84
|
-
}
|
|
85
|
-
if (!payload.data) {
|
|
86
|
-
throw new common_1.ValueError('Payload data is missing');
|
|
87
|
-
}
|
|
88
|
-
const keyIdBytes = payload.metadata[this.metadataEncryptionKeyId];
|
|
89
|
-
if (!keyIdBytes) {
|
|
90
|
-
throw new common_1.ValueError('Unable to decrypt Payload without encryption key id');
|
|
91
|
-
}
|
|
92
|
-
const keyId = (0, encoding_1.decode)(keyIdBytes);
|
|
93
|
-
let key = this.keys.get(keyId);
|
|
94
|
-
if (!key) {
|
|
95
|
-
const { name, version } = this.splitKeyId(keyId);
|
|
96
|
-
const { key: rawKey } = await this.envService.getTransitKey(name, { keyVersion: version });
|
|
97
|
-
this.logger.info(`Decryption key ${keyId} not found in cache, fetched from vault`);
|
|
98
|
-
key = await EncryptionCodec.createCryptoKey(rawKey);
|
|
99
|
-
this.keys.set(keyId, key);
|
|
100
|
-
}
|
|
101
|
-
const decryptedPayloadBytes = await (0, crypto_1.decrypt)(payload.data, key);
|
|
102
|
-
return proto_1.temporal.api.common.v1.Payload.decode(decryptedPayloadBytes);
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
async processBatch(items, processor) {
|
|
106
|
-
const results = [];
|
|
107
|
-
for (let i = 0; i < items.length; i += this.batchSize) {
|
|
108
|
-
const batch = items.slice(i, i + this.batchSize);
|
|
109
|
-
const batchPromises = batch.map(processor);
|
|
110
|
-
const batchResults = await Promise.all(batchPromises);
|
|
111
|
-
results.push(...batchResults);
|
|
112
|
-
}
|
|
113
|
-
return results;
|
|
114
|
-
}
|
|
115
|
-
splitKeyId(fullKeyId) {
|
|
116
|
-
const name = fullKeyId.split('/').slice(0, -1).join('/');
|
|
117
|
-
const version = fullKeyId.split('/').at(-1);
|
|
118
|
-
if (!version || Number.isNaN(Number(version))) {
|
|
119
|
-
throw new Error(`Invalid key ID: ${fullKeyId}. Failed to get version`);
|
|
120
|
-
}
|
|
121
|
-
return { name, version };
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
exports.EncryptionCodec = EncryptionCodec;
|
|
125
|
-
//# sourceMappingURL=encryptionCodec.js.map
|
|
108
|
+
//#endregion
|
|
109
|
+
export { EncryptionCodec };
|
package/dist/encryption/index.js
CHANGED
|
@@ -1,20 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./dataConverter"), exports);
|
|
18
|
-
__exportStar(require("./encryptionCodec"), exports);
|
|
19
|
-
__exportStar(require("./crypto"), exports);
|
|
20
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
import "./crypto.js";
|
|
2
|
+
import "./encryptionCodec.js";
|
|
3
|
+
import "./dataConverter.js";
|
|
4
|
+
export {};
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { SchedulesExporterConfig } from "./interfaces/services/schedulesExporter.js";
|
|
2
|
+
import { TemporalConfig } from "./interfaces/config.js";
|
|
3
|
+
import { getDataConverter } from "./encryption/dataConverter.js";
|
|
4
|
+
import { EncryptionCodec } from "./encryption/encryptionCodec.js";
|
|
5
|
+
import { decrypt, encrypt } from "./encryption/crypto.js";
|
|
6
|
+
import * as proto from "@temporalio/proto";
|
|
7
|
+
export { EncryptionCodec, type SchedulesExporterConfig, type TemporalConfig, decrypt, encrypt, getDataConverter, proto };
|
package/dist/index.js
CHANGED
|
@@ -1,42 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
36
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
37
|
-
};
|
|
38
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
-
exports.proto = void 0;
|
|
40
|
-
exports.proto = __importStar(require("@temporalio/proto"));
|
|
41
|
-
__exportStar(require("./encryption"), exports);
|
|
42
|
-
//# sourceMappingURL=index.js.map
|
|
1
|
+
import { decrypt, encrypt } from "./encryption/crypto.js";
|
|
2
|
+
import { EncryptionCodec } from "./encryption/encryptionCodec.js";
|
|
3
|
+
import { getDataConverter } from "./encryption/dataConverter.js";
|
|
4
|
+
import "./encryption/index.js";
|
|
5
|
+
import * as proto from "@temporalio/proto";
|
|
6
|
+
export { EncryptionCodec, decrypt, encrypt, getDataConverter, proto };
|
package/dist/instrumentation.js
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
url: env_1.EnvService.getVar('TRACING_EXPORTER_URL', 'string', 'http://localhost:4317') ||
|
|
8
|
-
'http://opentelemetry-collector.tracing.svc.cluster.local:4317',
|
|
9
|
-
});
|
|
10
|
-
//# sourceMappingURL=instrumentation.js.map
|
|
1
|
+
import { EnvService } from "@diia-inhouse/env";
|
|
2
|
+
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-grpc";
|
|
3
|
+
//#region src/instrumentation.ts
|
|
4
|
+
const traceExporter = new OTLPTraceExporter({ url: EnvService.getVar("TRACING_EXPORTER_URL", "string", "http://localhost:4317") || "http://opentelemetry-collector.tracing.svc.cluster.local:4317" });
|
|
5
|
+
//#endregion
|
|
6
|
+
export { traceExporter };
|
|
@@ -1,67 +1,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.AsyncLocalStorageBridgeInterceptor = void 0;
|
|
37
|
-
const otel = __importStar(require("@opentelemetry/api"));
|
|
1
|
+
import * as otel from "@opentelemetry/api";
|
|
2
|
+
//#region src/interceptors/asyncLocalStorageBridge.ts
|
|
38
3
|
/**
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
exports.AsyncLocalStorageBridgeInterceptor = AsyncLocalStorageBridgeInterceptor;
|
|
67
|
-
//# sourceMappingURL=asyncLocalStorageBridge.js.map
|
|
4
|
+
* Bridges OpenTelemetry trace context to AsyncLocalStorage for Temporal activities.
|
|
5
|
+
*
|
|
6
|
+
* Extracts trace_id from OpenTelemetry span and injects it into AsyncLocalStorage,
|
|
7
|
+
* making it available to services.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* // In a service called from an activity:
|
|
11
|
+
* const traceId = this.asyncLocalStorage.getStore()?.logData?.traceId
|
|
12
|
+
*/
|
|
13
|
+
var AsyncLocalStorageBridgeInterceptor = class {
|
|
14
|
+
ctx;
|
|
15
|
+
asyncLocalStorage;
|
|
16
|
+
logger;
|
|
17
|
+
constructor(ctx, asyncLocalStorage, logger) {
|
|
18
|
+
this.ctx = ctx;
|
|
19
|
+
this.asyncLocalStorage = asyncLocalStorage;
|
|
20
|
+
this.logger = logger;
|
|
21
|
+
}
|
|
22
|
+
async execute(input, next) {
|
|
23
|
+
const spanContext = otel.trace.getSpan(otel.context.active())?.spanContext();
|
|
24
|
+
const traceId = spanContext && otel.isSpanContextValid(spanContext) ? spanContext.traceId : void 0;
|
|
25
|
+
const alsData = { logData: this.logger.prepareContext({ traceId }) };
|
|
26
|
+
return await this.asyncLocalStorage.run(alsData, async () => await next(input));
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
//#endregion
|
|
30
|
+
export { AsyncLocalStorageBridgeInterceptor };
|
|
@@ -1,55 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.interceptors = void 0;
|
|
37
|
-
const otel = __importStar(require("@opentelemetry/api"));
|
|
1
|
+
import * as otel from "@opentelemetry/api";
|
|
2
|
+
//#region src/interceptors/traceLogAttributes.ts
|
|
38
3
|
/** Injects traceId and spanId from OpenTelemetry into workflow log attributes. */
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
});
|
|
54
|
-
exports.interceptors = interceptors;
|
|
55
|
-
//# sourceMappingURL=traceLogAttributes.js.map
|
|
4
|
+
var TraceLogAttributesInterceptor = class {
|
|
5
|
+
getLogAttributes(input, next) {
|
|
6
|
+
const attrs = next(input);
|
|
7
|
+
const spanContext = otel.trace.getSpan(otel.context.active())?.spanContext();
|
|
8
|
+
if (spanContext && otel.isSpanContextValid(spanContext)) {
|
|
9
|
+
attrs.traceId = spanContext.traceId;
|
|
10
|
+
attrs.spanId = spanContext.spanId;
|
|
11
|
+
}
|
|
12
|
+
return attrs;
|
|
13
|
+
}
|
|
14
|
+
};
|
|
15
|
+
const interceptors = () => ({ outbound: [new TraceLogAttributesInterceptor()] });
|
|
16
|
+
//#endregion
|
|
17
|
+
export { interceptors };
|
package/dist/interceptors.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.workflowInterceptors = void 0;
|
|
4
|
-
const interceptors_opentelemetry_1 = require("@temporalio/interceptors-opentelemetry");
|
|
1
|
+
import { OpenTelemetryInboundInterceptor, OpenTelemetryOutboundInterceptor } from "@temporalio/interceptors-opentelemetry";
|
|
2
|
+
//#region src/interceptors.ts
|
|
5
3
|
const workflowInterceptors = () => ({
|
|
6
|
-
|
|
7
|
-
|
|
4
|
+
inbound: [new OpenTelemetryInboundInterceptor()],
|
|
5
|
+
outbound: [new OpenTelemetryOutboundInterceptor()]
|
|
8
6
|
});
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
//#endregion
|
|
8
|
+
export { workflowInterceptors };
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { SchedulesExporterConfig } from "./services/schedulesExporter.js";
|
|
2
|
+
import { ClientOptions, ConnectionOptions } from "@temporalio/client";
|
|
3
|
+
import { MetricsConfig } from "@diia-inhouse/diia-metrics";
|
|
4
|
+
import { QueueConnectionConfig } from "@diia-inhouse/diia-queue";
|
|
5
|
+
|
|
6
|
+
//#region src/interfaces/config.d.ts
|
|
7
|
+
interface TemporalConfig extends Omit<ClientOptions, "dataConverter"> {
|
|
8
|
+
taskQueue: string;
|
|
9
|
+
encryptionEnabled: boolean;
|
|
10
|
+
encryptionKeyId: string;
|
|
11
|
+
encryptionKeyRefreshInterval?: number;
|
|
12
|
+
address?: string;
|
|
13
|
+
tls?: ConnectionOptions["tls"];
|
|
14
|
+
connectTimeout?: ConnectionOptions["connectTimeout"];
|
|
15
|
+
/**
|
|
16
|
+
* Controls whether the Temporal worker runs in the same process as the service.
|
|
17
|
+
*
|
|
18
|
+
* - `true` (default): Worker is bootstrapped together with the service in the same process.
|
|
19
|
+
* - `false`: Service starts without bootstrapping the worker. The worker should be run
|
|
20
|
+
* as a separate process using `bootstrapWorker()`.
|
|
21
|
+
*
|
|
22
|
+
* This is configured at the service level to enable flexible deployment topologies
|
|
23
|
+
* where workers can be scaled independently from the main service.
|
|
24
|
+
*/
|
|
25
|
+
workerInProcess?: boolean;
|
|
26
|
+
/**
|
|
27
|
+
* Whether to disable message queue consumers when running as a separate worker process.
|
|
28
|
+
* Applies to all queue connection types (internal, external, etc.).
|
|
29
|
+
*
|
|
30
|
+
* Defaults to `true` when `bootstrapWorker` manages the full application lifecycle
|
|
31
|
+
* (i.e. when `configFactory` and `deps` are provided).
|
|
32
|
+
*/
|
|
33
|
+
disableQueueConsumers?: boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Controls the SchedulesExporter, which polls Temporal Schedule and Visibility APIs and
|
|
36
|
+
* emits per-schedule + in-flight workflow gauges (`diia_schedule_*`, `diia_workflows_running`,
|
|
37
|
+
* etc.). Auto-started by `bootstrapWorker` / `initTemporalWorker` — services do not need
|
|
38
|
+
* to instantiate it themselves.
|
|
39
|
+
*
|
|
40
|
+
* Runs only in the worker process: when `workerInProcess === false` and the service is
|
|
41
|
+
* started without `bootstrapWorker`'s lifecycle path, the exporter is skipped (the worker
|
|
42
|
+
* process owns it).
|
|
43
|
+
*
|
|
44
|
+
* - Omit (default) — exporter starts with the defaults in `SchedulesExporterConfig`.
|
|
45
|
+
* - `false` — disable the exporter entirely (e.g. for clusters without advanced visibility).
|
|
46
|
+
* - Object — override polling intervals or other knobs. See `SchedulesExporterConfig`.
|
|
47
|
+
*/
|
|
48
|
+
schedulesExporter?: SchedulesExporterConfig | false;
|
|
49
|
+
}
|
|
50
|
+
interface AppConfig {
|
|
51
|
+
temporal: TemporalConfig;
|
|
52
|
+
metrics: {
|
|
53
|
+
custom: MetricsConfig;
|
|
54
|
+
};
|
|
55
|
+
rabbit?: QueueConnectionConfig;
|
|
56
|
+
}
|
|
57
|
+
//#endregion
|
|
58
|
+
export { AppConfig, TemporalConfig };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import { AppConfig, TemporalConfig } from "./config.js";
|