@wirecat/zoom-cli 0.1.0 → 0.2.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.
Files changed (89) hide show
  1. package/README.md +156 -11
  2. package/dist/agent-skill.d.ts +4 -0
  3. package/dist/agent-skill.d.ts.map +1 -0
  4. package/dist/agent-skill.js +16 -0
  5. package/dist/agent-skill.js.map +1 -0
  6. package/dist/api.d.ts +3 -2
  7. package/dist/api.d.ts.map +1 -1
  8. package/dist/api.js +10 -41
  9. package/dist/api.js.map +1 -1
  10. package/dist/archive-commands.d.ts +25 -0
  11. package/dist/archive-commands.d.ts.map +1 -0
  12. package/dist/archive-commands.js +157 -0
  13. package/dist/archive-commands.js.map +1 -0
  14. package/dist/bin/zm.js +53 -3
  15. package/dist/bin/zm.js.map +1 -1
  16. package/dist/commands.d.ts +12 -0
  17. package/dist/commands.d.ts.map +1 -0
  18. package/dist/commands.js +96 -0
  19. package/dist/commands.js.map +1 -0
  20. package/dist/config.d.ts +2 -0
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +13 -2
  23. package/dist/config.js.map +1 -1
  24. package/dist/errors.d.ts +4 -3
  25. package/dist/errors.d.ts.map +1 -1
  26. package/dist/errors.js +11 -4
  27. package/dist/errors.js.map +1 -1
  28. package/dist/execution.d.ts +16 -0
  29. package/dist/execution.d.ts.map +1 -0
  30. package/dist/execution.js +49 -0
  31. package/dist/execution.js.map +1 -0
  32. package/dist/index.d.ts +7 -2
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +6 -1
  35. package/dist/index.js.map +1 -1
  36. package/dist/login.d.ts +1 -0
  37. package/dist/login.d.ts.map +1 -1
  38. package/dist/login.js +13 -1
  39. package/dist/login.js.map +1 -1
  40. package/dist/mcp-server.d.ts +16 -0
  41. package/dist/mcp-server.d.ts.map +1 -0
  42. package/dist/mcp-server.js +172 -0
  43. package/dist/mcp-server.js.map +1 -0
  44. package/dist/output-file.d.ts +4 -0
  45. package/dist/output-file.d.ts.map +1 -0
  46. package/dist/output-file.js +55 -0
  47. package/dist/output-file.js.map +1 -0
  48. package/dist/program.d.ts +32 -0
  49. package/dist/program.d.ts.map +1 -1
  50. package/dist/program.js +403 -45
  51. package/dist/program.js.map +1 -1
  52. package/dist/recording-archive.d.ts +62 -0
  53. package/dist/recording-archive.d.ts.map +1 -0
  54. package/dist/recording-archive.js +519 -0
  55. package/dist/recording-archive.js.map +1 -0
  56. package/dist/recording-sync.d.ts +15 -0
  57. package/dist/recording-sync.d.ts.map +1 -0
  58. package/dist/recording-sync.js +49 -0
  59. package/dist/recording-sync.js.map +1 -0
  60. package/dist/recordings.d.ts +47 -0
  61. package/dist/recordings.d.ts.map +1 -0
  62. package/dist/recordings.js +124 -0
  63. package/dist/recordings.js.map +1 -0
  64. package/dist/remote-http.d.ts +23 -0
  65. package/dist/remote-http.d.ts.map +1 -0
  66. package/dist/remote-http.js +113 -0
  67. package/dist/remote-http.js.map +1 -0
  68. package/dist/remote-meetings.d.ts +58 -0
  69. package/dist/remote-meetings.d.ts.map +1 -0
  70. package/dist/remote-meetings.js +151 -0
  71. package/dist/remote-meetings.js.map +1 -0
  72. package/dist/store-connection.d.ts +9 -0
  73. package/dist/store-connection.d.ts.map +1 -0
  74. package/dist/store-connection.js +39 -0
  75. package/dist/store-connection.js.map +1 -0
  76. package/dist/streaming.d.ts +6 -0
  77. package/dist/streaming.d.ts.map +1 -0
  78. package/dist/streaming.js +86 -0
  79. package/dist/streaming.js.map +1 -0
  80. package/dist/tokens.d.ts +6 -4
  81. package/dist/tokens.d.ts.map +1 -1
  82. package/dist/tokens.js +48 -18
  83. package/dist/tokens.js.map +1 -1
  84. package/dist/watch-commands.d.ts +11 -0
  85. package/dist/watch-commands.d.ts.map +1 -0
  86. package/dist/watch-commands.js +30 -0
  87. package/dist/watch-commands.js.map +1 -0
  88. package/package.json +21 -12
  89. package/skills/zoom-cli/SKILL.md +69 -0
