@hooklink/cli 0.1.55 → 0.1.56
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/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +4 -2
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/connect.d.ts.map +1 -1
- package/dist/commands/connect.js +124 -105
- package/dist/commands/connect.js.map +1 -1
- package/dist/commands/login.d.ts.map +1 -1
- package/dist/commands/login.js +7 -3
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.d.ts.map +1 -1
- package/dist/commands/logout.js +6 -1
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/tunnel.d.ts.map +1 -1
- package/dist/commands/tunnel.js +9 -7
- package/dist/commands/tunnel.js.map +1 -1
- package/dist/core/http-forwarder.d.ts +13 -3
- package/dist/core/http-forwarder.d.ts.map +1 -1
- package/dist/core/http-forwarder.js +95 -54
- package/dist/core/http-forwarder.js.map +1 -1
- package/dist/core/websocket-client.d.ts +7 -2
- package/dist/core/websocket-client.d.ts.map +1 -1
- package/dist/core/websocket-client.js +58 -1
- package/dist/core/websocket-client.js.map +1 -1
- package/dist/core/websocket-pool.d.ts +40 -0
- package/dist/core/websocket-pool.d.ts.map +1 -0
- package/dist/core/websocket-pool.js +129 -0
- package/dist/core/websocket-pool.js.map +1 -0
- package/dist/index.js +38 -3
- package/dist/index.js.map +1 -1
- package/dist/types/index.d.ts +17 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/utils/api.d.ts +6 -4
- package/dist/utils/api.d.ts.map +1 -1
- package/dist/utils/api.js +30 -24
- package/dist/utils/api.js.map +1 -1
- package/dist/utils/config.d.ts +10 -1
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +82 -7
- package/dist/utils/config.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WebSocketPool = void 0;
|
|
7
|
+
const events_1 = require("events");
|
|
8
|
+
const crypto_1 = __importDefault(require("crypto"));
|
|
9
|
+
const websocket_client_1 = require("./websocket-client");
|
|
10
|
+
const logger_1 = require("../utils/logger");
|
|
11
|
+
/**
|
|
12
|
+
* Pool of WebSocket connections to the same server.
|
|
13
|
+
*
|
|
14
|
+
* The server dispatches incoming requests round-robin across all
|
|
15
|
+
* connections in the pool, so parallel HTTP requests (JS, CSS, images)
|
|
16
|
+
* travel over separate TCP streams and no longer block each other.
|
|
17
|
+
*
|
|
18
|
+
* All connections share the same poolId so the server counts them
|
|
19
|
+
* as a single logical connection for plan-limit purposes.
|
|
20
|
+
*/
|
|
21
|
+
class WebSocketPool extends events_1.EventEmitter {
|
|
22
|
+
constructor(options) {
|
|
23
|
+
super();
|
|
24
|
+
this.clients = [];
|
|
25
|
+
this.connectedCount = 0;
|
|
26
|
+
this.hasEmittedConnected = false;
|
|
27
|
+
this.hasEmittedReconnected = false;
|
|
28
|
+
this.options = options;
|
|
29
|
+
this.poolSize = options.poolSize ?? 4;
|
|
30
|
+
this.poolId = crypto_1.default.randomUUID();
|
|
31
|
+
}
|
|
32
|
+
async connect() {
|
|
33
|
+
const promises = [];
|
|
34
|
+
for (let i = 0; i < this.poolSize; i++) {
|
|
35
|
+
const clientOpts = {
|
|
36
|
+
wsUrl: this.options.wsUrl,
|
|
37
|
+
apiKey: this.options.apiKey,
|
|
38
|
+
endpointId: this.options.endpointId,
|
|
39
|
+
endpointIds: this.options.endpointIds,
|
|
40
|
+
trialToken: this.options.trialToken,
|
|
41
|
+
sessionId: this.options.sessionId,
|
|
42
|
+
maxReconnectAttempts: this.options.maxReconnectAttempts,
|
|
43
|
+
poolId: this.poolId,
|
|
44
|
+
onRequest: this.options.onRequest,
|
|
45
|
+
};
|
|
46
|
+
const client = new websocket_client_1.WebSocketClient(clientOpts);
|
|
47
|
+
// Forward events from individual clients to pool-level events.
|
|
48
|
+
// Only emit pool-level 'connected' once (when first client connects).
|
|
49
|
+
client.on('connected', () => {
|
|
50
|
+
this.connectedCount++;
|
|
51
|
+
if (!this.hasEmittedConnected) {
|
|
52
|
+
this.hasEmittedConnected = true;
|
|
53
|
+
this.emit('connected');
|
|
54
|
+
}
|
|
55
|
+
logger_1.Logger.debug(`Pool connection ${i + 1}/${this.poolSize} established`);
|
|
56
|
+
});
|
|
57
|
+
client.on('reconnected', () => {
|
|
58
|
+
// If the pool previously had zero connections, treat as pool reconnected
|
|
59
|
+
if (this.connectedCount === 0) {
|
|
60
|
+
this.connectedCount++;
|
|
61
|
+
if (!this.hasEmittedReconnected) {
|
|
62
|
+
this.hasEmittedReconnected = true;
|
|
63
|
+
this.emit('reconnected');
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
this.connectedCount++;
|
|
68
|
+
}
|
|
69
|
+
logger_1.Logger.debug(`Pool connection ${i + 1}/${this.poolSize} reconnected`);
|
|
70
|
+
});
|
|
71
|
+
client.on('disconnected', () => {
|
|
72
|
+
this.connectedCount = Math.max(0, this.connectedCount - 1);
|
|
73
|
+
// Only emit pool-level disconnected when ALL connections are down
|
|
74
|
+
if (this.connectedCount === 0) {
|
|
75
|
+
this.emit('disconnected');
|
|
76
|
+
}
|
|
77
|
+
logger_1.Logger.debug(`Pool connection ${i + 1}/${this.poolSize} disconnected (${this.connectedCount} remaining)`);
|
|
78
|
+
});
|
|
79
|
+
client.on('error', (error) => {
|
|
80
|
+
this.emit('error', error);
|
|
81
|
+
});
|
|
82
|
+
client.on('reconnect_exhausted', () => {
|
|
83
|
+
// Only emit pool-level exhaustion when ALL clients have exhausted
|
|
84
|
+
const allExhausted = this.clients.every((c) => !c.isConnected());
|
|
85
|
+
if (allExhausted) {
|
|
86
|
+
this.emit('reconnect_exhausted');
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
client.on('fatal_close', (code, reason) => {
|
|
90
|
+
// Fatal close affects the whole pool (auth failure, limit reached, etc.)
|
|
91
|
+
this.emit('fatal_close', code, reason);
|
|
92
|
+
// Disconnect all other pool members
|
|
93
|
+
this.disconnect();
|
|
94
|
+
});
|
|
95
|
+
this.clients.push(client);
|
|
96
|
+
// Stagger connections slightly to avoid thundering herd on the server
|
|
97
|
+
const connectPromise = i === 0
|
|
98
|
+
? client.connect()
|
|
99
|
+
: new Promise((resolve) => {
|
|
100
|
+
setTimeout(() => {
|
|
101
|
+
client.connect().then(resolve).catch(resolve);
|
|
102
|
+
}, i * 100);
|
|
103
|
+
});
|
|
104
|
+
promises.push(connectPromise);
|
|
105
|
+
}
|
|
106
|
+
// Wait for at least the first connection to succeed
|
|
107
|
+
await promises[0];
|
|
108
|
+
// Let remaining connections establish in the background
|
|
109
|
+
Promise.allSettled(promises.slice(1)).catch(() => { });
|
|
110
|
+
}
|
|
111
|
+
disconnect() {
|
|
112
|
+
for (const client of this.clients) {
|
|
113
|
+
client.disconnect();
|
|
114
|
+
}
|
|
115
|
+
this.clients = [];
|
|
116
|
+
this.connectedCount = 0;
|
|
117
|
+
}
|
|
118
|
+
isConnected() {
|
|
119
|
+
return this.clients.some((c) => c.isConnected());
|
|
120
|
+
}
|
|
121
|
+
getActiveCount() {
|
|
122
|
+
return this.connectedCount;
|
|
123
|
+
}
|
|
124
|
+
getPoolSize() {
|
|
125
|
+
return this.poolSize;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
exports.WebSocketPool = WebSocketPool;
|
|
129
|
+
//# sourceMappingURL=websocket-pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket-pool.js","sourceRoot":"","sources":["../../src/core/websocket-pool.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,38 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
"use strict";
|
|
3
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
4
|
+
if (k2 === undefined) k2 = k;
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
7
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
8
|
+
}
|
|
9
|
+
Object.defineProperty(o, k2, desc);
|
|
10
|
+
}) : (function(o, m, k, k2) {
|
|
11
|
+
if (k2 === undefined) k2 = k;
|
|
12
|
+
o[k2] = m[k];
|
|
13
|
+
}));
|
|
14
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
16
|
+
}) : function(o, v) {
|
|
17
|
+
o["default"] = v;
|
|
18
|
+
});
|
|
19
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
20
|
+
var ownKeys = function(o) {
|
|
21
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
22
|
+
var ar = [];
|
|
23
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
24
|
+
return ar;
|
|
25
|
+
};
|
|
26
|
+
return ownKeys(o);
|
|
27
|
+
};
|
|
28
|
+
return function (mod) {
|
|
29
|
+
if (mod && mod.__esModule) return mod;
|
|
30
|
+
var result = {};
|
|
31
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
32
|
+
__setModuleDefault(result, mod);
|
|
33
|
+
return result;
|
|
34
|
+
};
|
|
35
|
+
})();
|
|
3
36
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
4
37
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
5
38
|
};
|
|
@@ -48,10 +81,12 @@ async function main() {
|
|
|
48
81
|
return;
|
|
49
82
|
}
|
|
50
83
|
}
|
|
51
|
-
// Handle --staging flag before Commander parses
|
|
84
|
+
// Handle --staging flag before Commander parses
|
|
52
85
|
if (args.includes('--staging')) {
|
|
53
|
-
|
|
54
|
-
|
|
86
|
+
// Activate staging mode on config manager — transparently remaps
|
|
87
|
+
// apiKey/apiUrl/wsUrl to their staging: prefixed counterparts
|
|
88
|
+
const { config: cliConfig } = await Promise.resolve().then(() => __importStar(require('./utils/config')));
|
|
89
|
+
cliConfig.setStaging(true);
|
|
55
90
|
// Remove the flag so Commander doesn't choke on it
|
|
56
91
|
const idx = process.argv.indexOf('--staging');
|
|
57
92
|
if (idx !== -1)
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -7,6 +7,9 @@ export interface Config {
|
|
|
7
7
|
defaultEndpoint?: string;
|
|
8
8
|
defaultPort?: number;
|
|
9
9
|
telemetry?: boolean;
|
|
10
|
+
'staging:apiKey'?: string;
|
|
11
|
+
'staging:apiUrl'?: string;
|
|
12
|
+
'staging:wsUrl'?: string;
|
|
10
13
|
}
|
|
11
14
|
export interface WSAuthMessage {
|
|
12
15
|
type: 'auth';
|
|
@@ -36,6 +39,20 @@ export interface WSResponseMessage {
|
|
|
36
39
|
body?: string;
|
|
37
40
|
bodyEncoding?: 'utf8' | 'base64';
|
|
38
41
|
}
|
|
42
|
+
/** Returned by forwarder when response was streamed via WS chunks */
|
|
43
|
+
export interface StreamedResult {
|
|
44
|
+
streamed: true;
|
|
45
|
+
statusCode: number;
|
|
46
|
+
}
|
|
47
|
+
/** Callback interface for streaming response chunks over WebSocket */
|
|
48
|
+
export interface StreamContext {
|
|
49
|
+
sendStart: (requestId: string, statusCode: number, headers: Record<string, string | string[]>) => void;
|
|
50
|
+
/** Send a chunk. Returns a promise that resolves when the WS send buffer
|
|
51
|
+
* has drained below the high-water mark (backpressure). */
|
|
52
|
+
sendChunk: (requestId: string, data: Buffer) => Promise<void>;
|
|
53
|
+
sendEnd: (requestId: string) => void;
|
|
54
|
+
}
|
|
55
|
+
export type ForwardResult = WSResponseMessage | StreamedResult;
|
|
39
56
|
export interface WSErrorMessage {
|
|
40
57
|
type: 'error';
|
|
41
58
|
requestId?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,QAAQ,CAAC;AAChD,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAG1D,MAAM,WAAW,MAAM;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/api.d.ts
CHANGED
|
@@ -21,10 +21,12 @@ interface TrialStatusResponse {
|
|
|
21
21
|
remainingSeconds: number;
|
|
22
22
|
}
|
|
23
23
|
declare class ApiClient {
|
|
24
|
-
private
|
|
25
|
-
private
|
|
26
|
-
|
|
27
|
-
|
|
24
|
+
private _client;
|
|
25
|
+
private _unauthClient;
|
|
26
|
+
/** Lazily create the authenticated client so it picks up the correct
|
|
27
|
+
* apiUrl after staging mode has been activated. */
|
|
28
|
+
private get client();
|
|
29
|
+
private get unauthClient();
|
|
28
30
|
verifyApiKey(): Promise<boolean>;
|
|
29
31
|
getEndpoints(): Promise<Endpoint[]>;
|
|
30
32
|
getEndpoint(id: string): Promise<Endpoint>;
|
package/dist/utils/api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEhD,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,sBAAsB,EAAE,MAAM,CAAC;KAChC,CAAC;CACH;AAED,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uBAAuB,EAAE,MAAM,CAAC;IAChC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,cAAM,SAAS;IACb,OAAO,CAAC,
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEhD,UAAU,kBAAkB;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE;QACN,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,sBAAsB,EAAE,MAAM,CAAC;KAChC,CAAC;CACH;AAED,UAAU,mBAAmB;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uBAAuB,EAAE,MAAM,CAAC;IAChC,gBAAgB,EAAE,MAAM,CAAC;CAC1B;AAED,cAAM,SAAS;IACb,OAAO,CAAC,OAAO,CAA8B;IAC7C,OAAO,CAAC,aAAa,CAA8B;IAEnD;wDACoD;IACpD,OAAO,KAAK,MAAM,GAgBjB;IAED,OAAO,KAAK,YAAY,GASvB;IAEK,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC;IAShC,YAAY,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;IAKnC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAK1C,OAAO,CACX,UAAU,CAAC,EAAE,MAAM,EACnB,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,UAAU,EAAE,CAAC;IAalB,cAAc,IAAI,OAAO,CAAC;QAAE,IAAI,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;SAAE,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAKhH,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,GACjB,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAQlG,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAC;YAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAK7H,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAKtF,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAK/D,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAKhE;AAED,eAAO,MAAM,GAAG,WAAkB,CAAC"}
|
package/dist/utils/api.js
CHANGED
|
@@ -8,31 +8,37 @@ const axios_1 = __importDefault(require("axios"));
|
|
|
8
8
|
const config_1 = require("./config");
|
|
9
9
|
class ApiClient {
|
|
10
10
|
constructor() {
|
|
11
|
-
|
|
12
|
-
this.
|
|
13
|
-
baseURL: `${apiUrl}/api`,
|
|
14
|
-
headers: {
|
|
15
|
-
'Content-Type': 'application/json',
|
|
16
|
-
},
|
|
17
|
-
});
|
|
18
|
-
// Unauthenticated client for trial endpoints
|
|
19
|
-
this.unauthClient = axios_1.default.create({
|
|
20
|
-
baseURL: `${apiUrl}/api`,
|
|
21
|
-
headers: {
|
|
22
|
-
'Content-Type': 'application/json',
|
|
23
|
-
},
|
|
24
|
-
});
|
|
25
|
-
// Add auth interceptor
|
|
26
|
-
this.client.interceptors.request.use((config) => {
|
|
27
|
-
const apiKey = this.getApiKey();
|
|
28
|
-
if (apiKey) {
|
|
29
|
-
config.headers.Authorization = `Bearer ${apiKey}`;
|
|
30
|
-
}
|
|
31
|
-
return config;
|
|
32
|
-
});
|
|
11
|
+
this._client = null;
|
|
12
|
+
this._unauthClient = null;
|
|
33
13
|
}
|
|
34
|
-
|
|
35
|
-
|
|
14
|
+
/** Lazily create the authenticated client so it picks up the correct
|
|
15
|
+
* apiUrl after staging mode has been activated. */
|
|
16
|
+
get client() {
|
|
17
|
+
if (!this._client) {
|
|
18
|
+
const apiUrl = config_1.config.get('apiUrl');
|
|
19
|
+
this._client = axios_1.default.create({
|
|
20
|
+
baseURL: `${apiUrl}/api`,
|
|
21
|
+
headers: { 'Content-Type': 'application/json' },
|
|
22
|
+
});
|
|
23
|
+
this._client.interceptors.request.use((reqConfig) => {
|
|
24
|
+
const apiKey = config_1.config.get('apiKey');
|
|
25
|
+
if (apiKey) {
|
|
26
|
+
reqConfig.headers.Authorization = `Bearer ${apiKey}`;
|
|
27
|
+
}
|
|
28
|
+
return reqConfig;
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
return this._client;
|
|
32
|
+
}
|
|
33
|
+
get unauthClient() {
|
|
34
|
+
if (!this._unauthClient) {
|
|
35
|
+
const apiUrl = config_1.config.get('apiUrl');
|
|
36
|
+
this._unauthClient = axios_1.default.create({
|
|
37
|
+
baseURL: `${apiUrl}/api`,
|
|
38
|
+
headers: { 'Content-Type': 'application/json' },
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
return this._unauthClient;
|
|
36
42
|
}
|
|
37
43
|
async verifyApiKey() {
|
|
38
44
|
try {
|
package/dist/utils/api.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA6C;AAC7C,qCAAkC;AA0BlC,MAAM,SAAS;
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/utils/api.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/config.d.ts
CHANGED
|
@@ -1,13 +1,22 @@
|
|
|
1
1
|
import { Config } from '../types';
|
|
2
2
|
declare class ConfigManager {
|
|
3
3
|
private config;
|
|
4
|
+
private stagingMode;
|
|
4
5
|
constructor();
|
|
6
|
+
/** Enable staging mode. Remapped keys (apiKey, apiUrl, wsUrl) will
|
|
7
|
+
* transparently read/write their staging: prefixed counterparts. */
|
|
8
|
+
setStaging(enabled: boolean): void;
|
|
9
|
+
isStaging(): boolean;
|
|
10
|
+
/** Resolve the actual storage key, remapping to staging: prefix when active. */
|
|
11
|
+
private resolveKey;
|
|
5
12
|
get<K extends keyof Config>(key: K): Config[K];
|
|
6
13
|
set<K extends keyof Config>(key: K, value: Config[K]): void;
|
|
7
14
|
has(key: keyof Config): boolean;
|
|
8
15
|
delete(key: keyof Config): void;
|
|
9
16
|
clear(): void;
|
|
10
|
-
|
|
17
|
+
/** Returns config entries for the current environment only.
|
|
18
|
+
* Staging keys are hidden in production mode and vice versa. */
|
|
19
|
+
getAll(): Partial<Config>;
|
|
11
20
|
getPath(): string;
|
|
12
21
|
}
|
|
13
22
|
export declare const config: ConfigManager;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAgDlC,cAAM,aAAa;IACjB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,WAAW,CAAS;;IAS5B;yEACqE;IACrE,UAAU,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAIlC,SAAS,IAAI,OAAO;IAIpB,gFAAgF;IAChF,OAAO,CAAC,UAAU;IAOlB,GAAG,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;IAc9C,GAAG,CAAC,CAAC,SAAS,MAAM,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI;IAK3D,GAAG,CAAC,GAAG,EAAE,MAAM,MAAM,GAAG,OAAO;IAK/B,MAAM,CAAC,GAAG,EAAE,MAAM,MAAM,GAAG,IAAI;IAK/B,KAAK,IAAI,IAAI;IAoBb;qEACiE;IACjE,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IA2BzB,OAAO,IAAI,MAAM;CAGlB;AAED,eAAO,MAAM,MAAM,eAAsB,CAAC"}
|
package/dist/utils/config.js
CHANGED
|
@@ -28,7 +28,20 @@ const schema = {
|
|
|
28
28
|
type: 'boolean',
|
|
29
29
|
default: true,
|
|
30
30
|
},
|
|
31
|
+
'staging:apiKey': {
|
|
32
|
+
type: 'string',
|
|
33
|
+
},
|
|
34
|
+
'staging:apiUrl': {
|
|
35
|
+
type: 'string',
|
|
36
|
+
default: 'https://staging-api.hooklink.net',
|
|
37
|
+
},
|
|
38
|
+
'staging:wsUrl': {
|
|
39
|
+
type: 'string',
|
|
40
|
+
default: 'wss://staging-ws.hooklink.net/ws',
|
|
41
|
+
},
|
|
31
42
|
};
|
|
43
|
+
// Keys that are remapped when staging mode is active
|
|
44
|
+
const STAGING_REMAPPED_KEYS = new Set(['apiKey', 'apiUrl', 'wsUrl']);
|
|
32
45
|
// Map config keys to environment variable names
|
|
33
46
|
const envVarMap = {
|
|
34
47
|
apiKey: 'HOOKLINK_API_KEY',
|
|
@@ -37,13 +50,30 @@ const envVarMap = {
|
|
|
37
50
|
};
|
|
38
51
|
class ConfigManager {
|
|
39
52
|
constructor() {
|
|
53
|
+
this.stagingMode = false;
|
|
40
54
|
this.config = new conf_1.default({
|
|
41
55
|
projectName: 'hooklink',
|
|
42
56
|
schema: schema,
|
|
43
57
|
});
|
|
44
58
|
}
|
|
59
|
+
/** Enable staging mode. Remapped keys (apiKey, apiUrl, wsUrl) will
|
|
60
|
+
* transparently read/write their staging: prefixed counterparts. */
|
|
61
|
+
setStaging(enabled) {
|
|
62
|
+
this.stagingMode = enabled;
|
|
63
|
+
}
|
|
64
|
+
isStaging() {
|
|
65
|
+
return this.stagingMode;
|
|
66
|
+
}
|
|
67
|
+
/** Resolve the actual storage key, remapping to staging: prefix when active. */
|
|
68
|
+
resolveKey(key) {
|
|
69
|
+
if (this.stagingMode && STAGING_REMAPPED_KEYS.has(key)) {
|
|
70
|
+
return `staging:${key}`;
|
|
71
|
+
}
|
|
72
|
+
return key;
|
|
73
|
+
}
|
|
45
74
|
get(key) {
|
|
46
|
-
|
|
75
|
+
const resolved = this.resolveKey(key);
|
|
76
|
+
// Check env var (env vars always use the original key name)
|
|
47
77
|
const envName = envVarMap[key];
|
|
48
78
|
if (envName) {
|
|
49
79
|
const envVal = process.env[envName];
|
|
@@ -51,22 +81,67 @@ class ConfigManager {
|
|
|
51
81
|
return envVal;
|
|
52
82
|
}
|
|
53
83
|
}
|
|
54
|
-
return this.config.get(
|
|
84
|
+
return this.config.get(resolved);
|
|
55
85
|
}
|
|
56
86
|
set(key, value) {
|
|
57
|
-
this.
|
|
87
|
+
const resolved = this.resolveKey(key);
|
|
88
|
+
this.config.set(resolved, value);
|
|
58
89
|
}
|
|
59
90
|
has(key) {
|
|
60
|
-
|
|
91
|
+
const resolved = this.resolveKey(key);
|
|
92
|
+
return this.config.has(resolved);
|
|
61
93
|
}
|
|
62
94
|
delete(key) {
|
|
63
|
-
this.
|
|
95
|
+
const resolved = this.resolveKey(key);
|
|
96
|
+
this.config.delete(resolved);
|
|
64
97
|
}
|
|
65
98
|
clear() {
|
|
66
|
-
this.
|
|
99
|
+
if (this.stagingMode) {
|
|
100
|
+
// Only clear staging keys
|
|
101
|
+
for (const key of STAGING_REMAPPED_KEYS) {
|
|
102
|
+
const stagingKey = `staging:${key}`;
|
|
103
|
+
if (this.config.has(stagingKey)) {
|
|
104
|
+
this.config.delete(stagingKey);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// Clear production keys only (preserve staging keys)
|
|
110
|
+
const store = this.config.store;
|
|
111
|
+
for (const key of Object.keys(store)) {
|
|
112
|
+
if (!key.startsWith('staging:')) {
|
|
113
|
+
this.config.delete(key);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
67
117
|
}
|
|
118
|
+
/** Returns config entries for the current environment only.
|
|
119
|
+
* Staging keys are hidden in production mode and vice versa. */
|
|
68
120
|
getAll() {
|
|
69
|
-
|
|
121
|
+
const store = this.config.store;
|
|
122
|
+
const result = {};
|
|
123
|
+
if (this.stagingMode) {
|
|
124
|
+
// Show staging keys under their canonical names
|
|
125
|
+
for (const [key, value] of Object.entries(store)) {
|
|
126
|
+
if (key.startsWith('staging:')) {
|
|
127
|
+
const canonical = key.slice('staging:'.length);
|
|
128
|
+
result[canonical] = value;
|
|
129
|
+
}
|
|
130
|
+
else if (!STAGING_REMAPPED_KEYS.has(key)) {
|
|
131
|
+
// Show non-remapped keys (defaultEndpoint, defaultPort, telemetry)
|
|
132
|
+
result[key] = value;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
// Show production keys, hide staging: prefixed keys
|
|
138
|
+
for (const [key, value] of Object.entries(store)) {
|
|
139
|
+
if (!key.startsWith('staging:')) {
|
|
140
|
+
result[key] = value;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return result;
|
|
70
145
|
}
|
|
71
146
|
getPath() {
|
|
72
147
|
return this.config.path;
|
package/dist/utils/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAwB;AAIxB,MAAM,MAAM,GAAG;IACb,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;KACf;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,0BAA0B;KACpC;IACD,KAAK,EAAE;QACL,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,0BAA0B;KACpC;IACD,eAAe,EAAE;QACf,IAAI,EAAE,QAAQ;KACf;IACD,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,IAAI;KACd;IACD,SAAS,EAAE;QACT,IAAI,EAAE,SAAS;QACf,OAAO,EAAE,IAAI;KACd;CACO,CAAC;AAEX,gDAAgD;AAChD,MAAM,SAAS,GAA0C;IACvD,MAAM,EAAE,kBAAkB;IAC1B,MAAM,EAAE,kBAAkB;IAC1B,KAAK,EAAE,iBAAiB;CACzB,CAAC;AAEF,MAAM,aAAa;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
|