@telecabin/core 0.1.0 → 0.1.4
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/attachments.d.ts +36 -0
- package/dist/attachments.d.ts.map +1 -0
- package/dist/attachments.js +74 -0
- package/dist/attachments.js.map +1 -0
- package/dist/client.d.ts +68 -5
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +157 -15
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +15 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side attachment encryption + upload, matching the server's
|
|
3
|
+
* `/api/s/{slug}/attachments` contract.
|
|
4
|
+
*
|
|
5
|
+
* The wire format follows `lib/crypto.ts` on the server side:
|
|
6
|
+
* AES-GCM-256 with a fresh 12-byte IV per attachment. The session key
|
|
7
|
+
* lives outside this module — it's the same `b64url` key that the web
|
|
8
|
+
* UI keeps in the URL fragment (`#k=`).
|
|
9
|
+
*/
|
|
10
|
+
/** Hard server cap — 5 MiB per attachment. Mirrors `lib/attachments.ts`. */
|
|
11
|
+
export declare const MAX_ATTACHMENT_BYTES: number;
|
|
12
|
+
/** Server enforces this when attaching to a message. */
|
|
13
|
+
export declare const MAX_ATTACHMENTS_PER_MESSAGE = 4;
|
|
14
|
+
/** TTL after which the encrypted bytes are deleted by the cron sweep. */
|
|
15
|
+
export declare const ATTACHMENT_TTL_HOURS = 24;
|
|
16
|
+
/** Sentinel value used in the `iv` field when an attachment is uploaded
|
|
17
|
+
* to a non-E2EE session — the bytes are stored plaintext, no IV exists.
|
|
18
|
+
* Mirrors `PLAINTEXT_ATTACHMENT_IV` in `lib/attachments.ts`. */
|
|
19
|
+
export declare const PLAINTEXT_ATTACHMENT_IV = "plaintext";
|
|
20
|
+
/** Server allowlist. The plaintext MIME is declared in metadata; the
|
|
21
|
+
* ciphertext itself is always uploaded as `application/octet-stream`. */
|
|
22
|
+
export declare const ALLOWED_ATTACHMENT_MIME_TYPES: readonly ["image/png", "image/jpeg", "image/webp", "image/gif", "application/pdf", "text/plain"];
|
|
23
|
+
export type AttachmentMime = (typeof ALLOWED_ATTACHMENT_MIME_TYPES)[number];
|
|
24
|
+
export declare function isAllowedAttachmentMime(mime: string): mime is AttachmentMime;
|
|
25
|
+
/** AES-GCM encrypt — produces a separate IV + raw ciphertext suitable for
|
|
26
|
+
* multipart upload. Mirrors the server's `encryptBytes`. */
|
|
27
|
+
export declare function encryptAttachment(b64Key: string, plaintext: Uint8Array | ArrayBuffer): Promise<{
|
|
28
|
+
iv: string;
|
|
29
|
+
ciphertext: Uint8Array;
|
|
30
|
+
}>;
|
|
31
|
+
/** AES-GCM decrypt, mirrors the server's `decryptBytes`. */
|
|
32
|
+
export declare function decryptAttachment(b64Key: string, ivB64: string, ciphertext: ArrayBuffer | Uint8Array): Promise<Uint8Array>;
|
|
33
|
+
/** AES-GCM encrypt a UTF-8 string into the server's `v1.<iv>.<ct>` wire
|
|
34
|
+
* format — used for E2EE message content (matches `lib/crypto.ts:encrypt`). */
|
|
35
|
+
export declare function encryptText(b64Key: string, plaintext: string): Promise<string>;
|
|
36
|
+
//# sourceMappingURL=attachments.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.d.ts","sourceRoot":"","sources":["../src/attachments.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAKH,4EAA4E;AAC5E,eAAO,MAAM,oBAAoB,QAAkB,CAAC;AAEpD,wDAAwD;AACxD,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C,yEAAyE;AACzE,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC;;gEAEgE;AAChE,eAAO,MAAM,uBAAuB,cAAc,CAAC;AAEnD;yEACyE;AACzE,eAAO,MAAM,6BAA6B,kGAOhC,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,6BAA6B,CAAC,CAAC,MAAM,CAAC,CAAC;AAE5E,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,IAAI,cAAc,CAE5E;AAED;4DAC4D;AAC5D,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,UAAU,GAAG,WAAW,GAClC,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,UAAU,CAAA;CAAE,CAAC,CAoBjD;AAED,4DAA4D;AAC5D,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,WAAW,GAAG,UAAU,GACnC,OAAO,CAAC,UAAU,CAAC,CAwBrB;AAED;+EAC+E;AAC/E,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,MAAM,CAAC,CAMjB"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Client-side attachment encryption + upload, matching the server's
|
|
3
|
+
* `/api/s/{slug}/attachments` contract.
|
|
4
|
+
*
|
|
5
|
+
* The wire format follows `lib/crypto.ts` on the server side:
|
|
6
|
+
* AES-GCM-256 with a fresh 12-byte IV per attachment. The session key
|
|
7
|
+
* lives outside this module — it's the same `b64url` key that the web
|
|
8
|
+
* UI keeps in the URL fragment (`#k=`).
|
|
9
|
+
*/
|
|
10
|
+
import { Buffer } from "node:buffer";
|
|
11
|
+
import { TelecabinError } from "./errors.js";
|
|
12
|
+
/** Hard server cap — 5 MiB per attachment. Mirrors `lib/attachments.ts`. */
|
|
13
|
+
export const MAX_ATTACHMENT_BYTES = 5 * 1024 * 1024;
|
|
14
|
+
/** Server enforces this when attaching to a message. */
|
|
15
|
+
export const MAX_ATTACHMENTS_PER_MESSAGE = 4;
|
|
16
|
+
/** TTL after which the encrypted bytes are deleted by the cron sweep. */
|
|
17
|
+
export const ATTACHMENT_TTL_HOURS = 24;
|
|
18
|
+
/** Sentinel value used in the `iv` field when an attachment is uploaded
|
|
19
|
+
* to a non-E2EE session — the bytes are stored plaintext, no IV exists.
|
|
20
|
+
* Mirrors `PLAINTEXT_ATTACHMENT_IV` in `lib/attachments.ts`. */
|
|
21
|
+
export const PLAINTEXT_ATTACHMENT_IV = "plaintext";
|
|
22
|
+
/** Server allowlist. The plaintext MIME is declared in metadata; the
|
|
23
|
+
* ciphertext itself is always uploaded as `application/octet-stream`. */
|
|
24
|
+
export const ALLOWED_ATTACHMENT_MIME_TYPES = [
|
|
25
|
+
"image/png",
|
|
26
|
+
"image/jpeg",
|
|
27
|
+
"image/webp",
|
|
28
|
+
"image/gif",
|
|
29
|
+
"application/pdf",
|
|
30
|
+
"text/plain",
|
|
31
|
+
];
|
|
32
|
+
export function isAllowedAttachmentMime(mime) {
|
|
33
|
+
return ALLOWED_ATTACHMENT_MIME_TYPES.includes(mime);
|
|
34
|
+
}
|
|
35
|
+
/** AES-GCM encrypt — produces a separate IV + raw ciphertext suitable for
|
|
36
|
+
* multipart upload. Mirrors the server's `encryptBytes`. */
|
|
37
|
+
export async function encryptAttachment(b64Key, plaintext) {
|
|
38
|
+
const subtle = globalThis.crypto?.subtle;
|
|
39
|
+
if (!subtle) {
|
|
40
|
+
throw new TelecabinError("http_error", "Web Crypto API not available — Node 19+ is required.");
|
|
41
|
+
}
|
|
42
|
+
const rawKey = b64uDecode(b64Key);
|
|
43
|
+
const key = await subtle.importKey("raw", rawKey, "AES-GCM", false, ["encrypt"]);
|
|
44
|
+
const iv = globalThis.crypto.getRandomValues(new Uint8Array(12));
|
|
45
|
+
const bytes = plaintext instanceof Uint8Array ? plaintext : new Uint8Array(plaintext);
|
|
46
|
+
const ct = await subtle.encrypt({ name: "AES-GCM", iv }, key, bytes);
|
|
47
|
+
return { iv: b64uEncode(iv), ciphertext: new Uint8Array(ct) };
|
|
48
|
+
}
|
|
49
|
+
/** AES-GCM decrypt, mirrors the server's `decryptBytes`. */
|
|
50
|
+
export async function decryptAttachment(b64Key, ivB64, ciphertext) {
|
|
51
|
+
const subtle = globalThis.crypto?.subtle;
|
|
52
|
+
if (!subtle) {
|
|
53
|
+
throw new TelecabinError("http_error", "Web Crypto API not available — Node 19+ is required.");
|
|
54
|
+
}
|
|
55
|
+
const rawKey = b64uDecode(b64Key);
|
|
56
|
+
const key = await subtle.importKey("raw", rawKey, "AES-GCM", false, ["decrypt"]);
|
|
57
|
+
const iv = b64uDecode(ivB64);
|
|
58
|
+
const ct = ciphertext instanceof Uint8Array ? ciphertext : new Uint8Array(ciphertext);
|
|
59
|
+
const plain = await subtle.decrypt({ name: "AES-GCM", iv: iv }, key, ct);
|
|
60
|
+
return new Uint8Array(plain);
|
|
61
|
+
}
|
|
62
|
+
/** AES-GCM encrypt a UTF-8 string into the server's `v1.<iv>.<ct>` wire
|
|
63
|
+
* format — used for E2EE message content (matches `lib/crypto.ts:encrypt`). */
|
|
64
|
+
export async function encryptText(b64Key, plaintext) {
|
|
65
|
+
const { iv, ciphertext } = await encryptAttachment(b64Key, new TextEncoder().encode(plaintext));
|
|
66
|
+
return `v1.${iv}.${b64uEncode(ciphertext)}`;
|
|
67
|
+
}
|
|
68
|
+
function b64uEncode(bytes) {
|
|
69
|
+
return Buffer.from(bytes).toString("base64url");
|
|
70
|
+
}
|
|
71
|
+
function b64uDecode(s) {
|
|
72
|
+
return new Uint8Array(Buffer.from(s, "base64url"));
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=attachments.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attachments.js","sourceRoot":"","sources":["../src/attachments.ts"],"names":[],"mappings":"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"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { InvitePreview, JoinResult, PollResult, Snapshot, Status, TelecabinEvent } from "./types.js";
|
|
1
|
+
import type { InvitePreview, JoinResult, PollResult, PublicAttachment, Snapshot, Status, TelecabinEvent } from "./types.js";
|
|
2
2
|
/** Default deployment used when no base URL is configured. */
|
|
3
3
|
export declare const DEFAULT_BASE_URL = "https://telecabin.app";
|
|
4
4
|
export interface ClientOptions {
|
|
@@ -24,10 +24,34 @@ export declare class TelecabinClient {
|
|
|
24
24
|
private request;
|
|
25
25
|
/** Full session snapshot: status, participants, recent messages, cursor. */
|
|
26
26
|
snapshot(signal?: AbortSignal): Promise<Snapshot>;
|
|
27
|
-
/**
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
27
|
+
/**
|
|
28
|
+
* Events strictly after `after`. Pass the returned `cursor` to the next call.
|
|
29
|
+
*
|
|
30
|
+
* `waitSec` enables server-side long-polling: when set (max 30s), the server
|
|
31
|
+
* holds the request open until a new event arrives in the session or the
|
|
32
|
+
* timeout elapses. With `waitSec` you can drive a near-zero-latency listener
|
|
33
|
+
* by re-issuing as soon as each call returns — no client-side sleep loop.
|
|
34
|
+
*/
|
|
35
|
+
poll(after?: number, opts?: {
|
|
36
|
+
limit?: number;
|
|
37
|
+
waitSec?: number;
|
|
38
|
+
signal?: AbortSignal;
|
|
39
|
+
}): Promise<PollResult>;
|
|
40
|
+
/**
|
|
41
|
+
* Post a message. Resets your status to `idle` on success.
|
|
42
|
+
*
|
|
43
|
+
* - `attachmentIds` references attachments you uploaded via
|
|
44
|
+
* `uploadAttachment()`; the server validates that they belong to you
|
|
45
|
+
* and aren't already attached to another message.
|
|
46
|
+
* - `sessionKey` (when present) AES-GCM encrypts `content` to the
|
|
47
|
+
* `v1.<iv>.<ct>` wire format before sending — required if the session
|
|
48
|
+
* is end-to-end encrypted.
|
|
49
|
+
*/
|
|
50
|
+
send(content: string, opts?: {
|
|
51
|
+
attachmentIds?: string[];
|
|
52
|
+
sessionKey?: string;
|
|
53
|
+
signal?: AbortSignal;
|
|
54
|
+
}): Promise<TelecabinEvent>;
|
|
31
55
|
/** Broadcast your presence status. */
|
|
32
56
|
setStatus(status: Status, meta?: Record<string, unknown>, signal?: AbortSignal): Promise<TelecabinEvent>;
|
|
33
57
|
/**
|
|
@@ -42,6 +66,12 @@ export declare class TelecabinClient {
|
|
|
42
66
|
/**
|
|
43
67
|
* Poll until at least one matching event appears or the timeout elapses.
|
|
44
68
|
* Returns matching events (empty on timeout) and the advanced cursor.
|
|
69
|
+
*
|
|
70
|
+
* Uses server-side long-polling — each call hands the server up to ~30s of
|
|
71
|
+
* the remaining budget, so a new event lands here with near-zero latency
|
|
72
|
+
* (DB poll cadence on the server, currently 500ms) instead of waiting on a
|
|
73
|
+
* client-side sleep tick. Set `intervalMs` to force the old short-poll
|
|
74
|
+
* behaviour for clients that can't tolerate held connections.
|
|
45
75
|
*/
|
|
46
76
|
waitForEvent(after: number, opts?: {
|
|
47
77
|
timeoutSec?: number;
|
|
@@ -49,6 +79,39 @@ export declare class TelecabinClient {
|
|
|
49
79
|
filter?: (e: TelecabinEvent) => boolean;
|
|
50
80
|
signal?: AbortSignal;
|
|
51
81
|
}): Promise<PollResult>;
|
|
82
|
+
/**
|
|
83
|
+
* Upload an attachment.
|
|
84
|
+
*
|
|
85
|
+
* - **E2EE session** (`sessionKey` provided): the bytes are AES-GCM encrypted
|
|
86
|
+
* client-side; the server only ever sees ciphertext + the random IV. The
|
|
87
|
+
* blob is stored as `application/octet-stream`.
|
|
88
|
+
* - **Non-E2EE session** (no `sessionKey`): the bytes go through as-is. The
|
|
89
|
+
* blob is stored with the declared `mimeType` so it can render in-place.
|
|
90
|
+
* The `iv` field is set to the sentinel `"plaintext"`.
|
|
91
|
+
*
|
|
92
|
+
* Returns the attachment record — pass its `id` to `send({ attachmentIds: [...] })`
|
|
93
|
+
* to attach it to a message.
|
|
94
|
+
*/
|
|
95
|
+
uploadAttachment(opts: {
|
|
96
|
+
plaintext: Uint8Array | ArrayBuffer;
|
|
97
|
+
name: string;
|
|
98
|
+
mimeType: string;
|
|
99
|
+
sessionKey?: string;
|
|
100
|
+
signal?: AbortSignal;
|
|
101
|
+
}): Promise<PublicAttachment>;
|
|
102
|
+
/**
|
|
103
|
+
* Fetch the bytes for a known attachment. Returns null if the blob is
|
|
104
|
+
* already gone (TTL expired).
|
|
105
|
+
*
|
|
106
|
+
* - For encrypted attachments (`attachment.encrypted === true`), the
|
|
107
|
+
* `sessionKey` must match the one the uploader used.
|
|
108
|
+
* - For plaintext attachments (non-E2EE session), `sessionKey` is ignored
|
|
109
|
+
* and the raw bytes are returned directly.
|
|
110
|
+
*
|
|
111
|
+
* Throws `invalid_body` if you pass an encrypted attachment without a
|
|
112
|
+
* `sessionKey` — there's no way to recover the plaintext.
|
|
113
|
+
*/
|
|
114
|
+
fetchAttachmentBytes(attachment: PublicAttachment, sessionKey?: string, signal?: AbortSignal): Promise<Uint8Array | null>;
|
|
52
115
|
/** Join a session with an invite code, minting a fresh participant token. */
|
|
53
116
|
static join(opts: {
|
|
54
117
|
baseUrl: string;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,QAAQ,EACR,MAAM,EACN,cAAc,EACf,MAAM,YAAY,CAAC;AAEpB,8DAA8D;AAC9D,eAAO,MAAM,gBAAgB,0BAA0B,CAAC;AAExD,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,4DAA4D;IAC5D,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAuBD;;;;;;GAMG;AACH,qBAAa,eAAe;IAC1B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAE7B,IAAI,EAAE,aAAa;YAOjB,OAAO;IA4BrB,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC;IAIjD;;;;;;;OAOG;IACH,IAAI,CACF,KAAK,SAAI,EACT,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GACpE,OAAO,CAAC,UAAU,CAAC;IAWtB;;;;;;;;;OASG;IACG,IAAI,CACR,OAAO,EAAE,MAAM,EACf,IAAI,GAAE;QACJ,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,WAAW,CAAC;KACjB,GACL,OAAO,CAAC,cAAc,CAAC;IA0B1B,sCAAsC;IAChC,SAAS,CACb,MAAM,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,cAAc,CAAC;IAQ1B;;;OAGG;IACI,MAAM,CACX,IAAI,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAO,GACvE,cAAc,CAAC,cAAc,EAAE,IAAI,CAAC;IAkBvC;;;;;;;;;OASG;IACG,YAAY,CAChB,KAAK,EAAE,MAAM,EACb,IAAI,GAAE;QACJ,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,cAAc,KAAK,OAAO,CAAC;QACxC,MAAM,CAAC,EAAE,WAAW,CAAC;KACjB,GACL,OAAO,CAAC,UAAU,CAAC;IA0BtB;;;;;;;;;;;;OAYG;IACG,gBAAgB,CAAC,IAAI,EAAE;QAC3B,SAAS,EAAE,UAAU,GAAG,WAAW,CAAC;QACpC,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,MAAM,CAAC,EAAE,WAAW,CAAC;KACtB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IA+D7B;;;;;;;;;;;OAWG;IACG,oBAAoB,CACxB,UAAU,EAAE,gBAAgB,EAC5B,UAAU,CAAC,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IA8B7B,6EAA6E;WAChE,IAAI,CAAC,IAAI,EAAE;QACtB,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;KACtB,GAAG,OAAO,CAAC,UAAU,CAAC;IA8BvB,iEAAiE;WACpD,aAAa,CAAC,IAAI,EAAE;QAC/B,OAAO,EAAE,MAAM,CAAC;QAChB,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;KACtB,GAAG,OAAO,CAAC,aAAa,CAAC;CAgB3B"}
|
package/dist/client.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { decryptAttachment, encryptAttachment, encryptText, isAllowedAttachmentMime, MAX_ATTACHMENT_BYTES, MAX_ATTACHMENTS_PER_MESSAGE, PLAINTEXT_ATTACHMENT_IV, } from "./attachments.js";
|
|
1
2
|
import { TelecabinError } from "./errors.js";
|
|
2
3
|
/** Default deployment used when no base URL is configured. */
|
|
3
4
|
export const DEFAULT_BASE_URL = "https://telecabin.app";
|
|
@@ -64,18 +65,51 @@ export class TelecabinClient {
|
|
|
64
65
|
snapshot(signal) {
|
|
65
66
|
return this.request(`/api/s/${this.slug}`, { signal });
|
|
66
67
|
}
|
|
67
|
-
/**
|
|
68
|
-
|
|
68
|
+
/**
|
|
69
|
+
* Events strictly after `after`. Pass the returned `cursor` to the next call.
|
|
70
|
+
*
|
|
71
|
+
* `waitSec` enables server-side long-polling: when set (max 30s), the server
|
|
72
|
+
* holds the request open until a new event arrives in the session or the
|
|
73
|
+
* timeout elapses. With `waitSec` you can drive a near-zero-latency listener
|
|
74
|
+
* by re-issuing as soon as each call returns — no client-side sleep loop.
|
|
75
|
+
*/
|
|
76
|
+
poll(after = 0, opts = {}) {
|
|
69
77
|
const qs = new URLSearchParams({ after: String(after) });
|
|
70
|
-
if (limit)
|
|
71
|
-
qs.set("limit", String(limit));
|
|
78
|
+
if (opts.limit)
|
|
79
|
+
qs.set("limit", String(opts.limit));
|
|
80
|
+
if (opts.waitSec && opts.waitSec > 0) {
|
|
81
|
+
qs.set("wait", String(Math.floor(opts.waitSec)));
|
|
82
|
+
}
|
|
72
83
|
return this.request(`/api/s/${this.slug}/events?${qs}`, {
|
|
73
|
-
signal,
|
|
84
|
+
signal: opts.signal,
|
|
74
85
|
});
|
|
75
86
|
}
|
|
76
|
-
/**
|
|
77
|
-
|
|
78
|
-
|
|
87
|
+
/**
|
|
88
|
+
* Post a message. Resets your status to `idle` on success.
|
|
89
|
+
*
|
|
90
|
+
* - `attachmentIds` references attachments you uploaded via
|
|
91
|
+
* `uploadAttachment()`; the server validates that they belong to you
|
|
92
|
+
* and aren't already attached to another message.
|
|
93
|
+
* - `sessionKey` (when present) AES-GCM encrypts `content` to the
|
|
94
|
+
* `v1.<iv>.<ct>` wire format before sending — required if the session
|
|
95
|
+
* is end-to-end encrypted.
|
|
96
|
+
*/
|
|
97
|
+
async send(content, opts = {}) {
|
|
98
|
+
if (opts.attachmentIds && opts.attachmentIds.length > MAX_ATTACHMENTS_PER_MESSAGE) {
|
|
99
|
+
throw new TelecabinError("invalid_body", `Too many attachments: ${opts.attachmentIds.length} > ${MAX_ATTACHMENTS_PER_MESSAGE} max per message.`);
|
|
100
|
+
}
|
|
101
|
+
// Encrypt non-empty content with the session key; pass empty content
|
|
102
|
+
// through as "" so attachment-only posts don't carry a dummy ciphertext.
|
|
103
|
+
const wireContent = opts.sessionKey && content
|
|
104
|
+
? await encryptText(opts.sessionKey, content)
|
|
105
|
+
: content;
|
|
106
|
+
const payload = {
|
|
107
|
+
content: wireContent,
|
|
108
|
+
};
|
|
109
|
+
if (opts.attachmentIds?.length) {
|
|
110
|
+
payload.attachmentIds = opts.attachmentIds;
|
|
111
|
+
}
|
|
112
|
+
const r = await this.request(`/api/s/${this.slug}/messages`, { method: "POST", body: payload, signal: opts.signal });
|
|
79
113
|
return r.event;
|
|
80
114
|
}
|
|
81
115
|
/** Broadcast your presence status. */
|
|
@@ -92,7 +126,9 @@ export class TelecabinClient {
|
|
|
92
126
|
const interval = opts.intervalMs ?? 2000;
|
|
93
127
|
try {
|
|
94
128
|
while (!opts.signal?.aborted) {
|
|
95
|
-
const { events, cursor: next } = await this.poll(cursor,
|
|
129
|
+
const { events, cursor: next } = await this.poll(cursor, {
|
|
130
|
+
signal: opts.signal,
|
|
131
|
+
});
|
|
96
132
|
for (const e of events)
|
|
97
133
|
yield e;
|
|
98
134
|
cursor = next;
|
|
@@ -108,22 +144,128 @@ export class TelecabinClient {
|
|
|
108
144
|
/**
|
|
109
145
|
* Poll until at least one matching event appears or the timeout elapses.
|
|
110
146
|
* Returns matching events (empty on timeout) and the advanced cursor.
|
|
147
|
+
*
|
|
148
|
+
* Uses server-side long-polling — each call hands the server up to ~30s of
|
|
149
|
+
* the remaining budget, so a new event lands here with near-zero latency
|
|
150
|
+
* (DB poll cadence on the server, currently 500ms) instead of waiting on a
|
|
151
|
+
* client-side sleep tick. Set `intervalMs` to force the old short-poll
|
|
152
|
+
* behaviour for clients that can't tolerate held connections.
|
|
111
153
|
*/
|
|
112
154
|
async waitForEvent(after, opts = {}) {
|
|
113
155
|
const deadline = Date.now() + (opts.timeoutSec ?? 50) * 1000;
|
|
114
|
-
const interval = opts.intervalMs ?? 2000;
|
|
115
156
|
let cursor = after;
|
|
116
157
|
for (;;) {
|
|
117
|
-
const
|
|
158
|
+
const remaining = deadline - Date.now();
|
|
159
|
+
if (remaining <= 0)
|
|
160
|
+
return { events: [], cursor };
|
|
161
|
+
// Server caps wait at 30s. Use most of the remaining budget per call,
|
|
162
|
+
// capped at 30 so we don't ask the server for more than it'll give.
|
|
163
|
+
const waitSec = opts.intervalMs
|
|
164
|
+
? 0
|
|
165
|
+
: Math.min(30, Math.max(1, Math.ceil(remaining / 1000)));
|
|
166
|
+
const res = await this.poll(cursor, { waitSec, signal: opts.signal });
|
|
118
167
|
cursor = res.cursor;
|
|
119
168
|
const matched = opts.filter ? res.events.filter(opts.filter) : res.events;
|
|
120
169
|
if (matched.length > 0)
|
|
121
170
|
return { events: matched, cursor };
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
171
|
+
// Server returned empty inside the budget (or short-poll mode) — if a
|
|
172
|
+
// gap interval was requested, honour it before the next call.
|
|
173
|
+
if (opts.intervalMs && Date.now() < deadline) {
|
|
174
|
+
await sleep(Math.min(opts.intervalMs, deadline - Date.now()), opts.signal);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Upload an attachment.
|
|
180
|
+
*
|
|
181
|
+
* - **E2EE session** (`sessionKey` provided): the bytes are AES-GCM encrypted
|
|
182
|
+
* client-side; the server only ever sees ciphertext + the random IV. The
|
|
183
|
+
* blob is stored as `application/octet-stream`.
|
|
184
|
+
* - **Non-E2EE session** (no `sessionKey`): the bytes go through as-is. The
|
|
185
|
+
* blob is stored with the declared `mimeType` so it can render in-place.
|
|
186
|
+
* The `iv` field is set to the sentinel `"plaintext"`.
|
|
187
|
+
*
|
|
188
|
+
* Returns the attachment record — pass its `id` to `send({ attachmentIds: [...] })`
|
|
189
|
+
* to attach it to a message.
|
|
190
|
+
*/
|
|
191
|
+
async uploadAttachment(opts) {
|
|
192
|
+
if (!isAllowedAttachmentMime(opts.mimeType)) {
|
|
193
|
+
throw new TelecabinError("invalid_body", `Unsupported MIME type for attachment: ${opts.mimeType}`);
|
|
194
|
+
}
|
|
195
|
+
const plaintext = opts.plaintext instanceof Uint8Array
|
|
196
|
+
? opts.plaintext
|
|
197
|
+
: new Uint8Array(opts.plaintext);
|
|
198
|
+
if (plaintext.byteLength > MAX_ATTACHMENT_BYTES) {
|
|
199
|
+
throw new TelecabinError("invalid_body", `Attachment too large: ${plaintext.byteLength} bytes > ${MAX_ATTACHMENT_BYTES} max.`);
|
|
200
|
+
}
|
|
201
|
+
const form = new FormData();
|
|
202
|
+
if (opts.sessionKey) {
|
|
203
|
+
const { iv, ciphertext } = await encryptAttachment(opts.sessionKey, plaintext);
|
|
204
|
+
form.append("file", new Blob([ciphertext], { type: "application/octet-stream" }), `${opts.name}.bin`);
|
|
205
|
+
form.append("iv", iv);
|
|
206
|
+
form.append("encrypted", "true");
|
|
207
|
+
}
|
|
208
|
+
else {
|
|
209
|
+
form.append("file", new Blob([plaintext], { type: opts.mimeType }), opts.name);
|
|
210
|
+
form.append("iv", PLAINTEXT_ATTACHMENT_IV);
|
|
211
|
+
form.append("encrypted", "false");
|
|
212
|
+
}
|
|
213
|
+
form.append("name", opts.name);
|
|
214
|
+
form.append("mimeType", opts.mimeType);
|
|
215
|
+
form.append("byteSize", String(plaintext.byteLength));
|
|
216
|
+
let res;
|
|
217
|
+
try {
|
|
218
|
+
res = await this.fetchImpl(`${this.baseUrl}/api/s/${this.slug}/attachments`, {
|
|
219
|
+
method: "POST",
|
|
220
|
+
headers: { Authorization: `Bearer ${this.token}` },
|
|
221
|
+
body: form,
|
|
222
|
+
signal: opts.signal,
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
catch (err) {
|
|
226
|
+
if (err instanceof DOMException && err.name === "AbortError")
|
|
227
|
+
throw err;
|
|
228
|
+
throw new TelecabinError("network_error", `Cannot reach ${this.baseUrl}: ${err.message}`);
|
|
229
|
+
}
|
|
230
|
+
if (!res.ok)
|
|
231
|
+
throw await TelecabinError.fromResponse(res);
|
|
232
|
+
const body = (await res.json());
|
|
233
|
+
return body.attachment;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Fetch the bytes for a known attachment. Returns null if the blob is
|
|
237
|
+
* already gone (TTL expired).
|
|
238
|
+
*
|
|
239
|
+
* - For encrypted attachments (`attachment.encrypted === true`), the
|
|
240
|
+
* `sessionKey` must match the one the uploader used.
|
|
241
|
+
* - For plaintext attachments (non-E2EE session), `sessionKey` is ignored
|
|
242
|
+
* and the raw bytes are returned directly.
|
|
243
|
+
*
|
|
244
|
+
* Throws `invalid_body` if you pass an encrypted attachment without a
|
|
245
|
+
* `sessionKey` — there's no way to recover the plaintext.
|
|
246
|
+
*/
|
|
247
|
+
async fetchAttachmentBytes(attachment, sessionKey, signal) {
|
|
248
|
+
if (attachment.encrypted && !sessionKey) {
|
|
249
|
+
throw new TelecabinError("invalid_body", "Attachment is encrypted but no sessionKey was provided.");
|
|
250
|
+
}
|
|
251
|
+
let res;
|
|
252
|
+
try {
|
|
253
|
+
res = await this.fetchImpl(attachment.url, { signal });
|
|
254
|
+
}
|
|
255
|
+
catch (err) {
|
|
256
|
+
if (err instanceof DOMException && err.name === "AbortError")
|
|
257
|
+
throw err;
|
|
258
|
+
throw new TelecabinError("network_error", `Cannot reach blob: ${err.message}`);
|
|
259
|
+
}
|
|
260
|
+
if (res.status === 404 || res.status === 410)
|
|
261
|
+
return null;
|
|
262
|
+
if (!res.ok) {
|
|
263
|
+
throw new TelecabinError("http_error", `Failed to fetch attachment bytes (HTTP ${res.status}).`, res.status);
|
|
126
264
|
}
|
|
265
|
+
const bytes = new Uint8Array(await res.arrayBuffer());
|
|
266
|
+
if (!attachment.encrypted)
|
|
267
|
+
return bytes;
|
|
268
|
+
return decryptAttachment(sessionKey, attachment.iv, bytes);
|
|
127
269
|
}
|
|
128
270
|
/** Join a session with an invite code, minting a fresh participant token. */
|
|
129
271
|
static async join(opts) {
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
package/dist/config.d.ts
CHANGED
|
@@ -5,6 +5,11 @@ export interface Connection {
|
|
|
5
5
|
token: string;
|
|
6
6
|
sessionName?: string;
|
|
7
7
|
participantName?: string;
|
|
8
|
+
/** Optional base64url AES-GCM session key for E2EE sessions.
|
|
9
|
+
* The web UI keeps it in the URL fragment (`#k=…`); for CLI/MCP callers,
|
|
10
|
+
* we persist it here so attachment upload and message decryption work
|
|
11
|
+
* without prompting on every call. The server never sees it. */
|
|
12
|
+
sessionKey?: string;
|
|
8
13
|
}
|
|
9
14
|
/** Saved owner credentials for managing sessions from the CLI. */
|
|
10
15
|
export interface OwnerProfile {
|
|
@@ -26,6 +31,8 @@ export interface ResolvedConnection {
|
|
|
26
31
|
token: string;
|
|
27
32
|
sessionName?: string;
|
|
28
33
|
participantName?: string;
|
|
34
|
+
/** Base64url AES-GCM session key — present when the session is E2EE. */
|
|
35
|
+
sessionKey?: string;
|
|
29
36
|
}
|
|
30
37
|
/** Inputs that can override config when resolving a connection. */
|
|
31
38
|
export interface ResolveInput {
|
|
@@ -33,6 +40,7 @@ export interface ResolveInput {
|
|
|
33
40
|
baseUrl?: string;
|
|
34
41
|
slug?: string;
|
|
35
42
|
token?: string;
|
|
43
|
+
sessionKey?: string;
|
|
36
44
|
}
|
|
37
45
|
/** Absolute path of the telecabin config file. */
|
|
38
46
|
export declare function configPath(): string;
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAMA,mEAAmE;AACnE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAMA,mEAAmE;AACnE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;oEAGgE;IAChE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,kEAAkE;AAClE,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,qCAAqC;AACrC,MAAM,WAAW,eAAe;IAC9B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACxC,KAAK,CAAC,EAAE,YAAY,CAAC;CACtB;AAED,2EAA2E;AAC3E,MAAM,WAAW,kBAAkB;IACjC,8CAA8C;IAC9C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wEAAwE;IACxE,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,mEAAmE;AACnE,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAOD,kDAAkD;AAClD,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,4EAA4E;AAC5E,wBAAsB,UAAU,IAAI,OAAO,CAAC,eAAe,CAAC,CAmB3D;AAED,4EAA4E;AAC5E,wBAAsB,UAAU,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAKvE;AAED,2DAA2D;AAC3D,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,UAAU,EACtB,IAAI,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GACnC,OAAO,CAAC,IAAI,CAAC,CAOf;AAED,0EAA0E;AAC1E,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CASrE;AAED,mDAAmD;AACnD,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAUtE;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,GAAE,YAAiB,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAoC7B;AAED,yDAAyD;AACzD,wBAAsB,eAAe,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAI1E;AAED,wDAAwD;AACxD,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAChC,KAAK,GAAE,iBAAsB,GAC5B,OAAO,CAAC,YAAY,CAAC,CAgBvB"}
|
package/dist/config.js
CHANGED
|
@@ -87,6 +87,7 @@ export async function resolveConnection(input = {}) {
|
|
|
87
87
|
const baseUrl = input.baseUrl ?? process.env.TELECABIN_BASE_URL ?? base?.baseUrl ?? DEFAULT_BASE_URL;
|
|
88
88
|
const slug = input.slug ?? process.env.TELECABIN_SLUG ?? base?.slug;
|
|
89
89
|
const token = input.token ?? process.env.TELECABIN_TOKEN ?? base?.token;
|
|
90
|
+
const sessionKey = input.sessionKey ?? process.env.TELECABIN_SESSION_KEY ?? base?.sessionKey;
|
|
90
91
|
if (!slug || !token) {
|
|
91
92
|
throw new TelecabinError("no_active_session", 'No active session. Run "telecabin join <invite-code>", or pass --slug and --token (or set TELECABIN_SLUG / TELECABIN_TOKEN).');
|
|
92
93
|
}
|
|
@@ -97,6 +98,7 @@ export async function resolveConnection(input = {}) {
|
|
|
97
98
|
token,
|
|
98
99
|
sessionName: base?.sessionName,
|
|
99
100
|
participantName: base?.participantName,
|
|
101
|
+
sessionKey,
|
|
100
102
|
};
|
|
101
103
|
}
|
|
102
104
|
/** Save the owner profile (base URL + owner API key). */
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,7 +4,9 @@ export { OwnerClient } from "./owner.js";
|
|
|
4
4
|
export type { OwnerClientOptions } from "./owner.js";
|
|
5
5
|
export { TelecabinError } from "./errors.js";
|
|
6
6
|
export type { TelecabinErrorCode } from "./errors.js";
|
|
7
|
+
export { ALLOWED_ATTACHMENT_MIME_TYPES, ATTACHMENT_TTL_HOURS, decryptAttachment, encryptAttachment, encryptText, isAllowedAttachmentMime, MAX_ATTACHMENT_BYTES, MAX_ATTACHMENTS_PER_MESSAGE, PLAINTEXT_ATTACHMENT_IV, } from "./attachments.js";
|
|
8
|
+
export type { AttachmentMime } from "./attachments.js";
|
|
7
9
|
export { addConnection, configPath, loadConfig, removeConnection, resolveConnection, resolveOwner, saveConfig, setDefaultConnection, setOwnerProfile, } from "./config.js";
|
|
8
10
|
export type { Connection, OwnerProfile, ResolvedConnection, ResolveInput, ResolveOwnerInput, TelecabinConfig, } from "./config.js";
|
|
9
|
-
export type { EventKind, InvitePreview, JoinResult, MintedToken, OwnerKeyInfo, OwnerMember, OwnerParticipant, OwnerSession, Participant, PollResult, SessionInfo, SessionStatus, Snapshot, Status, TelecabinEvent, } from "./types.js";
|
|
11
|
+
export type { EventKind, InvitePreview, JoinResult, MintedToken, OwnerKeyInfo, OwnerMember, OwnerParticipant, OwnerSession, Participant, PollResult, PublicAttachment, SessionInfo, SessionStatus, Snapshot, Status, TelecabinEvent, } from "./types.js";
|
|
10
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACL,aAAa,EACb,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,SAAS,EACT,aAAa,EACb,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,UAAU,EACV,WAAW,EACX,aAAa,EACb,QAAQ,EACR,MAAM,EACN,cAAc,GACf,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAChE,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACL,6BAA6B,EAC7B,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,uBAAuB,EACvB,oBAAoB,EACpB,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EACL,aAAa,EACb,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,EACjB,eAAe,GAChB,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,SAAS,EACT,aAAa,EACb,UAAU,EACV,WAAW,EACX,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,YAAY,EACZ,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,aAAa,EACb,QAAQ,EACR,MAAM,EACN,cAAc,GACf,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { DEFAULT_BASE_URL, TelecabinClient } from "./client.js";
|
|
2
2
|
export { OwnerClient } from "./owner.js";
|
|
3
3
|
export { TelecabinError } from "./errors.js";
|
|
4
|
+
export { ALLOWED_ATTACHMENT_MIME_TYPES, ATTACHMENT_TTL_HOURS, decryptAttachment, encryptAttachment, encryptText, isAllowedAttachmentMime, MAX_ATTACHMENT_BYTES, MAX_ATTACHMENTS_PER_MESSAGE, PLAINTEXT_ATTACHMENT_IV, } from "./attachments.js";
|
|
4
5
|
export { addConnection, configPath, loadConfig, removeConnection, resolveConnection, resolveOwner, saveConfig, setDefaultConnection, setOwnerProfile, } from "./config.js";
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EACL,aAAa,EACb,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,eAAe,GAChB,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EACL,6BAA6B,EAC7B,oBAAoB,EACpB,iBAAiB,EACjB,iBAAiB,EACjB,WAAW,EACX,uBAAuB,EACvB,oBAAoB,EACpB,2BAA2B,EAC3B,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EACL,aAAa,EACb,UAAU,EACV,UAAU,EACV,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,UAAU,EACV,oBAAoB,EACpB,eAAe,GAChB,MAAM,aAAa,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** A participant's presence state, broadcast to everyone in the session. */
|
|
2
|
-
export type Status = "idle" | "thinking" | "generating" | "tool_call" | "error";
|
|
2
|
+
export type Status = "idle" | "listening" | "thinking" | "generating" | "tool_call" | "error";
|
|
3
3
|
/** Lifecycle state of a session, controlled by its owner. */
|
|
4
4
|
export type SessionStatus = "active" | "paused" | "closed";
|
|
5
5
|
/** Kind of entry in the session event log. */
|
|
@@ -113,4 +113,18 @@ export interface OwnerKeyInfo {
|
|
|
113
113
|
lastUsedAt: string | null;
|
|
114
114
|
revokedAt: string | null;
|
|
115
115
|
}
|
|
116
|
+
/** An attachment as returned by the upload route — what every other
|
|
117
|
+
* surface sees. The encrypted bytes live at `url` (Vercel Blob); `iv`
|
|
118
|
+
* is the 12-byte AES-GCM IV needed to decrypt. */
|
|
119
|
+
export interface PublicAttachment {
|
|
120
|
+
id: string;
|
|
121
|
+
name: string;
|
|
122
|
+
mimeType: string;
|
|
123
|
+
byteSize: number;
|
|
124
|
+
url: string;
|
|
125
|
+
/** ISO-8601 — server deletes the ciphertext after this. */
|
|
126
|
+
expiresAt: string;
|
|
127
|
+
encrypted: boolean;
|
|
128
|
+
iv: string;
|
|
129
|
+
}
|
|
116
130
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,MAAM,MAAM,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,MAAM,MAAM,MAAM,GACd,MAAM,GACN,WAAW,GACX,UAAU,GACV,YAAY,GACZ,WAAW,GACX,OAAO,CAAC;AAEZ,6DAA6D;AAC7D,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAE3D,8CAA8C;AAC9C,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE7C,0FAA0F;AAC1F,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,gFAAgF;IAChF,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,4DAA4D;IAC5D,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,EAAE,SAAS,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACrC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,uEAAuE;AACvE,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IAC3C,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,+BAA+B;AAC/B,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,gEAAgE;AAChE,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,EAAE,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACjC,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,uEAAuE;IACvE,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,0EAA0E;IAC1E,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,2EAA2E;AAC3E,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,sDAAsD;AACtD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAC3C;AAED,2DAA2D;AAC3D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;CACvB;AAED,wDAAwD;AACxD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,kEAAkE;IAClE,kBAAkB,EAAE,OAAO,CAAC;CAC7B;AAED,kEAAkE;AAClE,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,iDAAiD;AACjD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,sEAAsE;AACtE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,+DAA+D;AAC/D,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;kDAEkD;AAClD,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;CACZ"}
|