@localhostdevs/sdk 0.3.0 → 0.3.2
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 +25 -19
- package/dist/bot.d.ts +21 -9
- package/dist/bot.d.ts.map +1 -1
- package/dist/bot.js +140 -81
- package/dist/bot.js.map +1 -1
- package/dist/credentials.d.ts +12 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +43 -0
- package/dist/credentials.js.map +1 -0
- package/dist/index.d.ts +1 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -3
- package/dist/index.js.map +1 -1
- package/dist/sso.d.ts +21 -0
- package/dist/sso.d.ts.map +1 -0
- package/dist/sso.js +81 -0
- package/dist/sso.js.map +1 -0
- package/dist/transport.d.ts +58 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +144 -0
- package/dist/transport.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/types.d.ts +17 -15
- package/dist/types.d.ts.map +1 -1
- package/package.json +14 -8
- package/dist/context.d.ts +0 -11
- package/dist/context.d.ts.map +0 -1
- package/dist/context.js +0 -23
- package/dist/context.js.map +0 -1
- package/dist/subjects.d.ts +0 -17
- package/dist/subjects.d.ts.map +0 -1
- package/dist/subjects.js +0 -17
- package/dist/subjects.js.map +0 -1
package/dist/sso.js
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { platform } from 'node:os';
|
|
3
|
+
/**
|
|
4
|
+
* Run the device-flow auth dance. Returns a fresh apiKey after the user
|
|
5
|
+
* approves in the browser. Throws on expiry / denial.
|
|
6
|
+
*/
|
|
7
|
+
export async function runDeviceFlow(opts) {
|
|
8
|
+
// eslint-disable-next-line no-console -- intentional user-facing CLI output
|
|
9
|
+
const log = opts.log ?? ((line) => console.log(line));
|
|
10
|
+
const apiBase = opts.apiBaseUrl.replace(/\/$/, '');
|
|
11
|
+
// 1. Begin: ask the server for codes.
|
|
12
|
+
const beginRes = await fetch(`${apiBase}/api/auth/cli/begin`, {
|
|
13
|
+
method: 'POST',
|
|
14
|
+
headers: { 'content-type': 'application/json' },
|
|
15
|
+
body: JSON.stringify({ id: opts.id }),
|
|
16
|
+
});
|
|
17
|
+
if (!beginRes.ok) {
|
|
18
|
+
throw new Error(`failed to begin auth flow: HTTP ${beginRes.status}`);
|
|
19
|
+
}
|
|
20
|
+
const begin = (await beginRes.json());
|
|
21
|
+
log('');
|
|
22
|
+
log('Authorize this bot in your browser:');
|
|
23
|
+
log(` ${begin.verificationUriComplete}`);
|
|
24
|
+
log('');
|
|
25
|
+
log(`Or paste this code at ${begin.verificationUri}: ${begin.userCode}`);
|
|
26
|
+
log('');
|
|
27
|
+
log('Waiting for approval...');
|
|
28
|
+
// Best-effort: try to open the URL automatically.
|
|
29
|
+
tryOpenBrowser(begin.verificationUriComplete);
|
|
30
|
+
// 2. Poll loop.
|
|
31
|
+
const deadline = Date.now() + begin.expiresInSec * 1000;
|
|
32
|
+
let intervalMs = Math.max(begin.pollIntervalSec * 1000, 1000);
|
|
33
|
+
while (Date.now() < deadline) {
|
|
34
|
+
await sleep(intervalMs);
|
|
35
|
+
const res = await fetch(`${apiBase}/api/auth/cli/poll`, {
|
|
36
|
+
method: 'POST',
|
|
37
|
+
headers: { 'content-type': 'application/json' },
|
|
38
|
+
body: JSON.stringify({ deviceCode: begin.deviceCode }),
|
|
39
|
+
});
|
|
40
|
+
if (res.status === 200) {
|
|
41
|
+
const data = (await res.json());
|
|
42
|
+
log('');
|
|
43
|
+
log(`✓ Authorized as @${data.botHandle ?? opts.id}.`);
|
|
44
|
+
return { token: data.token, botHandle: data.botHandle };
|
|
45
|
+
}
|
|
46
|
+
if (res.status === 202) {
|
|
47
|
+
// authorization_pending — keep waiting
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (res.status === 429) {
|
|
51
|
+
// slow_down — back off
|
|
52
|
+
intervalMs = Math.min(intervalMs * 2, 10_000);
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
if (res.status === 403) {
|
|
56
|
+
throw new Error('authorization denied by user');
|
|
57
|
+
}
|
|
58
|
+
if (res.status === 410) {
|
|
59
|
+
throw new Error('authorization code expired before approval');
|
|
60
|
+
}
|
|
61
|
+
if (res.status === 404) {
|
|
62
|
+
throw new Error('invalid device code (server lost the auth attempt)');
|
|
63
|
+
}
|
|
64
|
+
// Unknown status — surface it.
|
|
65
|
+
throw new Error(`unexpected poll status ${res.status}`);
|
|
66
|
+
}
|
|
67
|
+
throw new Error('authorization timed out — restart `node app.js` to try again');
|
|
68
|
+
}
|
|
69
|
+
function sleep(ms) {
|
|
70
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
71
|
+
}
|
|
72
|
+
function tryOpenBrowser(url) {
|
|
73
|
+
const cmd = platform() === 'win32' ? 'start' : platform() === 'darwin' ? 'open' : 'xdg-open';
|
|
74
|
+
try {
|
|
75
|
+
spawn(cmd, [url], { detached: true, stdio: 'ignore', shell: true }).unref();
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// ignore — we already printed the URL for the user to open manually
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=sso.js.map
|
package/dist/sso.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sso.js","sourceRoot":"","sources":["../src/sso.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/** Wire protocol opcodes — mirrors the gateway. Keep in sync with services/bot-gateway. */
|
|
2
|
+
export declare const OP: {
|
|
3
|
+
readonly COMMAND: 0;
|
|
4
|
+
readonly IDENTIFY: 1;
|
|
5
|
+
readonly HEARTBEAT: 2;
|
|
6
|
+
readonly REPLY: 3;
|
|
7
|
+
readonly ERROR: 9;
|
|
8
|
+
readonly HELLO: 10;
|
|
9
|
+
readonly HEARTBEAT_ACK: 11;
|
|
10
|
+
};
|
|
11
|
+
export type CommandFrame = {
|
|
12
|
+
msgId: string;
|
|
13
|
+
command: string;
|
|
14
|
+
args: Record<string, unknown>;
|
|
15
|
+
};
|
|
16
|
+
export type ReplyBodyShape = {
|
|
17
|
+
text?: string;
|
|
18
|
+
data?: unknown;
|
|
19
|
+
dispatch?: {
|
|
20
|
+
to: string;
|
|
21
|
+
command: string;
|
|
22
|
+
args?: Record<string, unknown>;
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
export interface TransportOptions {
|
|
26
|
+
serverUrl: string;
|
|
27
|
+
apiKey: string;
|
|
28
|
+
botId: string;
|
|
29
|
+
sdkVersion: string;
|
|
30
|
+
onCommand: (cmd: CommandFrame) => void;
|
|
31
|
+
onClose?: (reason: string) => void;
|
|
32
|
+
onError?: (err: Error) => void;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Thin WebSocket client implementing the bot-gateway opcode protocol.
|
|
36
|
+
* - Sends IDENTIFY on open, awaits HELLO before resolving connect()
|
|
37
|
+
* - Starts heartbeat per the interval the server tells us
|
|
38
|
+
* - Forwards COMMAND frames to onCommand
|
|
39
|
+
* - Exposes sendReply() for the Bot to ship REPLY frames
|
|
40
|
+
*/
|
|
41
|
+
export declare class Transport {
|
|
42
|
+
private readonly opts;
|
|
43
|
+
private ws;
|
|
44
|
+
private heartbeatTimer;
|
|
45
|
+
private heartbeatIntervalMs;
|
|
46
|
+
private sessionId;
|
|
47
|
+
private ready;
|
|
48
|
+
constructor(opts: TransportOptions);
|
|
49
|
+
connect(): Promise<void>;
|
|
50
|
+
private handleMessage;
|
|
51
|
+
sendReply(msgId: string, body: ReplyBodyShape): void;
|
|
52
|
+
private send;
|
|
53
|
+
private startHeartbeat;
|
|
54
|
+
close(): Promise<void>;
|
|
55
|
+
private cleanup;
|
|
56
|
+
get currentSessionId(): string | null;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=transport.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"AAEA,2FAA2F;AAC3F,eAAO,MAAM,EAAE;;;;;;;;CAQL,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;CAC5E,CAAC;AAEF,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,IAAI,CAAC;IACvC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC;AAED;;;;;;GAMG;AACH,qBAAa,SAAS;IAOR,OAAO,CAAC,QAAQ,CAAC,IAAI;IANjC,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,cAAc,CAA+C;IACrE,OAAO,CAAC,mBAAmB,CAAU;IACrC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,KAAK,CAAS;gBAEO,IAAI,EAAE,gBAAgB;IAE7C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAkD9B,OAAO,CAAC,aAAa;IAgCrB,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,IAAI;IAIpD,OAAO,CAAC,IAAI;IAKZ,OAAO,CAAC,cAAc;IAMhB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5B,OAAO,CAAC,OAAO;IAQf,IAAI,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAEpC;CACF"}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import { WebSocket } from 'ws';
|
|
2
|
+
/** Wire protocol opcodes — mirrors the gateway. Keep in sync with services/bot-gateway. */
|
|
3
|
+
export const OP = {
|
|
4
|
+
COMMAND: 0,
|
|
5
|
+
IDENTIFY: 1,
|
|
6
|
+
HEARTBEAT: 2,
|
|
7
|
+
REPLY: 3,
|
|
8
|
+
ERROR: 9,
|
|
9
|
+
HELLO: 10,
|
|
10
|
+
HEARTBEAT_ACK: 11,
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Thin WebSocket client implementing the bot-gateway opcode protocol.
|
|
14
|
+
* - Sends IDENTIFY on open, awaits HELLO before resolving connect()
|
|
15
|
+
* - Starts heartbeat per the interval the server tells us
|
|
16
|
+
* - Forwards COMMAND frames to onCommand
|
|
17
|
+
* - Exposes sendReply() for the Bot to ship REPLY frames
|
|
18
|
+
*/
|
|
19
|
+
export class Transport {
|
|
20
|
+
opts;
|
|
21
|
+
ws = null;
|
|
22
|
+
heartbeatTimer = null;
|
|
23
|
+
heartbeatIntervalMs = 30_000;
|
|
24
|
+
sessionId = null;
|
|
25
|
+
ready = false;
|
|
26
|
+
constructor(opts) {
|
|
27
|
+
this.opts = opts;
|
|
28
|
+
}
|
|
29
|
+
async connect() {
|
|
30
|
+
this.ws = new WebSocket(this.opts.serverUrl);
|
|
31
|
+
return new Promise((resolve, reject) => {
|
|
32
|
+
let settled = false;
|
|
33
|
+
const settle = (err) => {
|
|
34
|
+
if (settled)
|
|
35
|
+
return;
|
|
36
|
+
settled = true;
|
|
37
|
+
if (err)
|
|
38
|
+
reject(err);
|
|
39
|
+
else
|
|
40
|
+
resolve();
|
|
41
|
+
};
|
|
42
|
+
const ws = this.ws;
|
|
43
|
+
ws.on('open', () => {
|
|
44
|
+
this.send({
|
|
45
|
+
op: OP.IDENTIFY,
|
|
46
|
+
d: {
|
|
47
|
+
apiKey: this.opts.apiKey,
|
|
48
|
+
id: this.opts.botId,
|
|
49
|
+
sdkVersion: this.opts.sdkVersion,
|
|
50
|
+
},
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
ws.on('message', (raw) => {
|
|
54
|
+
let msg;
|
|
55
|
+
try {
|
|
56
|
+
msg = JSON.parse(raw.toString());
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// malformed — drop
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
this.handleMessage(msg, settle);
|
|
63
|
+
});
|
|
64
|
+
ws.on('close', (_code, reason) => {
|
|
65
|
+
this.cleanup();
|
|
66
|
+
const reasonStr = reason?.toString() || 'closed';
|
|
67
|
+
if (!settled)
|
|
68
|
+
settle(new Error(`websocket closed before HELLO: ${reasonStr}`));
|
|
69
|
+
this.opts.onClose?.(reasonStr);
|
|
70
|
+
});
|
|
71
|
+
ws.on('error', (err) => {
|
|
72
|
+
if (!settled)
|
|
73
|
+
settle(err);
|
|
74
|
+
else
|
|
75
|
+
this.opts.onError?.(err);
|
|
76
|
+
});
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
handleMessage(msg, settle) {
|
|
80
|
+
switch (msg.op) {
|
|
81
|
+
case OP.HELLO: {
|
|
82
|
+
const d = msg.d;
|
|
83
|
+
this.sessionId = d.sessionId;
|
|
84
|
+
this.heartbeatIntervalMs = d.heartbeatIntervalMs;
|
|
85
|
+
this.startHeartbeat();
|
|
86
|
+
this.ready = true;
|
|
87
|
+
settle(undefined);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
case OP.HEARTBEAT_ACK:
|
|
91
|
+
return;
|
|
92
|
+
case OP.COMMAND: {
|
|
93
|
+
const d = msg.d;
|
|
94
|
+
if (!d?.msgId || typeof d.command !== 'string')
|
|
95
|
+
return;
|
|
96
|
+
this.opts.onCommand(d);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
case OP.ERROR: {
|
|
100
|
+
const d = msg.d;
|
|
101
|
+
const err = new Error(`gateway error: ${d.code} — ${d.message}`);
|
|
102
|
+
if (!this.ready)
|
|
103
|
+
settle(err);
|
|
104
|
+
else
|
|
105
|
+
this.opts.onError?.(err);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
default:
|
|
109
|
+
// Unknown op — log + ignore. Forward-compat.
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
sendReply(msgId, body) {
|
|
114
|
+
this.send({ op: OP.REPLY, d: { msgId, body } });
|
|
115
|
+
}
|
|
116
|
+
send(msg) {
|
|
117
|
+
if (!this.ws || this.ws.readyState !== WebSocket.OPEN)
|
|
118
|
+
return;
|
|
119
|
+
this.ws.send(JSON.stringify(msg));
|
|
120
|
+
}
|
|
121
|
+
startHeartbeat() {
|
|
122
|
+
this.heartbeatTimer = setInterval(() => {
|
|
123
|
+
this.send({ op: OP.HEARTBEAT, d: {} });
|
|
124
|
+
}, this.heartbeatIntervalMs);
|
|
125
|
+
}
|
|
126
|
+
async close() {
|
|
127
|
+
this.cleanup();
|
|
128
|
+
if (this.ws && this.ws.readyState === WebSocket.OPEN) {
|
|
129
|
+
this.ws.close(1000, 'client closing');
|
|
130
|
+
}
|
|
131
|
+
this.ws = null;
|
|
132
|
+
}
|
|
133
|
+
cleanup() {
|
|
134
|
+
if (this.heartbeatTimer) {
|
|
135
|
+
clearInterval(this.heartbeatTimer);
|
|
136
|
+
this.heartbeatTimer = null;
|
|
137
|
+
}
|
|
138
|
+
this.ready = false;
|
|
139
|
+
}
|
|
140
|
+
get currentSessionId() {
|
|
141
|
+
return this.sessionId;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
|