@hoox-sh/hoox-shared 1.4.0 → 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/agent-config-fields.d.ts +5 -0
- package/dist/agent-config-fields.d.ts.map +1 -1
- package/dist/agent-config-fields.js +21 -29
- package/dist/analytics.d.ts +3 -4
- package/dist/analytics.d.ts.map +1 -1
- package/dist/analytics.js +64 -19
- package/dist/api-client.js +12 -21
- package/dist/colors.js +5 -21
- package/dist/config.d.ts +10 -2
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +267 -51
- package/dist/cron-handler.js +0 -16
- package/dist/d1/index.js +8 -25
- package/dist/d1/repository.js +3 -19
- package/dist/d1/schemas.js +4 -20
- package/dist/dashboard-manifest.d.ts +2 -1
- package/dist/dashboard-manifest.d.ts.map +1 -1
- package/dist/dashboard-manifest.js +37 -33
- package/dist/entitlements.d.ts +46 -0
- package/dist/entitlements.d.ts.map +1 -0
- package/dist/entitlements.js +15 -0
- package/dist/errors.d.ts +1 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +7 -23
- package/dist/exchange-client.d.ts +0 -19
- package/dist/exchange-client.d.ts.map +1 -1
- package/dist/exchange-client.js +1 -83
- package/dist/exchanges/base-exchange-client.d.ts.map +1 -1
- package/dist/exchanges/base-exchange-client.js +4 -19
- package/dist/exchanges/index.js +4 -19
- package/dist/format-time.js +2 -18
- package/dist/formatters.js +12 -28
- package/dist/health.js +3 -19
- package/dist/index.d.ts +7 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3568 -3766
- package/dist/kill-switch.js +12 -20
- package/dist/kvKeys.d.ts +8 -0
- package/dist/kvKeys.d.ts.map +1 -1
- package/dist/kvKeys.js +42 -46
- package/dist/kvUtils.js +8 -24
- package/dist/legal.js +5 -21
- package/dist/middleware/auth.d.ts +9 -0
- package/dist/middleware/auth.d.ts.map +1 -1
- package/dist/middleware/auth.js +9 -25
- package/dist/middleware/cors.js +4 -20
- package/dist/middleware/index.js +144 -165
- package/dist/middleware/logger.d.ts +2 -0
- package/dist/middleware/logger.d.ts.map +1 -1
- package/dist/middleware/logger.js +9 -25
- package/dist/middleware/rate-limit.d.ts +7 -0
- package/dist/middleware/rate-limit.d.ts.map +1 -1
- package/dist/middleware/rate-limit.js +5 -20
- package/dist/middleware/security-headers.js +2 -18
- package/dist/middleware/validate.d.ts +2 -0
- package/dist/middleware/validate.d.ts.map +1 -1
- package/dist/middleware/validate.js +5 -21
- package/dist/middleware/wait-until.js +2 -18
- package/dist/operator-transport.js +13 -17
- package/dist/path-utils.d.ts.map +1 -1
- package/dist/path-utils.js +28 -34
- package/dist/queue-handler.d.ts.map +1 -1
- package/dist/queue-handler.js +19 -24
- package/dist/router.d.ts +5 -0
- package/dist/router.d.ts.map +1 -1
- package/dist/router.js +0 -16
- package/dist/schemas/index.js +75 -50
- package/dist/schemas/registry.d.ts.map +1 -1
- package/dist/schemas/registry.js +33 -21
- package/dist/schemas/validators.d.ts.map +1 -1
- package/dist/schemas/validators.js +41 -43
- package/dist/service-bindings.d.ts +4 -0
- package/dist/service-bindings.d.ts.map +1 -1
- package/dist/service-bindings.js +13 -29
- package/dist/session.d.ts +10 -3
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +111 -51
- package/dist/sse.d.ts.map +1 -1
- package/dist/sse.js +34 -24
- package/dist/stores/config-store.d.ts +2 -50
- package/dist/stores/config-store.d.ts.map +1 -1
- package/dist/stores/config-store.js +153 -156
- package/dist/stores/service-store.d.ts +2 -192
- package/dist/stores/service-store.d.ts.map +1 -1
- package/dist/stores/service-store.js +40 -35
- package/dist/stores/ui-store.d.ts +2 -48
- package/dist/stores/ui-store.d.ts.map +1 -1
- package/dist/stores/ui-store.js +0 -16
- package/dist/tenant.d.ts +62 -0
- package/dist/tenant.d.ts.map +1 -0
- package/dist/tenant.js +56 -0
- package/dist/test-utils.js +11 -27
- package/dist/types.d.ts +10 -3
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +29 -24
- package/dist/wizard/engine.d.ts.map +1 -1
- package/dist/wizard/engine.js +33 -27
- package/dist/wizard/index.d.ts +1 -0
- package/dist/wizard/index.d.ts.map +1 -1
- package/dist/wizard/index.js +48 -39
- package/dist/wizard/persistence.d.ts +4 -0
- package/dist/wizard/persistence.d.ts.map +1 -1
- package/dist/wizard/persistence.js +7 -19
- package/dist/wizard/presets.d.ts.map +1 -1
- package/dist/wizard/presets.js +13 -25
- package/dist/wizard/types.d.ts +6 -0
- package/dist/wizard/types.d.ts.map +1 -1
- package/dist/wizard/types.js +5 -0
- package/package.json +7 -2
|
@@ -1,28 +1,15 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __returnValue = (v) => v;
|
|
4
|
-
function __exportSetter(name, newValue) {
|
|
5
|
-
this[name] = __returnValue.bind(null, newValue);
|
|
6
|
-
}
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, {
|
|
10
|
-
get: all[name],
|
|
11
|
-
enumerable: true,
|
|
12
|
-
configurable: true,
|
|
13
|
-
set: __exportSetter.bind(all, name)
|
|
14
|
-
});
|
|
15
|
-
};
|
|
16
|
-
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
17
|
-
|
|
18
2
|
// src/schemas/validators.ts
|
|
19
3
|
import { parse } from "jsonc-parser";
|
|
4
|
+
function parseJsoncDocument(content) {
|
|
5
|
+
const errors = [];
|
|
6
|
+
const value = parse(content, errors, { allowTrailingComma: true });
|
|
7
|
+
return { value, errors };
|
|
8
|
+
}
|
|
20
9
|
function validateWranglerJsonc(workerName, manifest, jsoncContent) {
|
|
21
10
|
const errors = [];
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
parsed = parse(jsoncContent);
|
|
25
|
-
} catch {
|
|
11
|
+
const { value: parsed, errors: parseErrors } = parseJsoncDocument(jsoncContent);
|
|
12
|
+
if (parseErrors.length > 0) {
|
|
26
13
|
errors.push({
|
|
27
14
|
worker: workerName,
|
|
28
15
|
severity: "error",
|
|
@@ -53,7 +40,7 @@ function validateWranglerJsonc(workerName, manifest, jsoncContent) {
|
|
|
53
40
|
}
|
|
54
41
|
}
|
|
55
42
|
for (const [name, def] of Object.entries(manifest.vars)) {
|
|
56
|
-
if (def.type === "secret" && !name.endsWith("_BINDING") && !name.endsWith("_SECRET") && !name.startsWith("CLOUDFLARE_") && name !== "TELEGRAM_SECRET_TOKEN" && name !== "TELEGRAM_ALLOWED_CHAT_IDS" && name !== "AUTHORIZED_CHAT_IDS" && name !== "MAILGUN_API_KEY" && name !== "EMAIL_SCAN_SUBJECT" && name !== "DASHBOARD_USER" && name !== "DASHBOARD_PASS" && name !== "SESSION_SECRET" && name !== "AGENT_INTERNAL_KEY") {
|
|
43
|
+
if (def.type === "secret" && !name.endsWith("_BINDING") && !name.endsWith("_SECRET") && !name.startsWith("CLOUDFLARE_") && name !== "TELEGRAM_SECRET_TOKEN" && name !== "TELEGRAM_ALLOWED_CHAT_IDS" && name !== "AUTHORIZED_CHAT_IDS" && name !== "MAILGUN_API_KEY" && name !== "EMAIL_SCAN_SUBJECT" && name !== "DASHBOARD_USER" && name !== "DASHBOARD_PASS" && name !== "SESSION_SECRET" && name !== "AGENT_INTERNAL_KEY" && name !== "OPENAI_API_KEY" && name !== "ANTHROPIC_API_KEY" && name !== "GOOGLE_API_KEY") {
|
|
57
44
|
errors.push({
|
|
58
45
|
worker: workerName,
|
|
59
46
|
severity: "warning",
|
|
@@ -99,10 +86,8 @@ function validateWranglerJsonc(workerName, manifest, jsoncContent) {
|
|
|
99
86
|
}
|
|
100
87
|
function validateRootSecrets(workerName, manifest, rootJsoncContent) {
|
|
101
88
|
const errors = [];
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
parsed = parse(rootJsoncContent);
|
|
105
|
-
} catch {
|
|
89
|
+
const { value: parsed, errors: parseErrors } = parseJsoncDocument(rootJsoncContent);
|
|
90
|
+
if (parseErrors.length > 0) {
|
|
106
91
|
errors.push({
|
|
107
92
|
worker: workerName,
|
|
108
93
|
severity: "error",
|
|
@@ -160,6 +145,11 @@ function validateDevVars(workerName, manifest, devVarsContent) {
|
|
|
160
145
|
}
|
|
161
146
|
return errors;
|
|
162
147
|
}
|
|
148
|
+
function queueProducerBinding(queue) {
|
|
149
|
+
if (queue === "trade-execution")
|
|
150
|
+
return "TRADE_QUEUE";
|
|
151
|
+
return queue.replace(/[^A-Za-z0-9]+/g, "_").toUpperCase();
|
|
152
|
+
}
|
|
163
153
|
function generateWranglerJsonc(manifest) {
|
|
164
154
|
const parts = [];
|
|
165
155
|
parts.push(`{`);
|
|
@@ -226,21 +216,29 @@ function generateWranglerJsonc(manifest) {
|
|
|
226
216
|
parts.push(` ],`);
|
|
227
217
|
}
|
|
228
218
|
if (infra.queues) {
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
219
|
+
const producers = infra.queues.producer ?? [];
|
|
220
|
+
const consumers = infra.queues.consumer ?? [];
|
|
221
|
+
if (producers.length > 0 || consumers.length > 0) {
|
|
222
|
+
const queueParts = [];
|
|
223
|
+
if (producers.length > 0) {
|
|
224
|
+
queueParts.push(` "producers": [`);
|
|
225
|
+
for (const [i, q] of producers.entries()) {
|
|
226
|
+
const comma = i < producers.length - 1 ? "," : "";
|
|
227
|
+
queueParts.push(` { "queue": "${q}", "binding": "${queueProducerBinding(q)}" }${comma}`);
|
|
228
|
+
}
|
|
229
|
+
queueParts.push(consumers.length > 0 ? ` ],` : ` ]`);
|
|
234
230
|
}
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
231
|
+
if (consumers.length > 0) {
|
|
232
|
+
queueParts.push(` "consumers": [`);
|
|
233
|
+
for (const [i, q] of consumers.entries()) {
|
|
234
|
+
const comma = i < consumers.length - 1 ? "," : "";
|
|
235
|
+
queueParts.push(` { "queue": "${q}" }${comma}`);
|
|
236
|
+
}
|
|
237
|
+
queueParts.push(` ]`);
|
|
242
238
|
}
|
|
243
|
-
parts.push(`
|
|
239
|
+
parts.push(` "queues": {`);
|
|
240
|
+
parts.push(...queueParts);
|
|
241
|
+
parts.push(` },`);
|
|
244
242
|
}
|
|
245
243
|
}
|
|
246
244
|
if (infra.durableObjects && infra.durableObjects.length > 0) {
|
|
@@ -283,10 +281,10 @@ function validateAll(workerName, manifest, files) {
|
|
|
283
281
|
};
|
|
284
282
|
}
|
|
285
283
|
export {
|
|
286
|
-
|
|
287
|
-
validateRootSecrets,
|
|
288
|
-
validateDevVars,
|
|
289
|
-
validateAll,
|
|
284
|
+
generateDevVars,
|
|
290
285
|
generateWranglerJsonc,
|
|
291
|
-
|
|
286
|
+
validateAll,
|
|
287
|
+
validateDevVars,
|
|
288
|
+
validateRootSecrets,
|
|
289
|
+
validateWranglerJsonc
|
|
292
290
|
};
|
|
@@ -70,6 +70,10 @@ export declare function authenticatedServiceFetch<E extends AuthenticatedService
|
|
|
70
70
|
/** Ordered env fields to try when internalKey is not set */
|
|
71
71
|
internalKeyFields?: InternalAuthKeyName;
|
|
72
72
|
}): Promise<Response>;
|
|
73
|
+
/**
|
|
74
|
+
* Unauthenticated service-binding fetch. Callers that need mesh auth must
|
|
75
|
+
* use {@link authenticatedServiceFetch}, which injects `X-Internal-Auth-Key`.
|
|
76
|
+
*/
|
|
73
77
|
export declare function serviceFetch(binding: ServiceBinding, path: string, body?: unknown, options?: {
|
|
74
78
|
method?: string;
|
|
75
79
|
headers?: Record<string, string>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-bindings.d.ts","sourceRoot":"","sources":["../src/service-bindings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAmB,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE9E,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACzE;AAED,uDAAuD;AACvD,eAAO,MAAM,qBAAqB;;;;;;;;;IAShC,sDAAsD;;;;CAI9C,CAAC;AAEX,iFAAiF;AACjF,eAAO,MAAM,uBAAuB,0DAG1B,CAAC;AAEX,kFAAkF;AAClF,eAAO,MAAM,wBAAwB,2DAG3B,CAAC;AAEX,2EAA2E;AAC3E,eAAO,MAAM,6BAA6B,sFAIhC,CAAC;AAEX,sFAAsF;AACtF,eAAO,MAAM,0BAA0B,6DAG7B,CAAC;AAEX,oDAAoD;AACpD,eAAO,MAAM,8BAA8B,oEAGjC,CAAC;AAEX,4CAA4C;AAC5C,eAAO,MAAM,8BAA8B,iEAGjC,CAAC;AAEX,wEAAwE;AACxE,eAAO,MAAM,iCAAiC,6EAIpC,CAAC;AAEX,8CAA8C;AAC9C,eAAO,MAAM,uCAAuC,sFAI1C,CAAC;AAEX,gDAAgD;AAChD,eAAO,MAAM,wCAAwC,6FAI3C,CAAC;AAEX,0DAA0D;AAC1D,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,mBAAmB,GAC7B,MAAM,GAAG,SAAS,CAEpB;AAED,MAAM,WAAW,uBAAuB;IACtC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,uBAAuB,EACzE,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,CAAC,EACN,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,mBAAmB,CAAC;CACzC,GACA,OAAO,CAAC,QAAQ,CAAC,CAsBnB;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,OAAO,CAAC,QAAQ,CAAC,CAWnB"}
|
|
1
|
+
{"version":3,"file":"service-bindings.d.ts","sourceRoot":"","sources":["../src/service-bindings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAmB,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE9E,MAAM,WAAW,cAAc;IAC7B,KAAK,CAAC,OAAO,EAAE,OAAO,GAAG,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACzE;AAED,uDAAuD;AACvD,eAAO,MAAM,qBAAqB;;;;;;;;;IAShC,sDAAsD;;;;CAI9C,CAAC;AAEX,iFAAiF;AACjF,eAAO,MAAM,uBAAuB,0DAG1B,CAAC;AAEX,kFAAkF;AAClF,eAAO,MAAM,wBAAwB,2DAG3B,CAAC;AAEX,2EAA2E;AAC3E,eAAO,MAAM,6BAA6B,sFAIhC,CAAC;AAEX,sFAAsF;AACtF,eAAO,MAAM,0BAA0B,6DAG7B,CAAC;AAEX,oDAAoD;AACpD,eAAO,MAAM,8BAA8B,oEAGjC,CAAC;AAEX,4CAA4C;AAC5C,eAAO,MAAM,8BAA8B,iEAGjC,CAAC;AAEX,wEAAwE;AACxE,eAAO,MAAM,iCAAiC,6EAIpC,CAAC;AAEX,8CAA8C;AAC9C,eAAO,MAAM,uCAAuC,sFAI1C,CAAC;AAEX,gDAAgD;AAChD,eAAO,MAAM,wCAAwC,6FAI3C,CAAC;AAEX,0DAA0D;AAC1D,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,mBAAmB,GAC7B,MAAM,GAAG,SAAS,CAEpB;AAED,MAAM,WAAW,uBAAuB;IACtC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,yBAAyB,CAAC,EAAE,MAAM,CAAC;IACnC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,6BAA6B,CAAC,EAAE,MAAM,CAAC;IACvC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,qBAAqB,CAAC,EAAE,MAAM,CAAC;CAChC;AAED,qBAAa,gBAAiB,SAAQ,KAAK;gBAC7B,OAAO,EAAE,MAAM;CAI5B;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,uBAAuB,EACzE,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,CAAC,EACN,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gFAAgF;IAChF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4DAA4D;IAC5D,iBAAiB,CAAC,EAAE,mBAAmB,CAAC;CACzC,GACA,OAAO,CAAC,QAAQ,CAAC,CAsBnB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,cAAc,EACvB,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GACA,OAAO,CAAC,QAAQ,CAAC,CAWnB"}
|
package/dist/service-bindings.js
CHANGED
|
@@ -1,20 +1,4 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __returnValue = (v) => v;
|
|
4
|
-
function __exportSetter(name, newValue) {
|
|
5
|
-
this[name] = __returnValue.bind(null, newValue);
|
|
6
|
-
}
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, {
|
|
10
|
-
get: all[name],
|
|
11
|
-
enumerable: true,
|
|
12
|
-
configurable: true,
|
|
13
|
-
set: __exportSetter.bind(all, name)
|
|
14
|
-
});
|
|
15
|
-
};
|
|
16
|
-
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
17
|
-
|
|
18
2
|
// src/middleware/auth.ts
|
|
19
3
|
function timingSafeEqual(a, b) {
|
|
20
4
|
const encoder = new TextEncoder;
|
|
@@ -244,18 +228,18 @@ function serviceFetch(binding, path, body, options) {
|
|
|
244
228
|
});
|
|
245
229
|
}
|
|
246
230
|
export {
|
|
247
|
-
|
|
248
|
-
resolveInternalAuthKey,
|
|
249
|
-
authenticatedServiceFetch,
|
|
250
|
-
WALLET_EXECUTE_AUTH_KEY_FIELDS,
|
|
251
|
-
TRADE_READ_AUTH_KEY_FIELDS,
|
|
252
|
-
TRADE_EXECUTE_AUTH_KEY_FIELDS,
|
|
253
|
-
TELEGRAM_ALERT_AUTH_KEY_FIELDS,
|
|
254
|
-
ServiceAuthError,
|
|
255
|
-
InternalAuthKeyFields,
|
|
256
|
-
DASHBOARD_TRADE_EXECUTE_AUTH_KEY_FIELDS,
|
|
257
|
-
DASHBOARD_TELEGRAM_ALERT_AUTH_KEY_FIELDS,
|
|
258
|
-
DASHBOARD_D1_READ_AUTH_KEY_FIELDS,
|
|
231
|
+
D1_READ_AUTH_KEY_FIELDS,
|
|
259
232
|
D1_WRITE_AUTH_KEY_FIELDS,
|
|
260
|
-
|
|
233
|
+
DASHBOARD_D1_READ_AUTH_KEY_FIELDS,
|
|
234
|
+
DASHBOARD_TELEGRAM_ALERT_AUTH_KEY_FIELDS,
|
|
235
|
+
DASHBOARD_TRADE_EXECUTE_AUTH_KEY_FIELDS,
|
|
236
|
+
InternalAuthKeyFields,
|
|
237
|
+
ServiceAuthError,
|
|
238
|
+
TELEGRAM_ALERT_AUTH_KEY_FIELDS,
|
|
239
|
+
TRADE_EXECUTE_AUTH_KEY_FIELDS,
|
|
240
|
+
TRADE_READ_AUTH_KEY_FIELDS,
|
|
241
|
+
WALLET_EXECUTE_AUTH_KEY_FIELDS,
|
|
242
|
+
authenticatedServiceFetch,
|
|
243
|
+
resolveInternalAuthKey,
|
|
244
|
+
serviceFetch
|
|
261
245
|
};
|
package/dist/session.d.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Copyright (c) 2026 HOOX · HOOX · jango-blockchained (hoox-sh)
|
|
3
3
|
* SPDX-License-Identifier: Apache-2.0
|
|
4
4
|
*/
|
|
5
|
-
import type
|
|
5
|
+
import { type ViewId } from "./types";
|
|
6
6
|
export interface SessionState {
|
|
7
7
|
/** Last active view ID (e.g. "dashboard", "workers") */
|
|
8
8
|
activeView: ViewId;
|
|
@@ -18,6 +18,11 @@ export interface SessionState {
|
|
|
18
18
|
/** ISO timestamp of when the session was saved */
|
|
19
19
|
savedAt: string;
|
|
20
20
|
}
|
|
21
|
+
/** Restore result: on-disk session plus whether a file was actually read. */
|
|
22
|
+
export type RestoredSession = SessionState & {
|
|
23
|
+
/** True when session.json existed and was parsed (even if fields fell back). */
|
|
24
|
+
fromDisk: boolean;
|
|
25
|
+
};
|
|
21
26
|
/**
|
|
22
27
|
* Persist the current UI state to $HOME/.hoox/.tui-state/session.json.
|
|
23
28
|
* Call this on app destroy / clean shutdown.
|
|
@@ -33,7 +38,9 @@ export declare function saveSession(activeView: ViewId, sidebarExpanded: boolean
|
|
|
33
38
|
* Restore the previous session state from $HOME/.hoox/.tui-state/session.json.
|
|
34
39
|
* Returns defaults if the file doesn't exist or can't be parsed.
|
|
35
40
|
*
|
|
36
|
-
* @returns The saved session state, or defaults
|
|
41
|
+
* @returns The saved session state, or defaults. `fromDisk` is false when
|
|
42
|
+
* no file existed or JSON was unreadable — callers may then apply
|
|
43
|
+
* `defaultView` from TUI preferences.
|
|
37
44
|
*/
|
|
38
|
-
export declare function restoreSession(): Promise<
|
|
45
|
+
export declare function restoreSession(): Promise<RestoredSession>;
|
|
39
46
|
//# sourceMappingURL=session.d.ts.map
|
package/dist/session.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"session.d.ts","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,OAAO,EAAY,KAAK,MAAM,EAAE,MAAM,SAAS,CAAC;AAKhD,MAAM,WAAW,YAAY;IAC3B,wDAAwD;IACxD,UAAU,EAAE,MAAM,CAAC;IACnB,uCAAuC;IACvC,eAAe,EAAE,OAAO,CAAC;IACzB,+CAA+C;IAC/C,UAAU,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3C,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,6EAA6E;AAC7E,MAAM,MAAM,eAAe,GAAG,YAAY,GAAG;IAC3C,gFAAgF;IAChF,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAoDF;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,OAAO,EACxB,UAAU,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,EAC1C,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAkBf;AAID;;;;;;;GAOG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,eAAe,CAAC,CA+B/D"}
|
package/dist/session.js
CHANGED
|
@@ -1,20 +1,4 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var __defProp = Object.defineProperty;
|
|
3
|
-
var __returnValue = (v) => v;
|
|
4
|
-
function __exportSetter(name, newValue) {
|
|
5
|
-
this[name] = __returnValue.bind(null, newValue);
|
|
6
|
-
}
|
|
7
|
-
var __export = (target, all) => {
|
|
8
|
-
for (var name in all)
|
|
9
|
-
__defProp(target, name, {
|
|
10
|
-
get: all[name],
|
|
11
|
-
enumerable: true,
|
|
12
|
-
configurable: true,
|
|
13
|
-
set: __exportSetter.bind(all, name)
|
|
14
|
-
});
|
|
15
|
-
};
|
|
16
|
-
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
17
|
-
|
|
18
2
|
// src/path-utils.ts
|
|
19
3
|
import {
|
|
20
4
|
existsSync,
|
|
@@ -24,10 +8,20 @@ import {
|
|
|
24
8
|
chmodSync
|
|
25
9
|
} from "fs";
|
|
26
10
|
import { homedir } from "os";
|
|
27
|
-
import { dirname, join, resolve } from "path";
|
|
11
|
+
import { dirname, join, resolve, sep } from "path";
|
|
28
12
|
function createHooxPath(path) {
|
|
29
13
|
return path;
|
|
30
14
|
}
|
|
15
|
+
function isInsideDir(child, parent) {
|
|
16
|
+
const resolvedChild = resolve(child);
|
|
17
|
+
const resolvedParent = resolve(parent);
|
|
18
|
+
const cmpChild = process.platform === "win32" ? resolvedChild.toLowerCase() : resolvedChild;
|
|
19
|
+
const cmpParent = process.platform === "win32" ? resolvedParent.toLowerCase() : resolvedParent;
|
|
20
|
+
if (cmpChild === cmpParent)
|
|
21
|
+
return true;
|
|
22
|
+
const prefix = cmpParent.endsWith(sep) ? cmpParent : cmpParent + sep;
|
|
23
|
+
return cmpChild.startsWith(prefix);
|
|
24
|
+
}
|
|
31
25
|
function getHooxHome() {
|
|
32
26
|
try {
|
|
33
27
|
const override = process.env.HOOX_HOME?.trim();
|
|
@@ -191,7 +185,7 @@ function resolveHooxPath(relativePath) {
|
|
|
191
185
|
const fullPath = join(hooxHome, normalizedPath);
|
|
192
186
|
const resolvedPath = resolve(fullPath);
|
|
193
187
|
const resolvedHome = resolve(hooxHome);
|
|
194
|
-
if (!resolvedPath
|
|
188
|
+
if (!isInsideDir(resolvedPath, resolvedHome)) {
|
|
195
189
|
throw new Error(`Resolved path "${resolvedPath}" is outside Hoox home directory`);
|
|
196
190
|
}
|
|
197
191
|
return createHooxPath(resolvedPath);
|
|
@@ -201,7 +195,7 @@ function isWithinHooxHome(path) {
|
|
|
201
195
|
const hooxHome = getHooxHome();
|
|
202
196
|
const resolvedPath = resolve(path);
|
|
203
197
|
const resolvedHome = resolve(hooxHome);
|
|
204
|
-
return resolvedPath
|
|
198
|
+
return isInsideDir(resolvedPath, resolvedHome);
|
|
205
199
|
} catch {
|
|
206
200
|
return false;
|
|
207
201
|
}
|
|
@@ -236,17 +230,99 @@ function getHooxStatePath() {
|
|
|
236
230
|
return resolveHooxPath("data/state.json");
|
|
237
231
|
}
|
|
238
232
|
|
|
239
|
-
// src/
|
|
233
|
+
// src/types.ts
|
|
240
234
|
import { z } from "zod";
|
|
241
|
-
var
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
235
|
+
var TradeActionSchema = z.enum([
|
|
236
|
+
"LONG",
|
|
237
|
+
"SHORT",
|
|
238
|
+
"CLOSE_LONG",
|
|
239
|
+
"CLOSE_SHORT"
|
|
240
|
+
]);
|
|
241
|
+
var MAX_WEBHOOK_LEVERAGE = 125;
|
|
242
|
+
var MAX_WEBHOOK_QUANTITY = 1e6;
|
|
243
|
+
var WebhookPayloadSchema = z.object({
|
|
244
|
+
exchange: z.string().min(1),
|
|
245
|
+
action: TradeActionSchema,
|
|
246
|
+
symbol: z.string().min(1).max(20),
|
|
247
|
+
quantity: z.number().positive().finite().max(MAX_WEBHOOK_QUANTITY),
|
|
248
|
+
price: z.number().positive().finite().optional(),
|
|
249
|
+
orderType: z.string().optional(),
|
|
250
|
+
leverage: z.number().int().positive().max(MAX_WEBHOOK_LEVERAGE).optional(),
|
|
251
|
+
test: z.boolean().optional(),
|
|
252
|
+
tenantId: z.string().min(1).max(64).optional()
|
|
253
|
+
}).strict();
|
|
254
|
+
var TradeQueueMessageSchema = z.object({
|
|
255
|
+
requestId: z.string().min(1).max(128),
|
|
256
|
+
exchange: z.string().min(1).max(64),
|
|
257
|
+
action: TradeActionSchema,
|
|
258
|
+
symbol: z.string().min(1).max(32),
|
|
259
|
+
quantity: z.number().positive().finite().max(MAX_WEBHOOK_QUANTITY),
|
|
260
|
+
price: z.number().positive().finite().optional(),
|
|
261
|
+
leverage: z.number().int().positive().max(MAX_WEBHOOK_LEVERAGE).optional(),
|
|
262
|
+
test: z.boolean().optional(),
|
|
263
|
+
idempotencyKey: z.string().min(1).max(512).optional(),
|
|
264
|
+
tenantId: z.string().min(1).max(64).optional(),
|
|
265
|
+
queuedAt: z.string().min(1).max(64)
|
|
266
|
+
}).strict();
|
|
267
|
+
var TradeSignalSchema = z.object({
|
|
268
|
+
id: z.number().int().positive().optional(),
|
|
269
|
+
source: z.string().min(1),
|
|
270
|
+
symbol: z.string().min(1),
|
|
271
|
+
action: TradeActionSchema,
|
|
272
|
+
price: z.number().positive().finite().optional(),
|
|
273
|
+
quantity: z.number().positive().finite(),
|
|
274
|
+
leverage: z.number().int().positive().optional(),
|
|
275
|
+
status: z.enum(["pending", "executed", "failed", "skipped"]).optional(),
|
|
276
|
+
createdAt: z.string().optional(),
|
|
277
|
+
executedAt: z.string().optional(),
|
|
278
|
+
error: z.string().optional()
|
|
279
|
+
}).strict();
|
|
280
|
+
var PositionSchema = z.object({
|
|
281
|
+
id: z.string(),
|
|
282
|
+
symbol: z.string().min(1),
|
|
283
|
+
side: TradeActionSchema,
|
|
284
|
+
quantity: z.number().positive(),
|
|
285
|
+
entry_price: z.number().positive(),
|
|
286
|
+
current_price: z.number().positive(),
|
|
287
|
+
unrealized_pnl: z.number(),
|
|
288
|
+
timestamp: z.number().int().positive()
|
|
289
|
+
}).strict();
|
|
290
|
+
var BalanceSchema = z.object({
|
|
291
|
+
asset: z.string().min(1),
|
|
292
|
+
free: z.number().min(0),
|
|
293
|
+
locked: z.number().min(0),
|
|
294
|
+
timestamp: z.number().int().positive()
|
|
295
|
+
}).strict();
|
|
296
|
+
var VIEW_IDS = [
|
|
297
|
+
"dashboard",
|
|
298
|
+
"workers",
|
|
299
|
+
"worker-detail",
|
|
300
|
+
"trade-monitor",
|
|
301
|
+
"logs-viewer",
|
|
302
|
+
"service-manager",
|
|
303
|
+
"config-editor",
|
|
304
|
+
"setup-wizard",
|
|
305
|
+
"settings",
|
|
306
|
+
"queue-depth",
|
|
307
|
+
"kv-viewer",
|
|
308
|
+
"secrets-viewer",
|
|
309
|
+
"db-query",
|
|
310
|
+
"ai-chat",
|
|
311
|
+
"edge-topology",
|
|
312
|
+
"worker-settings"
|
|
313
|
+
];
|
|
314
|
+
|
|
315
|
+
// src/session.ts
|
|
316
|
+
import { z as z2 } from "zod";
|
|
317
|
+
var SessionStateFileSchema = z2.object({
|
|
318
|
+
activeView: z2.string().optional(),
|
|
319
|
+
sidebarExpanded: z2.boolean().optional(),
|
|
320
|
+
windowSize: z2.object({
|
|
321
|
+
cols: z2.number().int().positive(),
|
|
322
|
+
rows: z2.number().int().positive()
|
|
247
323
|
}).optional(),
|
|
248
|
-
lastData:
|
|
249
|
-
savedAt:
|
|
324
|
+
lastData: z2.number().nonnegative().optional(),
|
|
325
|
+
savedAt: z2.string().optional()
|
|
250
326
|
}).strict();
|
|
251
327
|
var TUI_STATE_DIR = ".tui-state";
|
|
252
328
|
function getSessionFilePath() {
|
|
@@ -283,7 +359,7 @@ async function restoreSession() {
|
|
|
283
359
|
const file = Bun.file(getSessionFilePath());
|
|
284
360
|
const exists = await file.exists();
|
|
285
361
|
if (!exists)
|
|
286
|
-
return { ...DEFAULT_SESSION };
|
|
362
|
+
return { ...DEFAULT_SESSION, fromDisk: false };
|
|
287
363
|
const raw = await file.text();
|
|
288
364
|
const result = SessionStateFileSchema.safeParse(JSON.parse(raw));
|
|
289
365
|
const parsed = result.success ? result.data : {};
|
|
@@ -292,34 +368,18 @@ async function restoreSession() {
|
|
|
292
368
|
sidebarExpanded: typeof parsed.sidebarExpanded === "boolean" ? parsed.sidebarExpanded : DEFAULT_SESSION.sidebarExpanded,
|
|
293
369
|
windowSize: parsed.windowSize ?? DEFAULT_SESSION.windowSize,
|
|
294
370
|
lastData: typeof parsed.lastData === "number" ? parsed.lastData : DEFAULT_SESSION.lastData,
|
|
295
|
-
savedAt: parsed.savedAt ?? DEFAULT_SESSION.savedAt
|
|
371
|
+
savedAt: parsed.savedAt ?? DEFAULT_SESSION.savedAt,
|
|
372
|
+
fromDisk: true
|
|
296
373
|
};
|
|
297
374
|
} catch {
|
|
298
|
-
return { ...DEFAULT_SESSION };
|
|
375
|
+
return { ...DEFAULT_SESSION, fromDisk: false };
|
|
299
376
|
}
|
|
300
377
|
}
|
|
301
|
-
var VALID_VIEW_IDS = new Set(
|
|
302
|
-
"dashboard",
|
|
303
|
-
"workers",
|
|
304
|
-
"worker-detail",
|
|
305
|
-
"trade-monitor",
|
|
306
|
-
"logs-viewer",
|
|
307
|
-
"service-manager",
|
|
308
|
-
"config-editor",
|
|
309
|
-
"setup-wizard",
|
|
310
|
-
"settings",
|
|
311
|
-
"queue-depth",
|
|
312
|
-
"kv-viewer",
|
|
313
|
-
"secrets-viewer",
|
|
314
|
-
"db-query",
|
|
315
|
-
"ai-chat",
|
|
316
|
-
"edge-topology",
|
|
317
|
-
"worker-settings"
|
|
318
|
-
]);
|
|
378
|
+
var VALID_VIEW_IDS = new Set(VIEW_IDS);
|
|
319
379
|
function validateViewId(id) {
|
|
320
380
|
return typeof id === "string" && VALID_VIEW_IDS.has(id);
|
|
321
381
|
}
|
|
322
382
|
export {
|
|
323
|
-
|
|
324
|
-
|
|
383
|
+
restoreSession,
|
|
384
|
+
saveSession
|
|
325
385
|
};
|
package/dist/sse.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;GASG;AAEH,OAAO,EAIL,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC9B,MAAM,sBAAsB,CAAC;AAS9B,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AAChD,MAAM,MAAM,iBAAiB,GAAG,CAC9B,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,cAAc,KAClD,IAAI,CAAC;AAEV,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,wBAAwB,CAAC;IACrC,YAAY,CAAC,EAAE,oBAAoB,CAAC;CACrC;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,EACxB,QAAQ,CAAC,EAAE,iBAAiB,EAC5B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,eAAe,
|
|
1
|
+
{"version":3,"file":"sse.d.ts","sourceRoot":"","sources":["../src/sse.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;;;;;;;;GASG;AAEH,OAAO,EAIL,KAAK,oBAAoB,EACzB,KAAK,wBAAwB,EAC9B,MAAM,sBAAsB,CAAC;AAS9B,MAAM,MAAM,WAAW,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,CAAC;AAChD,MAAM,MAAM,iBAAiB,GAAG,CAC9B,MAAM,EAAE,WAAW,GAAG,cAAc,GAAG,cAAc,KAClD,IAAI,CAAC;AAEV,UAAU,eAAe;IACvB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,wBAAwB,CAAC;IACrC,YAAY,CAAC,EAAE,oBAAoB,CAAC;CACrC;AAID;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,CAAC,EAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC,EACxB,QAAQ,CAAC,EAAE,iBAAiB,EAC5B,OAAO,CAAC,EAAE,mBAAmB,GAC5B,eAAe,CAwGjB"}
|
package/dist/sse.js
CHANGED
|
@@ -1,19 +1,15 @@
|
|
|
1
1
|
// @bun
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
configurable: true,
|
|
13
|
-
set: __exportSetter.bind(all, name)
|
|
14
|
-
});
|
|
2
|
+
var __esm = (fn, res, err) => () => {
|
|
3
|
+
if (fn)
|
|
4
|
+
try {
|
|
5
|
+
res = fn(fn = 0);
|
|
6
|
+
} catch (e) {
|
|
7
|
+
err = [e];
|
|
8
|
+
}
|
|
9
|
+
if (err)
|
|
10
|
+
throw err[0];
|
|
11
|
+
return res;
|
|
15
12
|
};
|
|
16
|
-
var __esm = (fn, res) => () => (fn && (res = fn(fn = 0)), res);
|
|
17
13
|
|
|
18
14
|
// src/operator-transport.ts
|
|
19
15
|
function stripTrailingSlashes(url) {
|
|
@@ -83,12 +79,9 @@ var init_operator_transport = __esm(() => {
|
|
|
83
79
|
});
|
|
84
80
|
|
|
85
81
|
// src/sse.ts
|
|
86
|
-
var exports_sse = {};
|
|
87
|
-
__export(exports_sse, {
|
|
88
|
-
subscribeSSE: () => subscribeSSE
|
|
89
|
-
});
|
|
90
82
|
function subscribeSSE(path, callback, onStatus, options) {
|
|
91
83
|
let aborted = false;
|
|
84
|
+
const ac = new AbortController;
|
|
92
85
|
const profile = options?.transport ?? (options?.transportEnv ? resolveOperatorTransportProfile(options.transportEnv) : resolveOperatorTransportProfile());
|
|
93
86
|
const run = async () => {
|
|
94
87
|
let attempt = 0;
|
|
@@ -99,7 +92,8 @@ function subscribeSSE(path, callback, onStatus, options) {
|
|
|
99
92
|
headers: {
|
|
100
93
|
Accept: "text/event-stream",
|
|
101
94
|
...buildOperatorAuthHeaders(profile)
|
|
102
|
-
}
|
|
95
|
+
},
|
|
96
|
+
signal: ac.signal
|
|
103
97
|
});
|
|
104
98
|
if (!response.ok || !response.body) {
|
|
105
99
|
throw new Error(`SSE connection failed: HTTP ${response.status}`);
|
|
@@ -111,17 +105,21 @@ function subscribeSSE(path, callback, onStatus, options) {
|
|
|
111
105
|
let buffer = "";
|
|
112
106
|
while (!aborted) {
|
|
113
107
|
const { done, value } = await reader.read();
|
|
114
|
-
if (done)
|
|
115
|
-
|
|
108
|
+
if (done) {
|
|
109
|
+
throw new Error("SSE stream ended");
|
|
110
|
+
}
|
|
116
111
|
buffer += decoder.decode(value, { stream: true });
|
|
117
112
|
const lines = buffer.split(`
|
|
118
113
|
`);
|
|
119
114
|
buffer = lines.pop() || "";
|
|
120
115
|
for (const line of lines) {
|
|
121
116
|
const trimmed = line.trim();
|
|
122
|
-
if (trimmed.startsWith("data:
|
|
117
|
+
if (trimmed.startsWith("data:")) {
|
|
118
|
+
const jsonText = trimmed.slice(5).replace(/^\s/, "");
|
|
119
|
+
if (!jsonText)
|
|
120
|
+
continue;
|
|
123
121
|
try {
|
|
124
|
-
const parsed = JSON.parse(
|
|
122
|
+
const parsed = JSON.parse(jsonText);
|
|
125
123
|
callback(parsed);
|
|
126
124
|
} catch {}
|
|
127
125
|
}
|
|
@@ -133,7 +131,18 @@ function subscribeSSE(path, callback, onStatus, options) {
|
|
|
133
131
|
onStatus?.("reconnecting");
|
|
134
132
|
const delay = Math.min(RECONNECT_BASE_MS * Math.pow(2, attempt), RECONNECT_MAX_MS);
|
|
135
133
|
attempt++;
|
|
136
|
-
await new Promise((resolve) =>
|
|
134
|
+
await new Promise((resolve) => {
|
|
135
|
+
const timer = setTimeout(resolve, delay);
|
|
136
|
+
const onAbort = () => {
|
|
137
|
+
clearTimeout(timer);
|
|
138
|
+
resolve();
|
|
139
|
+
};
|
|
140
|
+
if (ac.signal.aborted) {
|
|
141
|
+
onAbort();
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
ac.signal.addEventListener("abort", onAbort, { once: true });
|
|
145
|
+
});
|
|
137
146
|
}
|
|
138
147
|
}
|
|
139
148
|
if (!aborted) {
|
|
@@ -144,6 +153,7 @@ function subscribeSSE(path, callback, onStatus, options) {
|
|
|
144
153
|
return {
|
|
145
154
|
abort: () => {
|
|
146
155
|
aborted = true;
|
|
156
|
+
ac.abort();
|
|
147
157
|
}
|
|
148
158
|
};
|
|
149
159
|
}
|
|
@@ -38,56 +38,8 @@ export declare const useConfigStore: import("zustand").UseBoundStore<Omit<Omit<i
|
|
|
38
38
|
getOptions: () => Partial<import("zustand/middleware").PersistOptions<ConfigState & ConfigActions, unknown, unknown>>;
|
|
39
39
|
};
|
|
40
40
|
}, "setState"> & {
|
|
41
|
-
setState(nextStateOrUpdater: (ConfigState & ConfigActions) | Partial<ConfigState & ConfigActions> | ((state:
|
|
42
|
-
|
|
43
|
-
refreshIntervalMs: number;
|
|
44
|
-
defaultView: ViewId;
|
|
45
|
-
activeExchanges: string[];
|
|
46
|
-
keyboardShortcuts: {
|
|
47
|
-
[x: string]: string;
|
|
48
|
-
};
|
|
49
|
-
logFilters: {
|
|
50
|
-
levels: import("..").LogLevel[];
|
|
51
|
-
workers: string[];
|
|
52
|
-
searchText: string;
|
|
53
|
-
};
|
|
54
|
-
notifications: {
|
|
55
|
-
alerts: boolean;
|
|
56
|
-
trades: boolean;
|
|
57
|
-
debug: boolean;
|
|
58
|
-
system: boolean;
|
|
59
|
-
};
|
|
60
|
-
soundEnabled: boolean;
|
|
61
|
-
updateConfig: (partial: Partial<ConfigState>) => void;
|
|
62
|
-
resetDefaults: () => void;
|
|
63
|
-
setShortcut: (action: string, key: string) => void;
|
|
64
|
-
toggleNotification: (channel: keyof NotificationPreferences) => void;
|
|
65
|
-
}) => void), shouldReplace?: false): unknown;
|
|
66
|
-
setState(nextStateOrUpdater: (ConfigState & ConfigActions) | ((state: {
|
|
67
|
-
theme: "dark" | "light";
|
|
68
|
-
refreshIntervalMs: number;
|
|
69
|
-
defaultView: ViewId;
|
|
70
|
-
activeExchanges: string[];
|
|
71
|
-
keyboardShortcuts: {
|
|
72
|
-
[x: string]: string;
|
|
73
|
-
};
|
|
74
|
-
logFilters: {
|
|
75
|
-
levels: import("..").LogLevel[];
|
|
76
|
-
workers: string[];
|
|
77
|
-
searchText: string;
|
|
78
|
-
};
|
|
79
|
-
notifications: {
|
|
80
|
-
alerts: boolean;
|
|
81
|
-
trades: boolean;
|
|
82
|
-
debug: boolean;
|
|
83
|
-
system: boolean;
|
|
84
|
-
};
|
|
85
|
-
soundEnabled: boolean;
|
|
86
|
-
updateConfig: (partial: Partial<ConfigState>) => void;
|
|
87
|
-
resetDefaults: () => void;
|
|
88
|
-
setShortcut: (action: string, key: string) => void;
|
|
89
|
-
toggleNotification: (channel: keyof NotificationPreferences) => void;
|
|
90
|
-
}) => void), shouldReplace: true): unknown;
|
|
41
|
+
setState(nextStateOrUpdater: (ConfigState & ConfigActions) | Partial<ConfigState & ConfigActions> | ((state: import("immer").WritableNonArrayDraft<ConfigState & ConfigActions>) => void), shouldReplace?: false): unknown;
|
|
42
|
+
setState(nextStateOrUpdater: (ConfigState & ConfigActions) | ((state: import("immer").WritableNonArrayDraft<ConfigState & ConfigActions>) => void), shouldReplace: true): unknown;
|
|
91
43
|
}>;
|
|
92
44
|
export {};
|
|
93
45
|
//# sourceMappingURL=config-store.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-store.d.ts","sourceRoot":"","sources":["../../src/stores/config-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAM3E,qFAAqF;AACrF,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AA0ID,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,UAAU,EAAE,SAAS,CAAC;IACtB,aAAa,EAAE,uBAAuB,CAAC;IACvC,YAAY,EAAE,OAAO,CAAC;CACvB;AAID,UAAU,aAAa;IACrB,+DAA+D;IAC/D,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACtD,8CAA8C;IAC9C,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,yCAAyC;IACzC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,8CAA8C;IAC9C,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,uBAAuB,KAAK,IAAI,CAAC;CACtE;AAiBD,eAAO,MAAM,cAAc
|
|
1
|
+
{"version":3,"file":"config-store.d.ts","sourceRoot":"","sources":["../../src/stores/config-store.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,OAAO,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,uBAAuB,EAAE,MAAM,UAAU,CAAC;AAM3E,qFAAqF;AACrF,wBAAgB,qBAAqB,IAAI,MAAM,CAE9C;AA0ID,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,UAAU,EAAE,SAAS,CAAC;IACtB,aAAa,EAAE,uBAAuB,CAAC;IACvC,YAAY,EAAE,OAAO,CAAC;CACvB;AAID,UAAU,aAAa;IACrB,+DAA+D;IAC/D,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;IACtD,8CAA8C;IAC9C,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,yCAAyC;IACzC,WAAW,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,8CAA8C;IAC9C,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,uBAAuB,KAAK,IAAI,CAAC;CACtE;AAiBD,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;EA6D1B,CAAC"}
|