@jango-blockchained/hoox-shared 1.0.8
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 +27 -0
- package/dist/analytics.d.ts +22 -0
- package/dist/analytics.d.ts.map +1 -0
- package/dist/analytics.js +34 -0
- package/dist/api-client.d.ts +34 -0
- package/dist/api-client.d.ts.map +1 -0
- package/dist/api-client.js +124 -0
- package/dist/colors.d.ts +34 -0
- package/dist/colors.d.ts.map +1 -0
- package/dist/colors.js +42 -0
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +91 -0
- package/dist/d1/index.d.ts +5 -0
- package/dist/d1/index.d.ts.map +1 -0
- package/dist/d1/index.js +316 -0
- package/dist/d1/repository.d.ts +77 -0
- package/dist/d1/repository.d.ts.map +1 -0
- package/dist/d1/schemas.d.ts +85 -0
- package/dist/d1/schemas.d.ts.map +1 -0
- package/dist/errors.d.ts +39 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +106 -0
- package/dist/exchange-client.d.ts +84 -0
- package/dist/exchange-client.d.ts.map +1 -0
- package/dist/exchange-client.js +104 -0
- package/dist/format-time.d.ts +24 -0
- package/dist/format-time.d.ts.map +1 -0
- package/dist/format-time.js +57 -0
- package/dist/formatters.d.ts +32 -0
- package/dist/formatters.d.ts.map +1 -0
- package/dist/formatters.js +155 -0
- package/dist/health.d.ts +19 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +117 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2581 -0
- package/dist/kvKeys.d.ts +72 -0
- package/dist/kvKeys.d.ts.map +1 -0
- package/dist/kvKeys.js +107 -0
- package/dist/kvUtils.d.ts +26 -0
- package/dist/kvUtils.d.ts.map +1 -0
- package/dist/kvUtils.js +127 -0
- package/dist/legal.d.ts +11 -0
- package/dist/legal.d.ts.map +1 -0
- package/dist/legal.js +40 -0
- package/dist/middleware/auth.d.ts +59 -0
- package/dist/middleware/auth.d.ts.map +1 -0
- package/dist/middleware/cors.d.ts +28 -0
- package/dist/middleware/cors.d.ts.map +1 -0
- package/dist/middleware/index.d.ts +10 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +375 -0
- package/dist/middleware/logger.d.ts +16 -0
- package/dist/middleware/logger.d.ts.map +1 -0
- package/dist/middleware/rate-limit.d.ts +24 -0
- package/dist/middleware/rate-limit.d.ts.map +1 -0
- package/dist/middleware/security-headers.d.ts +39 -0
- package/dist/middleware/security-headers.d.ts.map +1 -0
- package/dist/middleware/validate.d.ts +21 -0
- package/dist/middleware/validate.d.ts.map +1 -0
- package/dist/router.d.ts +11 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +123 -0
- package/dist/schemas/index.d.ts +4 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +656 -0
- package/dist/schemas/registry.d.ts +8 -0
- package/dist/schemas/registry.d.ts.map +1 -0
- package/dist/schemas/types.d.ts +79 -0
- package/dist/schemas/types.d.ts.map +1 -0
- package/dist/schemas/validators.d.ts +35 -0
- package/dist/schemas/validators.d.ts.map +1 -0
- package/dist/service-bindings.d.ts +32 -0
- package/dist/service-bindings.d.ts.map +1 -0
- package/dist/service-bindings.js +31 -0
- package/dist/session.d.ts +46 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +79 -0
- package/dist/sse.d.ts +26 -0
- package/dist/sse.d.ts.map +1 -0
- package/dist/sse.js +91 -0
- package/dist/stores/config-store.d.ts +87 -0
- package/dist/stores/config-store.d.ts.map +1 -0
- package/dist/stores/config-store.js +132 -0
- package/dist/stores/service-store.d.ts +206 -0
- package/dist/stores/service-store.d.ts.map +1 -0
- package/dist/stores/service-store.js +359 -0
- package/dist/stores/ui-store.d.ts +63 -0
- package/dist/stores/ui-store.d.ts.map +1 -0
- package/dist/stores/ui-store.js +62 -0
- package/dist/types/errors.d.ts +16 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +1 -0
- package/dist/types/router.d.ts +22 -0
- package/dist/types/router.d.ts.map +1 -0
- package/dist/types/router.js +1 -0
- package/dist/types.d.ts +317 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +70 -0
- package/dist/wizard/engine.d.ts +42 -0
- package/dist/wizard/engine.d.ts.map +1 -0
- package/dist/wizard/index.d.ts +7 -0
- package/dist/wizard/index.d.ts.map +1 -0
- package/dist/wizard/index.js +519 -0
- package/dist/wizard/persistence.d.ts +14 -0
- package/dist/wizard/persistence.d.ts.map +1 -0
- package/dist/wizard/presets.d.ts +34 -0
- package/dist/wizard/presets.d.ts.map +1 -0
- package/dist/wizard/provisioner.d.ts +11 -0
- package/dist/wizard/provisioner.d.ts.map +1 -0
- package/dist/wizard/types.d.ts +72 -0
- package/dist/wizard/types.d.ts.map +1 -0
- package/package.json +83 -0
package/dist/kvKeys.d.ts
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Centralized KV key registry for Hoox workers.
|
|
3
|
+
* Use these constants instead of string literals to prevent typos.
|
|
4
|
+
*
|
|
5
|
+
* Key naming convention: <namespace>:<key>
|
|
6
|
+
* - trade:* - Trade execution settings
|
|
7
|
+
* - bot:* - Telegram bot settings
|
|
8
|
+
* - webhook:* - Webhook configuration
|
|
9
|
+
* - email:* - Email worker settings
|
|
10
|
+
* - agent:* - Agent worker settings
|
|
11
|
+
* - dashboard:* - Dashboard settings
|
|
12
|
+
* - global:* - Global settings
|
|
13
|
+
*/
|
|
14
|
+
export declare const KV_TRADE_DEFAULT_LEVERAGE = "trade:default_leverage";
|
|
15
|
+
export declare const KV_TRADE_MAX_POSITION_SIZE = "trade:max_position_size";
|
|
16
|
+
export declare const KV_TRADE_MAX_DAILY_DRAWDOWN_PERCENT = "trade:max_daily_drawdown_percent";
|
|
17
|
+
export declare const KV_TRADE_TRAILING_STOP_PERCENT = "trade:trailing_stop_percent";
|
|
18
|
+
export declare const KV_TRADE_KILL_SWITCH = "trade:kill_switch";
|
|
19
|
+
export declare const KV_TRADE_ROUTING = "trade:routing";
|
|
20
|
+
export declare const KV_BOT_ENABLED = "bot:enabled";
|
|
21
|
+
export declare const KV_BOT_DEFAULT_CHAT_ID = "bot:default_chat_id";
|
|
22
|
+
export declare const KV_BOT_NOTIFY_ON_EXECUTION = "bot:notify_on_execution";
|
|
23
|
+
export declare const KV_BOT_NOTIFY_ON_ERROR = "bot:notify_on_error";
|
|
24
|
+
export declare const KV_WEBHOOK_IP_CHECK_ENABLED = "webhook:tradingview:ip_check_enabled";
|
|
25
|
+
export declare const KV_WEBHOOK_ALLOWED_IPS = "webhook:tradingview:allowed_ips";
|
|
26
|
+
export declare const KV_WEBHOOK_QUEUE_MODE = "webhook:queue_mode";
|
|
27
|
+
export declare const KV_EMAIL_SCAN_SUBJECT = "email:scan_subject";
|
|
28
|
+
export declare const KV_EMAIL_USE_IMAP = "email:use_imap";
|
|
29
|
+
export declare const KV_EMAIL_COIN_PATTERN = "email:coin_pattern";
|
|
30
|
+
export declare const KV_EMAIL_ACTION_PATTERN = "email:action_pattern";
|
|
31
|
+
export declare const KV_EMAIL_QUANTITY_MULTIPLIER = "email:quantity_multiplier";
|
|
32
|
+
export declare const KV_AGENT_CONFIG = "agent:config";
|
|
33
|
+
export declare const KV_AGENT_OPENAI_KEY = "agent:openai_key";
|
|
34
|
+
export declare const KV_AGENT_ANTHROPIC_KEY = "agent:anthropic_key";
|
|
35
|
+
export declare const KV_AGENT_GOOGLE_KEY = "agent:google_key";
|
|
36
|
+
export declare const KV_DASHBOARD_AI_HEALTH_SUMMARY = "dashboard:ai_health_summary";
|
|
37
|
+
export declare const KV_HEALTH_CHECK = "health_check";
|
|
38
|
+
export declare const KV_HOUSEKEEPING_LAST_CHECK = "housekeeping:last_check";
|
|
39
|
+
export declare const QUEUE_MODE_FAILOVER = "queue_failover";
|
|
40
|
+
export declare const QUEUE_MODE_EVERYWHERE = "queue_everywhere";
|
|
41
|
+
export declare const QUEUE_MODE_DISABLED = "queue_disabled";
|
|
42
|
+
export declare const KVKeys: {
|
|
43
|
+
KV_TRADE_DEFAULT_LEVERAGE: string;
|
|
44
|
+
KV_TRADE_MAX_POSITION_SIZE: string;
|
|
45
|
+
KV_TRADE_MAX_DAILY_DRAWDOWN_PERCENT: string;
|
|
46
|
+
KV_TRADE_TRAILING_STOP_PERCENT: string;
|
|
47
|
+
KV_TRADE_KILL_SWITCH: string;
|
|
48
|
+
KV_TRADE_ROUTING: string;
|
|
49
|
+
KV_BOT_ENABLED: string;
|
|
50
|
+
KV_BOT_DEFAULT_CHAT_ID: string;
|
|
51
|
+
KV_BOT_NOTIFY_ON_EXECUTION: string;
|
|
52
|
+
KV_BOT_NOTIFY_ON_ERROR: string;
|
|
53
|
+
KV_WEBHOOK_IP_CHECK_ENABLED: string;
|
|
54
|
+
KV_WEBHOOK_ALLOWED_IPS: string;
|
|
55
|
+
KV_WEBHOOK_QUEUE_MODE: string;
|
|
56
|
+
KV_EMAIL_SCAN_SUBJECT: string;
|
|
57
|
+
KV_EMAIL_USE_IMAP: string;
|
|
58
|
+
KV_EMAIL_COIN_PATTERN: string;
|
|
59
|
+
KV_EMAIL_ACTION_PATTERN: string;
|
|
60
|
+
KV_EMAIL_QUANTITY_MULTIPLIER: string;
|
|
61
|
+
KV_AGENT_CONFIG: string;
|
|
62
|
+
KV_AGENT_OPENAI_KEY: string;
|
|
63
|
+
KV_AGENT_ANTHROPIC_KEY: string;
|
|
64
|
+
KV_AGENT_GOOGLE_KEY: string;
|
|
65
|
+
KV_DASHBOARD_AI_HEALTH_SUMMARY: string;
|
|
66
|
+
KV_HEALTH_CHECK: string;
|
|
67
|
+
KV_HOUSEKEEPING_LAST_CHECK: string;
|
|
68
|
+
QUEUE_MODE_FAILOVER: string;
|
|
69
|
+
QUEUE_MODE_EVERYWHERE: string;
|
|
70
|
+
QUEUE_MODE_DISABLED: string;
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=kvKeys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kvKeys.d.ts","sourceRoot":"","sources":["../src/kvKeys.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAGH,eAAO,MAAM,yBAAyB,2BAA2B,CAAC;AAClE,eAAO,MAAM,0BAA0B,4BAA4B,CAAC;AACpE,eAAO,MAAM,mCAAmC,qCACZ,CAAC;AACrC,eAAO,MAAM,8BAA8B,gCAAgC,CAAC;AAC5E,eAAO,MAAM,oBAAoB,sBAAsB,CAAC;AACxD,eAAO,MAAM,gBAAgB,kBAAkB,CAAC;AAGhD,eAAO,MAAM,cAAc,gBAAgB,CAAC;AAC5C,eAAO,MAAM,sBAAsB,wBAAwB,CAAC;AAC5D,eAAO,MAAM,0BAA0B,4BAA4B,CAAC;AACpE,eAAO,MAAM,sBAAsB,wBAAwB,CAAC;AAG5D,eAAO,MAAM,2BAA2B,yCACA,CAAC;AACzC,eAAO,MAAM,sBAAsB,oCAAoC,CAAC;AACxE,eAAO,MAAM,qBAAqB,uBAAuB,CAAC;AAG1D,eAAO,MAAM,qBAAqB,uBAAuB,CAAC;AAC1D,eAAO,MAAM,iBAAiB,mBAAmB,CAAC;AAClD,eAAO,MAAM,qBAAqB,uBAAuB,CAAC;AAC1D,eAAO,MAAM,uBAAuB,yBAAyB,CAAC;AAC9D,eAAO,MAAM,4BAA4B,8BAA8B,CAAC;AAGxE,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAC9C,eAAO,MAAM,mBAAmB,qBAAqB,CAAC;AACtD,eAAO,MAAM,sBAAsB,wBAAwB,CAAC;AAC5D,eAAO,MAAM,mBAAmB,qBAAqB,CAAC;AAGtD,eAAO,MAAM,8BAA8B,gCAAgC,CAAC;AAG5E,eAAO,MAAM,eAAe,iBAAiB,CAAC;AAC9C,eAAO,MAAM,0BAA0B,4BAA4B,CAAC;AAGpE,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AACpD,eAAO,MAAM,qBAAqB,qBAAqB,CAAC;AACxD,eAAO,MAAM,mBAAmB,mBAAmB,CAAC;AAKpD,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6BlB,CAAC"}
|
package/dist/kvKeys.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
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
|
+
// src/kvKeys.ts
|
|
19
|
+
var KV_TRADE_DEFAULT_LEVERAGE = "trade:default_leverage";
|
|
20
|
+
var KV_TRADE_MAX_POSITION_SIZE = "trade:max_position_size";
|
|
21
|
+
var KV_TRADE_MAX_DAILY_DRAWDOWN_PERCENT = "trade:max_daily_drawdown_percent";
|
|
22
|
+
var KV_TRADE_TRAILING_STOP_PERCENT = "trade:trailing_stop_percent";
|
|
23
|
+
var KV_TRADE_KILL_SWITCH = "trade:kill_switch";
|
|
24
|
+
var KV_TRADE_ROUTING = "trade:routing";
|
|
25
|
+
var KV_BOT_ENABLED = "bot:enabled";
|
|
26
|
+
var KV_BOT_DEFAULT_CHAT_ID = "bot:default_chat_id";
|
|
27
|
+
var KV_BOT_NOTIFY_ON_EXECUTION = "bot:notify_on_execution";
|
|
28
|
+
var KV_BOT_NOTIFY_ON_ERROR = "bot:notify_on_error";
|
|
29
|
+
var KV_WEBHOOK_IP_CHECK_ENABLED = "webhook:tradingview:ip_check_enabled";
|
|
30
|
+
var KV_WEBHOOK_ALLOWED_IPS = "webhook:tradingview:allowed_ips";
|
|
31
|
+
var KV_WEBHOOK_QUEUE_MODE = "webhook:queue_mode";
|
|
32
|
+
var KV_EMAIL_SCAN_SUBJECT = "email:scan_subject";
|
|
33
|
+
var KV_EMAIL_USE_IMAP = "email:use_imap";
|
|
34
|
+
var KV_EMAIL_COIN_PATTERN = "email:coin_pattern";
|
|
35
|
+
var KV_EMAIL_ACTION_PATTERN = "email:action_pattern";
|
|
36
|
+
var KV_EMAIL_QUANTITY_MULTIPLIER = "email:quantity_multiplier";
|
|
37
|
+
var KV_AGENT_CONFIG = "agent:config";
|
|
38
|
+
var KV_AGENT_OPENAI_KEY = "agent:openai_key";
|
|
39
|
+
var KV_AGENT_ANTHROPIC_KEY = "agent:anthropic_key";
|
|
40
|
+
var KV_AGENT_GOOGLE_KEY = "agent:google_key";
|
|
41
|
+
var KV_DASHBOARD_AI_HEALTH_SUMMARY = "dashboard:ai_health_summary";
|
|
42
|
+
var KV_HEALTH_CHECK = "health_check";
|
|
43
|
+
var KV_HOUSEKEEPING_LAST_CHECK = "housekeeping:last_check";
|
|
44
|
+
var QUEUE_MODE_FAILOVER = "queue_failover";
|
|
45
|
+
var QUEUE_MODE_EVERYWHERE = "queue_everywhere";
|
|
46
|
+
var QUEUE_MODE_DISABLED = "queue_disabled";
|
|
47
|
+
var KVKeys = {
|
|
48
|
+
KV_TRADE_DEFAULT_LEVERAGE,
|
|
49
|
+
KV_TRADE_MAX_POSITION_SIZE,
|
|
50
|
+
KV_TRADE_MAX_DAILY_DRAWDOWN_PERCENT,
|
|
51
|
+
KV_TRADE_TRAILING_STOP_PERCENT,
|
|
52
|
+
KV_TRADE_KILL_SWITCH,
|
|
53
|
+
KV_TRADE_ROUTING,
|
|
54
|
+
KV_BOT_ENABLED,
|
|
55
|
+
KV_BOT_DEFAULT_CHAT_ID,
|
|
56
|
+
KV_BOT_NOTIFY_ON_EXECUTION,
|
|
57
|
+
KV_BOT_NOTIFY_ON_ERROR,
|
|
58
|
+
KV_WEBHOOK_IP_CHECK_ENABLED,
|
|
59
|
+
KV_WEBHOOK_ALLOWED_IPS,
|
|
60
|
+
KV_WEBHOOK_QUEUE_MODE,
|
|
61
|
+
KV_EMAIL_SCAN_SUBJECT,
|
|
62
|
+
KV_EMAIL_USE_IMAP,
|
|
63
|
+
KV_EMAIL_COIN_PATTERN,
|
|
64
|
+
KV_EMAIL_ACTION_PATTERN,
|
|
65
|
+
KV_EMAIL_QUANTITY_MULTIPLIER,
|
|
66
|
+
KV_AGENT_CONFIG,
|
|
67
|
+
KV_AGENT_OPENAI_KEY,
|
|
68
|
+
KV_AGENT_ANTHROPIC_KEY,
|
|
69
|
+
KV_AGENT_GOOGLE_KEY,
|
|
70
|
+
KV_DASHBOARD_AI_HEALTH_SUMMARY,
|
|
71
|
+
KV_HEALTH_CHECK,
|
|
72
|
+
KV_HOUSEKEEPING_LAST_CHECK,
|
|
73
|
+
QUEUE_MODE_FAILOVER,
|
|
74
|
+
QUEUE_MODE_EVERYWHERE,
|
|
75
|
+
QUEUE_MODE_DISABLED
|
|
76
|
+
};
|
|
77
|
+
export {
|
|
78
|
+
QUEUE_MODE_FAILOVER,
|
|
79
|
+
QUEUE_MODE_EVERYWHERE,
|
|
80
|
+
QUEUE_MODE_DISABLED,
|
|
81
|
+
KV_WEBHOOK_QUEUE_MODE,
|
|
82
|
+
KV_WEBHOOK_IP_CHECK_ENABLED,
|
|
83
|
+
KV_WEBHOOK_ALLOWED_IPS,
|
|
84
|
+
KV_TRADE_TRAILING_STOP_PERCENT,
|
|
85
|
+
KV_TRADE_ROUTING,
|
|
86
|
+
KV_TRADE_MAX_POSITION_SIZE,
|
|
87
|
+
KV_TRADE_MAX_DAILY_DRAWDOWN_PERCENT,
|
|
88
|
+
KV_TRADE_KILL_SWITCH,
|
|
89
|
+
KV_TRADE_DEFAULT_LEVERAGE,
|
|
90
|
+
KV_HOUSEKEEPING_LAST_CHECK,
|
|
91
|
+
KV_HEALTH_CHECK,
|
|
92
|
+
KV_EMAIL_USE_IMAP,
|
|
93
|
+
KV_EMAIL_SCAN_SUBJECT,
|
|
94
|
+
KV_EMAIL_QUANTITY_MULTIPLIER,
|
|
95
|
+
KV_EMAIL_COIN_PATTERN,
|
|
96
|
+
KV_EMAIL_ACTION_PATTERN,
|
|
97
|
+
KV_DASHBOARD_AI_HEALTH_SUMMARY,
|
|
98
|
+
KV_BOT_NOTIFY_ON_EXECUTION,
|
|
99
|
+
KV_BOT_NOTIFY_ON_ERROR,
|
|
100
|
+
KV_BOT_ENABLED,
|
|
101
|
+
KV_BOT_DEFAULT_CHAT_ID,
|
|
102
|
+
KV_AGENT_OPENAI_KEY,
|
|
103
|
+
KV_AGENT_GOOGLE_KEY,
|
|
104
|
+
KV_AGENT_CONFIG,
|
|
105
|
+
KV_AGENT_ANTHROPIC_KEY,
|
|
106
|
+
KVKeys
|
|
107
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for KV operations
|
|
3
|
+
* Shared across workers that need KV timestamp logging
|
|
4
|
+
*/
|
|
5
|
+
import type { KVNamespace } from "@cloudflare/workers-types";
|
|
6
|
+
/**
|
|
7
|
+
* Interface for environments with a KVNamespace binding
|
|
8
|
+
*/
|
|
9
|
+
export interface EnvWithKV {
|
|
10
|
+
REPORT_KV: KVNamespace;
|
|
11
|
+
[key: string]: unknown;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Logs a timestamp to KV
|
|
15
|
+
* @param env - Environment with KV binding
|
|
16
|
+
* @param prefix - Optional prefix for the key
|
|
17
|
+
* @returns Promise that resolves when the operation completes
|
|
18
|
+
*/
|
|
19
|
+
export declare function logKvTimestamp(env: EnvWithKV, prefix?: string): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Helper function to convert Headers to a plain object
|
|
22
|
+
* @param headers - The Headers object to convert
|
|
23
|
+
* @returns Plain object representation of headers
|
|
24
|
+
*/
|
|
25
|
+
export declare function headersToObject(headers: Headers | null | undefined): Record<string, string>;
|
|
26
|
+
//# sourceMappingURL=kvUtils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kvUtils.d.ts","sourceRoot":"","sources":["../src/kvUtils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAG7D;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,WAAW,CAAC;IACvB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAsB,cAAc,CAClC,GAAG,EAAE,SAAS,EACd,MAAM,GAAE,MAAoB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAUf;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,GAAG,IAAI,GAAG,SAAS,GAClC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAgBxB"}
|
package/dist/kvUtils.js
ADDED
|
@@ -0,0 +1,127 @@
|
|
|
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
|
+
// src/errors.ts
|
|
19
|
+
function toError(err, fallback = "Unknown error") {
|
|
20
|
+
if (err instanceof Error)
|
|
21
|
+
return err.message;
|
|
22
|
+
if (typeof err === "string")
|
|
23
|
+
return err;
|
|
24
|
+
if (err && typeof err === "object" && "message" in err && typeof err.message === "string") {
|
|
25
|
+
return err.message;
|
|
26
|
+
}
|
|
27
|
+
if (err === null || err === undefined)
|
|
28
|
+
return fallback;
|
|
29
|
+
try {
|
|
30
|
+
return JSON.stringify(err) || fallback;
|
|
31
|
+
} catch {
|
|
32
|
+
return fallback;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function sanitizeOutput(data) {
|
|
36
|
+
if (data instanceof Error) {
|
|
37
|
+
return { name: data.name, message: data.message };
|
|
38
|
+
}
|
|
39
|
+
if (data && typeof data === "object" && !Array.isArray(data)) {
|
|
40
|
+
const sanitized = {};
|
|
41
|
+
for (const [k, v] of Object.entries(data)) {
|
|
42
|
+
if (k === "stack" || k === "cause")
|
|
43
|
+
continue;
|
|
44
|
+
sanitized[k] = v instanceof Error ? { name: v.name, message: v.message } : sanitizeOutput(v);
|
|
45
|
+
}
|
|
46
|
+
return sanitized;
|
|
47
|
+
}
|
|
48
|
+
if (Array.isArray(data)) {
|
|
49
|
+
return data.map(sanitizeOutput);
|
|
50
|
+
}
|
|
51
|
+
return data;
|
|
52
|
+
}
|
|
53
|
+
function createJsonResponse(data, status = 200) {
|
|
54
|
+
return new Response(JSON.stringify(sanitizeOutput(data)), {
|
|
55
|
+
status,
|
|
56
|
+
headers: { "Content-Type": "application/json" }
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
function createSuccessResponse(result) {
|
|
60
|
+
return createJsonResponse({ success: true, result }, 200);
|
|
61
|
+
}
|
|
62
|
+
function createErrorResponse(error, status) {
|
|
63
|
+
const message = typeof error === "string" ? error : error.message;
|
|
64
|
+
const statusCode = typeof error === "string" ? status ?? 500 : error.status ?? 500;
|
|
65
|
+
const body = { success: false, error: message };
|
|
66
|
+
if (typeof error !== "string" && error.code)
|
|
67
|
+
body.code = error.code;
|
|
68
|
+
if (typeof error !== "string" && error.details !== undefined)
|
|
69
|
+
body.details = error.details;
|
|
70
|
+
return new Response(JSON.stringify(body), {
|
|
71
|
+
status: statusCode,
|
|
72
|
+
headers: { "Content-Type": "application/json" }
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
var Errors = {
|
|
76
|
+
badRequest: (message) => createErrorResponse({ message, status: 400, code: "BAD_REQUEST" }),
|
|
77
|
+
unauthorized: (message = "Unauthorized") => createErrorResponse({ message, status: 401, code: "UNAUTHORIZED" }),
|
|
78
|
+
forbidden: (message = "Forbidden") => createErrorResponse({ message, status: 403, code: "FORBIDDEN" }),
|
|
79
|
+
notFound: (message = "Not found") => createErrorResponse({ message, status: 404, code: "NOT_FOUND" }),
|
|
80
|
+
methodNotAllowed: (message = "Method not allowed") => createErrorResponse({ message, status: 405, code: "METHOD_NOT_ALLOWED" }),
|
|
81
|
+
rateLimited: (retryAfter) => {
|
|
82
|
+
const res = createErrorResponse({
|
|
83
|
+
message: "Rate limit exceeded",
|
|
84
|
+
status: 429,
|
|
85
|
+
code: "RATE_LIMITED"
|
|
86
|
+
});
|
|
87
|
+
if (retryAfter)
|
|
88
|
+
res.headers.set("Retry-After", String(retryAfter));
|
|
89
|
+
return res;
|
|
90
|
+
},
|
|
91
|
+
internal: (err) => {
|
|
92
|
+
const message = err ? toError(err, "Internal server error") : "Internal server error";
|
|
93
|
+
return createErrorResponse({
|
|
94
|
+
message,
|
|
95
|
+
status: 500,
|
|
96
|
+
code: "INTERNAL_ERROR"
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
// src/kvUtils.ts
|
|
102
|
+
async function logKvTimestamp(env, prefix = "timestamp") {
|
|
103
|
+
const timestamp = new Date().toISOString();
|
|
104
|
+
const key = `${prefix}_${timestamp}`;
|
|
105
|
+
try {
|
|
106
|
+
await env.REPORT_KV.put(key, timestamp);
|
|
107
|
+
} catch (error) {
|
|
108
|
+
console.error(`Failed to log timestamp to KV: ${toError(error, "Unknown error")}`);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function headersToObject(headers) {
|
|
112
|
+
const result = {};
|
|
113
|
+
if (!headers)
|
|
114
|
+
return result;
|
|
115
|
+
try {
|
|
116
|
+
headers.forEach((value, key) => {
|
|
117
|
+
result[key] = value;
|
|
118
|
+
});
|
|
119
|
+
} catch (error) {
|
|
120
|
+
console.error(`Error converting headers to object: ${toError(error, "Unknown error")}`);
|
|
121
|
+
}
|
|
122
|
+
return result;
|
|
123
|
+
}
|
|
124
|
+
export {
|
|
125
|
+
logKvTimestamp,
|
|
126
|
+
headersToObject
|
|
127
|
+
};
|
package/dist/legal.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Legal notices, trademarks, and disclaimers for Hoox.
|
|
3
|
+
* Centralized here so all surfaces (CLI, HTTP, Dashboard) use consistent text.
|
|
4
|
+
*/
|
|
5
|
+
export declare const COPYRIGHT: string;
|
|
6
|
+
export declare const TRADEMARKS: readonly ["TradingView® is a registered trademark of TradingView, Inc.", "Cloudflare® is a registered trademark of Cloudflare, Inc."];
|
|
7
|
+
export declare const TRADEMARK_NOTICE: string;
|
|
8
|
+
export declare const DISCLAIMER: string;
|
|
9
|
+
export declare const FULL_LEGAL_NOTICE: string;
|
|
10
|
+
export declare const DISCLAIMER_HEADER = "X-Disclaimer";
|
|
11
|
+
//# sourceMappingURL=legal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legal.d.ts","sourceRoot":"","sources":["../src/legal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,SAAS,QAA8E,CAAC;AAErG,eAAO,MAAM,UAAU,uIAGb,CAAC;AAEX,eAAO,MAAM,gBAAgB,QAAwB,CAAC;AAEtD,eAAO,MAAM,UAAU,QAIqD,CAAC;AAE7E,eAAO,MAAM,iBAAiB,QAAyD,CAAC;AAExF,eAAO,MAAM,iBAAiB,iBAAiB,CAAC"}
|
package/dist/legal.js
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
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
|
+
// src/legal.ts
|
|
19
|
+
var COPYRIGHT = `Copyright (C) ${new Date().getFullYear()} Hoox Team. All rights reserved.`;
|
|
20
|
+
var TRADEMARKS = [
|
|
21
|
+
"TradingView\xAE is a registered trademark of TradingView, Inc.",
|
|
22
|
+
"Cloudflare\xAE is a registered trademark of Cloudflare, Inc."
|
|
23
|
+
];
|
|
24
|
+
var TRADEMARK_NOTICE = TRADEMARKS.join(`
|
|
25
|
+
`);
|
|
26
|
+
var DISCLAIMER = "DISCLAIMER: This software is provided for educational and informational purposes only. " + "Trading cryptocurrencies and other financial instruments involves substantial risk of loss. " + "No guarantee of profits or protection against losses is made or implied. " + "Past performance does not indicate future results. Use at your own risk.";
|
|
27
|
+
var FULL_LEGAL_NOTICE = `${COPYRIGHT}
|
|
28
|
+
|
|
29
|
+
${TRADEMARK_NOTICE}
|
|
30
|
+
|
|
31
|
+
${DISCLAIMER}`;
|
|
32
|
+
var DISCLAIMER_HEADER = "X-Disclaimer";
|
|
33
|
+
export {
|
|
34
|
+
TRADEMARK_NOTICE,
|
|
35
|
+
TRADEMARKS,
|
|
36
|
+
FULL_LEGAL_NOTICE,
|
|
37
|
+
DISCLAIMER_HEADER,
|
|
38
|
+
DISCLAIMER,
|
|
39
|
+
COPYRIGHT
|
|
40
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication middleware for Cloudflare Workers
|
|
3
|
+
* Provides both Bearer token auth and internal service-to-service auth
|
|
4
|
+
*/
|
|
5
|
+
import type { Env } from "../types";
|
|
6
|
+
import type { Handler } from "../types/router";
|
|
7
|
+
/**
|
|
8
|
+
* Constant-time string comparison to prevent timing attacks.
|
|
9
|
+
* Manually performs byte-wise XOR comparison to avoid early returns.
|
|
10
|
+
*/
|
|
11
|
+
export declare function timingSafeEqual(a: string, b: string): boolean;
|
|
12
|
+
/**
|
|
13
|
+
* Require Bearer token authentication via Authorization header.
|
|
14
|
+
* Use for external API endpoints that need token-based auth.
|
|
15
|
+
*/
|
|
16
|
+
export declare function requireAuth(request: Request, env: Env): Promise<Response | null>;
|
|
17
|
+
/**
|
|
18
|
+
* Environment with an internal auth key binding.
|
|
19
|
+
* Workers that accept internal service-to-service requests should extend this.
|
|
20
|
+
*/
|
|
21
|
+
export interface InternalAuthEnv {
|
|
22
|
+
[key: string]: unknown;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Require internal service-to-service authentication via X-Internal-Auth-Key header.
|
|
26
|
+
* Use for endpoints called by other workers via Service Bindings.
|
|
27
|
+
*
|
|
28
|
+
* Fails closed: if the expected key is not configured in env, the request is rejected.
|
|
29
|
+
* This prevents accidental exposure of unprotected internal endpoints.
|
|
30
|
+
*
|
|
31
|
+
* @param request - The incoming request
|
|
32
|
+
* @param env - Worker environment containing the expected key
|
|
33
|
+
* @param keyName - The env binding name for the internal key (default: 'INTERNAL_KEY_BINDING')
|
|
34
|
+
* @returns Response if unauthorized, null if authorized
|
|
35
|
+
*/
|
|
36
|
+
export declare function requireInternalAuth(request: Request, env: InternalAuthEnv, keyName?: string): Response | null;
|
|
37
|
+
/**
|
|
38
|
+
* Create a middleware function for the router that enforces internal auth.
|
|
39
|
+
* Returns a Response (401) when unauthorized, or void when authorized.
|
|
40
|
+
*
|
|
41
|
+
* Usage: router.get("/path", handler, [createInternalAuthMiddleware()])
|
|
42
|
+
*
|
|
43
|
+
* @param keyName - The env binding name for the internal key (default: 'INTERNAL_KEY_BINDING')
|
|
44
|
+
*/
|
|
45
|
+
export declare function createInternalAuthMiddleware<TEnv extends InternalAuthEnv>(keyName?: string): Handler<TEnv>;
|
|
46
|
+
/**
|
|
47
|
+
* Check internal auth and return a result object (non-throwing pattern).
|
|
48
|
+
* Useful when you need to check auth without immediately returning a response.
|
|
49
|
+
*
|
|
50
|
+
* @param request - The incoming request
|
|
51
|
+
* @param env - Worker environment containing the expected key
|
|
52
|
+
* @param keyName - The env binding name for the internal key (default: 'INTERNAL_KEY_BINDING')
|
|
53
|
+
* @returns Object with authorized flag and optional error message
|
|
54
|
+
*/
|
|
55
|
+
export declare function checkInternalAuth(request: Request, env: InternalAuthEnv, keyName?: string): {
|
|
56
|
+
authorized: boolean;
|
|
57
|
+
error?: string;
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/middleware/auth.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C;;;GAGG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,OAAO,CAU7D;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,GAAG,GACP,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAmB1B;AAED;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,eAAe,EACpB,OAAO,GAAE,MAA+B,GACvC,QAAQ,GAAG,IAAI,CAsBjB;AAED;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,SAAS,eAAe,EACvE,OAAO,GAAE,MAA+B,GACvC,OAAO,CAAC,IAAI,CAAC,CAKf;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,OAAO,EAChB,GAAG,EAAE,eAAe,EACpB,OAAO,GAAE,MAA+B,GACvC;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAYzC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CORS middleware for Cloudflare Workers
|
|
3
|
+
* Provides standardized CORS headers and preflight handling
|
|
4
|
+
*
|
|
5
|
+
* @available — Available for consumer use. Import from "@jango-blockchained/hoox-shared/middleware".
|
|
6
|
+
*/
|
|
7
|
+
export interface CorsOptions {
|
|
8
|
+
/** Allowed origins (default: "*") */
|
|
9
|
+
allowOrigin?: string;
|
|
10
|
+
/** Allowed methods (default: "GET, POST, OPTIONS, PUT, DELETE") */
|
|
11
|
+
allowMethods?: string;
|
|
12
|
+
/** Allowed headers (default: "Content-Type, Authorization, X-Request-ID, X-Internal-Auth-Key") */
|
|
13
|
+
allowHeaders?: string;
|
|
14
|
+
/** Whether to include credentials (default: false) */
|
|
15
|
+
allowCredentials?: boolean;
|
|
16
|
+
/** Max age for preflight cache (default: 86400 = 24h) */
|
|
17
|
+
maxAge?: number;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create CORS headers object for use in responses.
|
|
21
|
+
*/
|
|
22
|
+
export declare function corsHeaders(options?: CorsOptions): Record<string, string>;
|
|
23
|
+
/**
|
|
24
|
+
* Handle CORS preflight (OPTIONS) requests.
|
|
25
|
+
* Returns a Response for OPTIONS, or null for non-OPTIONS requests.
|
|
26
|
+
*/
|
|
27
|
+
export declare function handleCorsPreflightRequest(request: Request, options?: CorsOptions): Response | null;
|
|
28
|
+
//# sourceMappingURL=cors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cors.d.ts","sourceRoot":"","sources":["../../src/middleware/cors.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,WAAW,WAAW;IAC1B,qCAAqC;IACrC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kGAAkG;IAClG,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,yDAAyD;IACzD,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAWD;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,CAAC,EAAE,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAYzE;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,WAAW,GACpB,QAAQ,GAAG,IAAI,CAOjB"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Barrel exports for shared middleware
|
|
3
|
+
*/
|
|
4
|
+
export { createLogger, withRequestLog, type Logger, type LogContext, } from "./logger";
|
|
5
|
+
export { requireAuth, requireInternalAuth, createInternalAuthMiddleware, checkInternalAuth, timingSafeEqual, type InternalAuthEnv, } from "./auth";
|
|
6
|
+
export { createRateLimiter, type RateLimiter, type RateLimitConfig, } from "./rate-limit";
|
|
7
|
+
export { validateJson, validateJsonLegacy, requireField, optionalField, } from "./validate";
|
|
8
|
+
export { corsHeaders, handleCorsPreflightRequest, type CorsOptions, } from "./cors";
|
|
9
|
+
export { secureHeaders, wrapWithSecurityHeaders, type SecurityHeadersOptions, SECURITY_HEADERS_DEFAULTS, } from "./security-headers";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/middleware/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,YAAY,EACZ,cAAc,EACd,KAAK,MAAM,EACX,KAAK,UAAU,GAChB,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,4BAA4B,EAC5B,iBAAiB,EACjB,eAAe,EACf,KAAK,eAAe,GACrB,MAAM,QAAQ,CAAC;AAChB,OAAO,EACL,iBAAiB,EACjB,KAAK,WAAW,EAChB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,aAAa,GACd,MAAM,YAAY,CAAC;AACpB,OAAO,EACL,WAAW,EACX,0BAA0B,EAC1B,KAAK,WAAW,GACjB,MAAM,QAAQ,CAAC;AAChB,OAAO,EACL,aAAa,EACb,uBAAuB,EACvB,KAAK,sBAAsB,EAC3B,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC"}
|