@wirecat/zoom-cli 0.0.0-stage → 0.1.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAGrD,MAAM,WAAW,MAAM;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,MAAM,EAAE,CAAA;CACjB;AACD,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,YAAY,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,OAAO,KAAK,CAAA;IACnB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AACD,qBAAa,YAAY;IAEX,QAAQ,CAAC,OAAO,EAAE,YAAY;IAD1C,OAAO,CAAC,UAAU,CAA6B;IAC/C,YAAqB,OAAO,EAAE,YAAY,EAAI;IAC9C,IAAI,IAAI,MAAM,GAAG,IAAI,CA8BpB;IACD,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAMzB;IACK,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA4CjF;IACK,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,CAW9B;CACF"}
package/dist/tokens.js ADDED
@@ -0,0 +1,102 @@
1
+ import { object, ZoomError } from "./errors.js";
2
+ export class TokenManager {
3
+ options;
4
+ refreshing;
5
+ constructor(options) {
6
+ this.options = options;
7
+ }
8
+ load() {
9
+ let saved;
10
+ try {
11
+ saved = this.options.keyring.get(this.options.service, this.options.clientId);
12
+ }
13
+ catch {
14
+ throw new ZoomError("configuration_error", "system keyring is unavailable");
15
+ }
16
+ if (!saved)
17
+ return null;
18
+ try {
19
+ const value = object(JSON.parse(saved));
20
+ if (typeof value.accessToken !== "string" ||
21
+ !value.accessToken ||
22
+ typeof value.refreshToken !== "string" ||
23
+ !value.refreshToken ||
24
+ typeof value.expiresAt !== "number" ||
25
+ !Number.isFinite(value.expiresAt) ||
26
+ !Array.isArray(value.scopes) ||
27
+ !value.scopes.every((s) => typeof s === "string"))
28
+ throw new Error("invalid token entry");
29
+ return {
30
+ accessToken: value.accessToken,
31
+ refreshToken: value.refreshToken,
32
+ expiresAt: value.expiresAt,
33
+ scopes: value.scopes,
34
+ };
35
+ }
36
+ catch {
37
+ throw new ZoomError("authentication_error", "saved login is invalid; run zm login again");
38
+ }
39
+ }
40
+ save(tokens) {
41
+ try {
42
+ this.options.keyring.set(this.options.service, this.options.clientId, JSON.stringify(tokens));
43
+ }
44
+ catch {
45
+ throw new ZoomError("configuration_error", "could not save login to the system keyring");
46
+ }
47
+ }
48
+ async exchange(params, previous) {
49
+ let response;
50
+ try {
51
+ response = await this.options.fetch("https://zoom.us/oauth/token", {
52
+ method: "POST",
53
+ headers: { "content-type": "application/x-www-form-urlencoded" },
54
+ body: new URLSearchParams({ ...params, client_id: this.options.clientId }),
55
+ signal: AbortSignal.timeout(30000),
56
+ });
57
+ }
58
+ catch {
59
+ throw new ZoomError("provider_error", "could not reach Zoom token endpoint; retry the command");
60
+ }
61
+ if (!response.ok)
62
+ throw new ZoomError("authentication_error", `Zoom token request failed (HTTP ${response.status}); run zm login again`);
63
+ let body;
64
+ try {
65
+ body = object(await response.json());
66
+ }
67
+ catch {
68
+ throw new ZoomError("invalid_response", "Zoom returned an invalid token response");
69
+ }
70
+ const refreshToken = typeof body.refresh_token === "string" ? body.refresh_token : previous?.refreshToken;
71
+ if (typeof body.access_token !== "string" ||
72
+ !body.access_token ||
73
+ !refreshToken ||
74
+ typeof body.expires_in !== "number" ||
75
+ !Number.isFinite(body.expires_in) ||
76
+ body.expires_in <= 0 ||
77
+ !Number.isFinite((this.options.now?.() ?? Date.now()) + body.expires_in * 1000) ||
78
+ (body.scope !== undefined && typeof body.scope !== "string") ||
79
+ (body.refresh_token !== undefined && typeof body.refresh_token !== "string"))
80
+ throw new ZoomError("invalid_response", "Zoom returned an invalid token response");
81
+ const tokens = {
82
+ accessToken: body.access_token,
83
+ refreshToken,
84
+ expiresAt: (this.options.now?.() ?? Date.now()) + body.expires_in * 1000,
85
+ scopes: typeof body.scope === "string" ? body.scope.split(/\s+/).filter(Boolean) : (previous?.scopes ?? []),
86
+ };
87
+ this.save(tokens);
88
+ return tokens;
89
+ }
90
+ async tokens() {
91
+ const saved = this.load();
92
+ if (!saved)
93
+ throw new ZoomError("authentication_error", "run zm login first");
94
+ if (saved.expiresAt > (this.options.now?.() ?? Date.now()) + 30000)
95
+ return saved;
96
+ this.refreshing ??= this.exchange({ grant_type: "refresh_token", refresh_token: saved.refreshToken }, saved).finally(() => {
97
+ this.refreshing = undefined;
98
+ });
99
+ return this.refreshing;
100
+ }
101
+ }
102
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const VERSION: string;
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,OAAO,EAAE,MAAkE,CAAA"}
@@ -0,0 +1,3 @@
1
+ import { createRequire } from "node:module";
2
+ export const VERSION = createRequire(import.meta.url)("../package.json").version;
3
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,MAAM,CAAC,MAAM,OAAO,GAAW,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,iBAAiB,CAAC,CAAC,OAAO,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,60 @@
1
1
  {
2
2
  "name": "@wirecat/zoom-cli",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.1",
4
+ "description": "Zoom meetings, transcripts and summaries through provider-neutral meeting tools",
5
+ "license": "Apache-2.0",
6
+ "type": "module",
7
+ "engines": {
8
+ "node": ">=22.12.0"
9
+ },
10
+ "packageManager": "pnpm@11.20.0",
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/WireCatLabs/zoom-cli.git"
14
+ },
15
+ "bin": {
16
+ "zm": "dist/bin/zm.js"
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "README.md",
21
+ "LICENSE"
22
+ ],
23
+ "exports": {
24
+ ".": {
25
+ "types": "./dist/index.d.ts",
26
+ "default": "./dist/index.js"
27
+ }
28
+ },
29
+ "scripts": {
30
+ "build": "tsc --build",
31
+ "typecheck": "tsc --build --force --emitDeclarationOnly && tsc -p tsconfig.test.json && tsc -p tsconfig.scripts.json",
32
+ "lint": "biome check .",
33
+ "lint:fix": "biome check --write .",
34
+ "test": "vitest run",
35
+ "test:coverage": "vitest run --coverage",
36
+ "smoke:bun": "bun run scripts/smoke.ts",
37
+ "prepublishOnly": "pnpm build",
38
+ "docs:check": "node node_modules/@wirecat/cli-core/dist/dev/bin.js docs-check --rules scripts/docs-rules.ts && cspell --no-progress --no-summary README.md && node node_modules/rumdl/bin/rumdl check --config node_modules/@wirecat/cli-core/config/rumdl.toml README.md CHANGELOG.md CLAUDE.md docs/dev/*.md"
39
+ },
40
+ "dependencies": {
41
+ "@wirecat/cli-core": "0.18.1",
42
+ "@wirecat/cli-meetings": "0.2.3",
43
+ "commander": "15.0.0"
44
+ },
45
+ "devDependencies": {
46
+ "@biomejs/biome": "^2.5.15",
47
+ "@cspell/dict-en-gb": "^5.0.34",
48
+ "@cspell/dict-ru_ru": "^2.3.2",
49
+ "@types/node": "^22.20.5",
50
+ "@vitest/coverage-v8": "^5.0.3",
51
+ "cspell": "^10.3.6",
52
+ "lefthook": "^2.1.16",
53
+ "rumdl": "^0.2.78",
54
+ "typescript": "^7.0.2",
55
+ "vitest": "^5.0.3"
56
+ },
57
+ "publishConfig": {
58
+ "access": "public"
59
+ }
60
+ }