@quickmeet/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/LICENSE ADDED
@@ -0,0 +1,17 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ Copyright 2026 QuickMeet contributors
6
+
7
+ Licensed under the Apache License, Version 2.0 (the "License");
8
+ you may not use this file except in compliance with the License.
9
+ You may obtain a copy of the License at
10
+
11
+ http://www.apache.org/licenses/LICENSE-2.0
12
+
13
+ Unless required by applicable law or agreed to in writing, software
14
+ distributed under the License is distributed on an "AS IS" BASIS,
15
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ See the License for the specific language governing permissions and
17
+ limitations under the License.
package/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # @quickmeet/sdk
2
+
3
+ Framework-neutral browser client and shared TypeScript types for the self-hosted
4
+ QuickMeet video conferencing API.
5
+
6
+ ## Install
7
+
8
+ ```bash
9
+ npm install @quickmeet/sdk
10
+ ```
11
+
12
+ ## Browser invitation flow
13
+
14
+ ```ts
15
+ import { QuickMeetClient } from '@quickmeet/sdk';
16
+
17
+ const quickmeet = new QuickMeetClient({
18
+ apiUrl: 'https://meet-api.example.com',
19
+ });
20
+
21
+ const meeting = await quickmeet.getMeeting('weekly-review-a1b2c3');
22
+ const credentials = await quickmeet.joinMeeting(meeting.slug, {
23
+ name: 'Aarav',
24
+ accessKey: new URLSearchParams(location.search).get('key') ?? undefined,
25
+ });
26
+ ```
27
+
28
+ Pass `credentials` to `@quickmeet/react` or connect with `livekit-client`.
29
+
30
+ Trusted meeting creation and role assignment belong on your backend. Use
31
+ `@quickmeet/node` there so the QuickMeet API key never enters browser code.
32
+
33
+ ## License
34
+
35
+ Apache-2.0
@@ -0,0 +1,22 @@
1
+ import type { ApiErrorBody, CreateMeetingInput, CreateMeetingResult, JoinCredentials, JoinMeetingInput, MeetingSummary, UpdateMeetingInput } from './types.js';
2
+ export declare class QuickMeetApiError extends Error {
3
+ readonly status: number;
4
+ readonly code: string;
5
+ readonly details?: unknown;
6
+ constructor(status: number, body: ApiErrorBody);
7
+ }
8
+ export interface QuickMeetClientOptions {
9
+ apiUrl: string;
10
+ fetch?: typeof globalThis.fetch;
11
+ }
12
+ export declare class QuickMeetClient {
13
+ private readonly apiUrl;
14
+ private readonly fetcher;
15
+ constructor(options: QuickMeetClientOptions);
16
+ createMeeting(input: CreateMeetingInput): Promise<CreateMeetingResult>;
17
+ getMeeting(meetingIdOrSlug: string): Promise<MeetingSummary>;
18
+ joinMeeting(meetingIdOrSlug: string, input: JoinMeetingInput): Promise<JoinCredentials>;
19
+ updateMeeting(meetingIdOrSlug: string, input: UpdateMeetingInput): Promise<MeetingSummary>;
20
+ private request;
21
+ }
22
+ //# 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,EACV,YAAY,EACZ,kBAAkB,EAClB,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EACnB,MAAM,YAAY,CAAC;AAEpB,qBAAa,iBAAkB,SAAQ,KAAK;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;gBAEf,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY;CAO/C;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;gBAEtC,OAAO,EAAE,sBAAsB;IAK3C,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAOtE,UAAU,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAI5D,WAAW,CAAC,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAOvF,aAAa,CACX,eAAe,EAAE,MAAM,EACvB,KAAK,EAAE,kBAAkB,GACxB,OAAO,CAAC,cAAc,CAAC;YASZ,OAAO;CAgBtB"}
package/dist/client.js ADDED
@@ -0,0 +1,58 @@
1
+ export class QuickMeetApiError extends Error {
2
+ status;
3
+ code;
4
+ details;
5
+ constructor(status, body) {
6
+ super(body.message);
7
+ this.name = 'QuickMeetApiError';
8
+ this.status = status;
9
+ this.code = body.error;
10
+ this.details = body.details;
11
+ }
12
+ }
13
+ export class QuickMeetClient {
14
+ apiUrl;
15
+ fetcher;
16
+ constructor(options) {
17
+ this.apiUrl = options.apiUrl.replace(/\/+$/, '');
18
+ this.fetcher = options.fetch ?? globalThis.fetch.bind(globalThis);
19
+ }
20
+ createMeeting(input) {
21
+ return this.request('/v1/meetings', {
22
+ method: 'POST',
23
+ body: JSON.stringify(input),
24
+ });
25
+ }
26
+ getMeeting(meetingIdOrSlug) {
27
+ return this.request(`/v1/meetings/${encodeURIComponent(meetingIdOrSlug)}`);
28
+ }
29
+ joinMeeting(meetingIdOrSlug, input) {
30
+ return this.request(`/v1/meetings/${encodeURIComponent(meetingIdOrSlug)}/join`, {
31
+ method: 'POST',
32
+ body: JSON.stringify(input),
33
+ });
34
+ }
35
+ updateMeeting(meetingIdOrSlug, input) {
36
+ const { accessKey, ...updates } = input;
37
+ return this.request(`/v1/meetings/${encodeURIComponent(meetingIdOrSlug)}`, {
38
+ method: 'PATCH',
39
+ headers: accessKey ? { 'x-quickmeet-access-key': accessKey } : undefined,
40
+ body: JSON.stringify(updates),
41
+ });
42
+ }
43
+ async request(path, init = {}) {
44
+ const response = await this.fetcher(`${this.apiUrl}${path}`, {
45
+ ...init,
46
+ headers: {
47
+ 'content-type': 'application/json',
48
+ ...init.headers,
49
+ },
50
+ });
51
+ const body = (await response.json());
52
+ if (!response.ok) {
53
+ throw new QuickMeetApiError(response.status, body);
54
+ }
55
+ return body;
56
+ }
57
+ }
58
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAUA,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACjC,MAAM,CAAS;IACf,IAAI,CAAS;IACb,OAAO,CAAW;IAE3B,YAAY,MAAc,EAAE,IAAkB;QAC5C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAC9B,CAAC;CACF;AAOD,MAAM,OAAO,eAAe;IACT,MAAM,CAAS;IACf,OAAO,CAA0B;IAElD,YAAY,OAA+B;QACzC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACjD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpE,CAAC;IAED,aAAa,CAAC,KAAyB;QACrC,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE;YAClC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,UAAU,CAAC,eAAuB;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,kBAAkB,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;IAC7E,CAAC;IAED,WAAW,CAAC,eAAuB,EAAE,KAAuB;QAC1D,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,kBAAkB,CAAC,eAAe,CAAC,OAAO,EAAE;YAC9E,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;SAC5B,CAAC,CAAC;IACL,CAAC;IAED,aAAa,CACX,eAAuB,EACvB,KAAyB;QAEzB,MAAM,EAAE,SAAS,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC;QACxC,OAAO,IAAI,CAAC,OAAO,CAAC,gBAAgB,kBAAkB,CAAC,eAAe,CAAC,EAAE,EAAE;YACzE,MAAM,EAAE,OAAO;YACf,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,wBAAwB,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,SAAS;YACxE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;SAC9B,CAAC,CAAC;IACL,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,IAAY,EAAE,OAAoB,EAAE;QAC3D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,EAAE,EAAE;YAC3D,GAAG,IAAI;YACP,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,GAAG,IAAI,CAAC,OAAO;aAChB;SACF,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAqB,CAAC;QACzD,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,MAAM,IAAI,iBAAiB,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAoB,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,IAAS,CAAC;IACnB,CAAC;CACF"}
@@ -0,0 +1,3 @@
1
+ export * from './client.js';
2
+ export * from './types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ export * from './client.js';
2
+ export * from './types.js';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,74 @@
1
+ export type MeetingRole = 'host' | 'cohost' | 'participant';
2
+ export type MeetingAccess = 'open' | 'invite-only';
3
+ export interface MeetingFeatures {
4
+ camera: boolean;
5
+ microphone: boolean;
6
+ screenShare: boolean;
7
+ chat: boolean;
8
+ }
9
+ export declare const defaultMeetingFeatures: MeetingFeatures;
10
+ export interface PersonInput {
11
+ id?: string;
12
+ name: string;
13
+ email?: string;
14
+ }
15
+ export interface CreateMeetingInput {
16
+ name: string;
17
+ host: PersonInput;
18
+ coHosts?: PersonInput[];
19
+ participants?: PersonInput[];
20
+ features?: Partial<MeetingFeatures>;
21
+ access?: MeetingAccess;
22
+ }
23
+ export interface MeetingSummary {
24
+ id: string;
25
+ slug: string;
26
+ name: string;
27
+ access: MeetingAccess;
28
+ features: MeetingFeatures;
29
+ host: Omit<PersonInput, 'id'> & {
30
+ id: string;
31
+ };
32
+ coHostCount: number;
33
+ participantCount: number;
34
+ createdAt: string;
35
+ }
36
+ export interface MeetingInvitation {
37
+ id: string;
38
+ name: string;
39
+ email?: string;
40
+ role: MeetingRole;
41
+ accessKey: string;
42
+ joinUrl?: string;
43
+ }
44
+ export interface CreateMeetingResult {
45
+ meeting: MeetingSummary;
46
+ hostAccessKey: string;
47
+ invitations: MeetingInvitation[];
48
+ }
49
+ export interface JoinMeetingInput {
50
+ name: string;
51
+ accessKey?: string;
52
+ }
53
+ export interface JoinCredentials {
54
+ serverUrl: string;
55
+ participantToken: string;
56
+ meeting: MeetingSummary;
57
+ participant: {
58
+ identity: string;
59
+ name: string;
60
+ role: MeetingRole;
61
+ };
62
+ }
63
+ export interface UpdateMeetingInput {
64
+ name?: string;
65
+ features?: Partial<MeetingFeatures>;
66
+ access?: MeetingAccess;
67
+ accessKey?: string;
68
+ }
69
+ export interface ApiErrorBody {
70
+ error: string;
71
+ message: string;
72
+ details?: unknown;
73
+ }
74
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,QAAQ,GAAG,aAAa,CAAC;AAC5D,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,aAAa,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,OAAO,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;IACrB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,eAAO,MAAM,sBAAsB,EAAE,eAKpC,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,CAAC;IAClB,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB,YAAY,CAAC,EAAE,WAAW,EAAE,CAAC;IAC7B,QAAQ,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACpC,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,EAAE,eAAe,CAAC;IAC1B,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,cAAc,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,iBAAiB,EAAE,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,cAAc,CAAC;IACxB,WAAW,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,WAAW,CAAC;KACnB,CAAC;CACH;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IACpC,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB"}
package/dist/types.js ADDED
@@ -0,0 +1,7 @@
1
+ export const defaultMeetingFeatures = {
2
+ camera: true,
3
+ microphone: true,
4
+ screenShare: true,
5
+ chat: true,
6
+ };
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAUA,MAAM,CAAC,MAAM,sBAAsB,GAAoB;IACrD,MAAM,EAAE,IAAI;IACZ,UAAU,EAAE,IAAI;IAChB,WAAW,EAAE,IAAI;IACjB,IAAI,EAAE,IAAI;CACX,CAAC"}
package/package.json ADDED
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "@quickmeet/sdk",
3
+ "version": "0.1.0",
4
+ "description": "Framework-agnostic QuickMeet browser SDK",
5
+ "license": "Apache-2.0",
6
+ "keywords": [
7
+ "quickmeet",
8
+ "video-conferencing",
9
+ "webrtc",
10
+ "livekit",
11
+ "sdk"
12
+ ],
13
+ "type": "module",
14
+ "sideEffects": false,
15
+ "main": "./dist/index.js",
16
+ "types": "./dist/index.d.ts",
17
+ "exports": {
18
+ ".": {
19
+ "types": "./dist/index.d.ts",
20
+ "import": "./dist/index.js"
21
+ }
22
+ },
23
+ "files": ["dist"],
24
+ "publishConfig": {
25
+ "access": "public"
26
+ },
27
+ "scripts": {
28
+ "build": "tsc -p tsconfig.json",
29
+ "prepublishOnly": "npm run build",
30
+ "typecheck": "tsc -p tsconfig.json --noEmit"
31
+ },
32
+ "engines": {
33
+ "node": ">=20"
34
+ },
35
+ "devDependencies": {
36
+ "typescript": "^5.8.3"
37
+ }
38
+ }