@@ -0,0 +1,519 @@
1
+ import { createHash, randomUUID } from "node:crypto";
2
+ import { constants } from "node:fs";
3
+ import { link, lstat, mkdir, open, readdir, realpath, rename, rmdir, unlink } from "node:fs/promises";
4
+ import { hostname } from "node:os";
5
+ import { join } from "node:path";
6
+ import { retryableStatus, statusToCode } from "@wirecat/cli-core/http";
7
+ import { checkCancelled, string, ZoomError } from "./errors.js";
8
+ import { operationSignal } from "./remote-http.js";
9
+ export const validateDownloadOptions = (options) => {
10
+ const maxBytes = options.maxBytes === undefined ? 20 * 1024 ** 3 : options.maxBytes;
11
+ if (typeof options.destination !== "string" ||
12
+ !options.destination.trim() ||
13
+ !Number.isSafeInteger(maxBytes) ||
14
+ maxBytes <= 0)
15
+ throw new ZoomError("validation_error", "archive destination and positive download limit are required");
16
+ if (options.fileIds !== undefined &&
17
+ (!Array.isArray(options.fileIds) ||
18
+ options.fileIds.length === 0 ||
19
+ options.fileIds.some((id) => typeof id !== "string" || !id.trim())))
20
+ throw new ZoomError("validation_error", "recording selection must contain nonempty file ids");
21
+ return maxBytes;
22
+ };
23
+ const locksFolder = ".zoom-archive-locks";
24
+ const lockOwner = async (path, name, signal) => {
25
+ checkCancelled(signal);
26
+ try {
27
+ const file = await localFile(path);
28
+ try {
29
+ if ((await file.stat()).size > 4096)
30
+ return null;
31
+ const content = await file.readFile("utf8");
32
+ checkCancelled(signal);
33
+ const owner = JSON.parse(content);
34
+ if (owner.version !== 1 ||
35
+ !Number.isSafeInteger(owner.pid) ||
36
+ owner.pid <= 0 ||
37
+ !string(owner.host) ||
38
+ !/^[a-f0-9-]{36}$/.test(owner.nonce) ||
39
+ name !== `${owner.pid}-${owner.nonce}.json`)
40
+ return null;
41
+ return owner;
42
+ }
43
+ finally {
44
+ await file.close();
45
+ }
46
+ }
47
+ catch {
48
+ checkCancelled(signal);
49
+ return null;
50
+ }
51
+ };
52
+ const lockStatus = (owner) => {
53
+ if (owner.host !== hostname())
54
+ return "foreign";
55
+ try {
56
+ process.kill(owner.pid, 0);
57
+ return "active";
58
+ }
59
+ catch (error) {
60
+ return typeof error === "object" && error !== null && "code" in error && error.code === "ESRCH" ? "stale" : "active";
61
+ }
62
+ };
63
+ export const inspectArchiveLocks = async (destination, options = {}) => {
64
+ checkCancelled(options.signal);
65
+ const root = await realpath(destination);
66
+ checkCancelled(options.signal);
67
+ const folder = join(root, locksFolder);
68
+ let names;
69
+ try {
70
+ if ((await lstat(folder)).isSymbolicLink())
71
+ throw new ZoomError("validation_error", "archive lock directory must not be a symlink");
72
+ names = await readdir(folder);
73
+ }
74
+ catch (error) {
75
+ if (missing(error))
76
+ return [];
77
+ throw new ZoomError("configuration_error", "archive lock directory could not be read");
78
+ }
79
+ const result = [];
80
+ for (const name of names.sort()) {
81
+ checkCancelled(options.signal);
82
+ const owner = await lockOwner(join(folder, name), name, options.signal);
83
+ result.push({
84
+ name,
85
+ status: owner ? lockStatus(owner) : "unrecognized",
86
+ pid: owner?.pid ?? null,
87
+ host: owner?.host ?? null,
88
+ });
89
+ }
90
+ return result;
91
+ };
92
+ export const recoverArchiveLocks = async (destination, options = {}) => {
93
+ checkCancelled(options.signal);
94
+ const root = await realpath(destination);
95
+ const locks = await inspectArchiveLocks(root, options);
96
+ const removed = [];
97
+ if (options.apply)
98
+ for (const lock of locks) {
99
+ checkCancelled(options.signal);
100
+ if (lock.status !== "stale")
101
+ continue;
102
+ const path = join(root, locksFolder, lock.name);
103
+ const owner = await lockOwner(path, lock.name, options.signal);
104
+ if (!owner || lockStatus(owner) !== "stale")
105
+ continue;
106
+ // Unique PID/nonce paths are never reused, so a new writer cannot replace this stale owner.
107
+ try {
108
+ await unlink(path);
109
+ removed.push(lock.name);
110
+ }
111
+ catch (error) {
112
+ if (!missing(error))
113
+ throw new ZoomError("configuration_error", "stale archive lock could not be removed");
114
+ }
115
+ }
116
+ return { locks, removed };
117
+ };
118
+ const acquireArchiveLock = async (root) => {
119
+ const folder = join(root, locksFolder);
120
+ await mkdir(folder, { recursive: true });
121
+ if ((await lstat(folder)).isSymbolicLink())
122
+ throw new ZoomError("validation_error", "archive lock directory must not be a symlink");
123
+ const owner = { version: 1, pid: process.pid, host: hostname(), nonce: randomUUID() };
124
+ const name = `${owner.pid}-${owner.nonce}.json`;
125
+ const path = join(folder, name);
126
+ const file = await open(path, "wx", 0o600);
127
+ try {
128
+ await file.writeFile(JSON.stringify(owner));
129
+ await file.sync();
130
+ await file.close();
131
+ const locks = await inspectArchiveLocks(root);
132
+ if (locks.some((lock) => lock.name !== name))
133
+ throw new ZoomError("validation_error", "archive is locked; inspect or recover stale local locks");
134
+ try {
135
+ await lstat(join(root, ".zoom-archive.lock"));
136
+ throw new ZoomError("validation_error", "archive has an unrecognized legacy lock");
137
+ }
138
+ catch (error) {
139
+ if (!missing(error))
140
+ throw error;
141
+ }
142
+ return path;
143
+ }
144
+ catch (error) {
145
+ await file.close().catch(() => undefined);
146
+ await unlink(path).catch(() => undefined);
147
+ throw error;
148
+ }
149
+ };
150
+ const digest = (text) => createHash("sha256").update(text).digest("hex");
151
+ const manifestName = (uuid) => `.zoom-archive-${digest(uuid)}.json`;
152
+ const filename = (uuid, asset) => `${digest(uuid)}-${digest(asset.id ?? "")}.${/^(mp4|m4a|mp3|wav|vtt|txt|json)$/i.test(asset.format ?? "") ? asset.format?.toLowerCase() : "bin"}`;
153
+ const missing = (error) => typeof error === "object" && error !== null && "code" in error && error.code === "ENOENT";
154
+ const localFile = async (path) => {
155
+ if (!(await lstat(path)).isFile())
156
+ throw new ZoomError("validation_error", "archive path must be an ordinary file");
157
+ return open(path, constants.O_RDONLY | constants.O_NOFOLLOW);
158
+ };
159
+ const fingerprint = async (path, signal) => {
160
+ checkCancelled(signal);
161
+ const file = await localFile(path);
162
+ try {
163
+ checkCancelled(signal);
164
+ const hash = createHash("sha256");
165
+ let size = 0;
166
+ for await (const chunk of file.createReadStream({ autoClose: false, ...(signal ? { signal } : {}) })) {
167
+ checkCancelled(signal);
168
+ size += chunk.length;
169
+ hash.update(chunk);
170
+ }
171
+ return { size, sha256: hash.digest("hex") };
172
+ }
173
+ finally {
174
+ await file.close();
175
+ }
176
+ };
177
+ const onlyKeys = (value, keys) => Object.keys(value).every((key) => keys.includes(key));
178
+ const nullableText = (value) => value === null || typeof value === "string";
179
+ const nullableTime = (value) => value === null ||
180
+ (typeof value === "string" && Number.isFinite(Date.parse(value)) && new Date(value).toISOString() === value);
181
+ const readManifest = async (path, signal) => {
182
+ checkCancelled(signal);
183
+ let file;
184
+ try {
185
+ file = await localFile(path);
186
+ }
187
+ catch (error) {
188
+ if (missing(error))
189
+ return null;
190
+ throw error;
191
+ }
192
+ try {
193
+ if ((await file.stat()).size > 1048576)
194
+ throw new Error("manifest size");
195
+ const content = await file.readFile("utf8");
196
+ checkCancelled(signal);
197
+ const value = JSON.parse(content);
198
+ if (value.version !== 1 ||
199
+ !string(value.meeting?.uuid) ||
200
+ !string(value.meeting.id) ||
201
+ !Array.isArray(value.files) ||
202
+ !onlyKeys(value, ["version", "meeting", "files"]) ||
203
+ !onlyKeys(value.meeting, ["id", "uuid", "title", "startedAt"]) ||
204
+ !nullableText(value.meeting.title) ||
205
+ !nullableTime(value.meeting.startedAt))
206
+ throw new Error("manifest shape");
207
+ const ids = new Set();
208
+ const files = value.files.map((entry) => {
209
+ if (!onlyKeys(entry, ["id", "path", "size", "sha256", "remoteSize", "type", "format", "startedAt", "endedAt"]) ||
210
+ !string(entry.type) ||
211
+ !nullableText(entry.format) ||
212
+ !nullableTime(entry.startedAt) ||
213
+ !nullableTime(entry.endedAt) ||
214
+ !string(entry.id) ||
215
+ ids.has(entry.id) ||
216
+ !/^[a-f0-9]{64}-[a-f0-9]{64}\.(mp4|m4a|mp3|wav|vtt|txt|json|bin)$/.test(entry.path) ||
217
+ !/^[a-f0-9]{64}$/.test(entry.sha256) ||
218
+ !Number.isSafeInteger(entry.size) ||
219
+ entry.size < 0 ||
220
+ (entry.remoteSize !== null && (!Number.isSafeInteger(entry.remoteSize) || entry.remoteSize < 0)) ||
221
+ entry.path !== filename(value.meeting.uuid, { id: entry.id, format: entry.format }))
222
+ throw new Error("manifest file");
223
+ ids.add(entry.id);
224
+ return {
225
+ id: entry.id,
226
+ path: entry.path,
227
+ size: entry.size,
228
+ sha256: entry.sha256,
229
+ remoteSize: entry.remoteSize ?? null,
230
+ type: string(entry.type) ?? "unknown",
231
+ format: string(entry.format),
232
+ startedAt: string(entry.startedAt),
233
+ endedAt: string(entry.endedAt),
234
+ };
235
+ });
236
+ if (!path.endsWith(manifestName(value.meeting.uuid)))
237
+ throw new Error("manifest identity");
238
+ return {
239
+ version: 1,
240
+ meeting: {
241
+ id: value.meeting.id,
242
+ uuid: value.meeting.uuid,
243
+ title: string(value.meeting.title),
244
+ startedAt: string(value.meeting.startedAt),
245
+ },
246
+ files,
247
+ };
248
+ }
249
+ catch {
250
+ checkCancelled(signal);
251
+ throw new ZoomError("validation_error", "archive manifest is invalid");
252
+ }
253
+ finally {
254
+ await file.close();
255
+ }
256
+ };
257
+ const writeManifest = async (root, manifest) => {
258
+ const temp = join(root, `.zoom-manifest-${randomUUID()}.tmp`);
259
+ const file = await open(temp, "wx", 0o600);
260
+ try {
261
+ try {
262
+ await file.writeFile(`${JSON.stringify(manifest, null, 2)}\n`);
263
+ await file.sync();
264
+ }
265
+ finally {
266
+ await file.close();
267
+ }
268
+ await rename(temp, join(root, manifestName(manifest.meeting.uuid)));
269
+ }
270
+ finally {
271
+ await unlink(temp).catch(() => undefined);
272
+ }
273
+ };
274
+ const targetUrl = (input, base) => {
275
+ let target;
276
+ try {
277
+ target = new URL(input, base);
278
+ }
279
+ catch {
280
+ throw new ZoomError("invalid_response", "Zoom returned an unexpected recording download host");
281
+ }
282
+ if (target.protocol !== "https:" ||
283
+ target.username ||
284
+ target.password ||
285
+ (target.port && target.port !== "443") ||
286
+ !/(^|\.)zoom\.(us|com)$/.test(target.hostname))
287
+ throw new ZoomError("invalid_response", "Zoom returned an unexpected recording download host");
288
+ return target;
289
+ };
290
+ class DownloadFailure extends ZoomError {
291
+ response;
292
+ constructor(response) {
293
+ super(statusToCode(response.status), `Recording download failed (HTTP ${response.status})`);
294
+ this.response = response;
295
+ }
296
+ }
297
+ const transfer = async (remote, url, accessToken, path, maxBytes, format, signal) => {
298
+ let target = targetUrl(url);
299
+ let response;
300
+ for (let redirects = 0;; redirects++) {
301
+ response = await remote.get(target, accessToken, signal, false);
302
+ if (![301, 302, 303, 307, 308].includes(response.status))
303
+ break;
304
+ const location = response.headers.get("location");
305
+ await response.body?.cancel();
306
+ if (!location || redirects >= 5)
307
+ throw new ZoomError("invalid_response", "Zoom returned invalid recording redirects");
308
+ target = targetUrl(location, target);
309
+ }
310
+ if (!response.ok) {
311
+ await response.body?.cancel();
312
+ throw new DownloadFailure(response);
313
+ }
314
+ if (!response.body ||
315
+ response.status === 206 ||
316
+ /\btext\/html\b/i.test(response.headers.get("content-type") ?? "") ||
317
+ (format?.toUpperCase() !== "JSON" && /\bapplication\/json\b/i.test(response.headers.get("content-type") ?? ""))) {
318
+ await response.body?.cancel();
319
+ throw new ZoomError("invalid_response", "Zoom returned an unexpected recording body");
320
+ }
321
+ const file = await open(path, "wx", 0o600);
322
+ const hash = createHash("sha256");
323
+ const reader = response.body.getReader();
324
+ const abortReader = () => {
325
+ void reader.cancel().catch(() => undefined);
326
+ };
327
+ signal.addEventListener("abort", abortReader, { once: true });
328
+ let size = 0;
329
+ try {
330
+ for (;;) {
331
+ checkCancelled(signal);
332
+ let chunk;
333
+ try {
334
+ chunk = await reader.read();
335
+ }
336
+ catch {
337
+ throw new ZoomError("network_error", "Recording download could not be completed");
338
+ }
339
+ checkCancelled(signal);
340
+ const { done, value } = chunk;
341
+ if (done)
342
+ break;
343
+ size += value.byteLength;
344
+ if (size > maxBytes)
345
+ throw new ZoomError("invalid_response", "recording exceeds the configured download size limit");
346
+ hash.update(value);
347
+ // FileHandle.write may perform a short write even for a buffered chunk.
348
+ let offset = 0;
349
+ while (offset < value.length)
350
+ offset += (await file.write(value, offset, value.length - offset)).bytesWritten;
351
+ }
352
+ const advertised = response.headers.get("content-length");
353
+ if (advertised !== null && (!/^\d+$/.test(advertised) || Number(advertised) !== size))
354
+ throw new ZoomError("invalid_response", "recording download size does not match its response");
355
+ await file.sync();
356
+ return { size, sha256: hash.digest("hex") };
357
+ }
358
+ finally {
359
+ signal.removeEventListener("abort", abortReader);
360
+ await reader.cancel().catch(() => undefined);
361
+ reader.releaseLock();
362
+ await file.close();
363
+ }
364
+ };
365
+ export const archiveRecording = async (remote, meeting, urls, options) => {
366
+ const signal = operationSignal(options.signal);
367
+ checkCancelled(signal);
368
+ const maxBytes = validateDownloadOptions(options);
369
+ if (options.fileIds?.some((id) => !meeting.assets.some((asset) => asset.id === id)))
370
+ throw new ZoomError("validation_error", "requested recording file was not found");
371
+ let lock;
372
+ let root = "";
373
+ try {
374
+ await mkdir(options.destination, { recursive: true });
375
+ root = await realpath(options.destination);
376
+ lock = await acquireArchiveLock(root);
377
+ const manifestPath = join(root, manifestName(meeting.uuid));
378
+ const previous = await readManifest(manifestPath, signal);
379
+ const manifest = previous ?? {
380
+ version: 1,
381
+ meeting: { id: meeting.id, uuid: meeting.uuid, title: meeting.title, startedAt: meeting.startedAt },
382
+ files: [],
383
+ };
384
+ const report = { uuid: meeting.uuid, manifestPath, downloaded: [], skipped: [], unavailable: [] };
385
+ for (const asset of meeting.assets) {
386
+ checkCancelled(signal);
387
+ if (options.fileIds && (asset.id === null || !options.fileIds.includes(asset.id)))
388
+ continue;
389
+ if (!asset.available || asset.id === null) {
390
+ report.unavailable.push(asset);
391
+ continue;
392
+ }
393
+ const path = filename(meeting.uuid, asset);
394
+ const existing = manifest.files.find((file) => file.id === asset.id);
395
+ if (existing) {
396
+ const local = await fingerprint(join(root, existing.path), signal);
397
+ if (existing.path !== path ||
398
+ existing.remoteSize !== asset.size ||
399
+ existing.startedAt !== asset.startedAt ||
400
+ existing.endedAt !== asset.endedAt ||
401
+ existing.size !== local.size ||
402
+ existing.sha256 !== local.sha256)
403
+ throw new ZoomError("validation_error", "existing recording has changed; choose a new archive destination");
404
+ report.skipped.push(existing);
405
+ continue;
406
+ }
407
+ try {
408
+ await lstat(join(root, path));
409
+ throw new ZoomError("validation_error", "recording path already exists without a verified manifest");
410
+ }
411
+ catch (error) {
412
+ if (!missing(error))
413
+ throw error;
414
+ }
415
+ const temp = join(root, `.zoom-download-${randomUUID()}.part`);
416
+ const tokens = await remote.tokens.tokens();
417
+ let result;
418
+ for (let attempt = 0;; attempt++) {
419
+ try {
420
+ result = await transfer(remote, urls.get(asset.id) ?? "", tokens.accessToken, temp, maxBytes, asset.format, signal);
421
+ if (asset.size !== null && result.size !== asset.size)
422
+ throw new ZoomError("invalid_response", "recording download size does not match Zoom metadata");
423
+ checkCancelled(signal);
424
+ await link(temp, join(root, path));
425
+ break;
426
+ }
427
+ catch (error) {
428
+ await unlink(temp).catch(() => undefined);
429
+ checkCancelled(signal);
430
+ const retryable = error instanceof DownloadFailure
431
+ ? retryableStatus(error.response.status)
432
+ : error instanceof ZoomError && error.code === "network_error";
433
+ if (attempt >= 2 ||
434
+ !retryable ||
435
+ !(await remote.pause(error instanceof DownloadFailure ? error.response : null, attempt, signal)))
436
+ throw error;
437
+ }
438
+ }
439
+ await unlink(temp);
440
+ const entry = {
441
+ id: asset.id,
442
+ path,
443
+ ...result,
444
+ remoteSize: asset.size,
445
+ type: asset.type,
446
+ format: asset.format,
447
+ startedAt: asset.startedAt,
448
+ endedAt: asset.endedAt,
449
+ };
450
+ manifest.files.push(entry);
451
+ await writeManifest(root, manifest);
452
+ report.downloaded.push(entry);
453
+ }
454
+ if (!previous)
455
+ await writeManifest(root, manifest);
456
+ return report;
457
+ }
458
+ catch (error) {
459
+ checkCancelled(signal);
460
+ if (error instanceof ZoomError)
461
+ throw error;
462
+ throw new ZoomError("provider_error", "archive operation could not be completed");
463
+ }
464
+ finally {
465
+ if (root && !lock)
466
+ await rmdir(join(root, locksFolder)).catch(() => undefined);
467
+ if (lock) {
468
+ await unlink(lock);
469
+ await rmdir(join(root, locksFolder)).catch(() => undefined);
470
+ }
471
+ }
472
+ };
473
+ export const inspectArchive = async (destination, options = {}) => {
474
+ checkCancelled(options.signal);
475
+ try {
476
+ const root = await realpath(destination);
477
+ const names = (await readdir(root)).filter((name) => /^\.zoom-archive-[a-f0-9]{64}\.json$/.test(name)).sort();
478
+ const manifests = [];
479
+ for (const name of names) {
480
+ checkCancelled(options.signal);
481
+ const manifest = await readManifest(join(root, name), options.signal);
482
+ if (manifest)
483
+ manifests.push(manifest);
484
+ }
485
+ return manifests;
486
+ }
487
+ catch (error) {
488
+ checkCancelled(options.signal);
489
+ if (error instanceof ZoomError)
490
+ throw error;
491
+ throw new ZoomError("configuration_error", "archive destination could not be read");
492
+ }
493
+ };
494
+ export const verifyArchive = async (destination, options = {}) => {
495
+ checkCancelled(options.signal);
496
+ const manifests = await inspectArchive(destination, options);
497
+ const root = await realpath(destination);
498
+ const result = [];
499
+ for (const manifest of manifests)
500
+ for (const file of manifest.files) {
501
+ checkCancelled(options.signal);
502
+ let valid = false;
503
+ try {
504
+ const local = await fingerprint(join(root, file.path), options.signal);
505
+ valid = local.size === file.size && local.sha256 === file.sha256;
506
+ }
507
+ catch {
508
+ checkCancelled(options.signal);
509
+ }
510
+ result.push({
511
+ manifestPath: join(destination, manifestName(manifest.meeting.uuid)),
512
+ id: file.id,
513
+ path: file.path,
514
+ valid,
515
+ });
516
+ }
517
+ return result;
518
+ };
519
+ //# sourceMappingURL=recording-archive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording-archive.js","sourceRoot":"","sources":["../src/recording-archive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { ArchiveReport, DownloadOptions, RecordingMeeting, ZoomRecordings } from "./recordings.js";
2
+ export interface ArchiveSyncOptions extends Omit<DownloadOptions, "fileIds"> {
3
+ from: string;
4
+ to: string;
5
+ }
6
+ export interface ArchiveSyncReceipt {
7
+ window: {
8
+ from: string;
9
+ to: string;
10
+ };
11
+ meeting: Pick<RecordingMeeting, "id" | "uuid" | "title">;
12
+ archive: ArchiveReport;
13
+ }
14
+ export declare function syncRecordingArchive(recordings: Pick<ZoomRecordings, "list" | "download">, options: ArchiveSyncOptions): AsyncGenerator<ArchiveSyncReceipt, void, void>;
15
+ //# sourceMappingURL=recording-sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording-sync.d.ts","sourceRoot":"","sources":["../src/recording-sync.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAGvG,MAAM,WAAW,kBAAmB,SAAQ,IAAI,CAAC,eAAe,EAAE,SAAS,CAAC;IAC1E,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;CACX;AACD,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAA;IACpC,OAAO,EAAE,IAAI,CAAC,gBAAgB,EAAE,IAAI,GAAG,MAAM,GAAG,OAAO,CAAC,CAAA;IACxD,OAAO,EAAE,aAAa,CAAA;CACvB;AAUD,wBAAuB,oBAAoB,CACzC,UAAU,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,UAAU,CAAC,EACrD,OAAO,EAAE,kBAAkB,GAC1B,cAAc,CAAC,kBAAkB,EAAE,IAAI,EAAE,IAAI,CAAC,CAsChD"}
@@ -0,0 +1,49 @@
1
+ import { checkCancelled, ZoomError } from "./errors.js";
2
+ import { validateDownloadOptions } from "./recording-archive.js";
3
+ import { operationSignal } from "./remote-http.js";
4
+ const date = (value) => {
5
+ if (typeof value !== "string" || !/^\d{4}-\d{2}-\d{2}$/.test(value))
6
+ throw new ZoomError("validation_error", "archive dates must be valid YYYY-MM-DD dates");
7
+ const result = new Date(`${value}T00:00:00Z`);
8
+ if (!Number.isFinite(result.getTime()) || result.toISOString().slice(0, 10) !== value)
9
+ throw new ZoomError("validation_error", "archive dates must be valid YYYY-MM-DD dates");
10
+ return result;
11
+ };
12
+ const label = (value) => value.toISOString().slice(0, 10);
13
+ export async function* syncRecordingArchive(recordings, options) {
14
+ const from = date(options.from);
15
+ const to = date(options.to);
16
+ const anniversary = new Date(from);
17
+ const lastDay = new Date(from);
18
+ lastDay.setUTCFullYear(from.getUTCFullYear() + 10, from.getUTCMonth() + 1, 0);
19
+ anniversary.setUTCFullYear(from.getUTCFullYear() + 10, from.getUTCMonth(), Math.min(from.getUTCDate(), lastDay.getUTCDate()));
20
+ if (to < from || to > anniversary)
21
+ throw new ZoomError("validation_error", "archive date range must be ordered and at most ten calendar years");
22
+ validateDownloadOptions(options);
23
+ const signal = operationSignal(options.signal);
24
+ const seen = new Set();
25
+ let cursor = from;
26
+ while (cursor <= to) {
27
+ checkCancelled(signal);
28
+ const end = new Date(cursor);
29
+ end.setUTCMonth(end.getUTCMonth() + 1, 0);
30
+ const upper = new Date(Math.min(end.getTime(), to.getTime()));
31
+ const window = { from: label(cursor), to: label(upper) };
32
+ const meetings = await recordings.list({ ...window, signal });
33
+ for (const meeting of meetings) {
34
+ checkCancelled(signal);
35
+ if (seen.has(meeting.uuid))
36
+ continue;
37
+ seen.add(meeting.uuid);
38
+ const archive = await recordings.download(meeting.uuid, {
39
+ destination: options.destination,
40
+ signal,
41
+ ...(options.maxBytes === undefined ? {} : { maxBytes: options.maxBytes }),
42
+ });
43
+ yield { window, meeting: { id: meeting.id, uuid: meeting.uuid, title: meeting.title }, archive };
44
+ }
45
+ cursor = new Date(upper);
46
+ cursor.setUTCDate(cursor.getUTCDate() + 1);
47
+ }
48
+ }
49
+ //# sourceMappingURL=recording-sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recording-sync.js","sourceRoot":"","sources":["../src/recording-sync.ts"],"names":[],"mappings":"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"}