@tradejs/infra 3.1.8-beta.207 → 3.1.8-beta.210

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.
@@ -1,26 +0,0 @@
1
- import { StrategyConfig, RuntimeStrategyRelease, RuntimeStrategyControlState, RuntimeStrategyControlEvent } from '@tradejs/types';
2
-
3
- declare const assertRuntimeStrategyReleaseConfig: (config: StrategyConfig) => void;
4
- declare const verifyRuntimeStrategyRelease: (value: unknown) => RuntimeStrategyRelease;
5
- declare const getRuntimeStrategyRelease: (userName: string, strategyName: string, releaseVersion: number) => Promise<RuntimeStrategyRelease | null>;
6
- declare const listRuntimeStrategyReleases: (userName: string, strategyName: string) => Promise<RuntimeStrategyRelease[]>;
7
- declare const publishRuntimeStrategyRelease: ({ userName, strategyName, config, strategyPackage, strategyPackageVersion, runtimePackageVersion, createdBy, }: {
8
- userName: string;
9
- strategyName: string;
10
- config: StrategyConfig;
11
- strategyPackage: string;
12
- strategyPackageVersion: string;
13
- runtimePackageVersion: string;
14
- createdBy: string;
15
- }) => Promise<RuntimeStrategyRelease>;
16
- declare const recordRuntimeStrategyControlEvent: ({ userName, deploymentId, strategyName, releaseVersion, previousState, nextState, createdBy, }: {
17
- userName: string;
18
- deploymentId: string;
19
- strategyName: string;
20
- releaseVersion: number;
21
- previousState: RuntimeStrategyControlState;
22
- nextState: RuntimeStrategyControlState;
23
- createdBy: string;
24
- }) => Promise<RuntimeStrategyControlEvent>;
25
-
26
- export { assertRuntimeStrategyReleaseConfig, getRuntimeStrategyRelease, listRuntimeStrategyReleases, publishRuntimeStrategyRelease, recordRuntimeStrategyControlEvent, verifyRuntimeStrategyRelease };
@@ -1,196 +0,0 @@
1
- import {
2
- getData,
3
- getKeys,
4
- incrementKey,
5
- redisKeys,
6
- setData,
7
- setDataIfAbsent
8
- } from "./chunk-JLVCBKE3.mjs";
9
-
10
- // src/runtimeStrategyReleases.ts
11
- import { createHash, randomUUID } from "crypto";
12
- import {
13
- RUNTIME_STRATEGY_RELEASE_SCHEMA
14
- } from "@tradejs/types";
15
- var SHA256_RE = /^[a-f0-9]{64}$/;
16
- var FORBIDDEN_RELEASE_CONFIG_KEYS = /* @__PURE__ */ new Set([
17
- "ACCOUNT_ID",
18
- "AI_REPLAY_ANALYSES",
19
- "DEPLOYMENT_ID",
20
- "ENABLE",
21
- "ENV",
22
- "MAKE_ORDERS",
23
- "RECORD_RUNTIME_TRADES",
24
- "configId"
25
- ]);
26
- var SECRET_CONFIG_KEY_RE = /(?:^|_)(?:API_KEY|API_SECRET|TOKEN|PASSWORD|PRIVATE_KEY)$/i;
27
- var asRecord = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : null;
28
- var canonicalJson = (value) => {
29
- const normalize = (current) => {
30
- if (Array.isArray(current)) return current.map(normalize);
31
- const record = asRecord(current);
32
- if (!record) return current;
33
- return Object.fromEntries(
34
- Object.entries(record).filter(([, entry]) => entry !== void 0).sort(([left], [right]) => left.localeCompare(right)).map(([key, entry]) => [key, normalize(entry)])
35
- );
36
- };
37
- return JSON.stringify(normalize(value));
38
- };
39
- var releaseContentSha256 = (release) => createHash("sha256").update(canonicalJson(release)).digest("hex");
40
- var assertStrategyName = (strategyName) => {
41
- if (!/^[a-zA-Z0-9_-]+$/.test(strategyName)) {
42
- throw new Error(`Invalid strategy name: ${strategyName}`);
43
- }
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
- };
50
- var assertRuntimeStrategyReleaseConfig = (config) => {
51
- const record = asRecord(config);
52
- if (!record) throw new Error("Strategy release config must be an object");
53
- for (const key of FORBIDDEN_RELEASE_CONFIG_KEYS) {
54
- if (record[key] !== void 0) {
55
- throw new Error(`${key} is a deployment binding, not release config`);
56
- }
57
- }
58
- const inspect = (value, parentPath = "") => {
59
- if (Array.isArray(value)) {
60
- value.forEach(
61
- (entry, index) => inspect(entry, `${parentPath}[${index}]`)
62
- );
63
- return;
64
- }
65
- const current = asRecord(value);
66
- if (!current) return;
67
- for (const [key, entry] of Object.entries(current)) {
68
- const keyPath = parentPath ? `${parentPath}.${key}` : key;
69
- if (SECRET_CONFIG_KEY_RE.test(key)) {
70
- throw new Error(`${keyPath} is secret material, not release config`);
71
- }
72
- inspect(entry, keyPath);
73
- }
74
- };
75
- inspect(record);
76
- if (typeof record.INTERVAL !== "string" || !record.INTERVAL.trim()) {
77
- throw new Error("Published strategy config must define INTERVAL");
78
- }
79
- if (record.UNIVERSE !== "crypto" && record.UNIVERSE !== "tradfi") {
80
- throw new Error("Published strategy config must define a valid UNIVERSE");
81
- }
82
- };
83
- var isRelease = (value) => {
84
- const release = asRecord(value);
85
- return Boolean(
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)
87
- );
88
- };
89
- var verifyRuntimeStrategyRelease = (value) => {
90
- if (!isRelease(value)) throw new Error("Invalid runtime strategy release");
91
- const { contentSha256, ...content } = value;
92
- if (releaseContentSha256(content) !== contentSha256) {
93
- throw new Error(
94
- `${value.strategyName} v${value.releaseVersion} content checksum mismatch`
95
- );
96
- }
97
- assertRuntimeStrategyReleaseConfig(value.config);
98
- return value;
99
- };
100
- var getRuntimeStrategyRelease = async (userName, strategyName, releaseVersion) => {
101
- const value = await getData(
102
- redisKeys.runtimeStrategyRelease(userName, strategyName, releaseVersion),
103
- null
104
- );
105
- return value == null ? null : verifyRuntimeStrategyRelease(value);
106
- };
107
- var listRuntimeStrategyReleases = async (userName, strategyName) => {
108
- const keys = await getKeys(
109
- redisKeys.runtimeStrategyReleases(userName, strategyName)
110
- );
111
- const releases = await Promise.all(
112
- keys.map(async (key) => {
113
- const value = await getData(key, null);
114
- return value == null ? null : verifyRuntimeStrategyRelease(value);
115
- })
116
- );
117
- return releases.filter((release) => release != null).sort((left, right) => right.releaseVersion - left.releaseVersion);
118
- };
119
- var publishRuntimeStrategyRelease = async ({
120
- userName,
121
- strategyName,
122
- config,
123
- strategyPackage,
124
- strategyPackageVersion,
125
- runtimePackageVersion,
126
- createdBy
127
- }) => {
128
- assertStrategyName(strategyName);
129
- assertRuntimeStrategyReleaseConfig(config);
130
- assertPackageIdentity(strategyPackage, "strategyPackage");
131
- assertPackageIdentity(strategyPackageVersion, "strategyPackageVersion");
132
- assertPackageIdentity(runtimePackageVersion, "runtimePackageVersion");
133
- const releaseVersion = await incrementKey(
134
- redisKeys.runtimeStrategyReleaseSequence(userName, strategyName)
135
- );
136
- const content = {
137
- schema: RUNTIME_STRATEGY_RELEASE_SCHEMA,
138
- strategyName,
139
- releaseVersion,
140
- config,
141
- strategyPackage,
142
- strategyPackageVersion,
143
- runtimePackageVersion,
144
- createdAt: Date.now(),
145
- createdBy
146
- };
147
- const release = {
148
- ...content,
149
- contentSha256: releaseContentSha256(content)
150
- };
151
- const stored = await setDataIfAbsent(
152
- redisKeys.runtimeStrategyRelease(userName, strategyName, releaseVersion),
153
- release
154
- );
155
- if (!stored) {
156
- throw new Error(`Refused to overwrite ${strategyName} v${releaseVersion}`);
157
- }
158
- return release;
159
- };
160
- var recordRuntimeStrategyControlEvent = async ({
161
- userName,
162
- deploymentId,
163
- strategyName,
164
- releaseVersion,
165
- previousState,
166
- nextState,
167
- createdBy
168
- }) => {
169
- const action = nextState === "entries_paused" ? "pause_entries" : "resume";
170
- const createdAt = Date.now();
171
- const event = {
172
- eventId: `${createdAt}-${randomUUID()}`,
173
- deploymentId,
174
- strategyName,
175
- releaseVersion,
176
- action,
177
- previousState,
178
- nextState,
179
- createdAt,
180
- createdBy
181
- };
182
- await setData(
183
- redisKeys.runtimeStrategyControlEvent(userName, event.eventId),
184
- event,
185
- { expire: 0 }
186
- );
187
- return event;
188
- };
189
- export {
190
- assertRuntimeStrategyReleaseConfig,
191
- getRuntimeStrategyRelease,
192
- listRuntimeStrategyReleases,
193
- publishRuntimeStrategyRelease,
194
- recordRuntimeStrategyControlEvent,
195
- verifyRuntimeStrategyRelease
196
- };