@prvt/integration-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,144 @@
1
+ # `@prvt/integration-sdk`
2
+
3
+ TypeScript SDK for building visible Node.js integrations for a self-hosted
4
+ prvt room.
5
+
6
+ The SDK exchanges a room-scoped integration key for a short-lived participant
7
+ token and can connect the integration through the official LiveKit Node SDK.
8
+ It does not persist credentials, retry mutations, or hide integration
9
+ participants.
10
+
11
+ ## Install
12
+
13
+ ```bash
14
+ npm install @prvt/integration-sdk @livekit/rtc-node
15
+ ```
16
+
17
+ Node.js 18 or newer is required. `@livekit/rtc-node` is a peer dependency so
18
+ the application controls the native realtime runtime version.
19
+
20
+ ## Create an integration key
21
+
22
+ Join a room in the browser that created it, open **Room tools**, and choose
23
+ **Copy integrations API token**. The `Personal integration` key is shown only
24
+ once. Move it directly into the Node application's secret manager before
25
+ closing the dialog.
26
+
27
+ Never put the integration key in a URL, log, source file, or browser storage.
28
+
29
+ ## Connect
30
+
31
+ ```ts
32
+ import { RoomEvent } from "@livekit/rtc-node";
33
+ import { createPrvtIntegration } from "@prvt/integration-sdk";
34
+
35
+ const integrationKey = process.env.PRVT_INTEGRATION_KEY;
36
+ if (!integrationKey) throw new Error("PRVT_INTEGRATION_KEY is required");
37
+
38
+ const integration = createPrvtIntegration({
39
+ baseUrl: "https://call.example.com",
40
+ integrationKey,
41
+ });
42
+
43
+ const session = await integration.connect({
44
+ roomOptions: {
45
+ autoSubscribe: true,
46
+ dynacast: false,
47
+ },
48
+ });
49
+
50
+ session.room.on(RoomEvent.ParticipantConnected, (participant) => {
51
+ console.log(`${participant.name ?? participant.identity} joined`);
52
+ });
53
+
54
+ process.once("SIGINT", async () => {
55
+ await session.disconnect();
56
+ process.exit(0);
57
+ });
58
+ ```
59
+
60
+ `session.room` is the official `@livekit/rtc-node` `Room`. Use its track,
61
+ participant, text-stream, and data APIs directly. The integration's stable
62
+ identity, expiry, and effective permissions are also available on the session.
63
+
64
+ ## Exchange without connecting
65
+
66
+ Use `exchangeToken()` when the application needs to configure the LiveKit room
67
+ itself:
68
+
69
+ ```ts
70
+ const token = await integration.exchangeToken();
71
+
72
+ // token.participantToken short-lived bearer JWT
73
+ // token.serverUrl public LiveKit WebSocket URL
74
+ // token.participantIdentity
75
+ // token.expiresAt
76
+ // token.permissions
77
+ ```
78
+
79
+ The participant JWT is valid for five minutes and exactly one managed room.
80
+ Fetch a fresh token before a full reconnect instead of persisting it as a
81
+ replacement for the integration key.
82
+
83
+ ## Permissions
84
+
85
+ The server returns the effective permissions with every exchange:
86
+
87
+ - `subscribeMedia` allows room-wide media subscription, including both audio
88
+ and video.
89
+ - `publishMicrophone` allows publication restricted to microphone-source
90
+ tracks.
91
+ - `publishData` allows room-wide data publication. Topics such as
92
+ `prvt.chat` route messages but are not authorization boundaries.
93
+
94
+ `PRVT_CHAT_TOPIC` exports the exact `prvt.chat` topic name.
95
+
96
+ Personal integrations created from Room tools currently receive all three
97
+ permissions. The owner API can create integrations with selected permissions.
98
+
99
+ ## Errors
100
+
101
+ ```ts
102
+ import {
103
+ PrvtApiError,
104
+ PrvtConnectionError,
105
+ PrvtNetworkError,
106
+ PrvtProtocolError,
107
+ } from "@prvt/integration-sdk";
108
+
109
+ try {
110
+ await integration.connect();
111
+ } catch (error) {
112
+ if (error instanceof PrvtApiError) {
113
+ console.error(error.code, error.status, error.retryAfterSeconds);
114
+ } else if (error instanceof PrvtNetworkError) {
115
+ console.error("The prvt API is unreachable");
116
+ } else if (error instanceof PrvtProtocolError) {
117
+ console.error("The API response did not match the SDK contract");
118
+ } else if (error instanceof PrvtConnectionError) {
119
+ console.error("LiveKit connection failed");
120
+ }
121
+ }
122
+ ```
123
+
124
+ The SDK does not include integration keys, participant JWTs, request headers,
125
+ or response bodies in its own error messages. It does not retry automatically.
126
+ Respect `retryAfterSeconds` for `RATE_LIMITED`; use bounded backoff for
127
+ temporary `STORAGE_UNAVAILABLE` or `LIVEKIT_UNAVAILABLE` failures; require
128
+ operator action for revoked, closed, or unauthorized credentials.
129
+
130
+ ## Visibility and lifecycle
131
+
132
+ Integrations are ordinary visible room participants. Server-signed metadata
133
+ drives their badge, roster entry, join announcement, and chat attribution. A
134
+ new connection with the same stable integration identity replaces the older
135
+ connection.
136
+
137
+ Revoking an integration blocks future token exchanges and attempts to remove
138
+ the connected bot. An already issued JWT cannot be invalidated and may reconnect
139
+ for the remainder of its five-minute lifetime. Always disconnect the session
140
+ cleanly during shutdown.
141
+
142
+ This package intentionally does not wrap the owner API or browser moderator
143
+ flow. It is the runtime SDK for a Node.js integration after an integration key
144
+ has been created.
@@ -0,0 +1,11 @@
1
+ import type { Room } from "@livekit/rtc-node";
2
+ import type { ConnectIntegrationOptions, CreatePrvtIntegrationOptions, ExchangeTokenOptions, IntegrationToken, PrvtIntegration, PrvtIntegrationSession } from "./types.js";
3
+ export type RoomFactory = () => Promise<Room>;
4
+ export declare class PrvtIntegrationClient implements PrvtIntegration {
5
+ #private;
6
+ constructor(options: CreatePrvtIntegrationOptions, roomFactory?: RoomFactory);
7
+ exchangeToken(options?: ExchangeTokenOptions): Promise<IntegrationToken>;
8
+ connect(options?: ConnectIntegrationOptions): Promise<PrvtIntegrationSession>;
9
+ }
10
+ export declare const createPrvtIntegration: (options: CreatePrvtIntegrationOptions) => PrvtIntegration;
11
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAQ9C,OAAO,KAAK,EACV,yBAAyB,EACzB,4BAA4B,EAC5B,oBAAoB,EACpB,gBAAgB,EAChB,eAAe,EACf,sBAAsB,EACvB,MAAM,YAAY,CAAC;AASpB,MAAM,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AAyC9C,qBAAa,qBAAsB,YAAW,eAAe;;gBAM/C,OAAO,EAAE,4BAA4B,EAAE,WAAW,GAAE,WAAgC;IAQ1F,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAiC5E,OAAO,CAAC,OAAO,GAAE,yBAA8B,GAAG,OAAO,CAAC,sBAAsB,CAAC;CAYxF;AAED,eAAO,MAAM,qBAAqB,GAAI,SAAS,4BAA4B,KAAG,eAE7E,CAAC"}
package/dist/client.js ADDED
@@ -0,0 +1,94 @@
1
+ import { PrvtApiError, PrvtConnectionError, PrvtNetworkError, PrvtProtocolError, PrvtRtcUnavailableError, } from "./errors.js";
2
+ import { normalizeBaseUrl, normalizeIntegrationKey, parseApiErrorCode, parseIntegrationToken, parseRetryAfter, } from "./validation.js";
3
+ const defaultRoomFactory = async () => {
4
+ try {
5
+ const { Room } = await import("@livekit/rtc-node");
6
+ return new Room();
7
+ }
8
+ catch {
9
+ throw new PrvtRtcUnavailableError();
10
+ }
11
+ };
12
+ const isAbortError = (caught, signal) => (signal?.aborted === true
13
+ || (typeof caught === "object" && caught !== null && "name" in caught && caught.name === "AbortError"));
14
+ const abortReason = (signal) => {
15
+ if (signal.reason !== undefined)
16
+ return signal.reason;
17
+ const error = new Error("The operation was aborted");
18
+ error.name = "AbortError";
19
+ return error;
20
+ };
21
+ class IntegrationSession {
22
+ room;
23
+ participantIdentity;
24
+ expiresAt;
25
+ permissions;
26
+ constructor(room, token) {
27
+ this.room = room;
28
+ this.participantIdentity = token.participantIdentity;
29
+ this.expiresAt = token.expiresAt;
30
+ this.permissions = token.permissions;
31
+ }
32
+ async disconnect() {
33
+ await this.room.disconnect();
34
+ }
35
+ }
36
+ export class PrvtIntegrationClient {
37
+ #baseUrl;
38
+ #integrationKey;
39
+ #fetch;
40
+ #roomFactory;
41
+ constructor(options, roomFactory = defaultRoomFactory) {
42
+ this.#baseUrl = normalizeBaseUrl(options.baseUrl);
43
+ this.#integrationKey = normalizeIntegrationKey(options.integrationKey);
44
+ this.#fetch = options.fetch ?? globalThis.fetch;
45
+ if (typeof this.#fetch !== "function")
46
+ throw new TypeError("fetch is not available in this Node.js runtime");
47
+ this.#roomFactory = roomFactory;
48
+ }
49
+ async exchangeToken(options = {}) {
50
+ let response;
51
+ try {
52
+ response = await this.#fetch(new URL("/api/v1/integrations/token", this.#baseUrl), {
53
+ method: "POST",
54
+ headers: {
55
+ Accept: "application/json",
56
+ Authorization: `Bearer ${this.#integrationKey}`,
57
+ "Content-Type": "application/json",
58
+ },
59
+ body: "{}",
60
+ signal: options.signal,
61
+ });
62
+ }
63
+ catch (caught) {
64
+ if (isAbortError(caught, options.signal)) {
65
+ throw options.signal?.aborted ? abortReason(options.signal) : caught;
66
+ }
67
+ throw new PrvtNetworkError();
68
+ }
69
+ const body = await response.json().catch(() => null);
70
+ if (!response.ok) {
71
+ throw new PrvtApiError(parseApiErrorCode(body), response.status, parseRetryAfter(response.headers.get("Retry-After")));
72
+ }
73
+ const token = parseIntegrationToken(body);
74
+ if (token === null)
75
+ throw new PrvtProtocolError();
76
+ return token;
77
+ }
78
+ async connect(options = {}) {
79
+ const token = await this.exchangeToken({ signal: options.signal });
80
+ if (options.signal?.aborted)
81
+ throw abortReason(options.signal);
82
+ const room = await this.#roomFactory();
83
+ try {
84
+ await room.connect(token.serverUrl, token.participantToken, options.roomOptions);
85
+ }
86
+ catch {
87
+ await room.disconnect().catch(() => { });
88
+ throw new PrvtConnectionError();
89
+ }
90
+ return new IntegrationSession(room, token);
91
+ }
92
+ }
93
+ export const createPrvtIntegration = (options) => (new PrvtIntegrationClient(options));
94
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import type { PrvtApiErrorCode } from "./types.js";
2
+ export declare class PrvtApiError extends Error {
3
+ readonly code: PrvtApiErrorCode;
4
+ readonly status: number;
5
+ readonly retryAfterSeconds?: number;
6
+ constructor(code: PrvtApiErrorCode, status: number, retryAfterSeconds?: number);
7
+ }
8
+ export declare class PrvtNetworkError extends Error {
9
+ constructor();
10
+ }
11
+ export declare class PrvtProtocolError extends Error {
12
+ constructor();
13
+ }
14
+ export declare class PrvtRtcUnavailableError extends Error {
15
+ constructor();
16
+ }
17
+ export declare class PrvtConnectionError extends Error {
18
+ constructor();
19
+ }
20
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,qBAAa,YAAa,SAAQ,KAAK;IACrC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;gBAExB,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,CAAC,EAAE,MAAM;CAO/E;AAED,qBAAa,gBAAiB,SAAQ,KAAK;;CAK1C;AAED,qBAAa,iBAAkB,SAAQ,KAAK;;CAK3C;AAED,qBAAa,uBAAwB,SAAQ,KAAK;;CAKjD;AAED,qBAAa,mBAAoB,SAAQ,KAAK;;CAK7C"}
package/dist/errors.js ADDED
@@ -0,0 +1,38 @@
1
+ export class PrvtApiError extends Error {
2
+ code;
3
+ status;
4
+ retryAfterSeconds;
5
+ constructor(code, status, retryAfterSeconds) {
6
+ super(`prvt API request failed (${code})`);
7
+ this.name = "PrvtApiError";
8
+ this.code = code;
9
+ this.status = status;
10
+ if (retryAfterSeconds !== undefined)
11
+ this.retryAfterSeconds = retryAfterSeconds;
12
+ }
13
+ }
14
+ export class PrvtNetworkError extends Error {
15
+ constructor() {
16
+ super("Could not reach the prvt API");
17
+ this.name = "PrvtNetworkError";
18
+ }
19
+ }
20
+ export class PrvtProtocolError extends Error {
21
+ constructor() {
22
+ super("The prvt API returned an invalid response");
23
+ this.name = "PrvtProtocolError";
24
+ }
25
+ }
26
+ export class PrvtRtcUnavailableError extends Error {
27
+ constructor() {
28
+ super("@livekit/rtc-node is required to connect an integration");
29
+ this.name = "PrvtRtcUnavailableError";
30
+ }
31
+ }
32
+ export class PrvtConnectionError extends Error {
33
+ constructor() {
34
+ super("Could not connect the integration to its prvt room");
35
+ this.name = "PrvtConnectionError";
36
+ }
37
+ }
38
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,YAAa,SAAQ,KAAK;IAC5B,IAAI,CAAmB;IACvB,MAAM,CAAS;IACf,iBAAiB,CAAU;IAEpC,YAAY,IAAsB,EAAE,MAAc,EAAE,iBAA0B;QAC5E,KAAK,CAAC,4BAA4B,IAAI,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,iBAAiB,KAAK,SAAS;YAAE,IAAI,CAAC,iBAAiB,GAAG,iBAAiB,CAAC;IAClF,CAAC;CACF;AAED,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC;QACE,KAAK,CAAC,8BAA8B,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1C;QACE,KAAK,CAAC,2CAA2C,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IAClC,CAAC;CACF;AAED,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAChD;QACE,KAAK,CAAC,yDAAyD,CAAC,CAAC;QACjE,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,KAAK;IAC5C;QACE,KAAK,CAAC,oDAAoD,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;IACpC,CAAC;CACF"}
@@ -0,0 +1,5 @@
1
+ export { PrvtApiError, PrvtConnectionError, PrvtNetworkError, PrvtProtocolError, PrvtRtcUnavailableError, } from "./errors.js";
2
+ export { createPrvtIntegration } from "./client.js";
3
+ export type { ConnectIntegrationOptions, CreatePrvtIntegrationOptions, ExchangeTokenOptions, IntegrationPermissions, IntegrationToken, PrvtApiErrorCode, PrvtIntegration, PrvtIntegrationSession, } from "./types.js";
4
+ export declare const PRVT_CHAT_TOPIC = "prvt.chat";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,YAAY,EACV,yBAAyB,EACzB,4BAA4B,EAC5B,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,eAAe,EACf,sBAAsB,GACvB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,eAAe,cAAc,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export { PrvtApiError, PrvtConnectionError, PrvtNetworkError, PrvtProtocolError, PrvtRtcUnavailableError, } from "./errors.js";
2
+ export { createPrvtIntegration } from "./client.js";
3
+ export const PRVT_CHAT_TOPIC = "prvt.chat";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAYpD,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC"}
@@ -0,0 +1,37 @@
1
+ import type { Room, RoomOptions } from "@livekit/rtc-node";
2
+ export type IntegrationPermissions = {
3
+ subscribeMedia: boolean;
4
+ publishMicrophone: boolean;
5
+ publishData: boolean;
6
+ };
7
+ export type PrvtApiErrorCode = "INVALID_JSON" | "INVALID_REQUEST" | "INVALID_ROOM_NAME" | "INVALID_PARTICIPANT_NAME" | "INVALID_INTEGRATION_NAME" | "INVALID_INTEGRATION_PERMISSIONS" | "INVALID_CURSOR" | "UNAUTHORIZED" | "FORBIDDEN" | "ROOM_NOT_FOUND" | "INTEGRATION_NOT_FOUND" | "ROOM_CLOSED" | "INTEGRATION_REVOKED" | "ROOM_CAPACITY_REACHED" | "INTEGRATION_CAPACITY_REACHED" | "REQUEST_TOO_LARGE" | "UNSUPPORTED_MEDIA_TYPE" | "RATE_LIMITED" | "IDENTIFIER_GENERATION_FAILED" | "STORAGE_UNAVAILABLE" | "LIVEKIT_UNAVAILABLE" | "NOT_FOUND" | "UNKNOWN_ERROR";
8
+ export type IntegrationToken = {
9
+ participantToken: string;
10
+ serverUrl: string;
11
+ participantIdentity: string;
12
+ expiresAt: string;
13
+ permissions: IntegrationPermissions;
14
+ };
15
+ export type CreatePrvtIntegrationOptions = {
16
+ baseUrl: string;
17
+ integrationKey: string;
18
+ fetch?: typeof globalThis.fetch;
19
+ };
20
+ export type ExchangeTokenOptions = {
21
+ signal?: AbortSignal;
22
+ };
23
+ export type ConnectIntegrationOptions = ExchangeTokenOptions & {
24
+ roomOptions?: RoomOptions;
25
+ };
26
+ export interface PrvtIntegrationSession {
27
+ readonly room: Room;
28
+ readonly participantIdentity: string;
29
+ readonly expiresAt: string;
30
+ readonly permissions: IntegrationPermissions;
31
+ disconnect(): Promise<void>;
32
+ }
33
+ export interface PrvtIntegration {
34
+ exchangeToken(options?: ExchangeTokenOptions): Promise<IntegrationToken>;
35
+ connect(options?: ConnectIntegrationOptions): Promise<PrvtIntegrationSession>;
36
+ }
37
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE3D,MAAM,MAAM,sBAAsB,GAAG;IACnC,cAAc,EAAE,OAAO,CAAC;IACxB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GACxB,cAAc,GACd,iBAAiB,GACjB,mBAAmB,GACnB,0BAA0B,GAC1B,0BAA0B,GAC1B,iCAAiC,GACjC,gBAAgB,GAChB,cAAc,GACd,WAAW,GACX,gBAAgB,GAChB,uBAAuB,GACvB,aAAa,GACb,qBAAqB,GACrB,uBAAuB,GACvB,8BAA8B,GAC9B,mBAAmB,GACnB,wBAAwB,GACxB,cAAc,GACd,8BAA8B,GAC9B,qBAAqB,GACrB,qBAAqB,GACrB,WAAW,GACX,eAAe,CAAC;AAEpB,MAAM,MAAM,gBAAgB,GAAG;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,sBAAsB,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACzC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,oBAAoB,GAAG;IAC7D,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IACpB,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,sBAAsB,CAAC;IAC7C,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,eAAe;IAC9B,aAAa,CAAC,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACzE,OAAO,CAAC,OAAO,CAAC,EAAE,yBAAyB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAAC;CAC/E"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { IntegrationToken, PrvtApiErrorCode } from "./types.js";
2
+ export declare const normalizeBaseUrl: (value: string) => string;
3
+ export declare const normalizeIntegrationKey: (value: string) => string;
4
+ export declare const parseApiErrorCode: (value: unknown) => PrvtApiErrorCode;
5
+ export declare const parseRetryAfter: (value: string | null) => number | undefined;
6
+ export declare const parseIntegrationToken: (value: unknown) => IntegrationToken | null;
7
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAA0B,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAsD7F,eAAO,MAAM,gBAAgB,GAAI,OAAO,MAAM,WAgB7C,CAAC;AAEF,eAAO,MAAM,uBAAuB,GAAI,OAAO,MAAM,WAKpD,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAAI,OAAO,OAAO,KAAG,gBAOlD,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,OAAO,MAAM,GAAG,IAAI,uBAInD,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,OAAO,OAAO,KAAG,gBAAgB,GAAG,IA6BzE,CAAC"}
@@ -0,0 +1,116 @@
1
+ const API_ERROR_CODES = new Set([
2
+ "INVALID_JSON",
3
+ "INVALID_REQUEST",
4
+ "INVALID_ROOM_NAME",
5
+ "INVALID_PARTICIPANT_NAME",
6
+ "INVALID_INTEGRATION_NAME",
7
+ "INVALID_INTEGRATION_PERMISSIONS",
8
+ "INVALID_CURSOR",
9
+ "UNAUTHORIZED",
10
+ "FORBIDDEN",
11
+ "ROOM_NOT_FOUND",
12
+ "INTEGRATION_NOT_FOUND",
13
+ "ROOM_CLOSED",
14
+ "INTEGRATION_REVOKED",
15
+ "ROOM_CAPACITY_REACHED",
16
+ "INTEGRATION_CAPACITY_REACHED",
17
+ "REQUEST_TOO_LARGE",
18
+ "UNSUPPORTED_MEDIA_TYPE",
19
+ "RATE_LIMITED",
20
+ "IDENTIFIER_GENERATION_FAILED",
21
+ "STORAGE_UNAVAILABLE",
22
+ "LIVEKIT_UNAVAILABLE",
23
+ "NOT_FOUND",
24
+ ]);
25
+ const isRecord = (value) => (typeof value === "object" && value !== null && !Array.isArray(value));
26
+ const hasExactlyKeys = (value, expected) => {
27
+ const actual = Object.keys(value).sort();
28
+ const sortedExpected = [...expected].sort();
29
+ return actual.length === sortedExpected.length
30
+ && actual.every((key, index) => key === sortedExpected[index]);
31
+ };
32
+ const parsePermissions = (value) => {
33
+ if (!isRecord(value) || !hasExactlyKeys(value, ["subscribeMedia", "publishMicrophone", "publishData"])) {
34
+ return null;
35
+ }
36
+ if (typeof value.subscribeMedia !== "boolean"
37
+ || typeof value.publishMicrophone !== "boolean"
38
+ || typeof value.publishData !== "boolean")
39
+ return null;
40
+ return {
41
+ subscribeMedia: value.subscribeMedia,
42
+ publishMicrophone: value.publishMicrophone,
43
+ publishData: value.publishData,
44
+ };
45
+ };
46
+ export const normalizeBaseUrl = (value) => {
47
+ let url;
48
+ try {
49
+ url = new URL(value);
50
+ }
51
+ catch {
52
+ throw new TypeError("baseUrl must be an absolute HTTP(S) origin");
53
+ }
54
+ if ((url.protocol !== "http:" && url.protocol !== "https:")
55
+ || url.username !== ""
56
+ || url.password !== ""
57
+ || url.pathname !== "/"
58
+ || url.search !== ""
59
+ || url.hash !== "")
60
+ throw new TypeError("baseUrl must be an absolute HTTP(S) origin");
61
+ return url.origin;
62
+ };
63
+ export const normalizeIntegrationKey = (value) => {
64
+ if (typeof value !== "string" || value.trim().length === 0) {
65
+ throw new TypeError("integrationKey must be a non-empty string");
66
+ }
67
+ return value.trim();
68
+ };
69
+ export const parseApiErrorCode = (value) => {
70
+ if (!isRecord(value) || !isRecord(value.error) || typeof value.error.code !== "string") {
71
+ return "UNKNOWN_ERROR";
72
+ }
73
+ return API_ERROR_CODES.has(value.error.code)
74
+ ? value.error.code
75
+ : "UNKNOWN_ERROR";
76
+ };
77
+ export const parseRetryAfter = (value) => {
78
+ if (value === null || !/^\d+$/.test(value))
79
+ return undefined;
80
+ const seconds = Number(value);
81
+ return Number.isSafeInteger(seconds) ? seconds : undefined;
82
+ };
83
+ export const parseIntegrationToken = (value) => {
84
+ if (!isRecord(value)
85
+ || !hasExactlyKeys(value, ["participantToken", "serverUrl", "participantIdentity", "expiresAt", "permissions"])
86
+ || typeof value.participantToken !== "string"
87
+ || value.participantToken.length === 0
88
+ || typeof value.serverUrl !== "string"
89
+ || typeof value.participantIdentity !== "string"
90
+ || value.participantIdentity.length === 0
91
+ || typeof value.expiresAt !== "string")
92
+ return null;
93
+ let serverUrl;
94
+ try {
95
+ serverUrl = new URL(value.serverUrl);
96
+ }
97
+ catch {
98
+ return null;
99
+ }
100
+ if (serverUrl.protocol !== "ws:" && serverUrl.protocol !== "wss:")
101
+ return null;
102
+ const expiresAt = new Date(value.expiresAt);
103
+ if (!Number.isFinite(expiresAt.getTime()) || expiresAt.toISOString() !== value.expiresAt)
104
+ return null;
105
+ const permissions = parsePermissions(value.permissions);
106
+ if (permissions === null)
107
+ return null;
108
+ return {
109
+ participantToken: value.participantToken,
110
+ serverUrl: value.serverUrl,
111
+ participantIdentity: value.participantIdentity,
112
+ expiresAt: value.expiresAt,
113
+ permissions,
114
+ };
115
+ };
116
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "@prvt/integration-sdk",
3
+ "version": "0.1.0",
4
+ "description": "TypeScript SDK for building visible Node.js integrations for prvt rooms.",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "files": [
8
+ "dist",
9
+ "README.md"
10
+ ],
11
+ "main": "./dist/index.js",
12
+ "module": "./dist/index.js",
13
+ "types": "./dist/index.d.ts",
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "import": "./dist/index.js",
18
+ "default": "./dist/index.js"
19
+ },
20
+ "./package.json": "./package.json"
21
+ },
22
+ "engines": {
23
+ "node": ">=18"
24
+ },
25
+ "scripts": {
26
+ "clean": "bun -e \"import { rm } from 'node:fs/promises'; await rm('dist', { recursive: true, force: true })\"",
27
+ "build": "bun run clean && tsc -p tsconfig.build.json",
28
+ "test": "bun test",
29
+ "typecheck": "tsc -p tsconfig.json --noEmit",
30
+ "pack:check": "bun pm pack --dry-run",
31
+ "prepack": "bun run build",
32
+ "prepublishOnly": "bun run test && bun run typecheck"
33
+ },
34
+ "peerDependencies": {
35
+ "@livekit/rtc-node": "^0.13.34"
36
+ },
37
+ "devDependencies": {
38
+ "@livekit/rtc-node": "0.13.34",
39
+ "@types/bun": "^1.4.1",
40
+ "typescript": "^5.9.2"
41
+ },
42
+ "publishConfig": {
43
+ "access": "public"
44
+ },
45
+ "repository": {
46
+ "type": "git",
47
+ "url": "git+https://github.com/yerofey/prvt.git",
48
+ "directory": "packages/integration-sdk"
49
+ },
50
+ "keywords": [
51
+ "prvt",
52
+ "livekit",
53
+ "webrtc",
54
+ "integration",
55
+ "typescript"
56
+ ]
57
+ }