@tradejs/infra 3.1.2 → 3.1.4
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/{chunk-RZTVC4ZL.mjs → chunk-JLVCBKE3.mjs} +0 -1
- package/dist/redis.d.mts +0 -1
- package/dist/redis.d.ts +0 -1
- package/dist/redis.js +0 -1
- package/dist/redis.mjs +1 -1
- package/dist/runtimeDeployments.d.mts +2 -1
- package/dist/runtimeDeployments.d.ts +2 -1
- package/dist/runtimeDeployments.js +52 -21
- package/dist/runtimeDeployments.mjs +51 -20
- package/dist/runtimeStrategyConfigs.js +0 -1
- package/dist/runtimeStrategyConfigs.mjs +1 -1
- package/dist/runtimeStrategyReleases.d.mts +5 -13
- package/dist/runtimeStrategyReleases.d.ts +5 -13
- package/dist/runtimeStrategyReleases.js +12 -38
- package/dist/runtimeStrategyReleases.mjs +13 -37
- package/dist/tradingAccounts.js +5 -27
- package/dist/tradingAccounts.mjs +6 -27
- package/dist/userSettings.d.mts +0 -4
- package/dist/userSettings.d.ts +0 -4
- package/dist/userSettings.js +0 -3
- package/dist/userSettings.mjs +1 -3
- package/package.json +2 -2
|
@@ -517,7 +517,6 @@ var redisKeys = {
|
|
|
517
517
|
backtestConfig: (userName, config) => `users:${userName}:backtests:configs:${config}`,
|
|
518
518
|
strategies: (userName) => `users:${userName}:strategies`,
|
|
519
519
|
strategyConfig: (userName, strategyName, configId = "config") => `users:${userName}:strategies:${strategyName}:${configId}`,
|
|
520
|
-
runtimeStrategyDraft: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:draft`,
|
|
521
520
|
runtimeStrategyReleases: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:releases:`,
|
|
522
521
|
runtimeStrategyRelease: (userName, strategyName, releaseVersion) => `users:${userName}:strategies:${strategyName}:releases:${releaseVersion}`,
|
|
523
522
|
runtimeStrategyReleaseSequence: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:release-seq`,
|
package/dist/redis.d.mts
CHANGED
|
@@ -47,7 +47,6 @@ declare const redisKeys: {
|
|
|
47
47
|
backtestConfig: (userName: string, config: string) => string;
|
|
48
48
|
strategies: (userName: string) => string;
|
|
49
49
|
strategyConfig: (userName: string, strategyName: string, configId?: string) => string;
|
|
50
|
-
runtimeStrategyDraft: (userName: string, strategyName: string) => string;
|
|
51
50
|
runtimeStrategyReleases: (userName: string, strategyName: string) => string;
|
|
52
51
|
runtimeStrategyRelease: (userName: string, strategyName: string, releaseVersion: number) => string;
|
|
53
52
|
runtimeStrategyReleaseSequence: (userName: string, strategyName: string) => string;
|
package/dist/redis.d.ts
CHANGED
|
@@ -47,7 +47,6 @@ declare const redisKeys: {
|
|
|
47
47
|
backtestConfig: (userName: string, config: string) => string;
|
|
48
48
|
strategies: (userName: string) => string;
|
|
49
49
|
strategyConfig: (userName: string, strategyName: string, configId?: string) => string;
|
|
50
|
-
runtimeStrategyDraft: (userName: string, strategyName: string) => string;
|
|
51
50
|
runtimeStrategyReleases: (userName: string, strategyName: string) => string;
|
|
52
51
|
runtimeStrategyRelease: (userName: string, strategyName: string, releaseVersion: number) => string;
|
|
53
52
|
runtimeStrategyReleaseSequence: (userName: string, strategyName: string) => string;
|
package/dist/redis.js
CHANGED
|
@@ -569,7 +569,6 @@ var redisKeys = {
|
|
|
569
569
|
backtestConfig: (userName, config) => `users:${userName}:backtests:configs:${config}`,
|
|
570
570
|
strategies: (userName) => `users:${userName}:strategies`,
|
|
571
571
|
strategyConfig: (userName, strategyName, configId = "config") => `users:${userName}:strategies:${strategyName}:${configId}`,
|
|
572
|
-
runtimeStrategyDraft: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:draft`,
|
|
573
572
|
runtimeStrategyReleases: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:releases:`,
|
|
574
573
|
runtimeStrategyRelease: (userName, strategyName, releaseVersion) => `users:${userName}:strategies:${strategyName}:releases:${releaseVersion}`,
|
|
575
574
|
runtimeStrategyReleaseSequence: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:release-seq`,
|
package/dist/redis.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { RuntimeDeployment, RuntimeDeploymentHeartbeat } from '@tradejs/types';
|
|
2
2
|
|
|
3
|
+
declare const verifyRuntimeDeployment: (value: unknown) => RuntimeDeployment;
|
|
3
4
|
declare const listRuntimeDeployments: (userName: string) => Promise<RuntimeDeployment[]>;
|
|
4
5
|
declare const getRuntimeDeployment: (userName: string, deploymentId: string) => Promise<RuntimeDeployment | null>;
|
|
5
6
|
declare const saveRuntimeDeployment: (userName: string, deployment: RuntimeDeployment) => Promise<RuntimeDeployment>;
|
|
@@ -7,4 +8,4 @@ declare const deleteRuntimeDeployment: (userName: string, deploymentId: string)
|
|
|
7
8
|
declare const getRuntimeDeploymentHeartbeat: (userName: string, deploymentId: string) => Promise<RuntimeDeploymentHeartbeat | null>;
|
|
8
9
|
declare const saveRuntimeDeploymentHeartbeat: (userName: string, heartbeat: RuntimeDeploymentHeartbeat) => Promise<RuntimeDeploymentHeartbeat>;
|
|
9
10
|
|
|
10
|
-
export { deleteRuntimeDeployment, getRuntimeDeployment, getRuntimeDeploymentHeartbeat, listRuntimeDeployments, saveRuntimeDeployment, saveRuntimeDeploymentHeartbeat };
|
|
11
|
+
export { deleteRuntimeDeployment, getRuntimeDeployment, getRuntimeDeploymentHeartbeat, listRuntimeDeployments, saveRuntimeDeployment, saveRuntimeDeploymentHeartbeat, verifyRuntimeDeployment };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { RuntimeDeployment, RuntimeDeploymentHeartbeat } from '@tradejs/types';
|
|
2
2
|
|
|
3
|
+
declare const verifyRuntimeDeployment: (value: unknown) => RuntimeDeployment;
|
|
3
4
|
declare const listRuntimeDeployments: (userName: string) => Promise<RuntimeDeployment[]>;
|
|
4
5
|
declare const getRuntimeDeployment: (userName: string, deploymentId: string) => Promise<RuntimeDeployment | null>;
|
|
5
6
|
declare const saveRuntimeDeployment: (userName: string, deployment: RuntimeDeployment) => Promise<RuntimeDeployment>;
|
|
@@ -7,4 +8,4 @@ declare const deleteRuntimeDeployment: (userName: string, deploymentId: string)
|
|
|
7
8
|
declare const getRuntimeDeploymentHeartbeat: (userName: string, deploymentId: string) => Promise<RuntimeDeploymentHeartbeat | null>;
|
|
8
9
|
declare const saveRuntimeDeploymentHeartbeat: (userName: string, heartbeat: RuntimeDeploymentHeartbeat) => Promise<RuntimeDeploymentHeartbeat>;
|
|
9
10
|
|
|
10
|
-
export { deleteRuntimeDeployment, getRuntimeDeployment, getRuntimeDeploymentHeartbeat, listRuntimeDeployments, saveRuntimeDeployment, saveRuntimeDeploymentHeartbeat };
|
|
11
|
+
export { deleteRuntimeDeployment, getRuntimeDeployment, getRuntimeDeploymentHeartbeat, listRuntimeDeployments, saveRuntimeDeployment, saveRuntimeDeploymentHeartbeat, verifyRuntimeDeployment };
|
|
@@ -35,7 +35,8 @@ __export(runtimeDeployments_exports, {
|
|
|
35
35
|
getRuntimeDeploymentHeartbeat: () => getRuntimeDeploymentHeartbeat,
|
|
36
36
|
listRuntimeDeployments: () => listRuntimeDeployments,
|
|
37
37
|
saveRuntimeDeployment: () => saveRuntimeDeployment,
|
|
38
|
-
saveRuntimeDeploymentHeartbeat: () => saveRuntimeDeploymentHeartbeat
|
|
38
|
+
saveRuntimeDeploymentHeartbeat: () => saveRuntimeDeploymentHeartbeat,
|
|
39
|
+
verifyRuntimeDeployment: () => verifyRuntimeDeployment
|
|
39
40
|
});
|
|
40
41
|
module.exports = __toCommonJS(runtimeDeployments_exports);
|
|
41
42
|
|
|
@@ -315,7 +316,6 @@ var redisKeys = {
|
|
|
315
316
|
backtestConfig: (userName, config) => `users:${userName}:backtests:configs:${config}`,
|
|
316
317
|
strategies: (userName) => `users:${userName}:strategies`,
|
|
317
318
|
strategyConfig: (userName, strategyName, configId = "config") => `users:${userName}:strategies:${strategyName}:${configId}`,
|
|
318
|
-
runtimeStrategyDraft: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:draft`,
|
|
319
319
|
runtimeStrategyReleases: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:releases:`,
|
|
320
320
|
runtimeStrategyRelease: (userName, strategyName, releaseVersion) => `users:${userName}:strategies:${strategyName}:releases:${releaseVersion}`,
|
|
321
321
|
runtimeStrategyReleaseSequence: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:release-seq`,
|
|
@@ -383,13 +383,46 @@ var normalizeId = (value, label) => {
|
|
|
383
383
|
if (!normalized) throw new Error(`${label} is required`);
|
|
384
384
|
return normalized;
|
|
385
385
|
};
|
|
386
|
-
var
|
|
387
|
-
|
|
388
|
-
|
|
386
|
+
var DEPLOYMENT_KEYS = /* @__PURE__ */ new Set([
|
|
387
|
+
"id",
|
|
388
|
+
"label",
|
|
389
|
+
"connectorName",
|
|
390
|
+
"provider",
|
|
391
|
+
"accountId",
|
|
392
|
+
"enabled",
|
|
393
|
+
"strategies",
|
|
394
|
+
"assetClasses",
|
|
395
|
+
"tickers"
|
|
396
|
+
]);
|
|
397
|
+
var REFERENCE_KEYS = /* @__PURE__ */ new Set([
|
|
398
|
+
"strategyName",
|
|
399
|
+
"releaseVersion",
|
|
400
|
+
"controlState"
|
|
401
|
+
]);
|
|
402
|
+
var verifyRuntimeDeployment = (value) => {
|
|
403
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
404
|
+
throw new Error("Invalid runtime deployment");
|
|
405
|
+
}
|
|
406
|
+
const deployment = value;
|
|
407
|
+
const strategies = deployment.strategies;
|
|
408
|
+
if (Object.keys(deployment).some((key) => !DEPLOYMENT_KEYS.has(key)) || typeof deployment.id !== "string" || typeof deployment.label !== "string" || typeof deployment.connectorName !== "string" || typeof deployment.provider !== "string" || typeof deployment.accountId !== "string" || typeof deployment.enabled !== "boolean" || !Array.isArray(strategies) || !strategies.length || strategies.some((value2) => {
|
|
409
|
+
if (!value2 || typeof value2 !== "object" || Array.isArray(value2)) {
|
|
410
|
+
return true;
|
|
411
|
+
}
|
|
412
|
+
const reference = value2;
|
|
413
|
+
return Object.keys(reference).some((key) => !REFERENCE_KEYS.has(key)) || typeof reference.strategyName !== "string" || !reference.strategyName.trim() || !Number.isSafeInteger(reference.releaseVersion) || Number(reference.releaseVersion) <= 0 || reference.controlState !== "active" && reference.controlState !== "entries_paused";
|
|
414
|
+
})) {
|
|
415
|
+
throw new Error("Invalid runtime deployment");
|
|
416
|
+
}
|
|
417
|
+
return value;
|
|
418
|
+
};
|
|
389
419
|
var listRuntimeDeployments = async (userName) => {
|
|
390
420
|
const keys = await getKeys(redisKeys.runtimeDeployments(userName));
|
|
391
|
-
const
|
|
392
|
-
|
|
421
|
+
const deploymentKeys = keys.filter((key) => !key.endsWith(":heartbeat"));
|
|
422
|
+
const values = await Promise.all(
|
|
423
|
+
deploymentKeys.map((key) => getData(key, null))
|
|
424
|
+
);
|
|
425
|
+
return values.filter((value) => value != null).map(verifyRuntimeDeployment).sort((left, right) => left.label.localeCompare(right.label));
|
|
393
426
|
};
|
|
394
427
|
var getRuntimeDeployment = async (userName, deploymentId) => {
|
|
395
428
|
const normalizedId = normalizeId(deploymentId, "Deployment id");
|
|
@@ -397,38 +430,35 @@ var getRuntimeDeployment = async (userName, deploymentId) => {
|
|
|
397
430
|
redisKeys.runtimeDeployment(userName, normalizedId),
|
|
398
431
|
null
|
|
399
432
|
);
|
|
400
|
-
return
|
|
433
|
+
return value == null ? null : verifyRuntimeDeployment(value);
|
|
401
434
|
};
|
|
402
435
|
var saveRuntimeDeployment = async (userName, deployment) => {
|
|
403
|
-
const hasVersionedStrategies = deployment.strategies.some(
|
|
404
|
-
(strategy) => strategy.releaseVersion != null
|
|
405
|
-
);
|
|
406
|
-
if (hasVersionedStrategies && deployment.strategies.some((strategy) => strategy.releaseVersion == null)) {
|
|
407
|
-
throw new Error("A deployment cannot mix legacy configs and releases");
|
|
408
|
-
}
|
|
409
436
|
const strategies = deployment.strategies.map(
|
|
410
437
|
(strategy) => {
|
|
411
|
-
if (!
|
|
412
|
-
if (!Number.isSafeInteger(strategy.releaseVersion) || !strategy.releaseVersion || strategy.config && Object.keys(strategy.config).length) {
|
|
438
|
+
if (!Number.isSafeInteger(strategy.releaseVersion) || !strategy.releaseVersion || strategy.controlState !== "active" && strategy.controlState !== "entries_paused") {
|
|
413
439
|
throw new Error(
|
|
414
|
-
`Invalid
|
|
440
|
+
`Invalid runtime strategy reference: ${strategy.strategyName}`
|
|
415
441
|
);
|
|
416
442
|
}
|
|
417
443
|
return {
|
|
418
444
|
strategyName: strategy.strategyName,
|
|
419
445
|
releaseVersion: strategy.releaseVersion,
|
|
420
|
-
controlState: strategy.controlState
|
|
446
|
+
controlState: strategy.controlState
|
|
421
447
|
};
|
|
422
448
|
}
|
|
423
449
|
);
|
|
424
450
|
const normalized = {
|
|
425
|
-
...deployment,
|
|
426
451
|
id: normalizeId(deployment.id, "Deployment id"),
|
|
427
452
|
label: deployment.label.trim(),
|
|
453
|
+
connectorName: deployment.connectorName.trim(),
|
|
428
454
|
provider: deployment.provider.trim().toLowerCase(),
|
|
429
455
|
accountId: normalizeId(deployment.accountId, "Account id"),
|
|
430
|
-
|
|
456
|
+
enabled: deployment.enabled,
|
|
457
|
+
strategies,
|
|
458
|
+
assetClasses: deployment.assetClasses,
|
|
459
|
+
tickers: deployment.tickers
|
|
431
460
|
};
|
|
461
|
+
verifyRuntimeDeployment(normalized);
|
|
432
462
|
await setData(
|
|
433
463
|
redisKeys.runtimeDeployment(userName, normalized.id),
|
|
434
464
|
normalized,
|
|
@@ -471,5 +501,6 @@ var saveRuntimeDeploymentHeartbeat = async (userName, heartbeat) => {
|
|
|
471
501
|
getRuntimeDeploymentHeartbeat,
|
|
472
502
|
listRuntimeDeployments,
|
|
473
503
|
saveRuntimeDeployment,
|
|
474
|
-
saveRuntimeDeploymentHeartbeat
|
|
504
|
+
saveRuntimeDeploymentHeartbeat,
|
|
505
|
+
verifyRuntimeDeployment
|
|
475
506
|
});
|
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
getKeys,
|
|
5
5
|
redisKeys,
|
|
6
6
|
setData
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-JLVCBKE3.mjs";
|
|
8
8
|
|
|
9
9
|
// src/runtimeDeployments.ts
|
|
10
10
|
var normalizeId = (value, label) => {
|
|
@@ -12,13 +12,46 @@ var normalizeId = (value, label) => {
|
|
|
12
12
|
if (!normalized) throw new Error(`${label} is required`);
|
|
13
13
|
return normalized;
|
|
14
14
|
};
|
|
15
|
-
var
|
|
16
|
-
|
|
17
|
-
|
|
15
|
+
var DEPLOYMENT_KEYS = /* @__PURE__ */ new Set([
|
|
16
|
+
"id",
|
|
17
|
+
"label",
|
|
18
|
+
"connectorName",
|
|
19
|
+
"provider",
|
|
20
|
+
"accountId",
|
|
21
|
+
"enabled",
|
|
22
|
+
"strategies",
|
|
23
|
+
"assetClasses",
|
|
24
|
+
"tickers"
|
|
25
|
+
]);
|
|
26
|
+
var REFERENCE_KEYS = /* @__PURE__ */ new Set([
|
|
27
|
+
"strategyName",
|
|
28
|
+
"releaseVersion",
|
|
29
|
+
"controlState"
|
|
30
|
+
]);
|
|
31
|
+
var verifyRuntimeDeployment = (value) => {
|
|
32
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
33
|
+
throw new Error("Invalid runtime deployment");
|
|
34
|
+
}
|
|
35
|
+
const deployment = value;
|
|
36
|
+
const strategies = deployment.strategies;
|
|
37
|
+
if (Object.keys(deployment).some((key) => !DEPLOYMENT_KEYS.has(key)) || typeof deployment.id !== "string" || typeof deployment.label !== "string" || typeof deployment.connectorName !== "string" || typeof deployment.provider !== "string" || typeof deployment.accountId !== "string" || typeof deployment.enabled !== "boolean" || !Array.isArray(strategies) || !strategies.length || strategies.some((value2) => {
|
|
38
|
+
if (!value2 || typeof value2 !== "object" || Array.isArray(value2)) {
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
const reference = value2;
|
|
42
|
+
return Object.keys(reference).some((key) => !REFERENCE_KEYS.has(key)) || typeof reference.strategyName !== "string" || !reference.strategyName.trim() || !Number.isSafeInteger(reference.releaseVersion) || Number(reference.releaseVersion) <= 0 || reference.controlState !== "active" && reference.controlState !== "entries_paused";
|
|
43
|
+
})) {
|
|
44
|
+
throw new Error("Invalid runtime deployment");
|
|
45
|
+
}
|
|
46
|
+
return value;
|
|
47
|
+
};
|
|
18
48
|
var listRuntimeDeployments = async (userName) => {
|
|
19
49
|
const keys = await getKeys(redisKeys.runtimeDeployments(userName));
|
|
20
|
-
const
|
|
21
|
-
|
|
50
|
+
const deploymentKeys = keys.filter((key) => !key.endsWith(":heartbeat"));
|
|
51
|
+
const values = await Promise.all(
|
|
52
|
+
deploymentKeys.map((key) => getData(key, null))
|
|
53
|
+
);
|
|
54
|
+
return values.filter((value) => value != null).map(verifyRuntimeDeployment).sort((left, right) => left.label.localeCompare(right.label));
|
|
22
55
|
};
|
|
23
56
|
var getRuntimeDeployment = async (userName, deploymentId) => {
|
|
24
57
|
const normalizedId = normalizeId(deploymentId, "Deployment id");
|
|
@@ -26,38 +59,35 @@ var getRuntimeDeployment = async (userName, deploymentId) => {
|
|
|
26
59
|
redisKeys.runtimeDeployment(userName, normalizedId),
|
|
27
60
|
null
|
|
28
61
|
);
|
|
29
|
-
return
|
|
62
|
+
return value == null ? null : verifyRuntimeDeployment(value);
|
|
30
63
|
};
|
|
31
64
|
var saveRuntimeDeployment = async (userName, deployment) => {
|
|
32
|
-
const hasVersionedStrategies = deployment.strategies.some(
|
|
33
|
-
(strategy) => strategy.releaseVersion != null
|
|
34
|
-
);
|
|
35
|
-
if (hasVersionedStrategies && deployment.strategies.some((strategy) => strategy.releaseVersion == null)) {
|
|
36
|
-
throw new Error("A deployment cannot mix legacy configs and releases");
|
|
37
|
-
}
|
|
38
65
|
const strategies = deployment.strategies.map(
|
|
39
66
|
(strategy) => {
|
|
40
|
-
if (!
|
|
41
|
-
if (!Number.isSafeInteger(strategy.releaseVersion) || !strategy.releaseVersion || strategy.config && Object.keys(strategy.config).length) {
|
|
67
|
+
if (!Number.isSafeInteger(strategy.releaseVersion) || !strategy.releaseVersion || strategy.controlState !== "active" && strategy.controlState !== "entries_paused") {
|
|
42
68
|
throw new Error(
|
|
43
|
-
`Invalid
|
|
69
|
+
`Invalid runtime strategy reference: ${strategy.strategyName}`
|
|
44
70
|
);
|
|
45
71
|
}
|
|
46
72
|
return {
|
|
47
73
|
strategyName: strategy.strategyName,
|
|
48
74
|
releaseVersion: strategy.releaseVersion,
|
|
49
|
-
controlState: strategy.controlState
|
|
75
|
+
controlState: strategy.controlState
|
|
50
76
|
};
|
|
51
77
|
}
|
|
52
78
|
);
|
|
53
79
|
const normalized = {
|
|
54
|
-
...deployment,
|
|
55
80
|
id: normalizeId(deployment.id, "Deployment id"),
|
|
56
81
|
label: deployment.label.trim(),
|
|
82
|
+
connectorName: deployment.connectorName.trim(),
|
|
57
83
|
provider: deployment.provider.trim().toLowerCase(),
|
|
58
84
|
accountId: normalizeId(deployment.accountId, "Account id"),
|
|
59
|
-
|
|
85
|
+
enabled: deployment.enabled,
|
|
86
|
+
strategies,
|
|
87
|
+
assetClasses: deployment.assetClasses,
|
|
88
|
+
tickers: deployment.tickers
|
|
60
89
|
};
|
|
90
|
+
verifyRuntimeDeployment(normalized);
|
|
61
91
|
await setData(
|
|
62
92
|
redisKeys.runtimeDeployment(userName, normalized.id),
|
|
63
93
|
normalized,
|
|
@@ -99,5 +129,6 @@ export {
|
|
|
99
129
|
getRuntimeDeploymentHeartbeat,
|
|
100
130
|
listRuntimeDeployments,
|
|
101
131
|
saveRuntimeDeployment,
|
|
102
|
-
saveRuntimeDeploymentHeartbeat
|
|
132
|
+
saveRuntimeDeploymentHeartbeat,
|
|
133
|
+
verifyRuntimeDeployment
|
|
103
134
|
};
|
|
@@ -284,7 +284,6 @@ var redisKeys = {
|
|
|
284
284
|
backtestConfig: (userName, config) => `users:${userName}:backtests:configs:${config}`,
|
|
285
285
|
strategies: (userName) => `users:${userName}:strategies`,
|
|
286
286
|
strategyConfig: (userName, strategyName, configId = "config") => `users:${userName}:strategies:${strategyName}:${configId}`,
|
|
287
|
-
runtimeStrategyDraft: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:draft`,
|
|
288
287
|
runtimeStrategyReleases: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:releases:`,
|
|
289
288
|
runtimeStrategyRelease: (userName, strategyName, releaseVersion) => `users:${userName}:strategies:${strategyName}:releases:${releaseVersion}`,
|
|
290
289
|
runtimeStrategyReleaseSequence: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:release-seq`,
|
|
@@ -1,24 +1,16 @@
|
|
|
1
|
-
import { StrategyConfig,
|
|
1
|
+
import { StrategyConfig, RuntimeStrategyRelease, RuntimeStrategyControlState, RuntimeStrategyControlEvent } from '@tradejs/types';
|
|
2
2
|
|
|
3
3
|
declare const assertRuntimeStrategyReleaseConfig: (config: StrategyConfig) => void;
|
|
4
4
|
declare const verifyRuntimeStrategyRelease: (value: unknown) => RuntimeStrategyRelease;
|
|
5
|
-
declare const getRuntimeStrategyDraft: (userName: string, strategyName: string) => Promise<RuntimeStrategyDraft | null>;
|
|
6
|
-
declare const saveRuntimeStrategyDraft: ({ userName, strategyName, config, baseReleaseVersion, updatedBy, }: {
|
|
7
|
-
userName: string;
|
|
8
|
-
strategyName: string;
|
|
9
|
-
config: StrategyConfig;
|
|
10
|
-
baseReleaseVersion?: number | null;
|
|
11
|
-
updatedBy: string;
|
|
12
|
-
}) => Promise<RuntimeStrategyDraft>;
|
|
13
5
|
declare const getRuntimeStrategyRelease: (userName: string, strategyName: string, releaseVersion: number) => Promise<RuntimeStrategyRelease | null>;
|
|
14
6
|
declare const listRuntimeStrategyReleases: (userName: string, strategyName: string) => Promise<RuntimeStrategyRelease[]>;
|
|
15
7
|
declare const publishRuntimeStrategyRelease: ({ userName, strategyName, config, strategyPackage, strategyPackageVersion, runtimePackageVersion, createdBy, }: {
|
|
16
8
|
userName: string;
|
|
17
9
|
strategyName: string;
|
|
18
10
|
config: StrategyConfig;
|
|
19
|
-
strategyPackage
|
|
20
|
-
strategyPackageVersion
|
|
21
|
-
runtimePackageVersion
|
|
11
|
+
strategyPackage: string;
|
|
12
|
+
strategyPackageVersion: string;
|
|
13
|
+
runtimePackageVersion: string;
|
|
22
14
|
createdBy: string;
|
|
23
15
|
}) => Promise<RuntimeStrategyRelease>;
|
|
24
16
|
declare const recordRuntimeStrategyControlEvent: ({ userName, deploymentId, strategyName, releaseVersion, previousState, nextState, createdBy, }: {
|
|
@@ -31,4 +23,4 @@ declare const recordRuntimeStrategyControlEvent: ({ userName, deploymentId, stra
|
|
|
31
23
|
createdBy: string;
|
|
32
24
|
}) => Promise<RuntimeStrategyControlEvent>;
|
|
33
25
|
|
|
34
|
-
export { assertRuntimeStrategyReleaseConfig,
|
|
26
|
+
export { assertRuntimeStrategyReleaseConfig, getRuntimeStrategyRelease, listRuntimeStrategyReleases, publishRuntimeStrategyRelease, recordRuntimeStrategyControlEvent, verifyRuntimeStrategyRelease };
|
|
@@ -1,24 +1,16 @@
|
|
|
1
|
-
import { StrategyConfig,
|
|
1
|
+
import { StrategyConfig, RuntimeStrategyRelease, RuntimeStrategyControlState, RuntimeStrategyControlEvent } from '@tradejs/types';
|
|
2
2
|
|
|
3
3
|
declare const assertRuntimeStrategyReleaseConfig: (config: StrategyConfig) => void;
|
|
4
4
|
declare const verifyRuntimeStrategyRelease: (value: unknown) => RuntimeStrategyRelease;
|
|
5
|
-
declare const getRuntimeStrategyDraft: (userName: string, strategyName: string) => Promise<RuntimeStrategyDraft | null>;
|
|
6
|
-
declare const saveRuntimeStrategyDraft: ({ userName, strategyName, config, baseReleaseVersion, updatedBy, }: {
|
|
7
|
-
userName: string;
|
|
8
|
-
strategyName: string;
|
|
9
|
-
config: StrategyConfig;
|
|
10
|
-
baseReleaseVersion?: number | null;
|
|
11
|
-
updatedBy: string;
|
|
12
|
-
}) => Promise<RuntimeStrategyDraft>;
|
|
13
5
|
declare const getRuntimeStrategyRelease: (userName: string, strategyName: string, releaseVersion: number) => Promise<RuntimeStrategyRelease | null>;
|
|
14
6
|
declare const listRuntimeStrategyReleases: (userName: string, strategyName: string) => Promise<RuntimeStrategyRelease[]>;
|
|
15
7
|
declare const publishRuntimeStrategyRelease: ({ userName, strategyName, config, strategyPackage, strategyPackageVersion, runtimePackageVersion, createdBy, }: {
|
|
16
8
|
userName: string;
|
|
17
9
|
strategyName: string;
|
|
18
10
|
config: StrategyConfig;
|
|
19
|
-
strategyPackage
|
|
20
|
-
strategyPackageVersion
|
|
21
|
-
runtimePackageVersion
|
|
11
|
+
strategyPackage: string;
|
|
12
|
+
strategyPackageVersion: string;
|
|
13
|
+
runtimePackageVersion: string;
|
|
22
14
|
createdBy: string;
|
|
23
15
|
}) => Promise<RuntimeStrategyRelease>;
|
|
24
16
|
declare const recordRuntimeStrategyControlEvent: ({ userName, deploymentId, strategyName, releaseVersion, previousState, nextState, createdBy, }: {
|
|
@@ -31,4 +23,4 @@ declare const recordRuntimeStrategyControlEvent: ({ userName, deploymentId, stra
|
|
|
31
23
|
createdBy: string;
|
|
32
24
|
}) => Promise<RuntimeStrategyControlEvent>;
|
|
33
25
|
|
|
34
|
-
export { assertRuntimeStrategyReleaseConfig,
|
|
26
|
+
export { assertRuntimeStrategyReleaseConfig, getRuntimeStrategyRelease, listRuntimeStrategyReleases, publishRuntimeStrategyRelease, recordRuntimeStrategyControlEvent, verifyRuntimeStrategyRelease };
|
|
@@ -31,12 +31,10 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
31
31
|
var runtimeStrategyReleases_exports = {};
|
|
32
32
|
__export(runtimeStrategyReleases_exports, {
|
|
33
33
|
assertRuntimeStrategyReleaseConfig: () => assertRuntimeStrategyReleaseConfig,
|
|
34
|
-
getRuntimeStrategyDraft: () => getRuntimeStrategyDraft,
|
|
35
34
|
getRuntimeStrategyRelease: () => getRuntimeStrategyRelease,
|
|
36
35
|
listRuntimeStrategyReleases: () => listRuntimeStrategyReleases,
|
|
37
36
|
publishRuntimeStrategyRelease: () => publishRuntimeStrategyRelease,
|
|
38
37
|
recordRuntimeStrategyControlEvent: () => recordRuntimeStrategyControlEvent,
|
|
39
|
-
saveRuntimeStrategyDraft: () => saveRuntimeStrategyDraft,
|
|
40
38
|
verifyRuntimeStrategyRelease: () => verifyRuntimeStrategyRelease
|
|
41
39
|
});
|
|
42
40
|
module.exports = __toCommonJS(runtimeStrategyReleases_exports);
|
|
@@ -327,7 +325,6 @@ var redisKeys = {
|
|
|
327
325
|
backtestConfig: (userName, config) => `users:${userName}:backtests:configs:${config}`,
|
|
328
326
|
strategies: (userName) => `users:${userName}:strategies`,
|
|
329
327
|
strategyConfig: (userName, strategyName, configId = "config") => `users:${userName}:strategies:${strategyName}:${configId}`,
|
|
330
|
-
runtimeStrategyDraft: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:draft`,
|
|
331
328
|
runtimeStrategyReleases: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:releases:`,
|
|
332
329
|
runtimeStrategyRelease: (userName, strategyName, releaseVersion) => `users:${userName}:strategies:${strategyName}:releases:${releaseVersion}`,
|
|
333
330
|
runtimeStrategyReleaseSequence: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:release-seq`,
|
|
@@ -420,6 +417,11 @@ var assertStrategyName = (strategyName) => {
|
|
|
420
417
|
throw new Error(`Invalid strategy name: ${strategyName}`);
|
|
421
418
|
}
|
|
422
419
|
};
|
|
420
|
+
var assertPackageIdentity = (value, label) => {
|
|
421
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
422
|
+
throw new Error(`${label} is required for a runtime strategy release`);
|
|
423
|
+
}
|
|
424
|
+
};
|
|
423
425
|
var assertRuntimeStrategyReleaseConfig = (config) => {
|
|
424
426
|
const record = asRecord(config);
|
|
425
427
|
if (!record) throw new Error("Strategy release config must be an object");
|
|
@@ -456,7 +458,7 @@ var assertRuntimeStrategyReleaseConfig = (config) => {
|
|
|
456
458
|
var isRelease = (value) => {
|
|
457
459
|
const release = asRecord(value);
|
|
458
460
|
return Boolean(
|
|
459
|
-
release?.schema === import_types.RUNTIME_STRATEGY_RELEASE_SCHEMA && typeof release.strategyName === "string" && Number.isSafeInteger(release.releaseVersion) && Number(release.releaseVersion) > 0 && asRecord(release.config) && typeof release.createdAt === "number" && typeof release.createdBy === "string" && typeof release.contentSha256 === "string" && SHA256_RE.test(release.contentSha256)
|
|
461
|
+
release?.schema === import_types.RUNTIME_STRATEGY_RELEASE_SCHEMA && typeof release.strategyName === "string" && Number.isSafeInteger(release.releaseVersion) && Number(release.releaseVersion) > 0 && asRecord(release.config) && typeof release.strategyPackage === "string" && Boolean(release.strategyPackage.trim()) && typeof release.strategyPackageVersion === "string" && Boolean(release.strategyPackageVersion.trim()) && typeof release.runtimePackageVersion === "string" && Boolean(release.runtimePackageVersion.trim()) && typeof release.createdAt === "number" && typeof release.createdBy === "string" && typeof release.contentSha256 === "string" && SHA256_RE.test(release.contentSha256)
|
|
460
462
|
);
|
|
461
463
|
};
|
|
462
464
|
var verifyRuntimeStrategyRelease = (value) => {
|
|
@@ -470,35 +472,6 @@ var verifyRuntimeStrategyRelease = (value) => {
|
|
|
470
472
|
assertRuntimeStrategyReleaseConfig(value.config);
|
|
471
473
|
return value;
|
|
472
474
|
};
|
|
473
|
-
var getRuntimeStrategyDraft = async (userName, strategyName) => {
|
|
474
|
-
const value = await getData(
|
|
475
|
-
redisKeys.runtimeStrategyDraft(userName, strategyName),
|
|
476
|
-
null
|
|
477
|
-
);
|
|
478
|
-
const draft = asRecord(value);
|
|
479
|
-
return draft?.schema === import_types.RUNTIME_STRATEGY_DRAFT_SCHEMA && draft.strategyName === strategyName && asRecord(draft.config) ? value : null;
|
|
480
|
-
};
|
|
481
|
-
var saveRuntimeStrategyDraft = async ({
|
|
482
|
-
userName,
|
|
483
|
-
strategyName,
|
|
484
|
-
config,
|
|
485
|
-
baseReleaseVersion = null,
|
|
486
|
-
updatedBy
|
|
487
|
-
}) => {
|
|
488
|
-
assertStrategyName(strategyName);
|
|
489
|
-
const draft = {
|
|
490
|
-
schema: import_types.RUNTIME_STRATEGY_DRAFT_SCHEMA,
|
|
491
|
-
strategyName,
|
|
492
|
-
baseReleaseVersion,
|
|
493
|
-
config,
|
|
494
|
-
updatedAt: Date.now(),
|
|
495
|
-
updatedBy
|
|
496
|
-
};
|
|
497
|
-
await setData(redisKeys.runtimeStrategyDraft(userName, strategyName), draft, {
|
|
498
|
-
expire: 0
|
|
499
|
-
});
|
|
500
|
-
return draft;
|
|
501
|
-
};
|
|
502
475
|
var getRuntimeStrategyRelease = async (userName, strategyName, releaseVersion) => {
|
|
503
476
|
const value = await getData(
|
|
504
477
|
redisKeys.runtimeStrategyRelease(userName, strategyName, releaseVersion),
|
|
@@ -522,13 +495,16 @@ var publishRuntimeStrategyRelease = async ({
|
|
|
522
495
|
userName,
|
|
523
496
|
strategyName,
|
|
524
497
|
config,
|
|
525
|
-
strategyPackage
|
|
526
|
-
strategyPackageVersion
|
|
527
|
-
runtimePackageVersion
|
|
498
|
+
strategyPackage,
|
|
499
|
+
strategyPackageVersion,
|
|
500
|
+
runtimePackageVersion,
|
|
528
501
|
createdBy
|
|
529
502
|
}) => {
|
|
530
503
|
assertStrategyName(strategyName);
|
|
531
504
|
assertRuntimeStrategyReleaseConfig(config);
|
|
505
|
+
assertPackageIdentity(strategyPackage, "strategyPackage");
|
|
506
|
+
assertPackageIdentity(strategyPackageVersion, "strategyPackageVersion");
|
|
507
|
+
assertPackageIdentity(runtimePackageVersion, "runtimePackageVersion");
|
|
532
508
|
const releaseVersion = await incrementKey(
|
|
533
509
|
redisKeys.runtimeStrategyReleaseSequence(userName, strategyName)
|
|
534
510
|
);
|
|
@@ -588,11 +564,9 @@ var recordRuntimeStrategyControlEvent = async ({
|
|
|
588
564
|
// Annotate the CommonJS export names for ESM import in node:
|
|
589
565
|
0 && (module.exports = {
|
|
590
566
|
assertRuntimeStrategyReleaseConfig,
|
|
591
|
-
getRuntimeStrategyDraft,
|
|
592
567
|
getRuntimeStrategyRelease,
|
|
593
568
|
listRuntimeStrategyReleases,
|
|
594
569
|
publishRuntimeStrategyRelease,
|
|
595
570
|
recordRuntimeStrategyControlEvent,
|
|
596
|
-
saveRuntimeStrategyDraft,
|
|
597
571
|
verifyRuntimeStrategyRelease
|
|
598
572
|
});
|
|
@@ -5,12 +5,11 @@ import {
|
|
|
5
5
|
redisKeys,
|
|
6
6
|
setData,
|
|
7
7
|
setDataIfAbsent
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-JLVCBKE3.mjs";
|
|
9
9
|
|
|
10
10
|
// src/runtimeStrategyReleases.ts
|
|
11
11
|
import { createHash, randomUUID } from "crypto";
|
|
12
12
|
import {
|
|
13
|
-
RUNTIME_STRATEGY_DRAFT_SCHEMA,
|
|
14
13
|
RUNTIME_STRATEGY_RELEASE_SCHEMA
|
|
15
14
|
} from "@tradejs/types";
|
|
16
15
|
var SHA256_RE = /^[a-f0-9]{64}$/;
|
|
@@ -43,6 +42,11 @@ var assertStrategyName = (strategyName) => {
|
|
|
43
42
|
throw new Error(`Invalid strategy name: ${strategyName}`);
|
|
44
43
|
}
|
|
45
44
|
};
|
|
45
|
+
var assertPackageIdentity = (value, label) => {
|
|
46
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
47
|
+
throw new Error(`${label} is required for a runtime strategy release`);
|
|
48
|
+
}
|
|
49
|
+
};
|
|
46
50
|
var assertRuntimeStrategyReleaseConfig = (config) => {
|
|
47
51
|
const record = asRecord(config);
|
|
48
52
|
if (!record) throw new Error("Strategy release config must be an object");
|
|
@@ -79,7 +83,7 @@ var assertRuntimeStrategyReleaseConfig = (config) => {
|
|
|
79
83
|
var isRelease = (value) => {
|
|
80
84
|
const release = asRecord(value);
|
|
81
85
|
return Boolean(
|
|
82
|
-
release?.schema === RUNTIME_STRATEGY_RELEASE_SCHEMA && typeof release.strategyName === "string" && Number.isSafeInteger(release.releaseVersion) && Number(release.releaseVersion) > 0 && asRecord(release.config) && typeof release.createdAt === "number" && typeof release.createdBy === "string" && typeof release.contentSha256 === "string" && SHA256_RE.test(release.contentSha256)
|
|
86
|
+
release?.schema === RUNTIME_STRATEGY_RELEASE_SCHEMA && typeof release.strategyName === "string" && Number.isSafeInteger(release.releaseVersion) && Number(release.releaseVersion) > 0 && asRecord(release.config) && typeof release.strategyPackage === "string" && Boolean(release.strategyPackage.trim()) && typeof release.strategyPackageVersion === "string" && Boolean(release.strategyPackageVersion.trim()) && typeof release.runtimePackageVersion === "string" && Boolean(release.runtimePackageVersion.trim()) && typeof release.createdAt === "number" && typeof release.createdBy === "string" && typeof release.contentSha256 === "string" && SHA256_RE.test(release.contentSha256)
|
|
83
87
|
);
|
|
84
88
|
};
|
|
85
89
|
var verifyRuntimeStrategyRelease = (value) => {
|
|
@@ -93,35 +97,6 @@ var verifyRuntimeStrategyRelease = (value) => {
|
|
|
93
97
|
assertRuntimeStrategyReleaseConfig(value.config);
|
|
94
98
|
return value;
|
|
95
99
|
};
|
|
96
|
-
var getRuntimeStrategyDraft = async (userName, strategyName) => {
|
|
97
|
-
const value = await getData(
|
|
98
|
-
redisKeys.runtimeStrategyDraft(userName, strategyName),
|
|
99
|
-
null
|
|
100
|
-
);
|
|
101
|
-
const draft = asRecord(value);
|
|
102
|
-
return draft?.schema === RUNTIME_STRATEGY_DRAFT_SCHEMA && draft.strategyName === strategyName && asRecord(draft.config) ? value : null;
|
|
103
|
-
};
|
|
104
|
-
var saveRuntimeStrategyDraft = async ({
|
|
105
|
-
userName,
|
|
106
|
-
strategyName,
|
|
107
|
-
config,
|
|
108
|
-
baseReleaseVersion = null,
|
|
109
|
-
updatedBy
|
|
110
|
-
}) => {
|
|
111
|
-
assertStrategyName(strategyName);
|
|
112
|
-
const draft = {
|
|
113
|
-
schema: RUNTIME_STRATEGY_DRAFT_SCHEMA,
|
|
114
|
-
strategyName,
|
|
115
|
-
baseReleaseVersion,
|
|
116
|
-
config,
|
|
117
|
-
updatedAt: Date.now(),
|
|
118
|
-
updatedBy
|
|
119
|
-
};
|
|
120
|
-
await setData(redisKeys.runtimeStrategyDraft(userName, strategyName), draft, {
|
|
121
|
-
expire: 0
|
|
122
|
-
});
|
|
123
|
-
return draft;
|
|
124
|
-
};
|
|
125
100
|
var getRuntimeStrategyRelease = async (userName, strategyName, releaseVersion) => {
|
|
126
101
|
const value = await getData(
|
|
127
102
|
redisKeys.runtimeStrategyRelease(userName, strategyName, releaseVersion),
|
|
@@ -145,13 +120,16 @@ var publishRuntimeStrategyRelease = async ({
|
|
|
145
120
|
userName,
|
|
146
121
|
strategyName,
|
|
147
122
|
config,
|
|
148
|
-
strategyPackage
|
|
149
|
-
strategyPackageVersion
|
|
150
|
-
runtimePackageVersion
|
|
123
|
+
strategyPackage,
|
|
124
|
+
strategyPackageVersion,
|
|
125
|
+
runtimePackageVersion,
|
|
151
126
|
createdBy
|
|
152
127
|
}) => {
|
|
153
128
|
assertStrategyName(strategyName);
|
|
154
129
|
assertRuntimeStrategyReleaseConfig(config);
|
|
130
|
+
assertPackageIdentity(strategyPackage, "strategyPackage");
|
|
131
|
+
assertPackageIdentity(strategyPackageVersion, "strategyPackageVersion");
|
|
132
|
+
assertPackageIdentity(runtimePackageVersion, "runtimePackageVersion");
|
|
155
133
|
const releaseVersion = await incrementKey(
|
|
156
134
|
redisKeys.runtimeStrategyReleaseSequence(userName, strategyName)
|
|
157
135
|
);
|
|
@@ -210,11 +188,9 @@ var recordRuntimeStrategyControlEvent = async ({
|
|
|
210
188
|
};
|
|
211
189
|
export {
|
|
212
190
|
assertRuntimeStrategyReleaseConfig,
|
|
213
|
-
getRuntimeStrategyDraft,
|
|
214
191
|
getRuntimeStrategyRelease,
|
|
215
192
|
listRuntimeStrategyReleases,
|
|
216
193
|
publishRuntimeStrategyRelease,
|
|
217
194
|
recordRuntimeStrategyControlEvent,
|
|
218
|
-
saveRuntimeStrategyDraft,
|
|
219
195
|
verifyRuntimeStrategyRelease
|
|
220
196
|
};
|
package/dist/tradingAccounts.js
CHANGED
|
@@ -314,7 +314,6 @@ var redisKeys = {
|
|
|
314
314
|
backtestConfig: (userName, config) => `users:${userName}:backtests:configs:${config}`,
|
|
315
315
|
strategies: (userName) => `users:${userName}:strategies`,
|
|
316
316
|
strategyConfig: (userName, strategyName, configId = "config") => `users:${userName}:strategies:${strategyName}:${configId}`,
|
|
317
|
-
runtimeStrategyDraft: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:draft`,
|
|
318
317
|
runtimeStrategyReleases: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:releases:`,
|
|
319
318
|
runtimeStrategyRelease: (userName, strategyName, releaseVersion) => `users:${userName}:strategies:${strategyName}:releases:${releaseVersion}`,
|
|
320
319
|
runtimeStrategyReleaseSequence: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:release-seq`,
|
|
@@ -387,12 +386,11 @@ var normalizeId = (value, label) => {
|
|
|
387
386
|
var isTradingAccount = (value) => Boolean(
|
|
388
387
|
value && typeof value === "object" && typeof value.id === "string" && typeof value.provider === "string"
|
|
389
388
|
);
|
|
390
|
-
var withProviderUniverses = (account) => account.provider.toLowerCase() === "bybit" ? { ...account, universes: ["crypto", "tradfi"] } : account;
|
|
391
389
|
var listTradingAccounts = async (userName) => {
|
|
392
390
|
if (typeof redisKeys.tradingAccounts !== "function") return [];
|
|
393
391
|
const keys = await getKeys(redisKeys.tradingAccounts(userName));
|
|
394
392
|
const values = await Promise.all(keys.map((key) => getData(key, null)));
|
|
395
|
-
return values.filter(isTradingAccount).
|
|
393
|
+
return values.filter(isTradingAccount).sort((left, right) => left.label.localeCompare(right.label));
|
|
396
394
|
};
|
|
397
395
|
var getTradingAccount = async (userName, accountId) => {
|
|
398
396
|
const normalizedId = normalizeId(accountId, "Account id");
|
|
@@ -400,16 +398,16 @@ var getTradingAccount = async (userName, accountId) => {
|
|
|
400
398
|
redisKeys.tradingAccount(userName, normalizedId),
|
|
401
399
|
null
|
|
402
400
|
);
|
|
403
|
-
return isTradingAccount(value) ?
|
|
401
|
+
return isTradingAccount(value) ? value : null;
|
|
404
402
|
};
|
|
405
403
|
var saveTradingAccount = async (userName, account) => {
|
|
406
|
-
const normalized =
|
|
404
|
+
const normalized = {
|
|
407
405
|
...account,
|
|
408
406
|
id: normalizeId(account.id, "Account id"),
|
|
409
407
|
label: account.label.trim(),
|
|
410
408
|
provider: account.provider.trim().toLowerCase(),
|
|
411
409
|
universes: [...new Set(account.universes)]
|
|
412
|
-
}
|
|
410
|
+
};
|
|
413
411
|
if (normalized.isDefault) {
|
|
414
412
|
const previousDefaults = (await listTradingAccounts(userName)).filter(
|
|
415
413
|
(candidate) => candidate.provider === normalized.provider && candidate.id !== normalized.id && candidate.isDefault && candidate.universes.some(
|
|
@@ -464,27 +462,7 @@ var resolveTradingAccount = async ({
|
|
|
464
462
|
(account) => account.enabled && account.provider === provider.toLowerCase() && (!universe || account.universes.includes(universe))
|
|
465
463
|
);
|
|
466
464
|
const selected = accounts.find((account) => account.isDefault) ?? (accounts.length === 1 ? accounts[0] : null);
|
|
467
|
-
|
|
468
|
-
if (provider.toLowerCase() !== "bybit" || accounts.length > 1) {
|
|
469
|
-
return null;
|
|
470
|
-
}
|
|
471
|
-
const legacy = await getData(redisKeys.user(userName));
|
|
472
|
-
const legacyApiKey = String(legacy?.BYBIT_API_KEY ?? "").trim();
|
|
473
|
-
const legacyApiSecret = String(legacy?.BYBIT_API_SECRET ?? "").trim();
|
|
474
|
-
if (!legacyApiKey || !legacyApiSecret) {
|
|
475
|
-
return null;
|
|
476
|
-
}
|
|
477
|
-
return {
|
|
478
|
-
id: "bybit-default",
|
|
479
|
-
label: "Bybit Default",
|
|
480
|
-
provider: "bybit",
|
|
481
|
-
enabled: true,
|
|
482
|
-
isDefault: true,
|
|
483
|
-
universes: ["crypto", "tradfi"],
|
|
484
|
-
environment: "mainnet",
|
|
485
|
-
apiKey: legacyApiKey,
|
|
486
|
-
apiSecret: legacyApiSecret
|
|
487
|
-
};
|
|
465
|
+
return selected;
|
|
488
466
|
};
|
|
489
467
|
// Annotate the CommonJS export names for ESM import in node:
|
|
490
468
|
0 && (module.exports = {
|
package/dist/tradingAccounts.mjs
CHANGED
|
@@ -4,7 +4,7 @@ import {
|
|
|
4
4
|
getKeys,
|
|
5
5
|
redisKeys,
|
|
6
6
|
setData
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-JLVCBKE3.mjs";
|
|
8
8
|
|
|
9
9
|
// src/tradingAccounts.ts
|
|
10
10
|
var normalizeId = (value, label) => {
|
|
@@ -17,12 +17,11 @@ var normalizeId = (value, label) => {
|
|
|
17
17
|
var isTradingAccount = (value) => Boolean(
|
|
18
18
|
value && typeof value === "object" && typeof value.id === "string" && typeof value.provider === "string"
|
|
19
19
|
);
|
|
20
|
-
var withProviderUniverses = (account) => account.provider.toLowerCase() === "bybit" ? { ...account, universes: ["crypto", "tradfi"] } : account;
|
|
21
20
|
var listTradingAccounts = async (userName) => {
|
|
22
21
|
if (typeof redisKeys.tradingAccounts !== "function") return [];
|
|
23
22
|
const keys = await getKeys(redisKeys.tradingAccounts(userName));
|
|
24
23
|
const values = await Promise.all(keys.map((key) => getData(key, null)));
|
|
25
|
-
return values.filter(isTradingAccount).
|
|
24
|
+
return values.filter(isTradingAccount).sort((left, right) => left.label.localeCompare(right.label));
|
|
26
25
|
};
|
|
27
26
|
var getTradingAccount = async (userName, accountId) => {
|
|
28
27
|
const normalizedId = normalizeId(accountId, "Account id");
|
|
@@ -30,16 +29,16 @@ var getTradingAccount = async (userName, accountId) => {
|
|
|
30
29
|
redisKeys.tradingAccount(userName, normalizedId),
|
|
31
30
|
null
|
|
32
31
|
);
|
|
33
|
-
return isTradingAccount(value) ?
|
|
32
|
+
return isTradingAccount(value) ? value : null;
|
|
34
33
|
};
|
|
35
34
|
var saveTradingAccount = async (userName, account) => {
|
|
36
|
-
const normalized =
|
|
35
|
+
const normalized = {
|
|
37
36
|
...account,
|
|
38
37
|
id: normalizeId(account.id, "Account id"),
|
|
39
38
|
label: account.label.trim(),
|
|
40
39
|
provider: account.provider.trim().toLowerCase(),
|
|
41
40
|
universes: [...new Set(account.universes)]
|
|
42
|
-
}
|
|
41
|
+
};
|
|
43
42
|
if (normalized.isDefault) {
|
|
44
43
|
const previousDefaults = (await listTradingAccounts(userName)).filter(
|
|
45
44
|
(candidate) => candidate.provider === normalized.provider && candidate.id !== normalized.id && candidate.isDefault && candidate.universes.some(
|
|
@@ -94,27 +93,7 @@ var resolveTradingAccount = async ({
|
|
|
94
93
|
(account) => account.enabled && account.provider === provider.toLowerCase() && (!universe || account.universes.includes(universe))
|
|
95
94
|
);
|
|
96
95
|
const selected = accounts.find((account) => account.isDefault) ?? (accounts.length === 1 ? accounts[0] : null);
|
|
97
|
-
|
|
98
|
-
if (provider.toLowerCase() !== "bybit" || accounts.length > 1) {
|
|
99
|
-
return null;
|
|
100
|
-
}
|
|
101
|
-
const legacy = await getData(redisKeys.user(userName));
|
|
102
|
-
const legacyApiKey = String(legacy?.BYBIT_API_KEY ?? "").trim();
|
|
103
|
-
const legacyApiSecret = String(legacy?.BYBIT_API_SECRET ?? "").trim();
|
|
104
|
-
if (!legacyApiKey || !legacyApiSecret) {
|
|
105
|
-
return null;
|
|
106
|
-
}
|
|
107
|
-
return {
|
|
108
|
-
id: "bybit-default",
|
|
109
|
-
label: "Bybit Default",
|
|
110
|
-
provider: "bybit",
|
|
111
|
-
enabled: true,
|
|
112
|
-
isDefault: true,
|
|
113
|
-
universes: ["crypto", "tradfi"],
|
|
114
|
-
environment: "mainnet",
|
|
115
|
-
apiKey: legacyApiKey,
|
|
116
|
-
apiSecret: legacyApiSecret
|
|
117
|
-
};
|
|
96
|
+
return selected;
|
|
118
97
|
};
|
|
119
98
|
export {
|
|
120
99
|
deleteTradingAccount,
|
package/dist/userSettings.d.mts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
interface UserRecord extends Record<string, unknown> {
|
|
2
2
|
userName?: string;
|
|
3
3
|
passwordHash?: string;
|
|
4
|
-
BYBIT_API_KEY?: string;
|
|
5
|
-
BYBIT_API_SECRET?: string;
|
|
6
4
|
COINALYZE_API_KEY?: string;
|
|
7
5
|
COINMARKETCAP_API_KEY?: string;
|
|
8
6
|
AI_API_KEY?: string;
|
|
@@ -15,8 +13,6 @@ interface UserRecord extends Record<string, unknown> {
|
|
|
15
13
|
}
|
|
16
14
|
interface UserSettings {
|
|
17
15
|
userName: string;
|
|
18
|
-
BYBIT_API_KEY: string;
|
|
19
|
-
BYBIT_API_SECRET: string;
|
|
20
16
|
COINALYZE_API_KEY: string;
|
|
21
17
|
COINMARKETCAP_API_KEY: string;
|
|
22
18
|
AI_API_KEY: string;
|
package/dist/userSettings.d.ts
CHANGED
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
interface UserRecord extends Record<string, unknown> {
|
|
2
2
|
userName?: string;
|
|
3
3
|
passwordHash?: string;
|
|
4
|
-
BYBIT_API_KEY?: string;
|
|
5
|
-
BYBIT_API_SECRET?: string;
|
|
6
4
|
COINALYZE_API_KEY?: string;
|
|
7
5
|
COINMARKETCAP_API_KEY?: string;
|
|
8
6
|
AI_API_KEY?: string;
|
|
@@ -15,8 +13,6 @@ interface UserRecord extends Record<string, unknown> {
|
|
|
15
13
|
}
|
|
16
14
|
interface UserSettings {
|
|
17
15
|
userName: string;
|
|
18
|
-
BYBIT_API_KEY: string;
|
|
19
|
-
BYBIT_API_SECRET: string;
|
|
20
16
|
COINALYZE_API_KEY: string;
|
|
21
17
|
COINMARKETCAP_API_KEY: string;
|
|
22
18
|
AI_API_KEY: string;
|
package/dist/userSettings.js
CHANGED
|
@@ -247,7 +247,6 @@ var redisKeys = {
|
|
|
247
247
|
backtestConfig: (userName, config) => `users:${userName}:backtests:configs:${config}`,
|
|
248
248
|
strategies: (userName) => `users:${userName}:strategies`,
|
|
249
249
|
strategyConfig: (userName, strategyName, configId = "config") => `users:${userName}:strategies:${strategyName}:${configId}`,
|
|
250
|
-
runtimeStrategyDraft: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:draft`,
|
|
251
250
|
runtimeStrategyReleases: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:releases:`,
|
|
252
251
|
runtimeStrategyRelease: (userName, strategyName, releaseVersion) => `users:${userName}:strategies:${strategyName}:releases:${releaseVersion}`,
|
|
253
252
|
runtimeStrategyReleaseSequence: (userName, strategyName) => `users:${userName}:strategies:${strategyName}:release-seq`,
|
|
@@ -323,8 +322,6 @@ var getUserSettings = async (userName) => {
|
|
|
323
322
|
const record = await getUserRecord(userName);
|
|
324
323
|
return {
|
|
325
324
|
userName,
|
|
326
|
-
BYBIT_API_KEY: readUserString(record, "BYBIT_API_KEY"),
|
|
327
|
-
BYBIT_API_SECRET: readUserString(record, "BYBIT_API_SECRET"),
|
|
328
325
|
COINALYZE_API_KEY: readUserString(record, "COINALYZE_API_KEY"),
|
|
329
326
|
COINMARKETCAP_API_KEY: readUserString(record, "COINMARKETCAP_API_KEY"),
|
|
330
327
|
AI_API_KEY: readUserString(record, "AI_API_KEY"),
|
package/dist/userSettings.mjs
CHANGED
|
@@ -2,7 +2,7 @@ import {
|
|
|
2
2
|
getData,
|
|
3
3
|
redisKeys,
|
|
4
4
|
setData
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-JLVCBKE3.mjs";
|
|
6
6
|
|
|
7
7
|
// src/userSettings.ts
|
|
8
8
|
var readString = (value) => typeof value === "string" ? value.trim() : "";
|
|
@@ -18,8 +18,6 @@ var getUserSettings = async (userName) => {
|
|
|
18
18
|
const record = await getUserRecord(userName);
|
|
19
19
|
return {
|
|
20
20
|
userName,
|
|
21
|
-
BYBIT_API_KEY: readUserString(record, "BYBIT_API_KEY"),
|
|
22
|
-
BYBIT_API_SECRET: readUserString(record, "BYBIT_API_SECRET"),
|
|
23
21
|
COINALYZE_API_KEY: readUserString(record, "COINALYZE_API_KEY"),
|
|
24
22
|
COINMARKETCAP_API_KEY: readUserString(record, "COINMARKETCAP_API_KEY"),
|
|
25
23
|
AI_API_KEY: readUserString(record, "AI_API_KEY"),
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tradejs/infra",
|
|
3
|
-
"version": "3.1.
|
|
3
|
+
"version": "3.1.4",
|
|
4
4
|
"description": "MIT-licensed server infrastructure adapters for TradeJS: Redis, Timescale, ML, logging, and IO.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"tradejs",
|
|
@@ -126,7 +126,7 @@
|
|
|
126
126
|
"dependencies": {
|
|
127
127
|
"@grpc/grpc-js": "^1.14.4",
|
|
128
128
|
"@grpc/proto-loader": "^0.8.1",
|
|
129
|
-
"@tradejs/types": "^3.1.
|
|
129
|
+
"@tradejs/types": "^3.1.4",
|
|
130
130
|
"chalk": "4.1.2",
|
|
131
131
|
"date-fns": "^3.6.0",
|
|
132
132
|
"ioredis": "5.11.1",
|