@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.
- package/LICENSE +204 -0
- package/README.md +113 -2
- package/dist/api.d.ts +21 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +364 -0
- package/dist/api.js.map +1 -0
- package/dist/bin/zm.d.ts +3 -0
- package/dist/bin/zm.d.ts.map +1 -0
- package/dist/bin/zm.js +51 -0
- package/dist/bin/zm.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +78 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +8 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +15 -0
- package/dist/errors.js.map +1 -0
- package/dist/files.d.ts +26 -0
- package/dist/files.d.ts.map +1 -0
- package/dist/files.js +158 -0
- package/dist/files.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/login.d.ts +14 -0
- package/dist/login.d.ts.map +1 -0
- package/dist/login.js +85 -0
- package/dist/login.js.map +1 -0
- package/dist/program.d.ts +32 -0
- package/dist/program.d.ts.map +1 -0
- package/dist/program.js +260 -0
- package/dist/program.js.map +1 -0
- package/dist/tokens.d.ts +24 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +102 -0
- package/dist/tokens.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +58 -4
package/dist/api.js
ADDED
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import { parseVtt, } from "@wirecat/cli-meetings";
|
|
2
|
+
import { number, object, string, ZoomError } from "./errors.js";
|
|
3
|
+
const json = (value) => {
|
|
4
|
+
if (value === null || typeof value === "boolean" || typeof value === "string")
|
|
5
|
+
return value;
|
|
6
|
+
if (typeof value === "number")
|
|
7
|
+
return Number.isFinite(value) ? value : null;
|
|
8
|
+
if (Array.isArray(value))
|
|
9
|
+
return value.map(json);
|
|
10
|
+
if (typeof value === "object")
|
|
11
|
+
return Object.fromEntries(Object.entries(object(value)).map(([key, item]) => [key, json(item)]));
|
|
12
|
+
return null;
|
|
13
|
+
};
|
|
14
|
+
const extras = (row, keys) => Object.fromEntries(Object.entries(row)
|
|
15
|
+
.filter(([key]) => !keys.includes(key))
|
|
16
|
+
.map(([key, value]) => [key, json(value)]));
|
|
17
|
+
export const encodeUuid = (uuid) => uuid.startsWith("/") || uuid.includes("//") ? encodeURIComponent(encodeURIComponent(uuid)) : encodeURIComponent(uuid);
|
|
18
|
+
const time = (value) => {
|
|
19
|
+
const text = string(value);
|
|
20
|
+
if (text === null)
|
|
21
|
+
return null;
|
|
22
|
+
const result = Date.parse(text);
|
|
23
|
+
if (!Number.isFinite(result))
|
|
24
|
+
throw new ZoomError("invalid_response", "Zoom returned an invalid timestamp");
|
|
25
|
+
return result;
|
|
26
|
+
};
|
|
27
|
+
const requiredString = (value) => {
|
|
28
|
+
const text = string(value);
|
|
29
|
+
if (text === null)
|
|
30
|
+
throw new ZoomError("invalid_response", "Zoom response is missing a required field");
|
|
31
|
+
return text;
|
|
32
|
+
};
|
|
33
|
+
export class ZoomApiSource {
|
|
34
|
+
tokens;
|
|
35
|
+
fetcher;
|
|
36
|
+
provider = "zoom";
|
|
37
|
+
transcriptFormat = "vtt";
|
|
38
|
+
name = "api";
|
|
39
|
+
constructor(tokens, fetcher) {
|
|
40
|
+
this.tokens = tokens;
|
|
41
|
+
this.fetcher = fetcher;
|
|
42
|
+
}
|
|
43
|
+
async request(path, scope, missingCode) {
|
|
44
|
+
const tokens = await this.tokens.tokens();
|
|
45
|
+
if (!tokens.scopes.includes(scope) && !tokens.scopes.includes(`${scope}:admin`))
|
|
46
|
+
throw new ZoomError("authentication_error", `Zoom scope ${scope} is missing; add it to the app and run zm login again`);
|
|
47
|
+
const response = await this.get(`https://api.zoom.us/v2${path}`, tokens.accessToken);
|
|
48
|
+
let value;
|
|
49
|
+
try {
|
|
50
|
+
value = await response.json();
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
if (response.ok)
|
|
54
|
+
throw new ZoomError("invalid_response", "Zoom returned an invalid response");
|
|
55
|
+
value = {};
|
|
56
|
+
}
|
|
57
|
+
const body = response.ok
|
|
58
|
+
? object(value)
|
|
59
|
+
: typeof value === "object" && value !== null && !Array.isArray(value)
|
|
60
|
+
? object(value)
|
|
61
|
+
: {};
|
|
62
|
+
if (body.code === 4711)
|
|
63
|
+
throw new ZoomError("authentication_error", `Zoom scope ${scope} is missing; add it to the app and run zm login again`);
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
if (response.status === 404 && missingCode !== undefined && body.code === missingCode)
|
|
66
|
+
return null;
|
|
67
|
+
throw new ZoomError(response.status === 401 ? "authentication_error" : "provider_error", `Zoom request failed (HTTP ${response.status}${typeof body.code === "number" ? `, code ${body.code}` : ""})`);
|
|
68
|
+
}
|
|
69
|
+
return body;
|
|
70
|
+
}
|
|
71
|
+
async get(target, accessToken) {
|
|
72
|
+
try {
|
|
73
|
+
return await this.fetcher(target, {
|
|
74
|
+
headers: { authorization: `Bearer ${accessToken}` },
|
|
75
|
+
signal: AbortSignal.timeout(30000),
|
|
76
|
+
redirect: "manual",
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
throw new ZoomError("provider_error", "Zoom request could not be completed");
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
async pages(path, key, scope) {
|
|
84
|
+
const rows = [];
|
|
85
|
+
const seen = new Set();
|
|
86
|
+
let next = "";
|
|
87
|
+
do {
|
|
88
|
+
const query = new URLSearchParams({ page_size: "100", ...(next ? { next_page_token: next } : {}) });
|
|
89
|
+
const body = await this.request(`${path}${path.includes("?") ? "&" : "?"}${query}`, scope);
|
|
90
|
+
if (!body || !Array.isArray(body[key]))
|
|
91
|
+
throw new ZoomError("invalid_response", "Zoom returned an invalid list");
|
|
92
|
+
rows.push(...body[key].map(object));
|
|
93
|
+
next = string(body.next_page_token) ?? "";
|
|
94
|
+
if (next && seen.has(next))
|
|
95
|
+
throw new ZoomError("invalid_response", "Zoom repeated a pagination token");
|
|
96
|
+
seen.add(next);
|
|
97
|
+
} while (next);
|
|
98
|
+
return rows;
|
|
99
|
+
}
|
|
100
|
+
async meetings(since) {
|
|
101
|
+
const lower = Date.parse(since);
|
|
102
|
+
if (!Number.isFinite(lower))
|
|
103
|
+
throw new ZoomError("validation_error", "expected an ISO since timestamp");
|
|
104
|
+
const series = await this.pages("/users/me/meetings?type=previous_meetings", "meetings", "meeting:read:list_meetings");
|
|
105
|
+
const meetings = [];
|
|
106
|
+
const seen = new Set();
|
|
107
|
+
for (const row of series) {
|
|
108
|
+
if (!(string(row.id) !== null || (typeof row.id === "number" && Number.isSafeInteger(row.id) && row.id > 0)))
|
|
109
|
+
throw new ZoomError("invalid_response", "Zoom meeting is missing its series id");
|
|
110
|
+
const seriesId = String(row.id);
|
|
111
|
+
const recurring = row.type === 3 || row.type === 8;
|
|
112
|
+
let instances = [row];
|
|
113
|
+
if (recurring) {
|
|
114
|
+
const body = await this.request(`/past_meetings/${encodeURIComponent(seriesId)}/instances`, "meeting:read:list_past_instances");
|
|
115
|
+
if (!body || !Array.isArray(body.meetings))
|
|
116
|
+
throw new ZoomError("invalid_response", "Zoom returned invalid occurrences");
|
|
117
|
+
instances = body.meetings.map(object);
|
|
118
|
+
}
|
|
119
|
+
for (const instance of instances) {
|
|
120
|
+
const startedAt = time(instance.start_time);
|
|
121
|
+
const id = requiredString(instance.uuid);
|
|
122
|
+
if (startedAt === null)
|
|
123
|
+
throw new ZoomError("invalid_response", "Zoom occurrence is missing its start time");
|
|
124
|
+
if (startedAt < lower || seen.has(id))
|
|
125
|
+
continue;
|
|
126
|
+
seen.add(id);
|
|
127
|
+
const rawDuration = recurring ? null : number(row.duration);
|
|
128
|
+
const end = rawDuration !== null && rawDuration >= 0 ? startedAt + rawDuration * 60000 : Number.NaN;
|
|
129
|
+
const endedAt = Number.isFinite(end) && Math.abs(end) <= 8640000000000000 ? new Date(end).toISOString() : null;
|
|
130
|
+
meetings.push({
|
|
131
|
+
series: {
|
|
132
|
+
id: seriesId,
|
|
133
|
+
provider: "zoom",
|
|
134
|
+
title: string(row.topic),
|
|
135
|
+
kind: recurring ? "recurring" : row.type === 1 ? "instant" : "scheduled",
|
|
136
|
+
joinUrl: string(row.join_url) ?? undefined,
|
|
137
|
+
recurrence: json(row.recurrence),
|
|
138
|
+
},
|
|
139
|
+
occurrence: {
|
|
140
|
+
id,
|
|
141
|
+
seriesId,
|
|
142
|
+
title: string(row.topic),
|
|
143
|
+
startedAt: new Date(startedAt).toISOString(),
|
|
144
|
+
endedAt,
|
|
145
|
+
},
|
|
146
|
+
description: string(row.agenda),
|
|
147
|
+
joinUrl: string(row.join_url),
|
|
148
|
+
timezone: string(row.timezone),
|
|
149
|
+
metadata: extras(row, [
|
|
150
|
+
"id",
|
|
151
|
+
"uuid",
|
|
152
|
+
"topic",
|
|
153
|
+
"type",
|
|
154
|
+
"start_time",
|
|
155
|
+
"duration",
|
|
156
|
+
"join_url",
|
|
157
|
+
"timezone",
|
|
158
|
+
"agenda",
|
|
159
|
+
"recurrence",
|
|
160
|
+
]),
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return meetings;
|
|
165
|
+
}
|
|
166
|
+
async participants(id) {
|
|
167
|
+
const rows = await this.pages(`/past_meetings/${encodeUuid(id)}/participants`, "participants", "meeting:read:list_past_participants");
|
|
168
|
+
const participants = new Map();
|
|
169
|
+
const seenSessions = new Set();
|
|
170
|
+
for (const [position, row] of rows.entries()) {
|
|
171
|
+
const stableId = string(row.id);
|
|
172
|
+
const email = string(row.user_email);
|
|
173
|
+
const registrant = string(row.registrant_id);
|
|
174
|
+
const key = stableId
|
|
175
|
+
? `id:${stableId}`
|
|
176
|
+
: email
|
|
177
|
+
? `email:${email.toLowerCase()}`
|
|
178
|
+
: registrant
|
|
179
|
+
? `registrant:${registrant}`
|
|
180
|
+
: `unknown:${position}`;
|
|
181
|
+
const joinedAt = time(row.join_time);
|
|
182
|
+
const leftAt = time(row.leave_time);
|
|
183
|
+
const rawDuration = number(row.duration);
|
|
184
|
+
const duration = rawDuration !== null && rawDuration >= 0 && Number.isFinite(rawDuration * 1000) ? rawDuration : null;
|
|
185
|
+
// Only stable identities with a concrete session id can be deduplicated safely.
|
|
186
|
+
const sessionId = string(row.user_id);
|
|
187
|
+
if (key !== `unknown:${position}` && sessionId) {
|
|
188
|
+
const fingerprint = JSON.stringify([key, sessionId, joinedAt, leftAt, duration]);
|
|
189
|
+
if (seenSessions.has(fingerprint))
|
|
190
|
+
continue;
|
|
191
|
+
seenSessions.add(fingerprint);
|
|
192
|
+
}
|
|
193
|
+
const session = {
|
|
194
|
+
joinedAt,
|
|
195
|
+
leftAt,
|
|
196
|
+
durationMs: duration === null ? null : duration * 1000,
|
|
197
|
+
userId: string(row.user_id),
|
|
198
|
+
displayName: string(row.name),
|
|
199
|
+
};
|
|
200
|
+
const existing = participants.get(key);
|
|
201
|
+
if (existing) {
|
|
202
|
+
if (joinedAt !== null)
|
|
203
|
+
existing.joinedAt = Math.min(existing.joinedAt ?? joinedAt, joinedAt);
|
|
204
|
+
if (leftAt !== null)
|
|
205
|
+
existing.leftAt = Math.max(existing.leftAt ?? leftAt, leftAt);
|
|
206
|
+
if (duration !== null)
|
|
207
|
+
existing.durationMs = (existing.durationMs ?? 0) + duration * 1000;
|
|
208
|
+
if (Array.isArray(existing.sessions))
|
|
209
|
+
existing.sessions.push(session);
|
|
210
|
+
}
|
|
211
|
+
else
|
|
212
|
+
participants.set(key, {
|
|
213
|
+
identityExternalId: stableId,
|
|
214
|
+
email,
|
|
215
|
+
externalId: registrant,
|
|
216
|
+
displayName: string(row.name),
|
|
217
|
+
role: string(row.role),
|
|
218
|
+
joinedAt,
|
|
219
|
+
leftAt,
|
|
220
|
+
durationMs: duration === null ? null : duration * 1000,
|
|
221
|
+
sessions: [session],
|
|
222
|
+
metadata: extras(row, [
|
|
223
|
+
"id",
|
|
224
|
+
"name",
|
|
225
|
+
"user_email",
|
|
226
|
+
"registrant_id",
|
|
227
|
+
"join_time",
|
|
228
|
+
"leave_time",
|
|
229
|
+
"duration",
|
|
230
|
+
"role",
|
|
231
|
+
]),
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
return [...participants.values()];
|
|
235
|
+
}
|
|
236
|
+
async transcript(id) {
|
|
237
|
+
const body = await this.request(`/meetings/${encodeUuid(id)}/transcript`, "cloud_recording:read:meeting_transcript", 3322);
|
|
238
|
+
if (!body)
|
|
239
|
+
return null;
|
|
240
|
+
const validateTarget = (value, base) => {
|
|
241
|
+
let target;
|
|
242
|
+
try {
|
|
243
|
+
target = new URL(value, base);
|
|
244
|
+
}
|
|
245
|
+
catch {
|
|
246
|
+
throw new ZoomError("invalid_response", "Zoom returned an unexpected transcript download host");
|
|
247
|
+
}
|
|
248
|
+
if (target.protocol !== "https:" ||
|
|
249
|
+
target.username ||
|
|
250
|
+
target.password ||
|
|
251
|
+
(target.port && target.port !== "443") ||
|
|
252
|
+
!/(^|\.)zoom\.(us|com)$/.test(target.hostname))
|
|
253
|
+
throw new ZoomError("invalid_response", "Zoom returned an unexpected transcript download host");
|
|
254
|
+
return target;
|
|
255
|
+
};
|
|
256
|
+
let target = validateTarget(requiredString(body.download_url));
|
|
257
|
+
const tokens = await this.tokens.tokens();
|
|
258
|
+
const signal = AbortSignal.timeout(30000);
|
|
259
|
+
for (let redirects = 0;; redirects++) {
|
|
260
|
+
// One deadline covers every redirect and the streamed body.
|
|
261
|
+
let response;
|
|
262
|
+
try {
|
|
263
|
+
response = await this.fetcher(target, {
|
|
264
|
+
headers: { authorization: `Bearer ${tokens.accessToken}` },
|
|
265
|
+
signal,
|
|
266
|
+
redirect: "manual",
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
catch {
|
|
270
|
+
throw new ZoomError("provider_error", "Transcript download could not be completed");
|
|
271
|
+
}
|
|
272
|
+
if ([301, 302, 303, 307, 308].includes(response.status)) {
|
|
273
|
+
const location = response.headers.get("location");
|
|
274
|
+
await response.body?.cancel();
|
|
275
|
+
if (!location || redirects >= 5)
|
|
276
|
+
throw new ZoomError("invalid_response", "Zoom returned invalid transcript redirects");
|
|
277
|
+
target = validateTarget(location, target);
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
if (!response.ok)
|
|
281
|
+
throw new ZoomError("provider_error", `Transcript download failed (HTTP ${response.status})`);
|
|
282
|
+
// A mislabeled HTML login page must not become an empty saved transcript.
|
|
283
|
+
const maxBytes = 10 * 1024 * 1024;
|
|
284
|
+
const reader = response.body?.getReader();
|
|
285
|
+
if (!reader)
|
|
286
|
+
throw new ZoomError("invalid_response", "Zoom returned an invalid transcript");
|
|
287
|
+
const chunks = [];
|
|
288
|
+
let size = 0;
|
|
289
|
+
try {
|
|
290
|
+
for (;;) {
|
|
291
|
+
const { done, value } = await reader.read();
|
|
292
|
+
if (done)
|
|
293
|
+
break;
|
|
294
|
+
size += value.byteLength;
|
|
295
|
+
if (size > maxBytes) {
|
|
296
|
+
await reader.cancel();
|
|
297
|
+
throw new ZoomError("invalid_response", "Zoom transcript exceeds the download size limit");
|
|
298
|
+
}
|
|
299
|
+
chunks.push(value);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
if (error instanceof ZoomError)
|
|
304
|
+
throw error;
|
|
305
|
+
throw new ZoomError("provider_error", "Transcript download could not be completed");
|
|
306
|
+
}
|
|
307
|
+
const bytes = new Uint8Array(size);
|
|
308
|
+
let offset = 0;
|
|
309
|
+
for (const chunk of chunks) {
|
|
310
|
+
bytes.set(chunk, offset);
|
|
311
|
+
offset += chunk.byteLength;
|
|
312
|
+
}
|
|
313
|
+
const content = new TextDecoder().decode(bytes);
|
|
314
|
+
try {
|
|
315
|
+
return parseVtt(content);
|
|
316
|
+
}
|
|
317
|
+
catch {
|
|
318
|
+
throw new ZoomError("invalid_response", "Zoom returned an invalid transcript");
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
async summary(id) {
|
|
323
|
+
const body = await this.request(`/meetings/${encodeUuid(id)}/meeting_summary`, "meeting:read:summary", 3001);
|
|
324
|
+
if (!body)
|
|
325
|
+
return null;
|
|
326
|
+
const edited = body.edited_summary && typeof body.edited_summary === "object" ? object(body.edited_summary) : null;
|
|
327
|
+
const details = Array.isArray(body.summary_details) ? body.summary_details.map(object) : [];
|
|
328
|
+
const steps = edited?.next_steps ?? body.next_steps;
|
|
329
|
+
const content = typeof body.summary_content === "string" ? body.summary_content : null;
|
|
330
|
+
const editedDetails = typeof edited?.summary_details === "string" ? edited.summary_details : null;
|
|
331
|
+
const editedOverview = typeof edited?.summary_overview === "string" ? edited.summary_overview : null;
|
|
332
|
+
return {
|
|
333
|
+
source: "zoom-ai",
|
|
334
|
+
content: content ?? editedDetails,
|
|
335
|
+
docUrl: string(body.summary_doc_url),
|
|
336
|
+
externalCreatedAt: time(body.summary_created_time),
|
|
337
|
+
externalUpdatedAt: time(body.summary_last_modified_time),
|
|
338
|
+
metadata: extras(body, [
|
|
339
|
+
"summary_content",
|
|
340
|
+
"summary_title",
|
|
341
|
+
"summary_overview",
|
|
342
|
+
"summary_details",
|
|
343
|
+
"next_steps",
|
|
344
|
+
"edited_summary",
|
|
345
|
+
"summary_doc_url",
|
|
346
|
+
"summary_created_time",
|
|
347
|
+
"summary_last_modified_time",
|
|
348
|
+
]),
|
|
349
|
+
title: string(body.summary_title),
|
|
350
|
+
overview: editedOverview ?? string(body.summary_overview),
|
|
351
|
+
sections: content !== null || editedDetails !== null
|
|
352
|
+
? []
|
|
353
|
+
: details.map((part) => ({ label: string(part.label) ?? "", text: string(part.summary) ?? "" })),
|
|
354
|
+
nextSteps: content !== null ? [] : Array.isArray(steps) ? steps.filter((s) => typeof s === "string") : [],
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
async chat() {
|
|
358
|
+
return null;
|
|
359
|
+
}
|
|
360
|
+
async files() {
|
|
361
|
+
return null;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
//# sourceMappingURL=api.js.map
|
package/dist/api.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
|
package/dist/bin/zm.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zm.d.ts","sourceRoot":"","sources":["../../src/bin/zm.ts"],"names":[],"mappings":""}
|
package/dist/bin/zm.js
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { spawn } from "node:child_process";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { createInterface } from "node:readline/promises";
|
|
5
|
+
import { resolvePaths, systemKeyring } from "@wirecat/cli-core";
|
|
6
|
+
import { readConfig } from "../config.js";
|
|
7
|
+
import { run } from "../program.js";
|
|
8
|
+
import { TokenManager } from "../tokens.js";
|
|
9
|
+
const paths = resolvePaths({ appName: "zm", env: process.env });
|
|
10
|
+
const configPath = join(paths.config, "config.json");
|
|
11
|
+
try {
|
|
12
|
+
const tokens = new TokenManager({
|
|
13
|
+
get clientId() {
|
|
14
|
+
return readConfig(configPath).clientId ?? "";
|
|
15
|
+
},
|
|
16
|
+
keyring: systemKeyring,
|
|
17
|
+
service: `zoom-cli:${paths.config}`,
|
|
18
|
+
fetch,
|
|
19
|
+
});
|
|
20
|
+
process.exitCode = await run(process.argv.slice(2), {
|
|
21
|
+
configPath,
|
|
22
|
+
tokens,
|
|
23
|
+
fetch,
|
|
24
|
+
data: (text) => process.stdout.write(text),
|
|
25
|
+
diagnostic: (text) => process.stderr.write(text),
|
|
26
|
+
openBrowser: (url, browser = "xdg-open") => new Promise((resolve, reject) => {
|
|
27
|
+
const child = spawn(browser, [url], { detached: true, stdio: "ignore" });
|
|
28
|
+
child.once("error", reject);
|
|
29
|
+
child.once("spawn", () => {
|
|
30
|
+
child.unref();
|
|
31
|
+
resolve();
|
|
32
|
+
});
|
|
33
|
+
}),
|
|
34
|
+
readPaste: process.stdin.isTTY
|
|
35
|
+
? async (signal) => {
|
|
36
|
+
const input = createInterface({ input: process.stdin, output: process.stderr });
|
|
37
|
+
try {
|
|
38
|
+
return await input.question("If the callback does not complete, paste code=…&state=… here: ", { signal });
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
input.close();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
: undefined,
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
process.stderr.write(`${JSON.stringify({ error: { code: "configuration_error", message: "could not load zm configuration" } })}\n`);
|
|
49
|
+
process.exitCode = 3;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=zm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zm.js","sourceRoot":"","sources":["../../src/bin/zm.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAChC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAA;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAE3C,MAAM,KAAK,GAAG,YAAY,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC,CAAA;AAC/D,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;AACpD,IAAI,CAAC;IACH,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;QAC9B,IAAI,QAAQ;YACV,OAAO,UAAU,CAAC,UAAU,CAAC,CAAC,QAAQ,IAAI,EAAE,CAAA;QAC9C,CAAC;QACD,OAAO,EAAE,aAAa;QACtB,OAAO,EAAE,YAAY,KAAK,CAAC,MAAM,EAAE;QACnC,KAAK;KACN,CAAC,CAAA;IACF,OAAO,CAAC,QAAQ,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;QAClD,UAAU;QACV,MAAM;QACN,KAAK;QACL,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QAC1C,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;QAChD,WAAW,EAAE,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,EAAE,EAAE,CACzC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACpC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;YACxE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YAC3B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;gBACvB,KAAK,CAAC,KAAK,EAAE,CAAA;gBACb,OAAO,EAAE,CAAA;YACX,CAAC,CAAC,CAAA;QACJ,CAAC,CAAC;QACJ,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK;YAC5B,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;gBACf,MAAM,KAAK,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAA;gBAC/E,IAAI,CAAC;oBACH,OAAO,MAAM,KAAK,CAAC,QAAQ,CAAC,gEAAgE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;gBAC3G,CAAC;wBAAS,CAAC;oBACT,KAAK,CAAC,KAAK,EAAE,CAAA;gBACf,CAAC;YACH,CAAC;YACH,CAAC,CAAC,SAAS;KACd,CAAC,CAAA;AACJ,CAAC;AAAC,MAAM,CAAC;IACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,qBAAqB,EAAE,OAAO,EAAE,iCAAiC,EAAE,EAAE,CAAC,IAAI,CAC9G,CAAA;IACD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;AACtB,CAAC"}
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export interface ZoomConfig {
|
|
2
|
+
clientId: string | null;
|
|
3
|
+
source: "api" | "files";
|
|
4
|
+
filesFolder: string | null;
|
|
5
|
+
filesTimezone: string;
|
|
6
|
+
accountProfile: string | null;
|
|
7
|
+
}
|
|
8
|
+
export declare const profileAccountKey: (profile: string) => string;
|
|
9
|
+
export declare const readConfig: (path: string) => ZoomConfig;
|
|
10
|
+
export declare const setConfig: (path: string, key: string, value: string) => ZoomConfig;
|
|
11
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,MAAM,EAAE,KAAK,GAAG,OAAO,CAAA;IACvB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,aAAa,EAAE,MAAM,CAAA;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAA;CAC9B;AAED,eAAO,MAAM,iBAAiB,YAAa,MAAM,KAAG,MAAiC,CAAA;AAErF,eAAO,MAAM,UAAU,SAAU,MAAM,KAAG,UAiCzC,CAAA;AACD,eAAO,MAAM,SAAS,SAAU,MAAM,OAAO,MAAM,SAAS,MAAM,KAAG,UAqCpE,CAAA"}
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { saveConfigFile } from "@wirecat/cli-core";
|
|
3
|
+
import { object, ZoomError } from "./errors.js";
|
|
4
|
+
const profilePattern = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
|
|
5
|
+
export const profileAccountKey = (profile) => `zm-profile:${profile}`;
|
|
6
|
+
export const readConfig = (path) => {
|
|
7
|
+
let text;
|
|
8
|
+
try {
|
|
9
|
+
text = readFileSync(path, "utf8");
|
|
10
|
+
}
|
|
11
|
+
catch (error) {
|
|
12
|
+
if (typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT")
|
|
13
|
+
return { clientId: null, source: "api", filesFolder: null, filesTimezone: "UTC", accountProfile: null };
|
|
14
|
+
throw new ZoomError("configuration_error", "could not read zm config");
|
|
15
|
+
}
|
|
16
|
+
try {
|
|
17
|
+
const value = object(JSON.parse(text));
|
|
18
|
+
if ((value.clientId !== null &&
|
|
19
|
+
(typeof value.clientId !== "string" || !value.clientId.trim() || /\s/.test(value.clientId))) ||
|
|
20
|
+
(value.source !== "api" && value.source !== "files") ||
|
|
21
|
+
(value.filesFolder !== null && typeof value.filesFolder !== "string") ||
|
|
22
|
+
typeof value.filesTimezone !== "string" ||
|
|
23
|
+
(value.accountProfile !== undefined &&
|
|
24
|
+
value.accountProfile !== null &&
|
|
25
|
+
(typeof value.accountProfile !== "string" || !profilePattern.test(value.accountProfile))))
|
|
26
|
+
throw new Error("invalid config");
|
|
27
|
+
new Intl.DateTimeFormat("en", { timeZone: value.filesTimezone });
|
|
28
|
+
return {
|
|
29
|
+
clientId: value.clientId,
|
|
30
|
+
source: value.source,
|
|
31
|
+
filesFolder: value.filesFolder,
|
|
32
|
+
filesTimezone: value.filesTimezone,
|
|
33
|
+
accountProfile: typeof value.accountProfile === "string" ? value.accountProfile : null,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
throw new ZoomError("configuration_error", "zm config is invalid");
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
export const setConfig = (path, key, value) => {
|
|
41
|
+
const config = readConfig(path);
|
|
42
|
+
switch (key) {
|
|
43
|
+
case "zoom.clientId":
|
|
44
|
+
if (!value.trim() || /\s/.test(value))
|
|
45
|
+
throw new ZoomError("validation_error", "client id must not contain whitespace");
|
|
46
|
+
config.clientId = value;
|
|
47
|
+
break;
|
|
48
|
+
case "account.profile":
|
|
49
|
+
if (!profilePattern.test(value))
|
|
50
|
+
throw new ZoomError("validation_error", "profile must be 1-64 letters, digits, dots, underscores or hyphens and start with a letter or digit");
|
|
51
|
+
config.accountProfile = value;
|
|
52
|
+
break;
|
|
53
|
+
case "source":
|
|
54
|
+
if (value !== "api" && value !== "files")
|
|
55
|
+
throw new ZoomError("validation_error", "source must be api or files");
|
|
56
|
+
config.source = value;
|
|
57
|
+
break;
|
|
58
|
+
case "files.folder":
|
|
59
|
+
if (!value.trim())
|
|
60
|
+
throw new ZoomError("validation_error", "folder must not be empty");
|
|
61
|
+
config.filesFolder = value;
|
|
62
|
+
break;
|
|
63
|
+
case "files.timezone":
|
|
64
|
+
try {
|
|
65
|
+
new Intl.DateTimeFormat("en", { timeZone: value });
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
throw new ZoomError("validation_error", "expected an IANA time zone");
|
|
69
|
+
}
|
|
70
|
+
config.filesTimezone = value;
|
|
71
|
+
break;
|
|
72
|
+
default:
|
|
73
|
+
throw new ZoomError("validation_error", "unknown config key");
|
|
74
|
+
}
|
|
75
|
+
saveConfigFile(path, config);
|
|
76
|
+
return config;
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare class ZoomError extends Error {
|
|
2
|
+
readonly code: "configuration_error" | "authentication_error" | "validation_error" | "provider_error" | "invalid_response";
|
|
3
|
+
constructor(code: "configuration_error" | "authentication_error" | "validation_error" | "provider_error" | "invalid_response", message: string);
|
|
4
|
+
}
|
|
5
|
+
export declare const object: (value: unknown) => Record<string, unknown>;
|
|
6
|
+
export declare const string: (value: unknown) => string | null;
|
|
7
|
+
export declare const number: (value: unknown) => number | null;
|
|
8
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,qBAAa,SAAU,SAAQ,KAAK;IAEhC,QAAQ,CAAC,IAAI,EACT,qBAAqB,GACrB,sBAAsB,GACtB,kBAAkB,GAClB,gBAAgB,GAChB,kBAAkB;IANxB,YACW,IAAI,EACT,qBAAqB,GACrB,sBAAsB,GACtB,kBAAkB,GAClB,gBAAgB,GAChB,kBAAkB,EACtB,OAAO,EAAE,MAAM,EAGhB;CACF;AACD,eAAO,MAAM,MAAM,UAAW,OAAO,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAI7D,CAAA;AACD,eAAO,MAAM,MAAM,UAAW,OAAO,KAAG,MAAM,GAAG,IAAkE,CAAA;AACnH,eAAO,MAAM,MAAM,UAAW,OAAO,KAAG,MAAM,GAAG,IACmB,CAAA"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export class ZoomError extends Error {
|
|
2
|
+
code;
|
|
3
|
+
constructor(code, message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.code = code;
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
export const object = (value) => {
|
|
9
|
+
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
10
|
+
throw new ZoomError("invalid_response", "Zoom returned an invalid response");
|
|
11
|
+
return value;
|
|
12
|
+
};
|
|
13
|
+
export const string = (value) => (typeof value === "string" && value.trim() ? value : null);
|
|
14
|
+
export const number = (value) => typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
15
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,SAAU,SAAQ,KAAK;IAEvB,IAAI;IADf,YACW,IAKa,EACtB,OAAe;QAEf,KAAK,CAAC,OAAO,CAAC,CAAA;oBARL,IAAI;IASf,CAAC;CACF;AACD,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAc,EAA2B,EAAE;IAChE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrE,MAAM,IAAI,SAAS,CAAC,kBAAkB,EAAE,mCAAmC,CAAC,CAAA;IAC9E,OAAO,KAAgC,CAAA;AACzC,CAAC,CAAA;AACD,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAc,EAAiB,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AACnH,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,KAAc,EAAiB,EAAE,CACtD,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA"}
|
package/dist/files.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { type ImportFile, type MeetingSource, type SourceMeeting } from "@wirecat/cli-meetings";
|
|
2
|
+
export interface DownloadedFile {
|
|
3
|
+
name: string;
|
|
4
|
+
content: string;
|
|
5
|
+
}
|
|
6
|
+
export declare const fileMeeting: (name: string, timezone?: string) => SourceMeeting;
|
|
7
|
+
export declare const importFile: (file: DownloadedFile, accountId: number, timezone?: string) => ImportFile;
|
|
8
|
+
export declare const validateDownloadedFiles: (files: DownloadedFile[], timezone?: string) => DownloadedFile[];
|
|
9
|
+
export declare const readDownloadedFiles: (folder: string) => Promise<DownloadedFile[]>;
|
|
10
|
+
export declare class FilesSource implements MeetingSource {
|
|
11
|
+
private readonly filesData;
|
|
12
|
+
private readonly timezone;
|
|
13
|
+
readonly provider = "zoom";
|
|
14
|
+
readonly transcriptFormat = "vtt";
|
|
15
|
+
readonly name = "file";
|
|
16
|
+
constructor(filesData: DownloadedFile[], timezone?: string);
|
|
17
|
+
private indexed;
|
|
18
|
+
private index;
|
|
19
|
+
meetings(since: string): Promise<SourceMeeting[]>;
|
|
20
|
+
transcript(id: string): Promise<import("@wirecat/cli-meetings").TranscriptLine[] | null>;
|
|
21
|
+
participants(): Promise<null>;
|
|
22
|
+
chat(): Promise<null>;
|
|
23
|
+
summary(): Promise<null>;
|
|
24
|
+
files(): Promise<null>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.d.ts","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAY,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAGzG,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAwDD,eAAO,MAAM,WAAW,SAAU,MAAM,wBAAqB,aAc5D,CAAA;AACD,eAAO,MAAM,UAAU,SAAU,cAAc,aAAa,MAAM,wBAAqB,UAiCtF,CAAA;AAeD,eAAO,MAAM,uBAAuB,UAAW,cAAc,EAAE,wBAAqB,cAAc,EACrB,CAAA;AAC7E,eAAO,MAAM,mBAAmB,WAAkB,MAAM,KAAG,OAAO,CAAC,cAAc,EAAE,CASlF,CAAA;AACD,qBAAa,WAAY,YAAW,aAAa;IAK7C,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAL3B,QAAQ,CAAC,QAAQ,UAAS;IAC1B,QAAQ,CAAC,gBAAgB,SAAQ;IACjC,QAAQ,CAAC,IAAI,UAAS;IACtB,YACmB,SAAS,EAAE,cAAc,EAAE,EAC3B,QAAQ,SAAQ,EAC/B;IACJ,OAAO,CAAC,OAAO,CAA2E;IAC1F,OAAO,CAAC,KAAK;IAKP,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CAMtD;IACK,UAAU,CAAC,EAAE,EAAE,MAAM,oEAG1B;IACK,YAAY,kBAEjB;IACK,IAAI,kBAET;IACK,OAAO,kBAEZ;IACK,KAAK,kBAEV;CACF"}
|