@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/files.js
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { readdir, readFile } from "node:fs/promises";
|
|
3
|
+
import { basename, join } from "node:path";
|
|
4
|
+
import { parseVtt } from "@wirecat/cli-meetings";
|
|
5
|
+
import { ZoomError } from "./errors.js";
|
|
6
|
+
const localTimestamp = (year, month, day, hour, minute, timezone) => {
|
|
7
|
+
const target = Date.UTC(year, month - 1, day, hour, minute);
|
|
8
|
+
const date = new Date(target);
|
|
9
|
+
if (date.getUTCFullYear() !== year ||
|
|
10
|
+
date.getUTCMonth() !== month - 1 ||
|
|
11
|
+
date.getUTCDate() !== day ||
|
|
12
|
+
hour > 23 ||
|
|
13
|
+
minute > 59)
|
|
14
|
+
throw new ZoomError("validation_error", "transcript filename contains an invalid date or time");
|
|
15
|
+
let formatter;
|
|
16
|
+
try {
|
|
17
|
+
formatter = new Intl.DateTimeFormat("en-GB", {
|
|
18
|
+
timeZone: timezone,
|
|
19
|
+
year: "numeric",
|
|
20
|
+
month: "2-digit",
|
|
21
|
+
day: "2-digit",
|
|
22
|
+
hour: "2-digit",
|
|
23
|
+
minute: "2-digit",
|
|
24
|
+
hourCycle: "h23",
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
throw new ZoomError("validation_error", "expected a valid IANA timezone");
|
|
29
|
+
}
|
|
30
|
+
const wallTime = (instant) => {
|
|
31
|
+
const parts = Object.fromEntries(formatter.formatToParts(instant).map((part) => [part.type, part.value]));
|
|
32
|
+
return Date.UTC(Number(parts.year), Number(parts.month) - 1, Number(parts.day), Number(parts.hour), Number(parts.minute));
|
|
33
|
+
};
|
|
34
|
+
const possibilities = new Set();
|
|
35
|
+
for (const delta of [-86400000, 0, 86400000]) {
|
|
36
|
+
const probe = target + delta;
|
|
37
|
+
const candidate = target - (wallTime(probe) - probe);
|
|
38
|
+
if (wallTime(candidate) === target)
|
|
39
|
+
possibilities.add(candidate);
|
|
40
|
+
}
|
|
41
|
+
if (possibilities.size !== 1)
|
|
42
|
+
throw new ZoomError("validation_error", "transcript filename time is ambiguous or nonexistent in the selected timezone");
|
|
43
|
+
return [...possibilities][0] ?? target;
|
|
44
|
+
};
|
|
45
|
+
export const fileMeeting = (name, timezone = "UTC") => {
|
|
46
|
+
const match = /^(\d{4})-(\d{2})-(\d{2})_(\d{2})(\d{2})_(.+)\.vtt$/i.exec(basename(name));
|
|
47
|
+
if (!match)
|
|
48
|
+
throw new ZoomError("validation_error", "expected a transcript named YYYY-MM-DD_HHMM_topic.vtt");
|
|
49
|
+
const [, year, month, day, hour, minute, topic = ""] = match;
|
|
50
|
+
const startedAt = localTimestamp(Number(year), Number(month), Number(day), Number(hour), Number(minute), timezone);
|
|
51
|
+
const slug = topic.normalize("NFC");
|
|
52
|
+
const id = `file:${createHash("sha256").update(`${year}-${month}-${day}_${hour}${minute}_${slug}`).digest("hex")}`;
|
|
53
|
+
const seriesId = `file:${slug}`;
|
|
54
|
+
const title = slug.replace(/-/g, " ");
|
|
55
|
+
return {
|
|
56
|
+
series: { id: seriesId, provider: "zoom", title },
|
|
57
|
+
occurrence: { id, seriesId, title, startedAt: new Date(startedAt).toISOString(), endedAt: null },
|
|
58
|
+
timezone,
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
export const importFile = (file, accountId, timezone = "UTC") => {
|
|
62
|
+
const source = fileMeeting(file.name, timezone);
|
|
63
|
+
return {
|
|
64
|
+
content: file.content,
|
|
65
|
+
source: "file",
|
|
66
|
+
meeting: {
|
|
67
|
+
accountId,
|
|
68
|
+
externalId: source.occurrence.id,
|
|
69
|
+
title: source.occurrence.title,
|
|
70
|
+
description: null,
|
|
71
|
+
location: null,
|
|
72
|
+
joinUrl: null,
|
|
73
|
+
startedAt: Date.parse(source.occurrence.startedAt),
|
|
74
|
+
endedAt: null,
|
|
75
|
+
durationMs: null,
|
|
76
|
+
timezone,
|
|
77
|
+
hostIdentityId: null,
|
|
78
|
+
participantsCount: null,
|
|
79
|
+
metadata: null,
|
|
80
|
+
deletedAt: null,
|
|
81
|
+
series: {
|
|
82
|
+
externalId: source.occurrence.seriesId,
|
|
83
|
+
title: source.series?.title ?? null,
|
|
84
|
+
description: null,
|
|
85
|
+
kind: null,
|
|
86
|
+
recurrence: null,
|
|
87
|
+
hostIdentityId: null,
|
|
88
|
+
joinUrl: null,
|
|
89
|
+
metadata: null,
|
|
90
|
+
deletedAt: null,
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
};
|
|
95
|
+
const indexDownloadedFiles = (files, timezone) => {
|
|
96
|
+
const result = new Map();
|
|
97
|
+
for (const file of [...files].sort((a, b) => a.name.localeCompare(b.name))) {
|
|
98
|
+
const meeting = fileMeeting(file.name, timezone);
|
|
99
|
+
const existing = result.get(meeting.occurrence.id);
|
|
100
|
+
if (existing && existing.file.content !== file.content)
|
|
101
|
+
throw new ZoomError("validation_error", "conflicting transcript files have the same occurrence key");
|
|
102
|
+
if (!existing)
|
|
103
|
+
result.set(meeting.occurrence.id, { meeting, file });
|
|
104
|
+
}
|
|
105
|
+
return result;
|
|
106
|
+
};
|
|
107
|
+
export const validateDownloadedFiles = (files, timezone = "UTC") => [...indexDownloadedFiles(files, timezone).values()].map(({ file }) => file);
|
|
108
|
+
export const readDownloadedFiles = async (folder) => {
|
|
109
|
+
const entries = await readdir(folder, { withFileTypes: true });
|
|
110
|
+
const files = await Promise.all(entries
|
|
111
|
+
.filter((entry) => entry.isFile() && /\.vtt$/i.test(entry.name))
|
|
112
|
+
.sort((a, b) => a.name.localeCompare(b.name))
|
|
113
|
+
.map(async (entry) => ({ name: entry.name, content: await readFile(join(folder, entry.name), "utf8") })));
|
|
114
|
+
return validateDownloadedFiles(files);
|
|
115
|
+
};
|
|
116
|
+
export class FilesSource {
|
|
117
|
+
filesData;
|
|
118
|
+
timezone;
|
|
119
|
+
provider = "zoom";
|
|
120
|
+
transcriptFormat = "vtt";
|
|
121
|
+
name = "file";
|
|
122
|
+
constructor(filesData, timezone = "UTC") {
|
|
123
|
+
this.filesData = filesData;
|
|
124
|
+
this.timezone = timezone;
|
|
125
|
+
}
|
|
126
|
+
indexed;
|
|
127
|
+
index() {
|
|
128
|
+
if (this.indexed)
|
|
129
|
+
return this.indexed;
|
|
130
|
+
this.indexed = indexDownloadedFiles(this.filesData, this.timezone);
|
|
131
|
+
return this.indexed;
|
|
132
|
+
}
|
|
133
|
+
async meetings(since) {
|
|
134
|
+
const lower = Date.parse(since);
|
|
135
|
+
if (!Number.isFinite(lower))
|
|
136
|
+
throw new ZoomError("validation_error", "expected an ISO since timestamp");
|
|
137
|
+
return [...this.index().values()]
|
|
138
|
+
.map(({ meeting }) => meeting)
|
|
139
|
+
.filter((m) => Date.parse(m.occurrence.startedAt) >= lower);
|
|
140
|
+
}
|
|
141
|
+
async transcript(id) {
|
|
142
|
+
const file = this.index().get(id)?.file;
|
|
143
|
+
return file ? parseVtt(file.content) : null;
|
|
144
|
+
}
|
|
145
|
+
async participants() {
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
async chat() {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
async summary() {
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
async files() {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"files.js","sourceRoot":"","sources":["../src/files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AACpD,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,WAAW,CAAA;AAC1C,OAAO,EAAuC,QAAQ,EAAsB,MAAM,uBAAuB,CAAA;AACzG,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAMvC,MAAM,cAAc,GAAG,CACrB,IAAY,EACZ,KAAa,EACb,GAAW,EACX,IAAY,EACZ,MAAc,EACd,QAAgB,EACR,EAAE;IACV,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IAC3D,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,CAAA;IAC7B,IACE,IAAI,CAAC,cAAc,EAAE,KAAK,IAAI;QAC9B,IAAI,CAAC,WAAW,EAAE,KAAK,KAAK,GAAG,CAAC;QAChC,IAAI,CAAC,UAAU,EAAE,KAAK,GAAG;QACzB,IAAI,GAAG,EAAE;QACT,MAAM,GAAG,EAAE;QAEX,MAAM,IAAI,SAAS,CAAC,kBAAkB,EAAE,sDAAsD,CAAC,CAAA;IACjG,IAAI,SAA8B,CAAA;IAClC,IAAI,CAAC;QACH,SAAS,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE;YAC3C,QAAQ,EAAE,QAAQ;YAClB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,KAAK;SACjB,CAAC,CAAA;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,SAAS,CAAC,kBAAkB,EAAE,gCAAgC,CAAC,CAAA;IAC3E,CAAC;IACD,MAAM,QAAQ,GAAG,CAAC,OAAe,EAAE,EAAE;QACnC,MAAM,KAAK,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;QACzG,OAAO,IAAI,CAAC,GAAG,CACb,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAClB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,EACvB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EACjB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAClB,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CACrB,CAAA;IACH,CAAC,CAAA;IACD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAA;IACvC,KAAK,MAAM,KAAK,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,GAAG,KAAK,CAAA;QAC5B,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,CAAA;QACpD,IAAI,QAAQ,CAAC,SAAS,CAAC,KAAK,MAAM;YAAE,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;IAClE,CAAC;IACD,IAAI,aAAa,CAAC,IAAI,KAAK,CAAC;QAC1B,MAAM,IAAI,SAAS,CACjB,kBAAkB,EAClB,+EAA+E,CAChF,CAAA;IACH,OAAO,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAA;AACxC,CAAC,CAAA;AACD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,QAAQ,GAAG,KAAK,EAAiB,EAAE;IAC3E,MAAM,KAAK,GAAG,qDAAqD,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAA;IACxF,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,SAAS,CAAC,kBAAkB,EAAE,uDAAuD,CAAC,CAAA;IAC5G,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,GAAG,EAAE,CAAC,GAAG,KAAK,CAAA;IAC5D,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,CAAA;IAClH,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;IACnC,MAAM,EAAE,GAAG,QAAQ,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,IAAI,IAAI,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAA;IAClH,MAAM,QAAQ,GAAG,QAAQ,IAAI,EAAE,CAAA;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IACrC,OAAO;QACL,MAAM,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;QACjD,UAAU,EAAE,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE;QAChG,QAAQ;KACT,CAAA;AACH,CAAC,CAAA;AACD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAoB,EAAE,SAAiB,EAAE,QAAQ,GAAG,KAAK,EAAc,EAAE;IAClG,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;IAC/C,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,SAAS;YACT,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE;YAChC,KAAK,EAAE,MAAM,CAAC,UAAU,CAAC,KAAK;YAC9B,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,IAAI;YACd,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;YAClD,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;YAChB,QAAQ;YACR,cAAc,EAAE,IAAI;YACpB,iBAAiB,EAAE,IAAI;YACvB,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,IAAI;YACf,MAAM,EAAE;gBACN,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ;gBACtC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,IAAI;gBACnC,WAAW,EAAE,IAAI;gBACjB,IAAI,EAAE,IAAI;gBACV,UAAU,EAAE,IAAI;gBAChB,cAAc,EAAE,IAAI;gBACpB,OAAO,EAAE,IAAI;gBACb,QAAQ,EAAE,IAAI;gBACd,SAAS,EAAE,IAAI;aAChB;SACF;KACF,CAAA;AACH,CAAC,CAAA;AACD,MAAM,oBAAoB,GAAG,CAC3B,KAAuB,EACvB,QAAgB,EAC+C,EAAE;IACjE,MAAM,MAAM,GAAG,IAAI,GAAG,EAA4D,CAAA;IAClF,KAAK,MAAM,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC3E,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAChD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QAClD,IAAI,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO;YACpD,MAAM,IAAI,SAAS,CAAC,kBAAkB,EAAE,2DAA2D,CAAC,CAAA;QACtG,IAAI,CAAC,QAAQ;YAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IACrE,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AACD,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,KAAuB,EAAE,QAAQ,GAAG,KAAK,EAAoB,EAAE,CACrG,CAAC,GAAG,oBAAoB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,CAAA;AAC7E,MAAM,CAAC,MAAM,mBAAmB,GAAG,KAAK,EAAE,MAAc,EAA6B,EAAE;IACrF,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9D,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,OAAO;SACJ,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SAC/D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAC5C,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAC3G,CAAA;IACD,OAAO,uBAAuB,CAAC,KAAK,CAAC,CAAA;AACvC,CAAC,CAAA;AACD,MAAM,OAAO,WAAW;IAKH,SAAS;IACT,QAAQ;IALlB,QAAQ,GAAG,MAAM,CAAA;IACjB,gBAAgB,GAAG,KAAK,CAAA;IACxB,IAAI,GAAG,MAAM,CAAA;IACtB,YACmB,SAA2B,EAC3B,QAAQ,GAAG,KAAK;yBADhB,SAAS;wBACT,QAAQ;IACxB,CAAC;IACI,OAAO,CAA2E;IAClF,KAAK;QACX,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAC,OAAO,CAAA;QACrC,IAAI,CAAC,OAAO,GAAG,oBAAoB,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QAClE,OAAO,IAAI,CAAC,OAAO,CAAA;IACrB,CAAC;IACD,KAAK,CAAC,QAAQ,CAAC,KAAa;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,MAAM,IAAI,SAAS,CAAC,kBAAkB,EAAE,iCAAiC,CAAC,CAAA;QACvG,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,CAAC;aAC9B,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,OAAO,CAAC;aAC7B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,CAAA;IAC/D,CAAC;IACD,KAAK,CAAC,UAAU,CAAC,EAAU;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,IAAI,CAAA;QACvC,OAAO,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;IAC7C,CAAC;IACD,KAAK,CAAC,YAAY;QAChB,OAAO,IAAI,CAAA;IACb,CAAC;IACD,KAAK,CAAC,IAAI;QACR,OAAO,IAAI,CAAA;IACb,CAAC;IACD,KAAK,CAAC,OAAO;QACX,OAAO,IAAI,CAAA;IACb,CAAC;IACD,KAAK,CAAC,KAAK;QACT,OAAO,IAAI,CAAA;IACb,CAAC;CACF"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { encodeUuid, ZoomApiSource } from "./api.js";
|
|
2
|
+
export { profileAccountKey, readConfig, setConfig, type ZoomConfig } from "./config.js";
|
|
3
|
+
export { ZoomError } from "./errors.js";
|
|
4
|
+
export { type DownloadedFile, FilesSource, fileMeeting, importFile, readDownloadedFiles, validateDownloadedFiles, } from "./files.js";
|
|
5
|
+
export { type LoginOptions, login, REDIRECT } from "./login.js";
|
|
6
|
+
export { createProgram, type ProgramDeps, run, type StoreConnection, type StoreConnectRequest } from "./program.js";
|
|
7
|
+
export { TokenManager, type TokenOptions, type Tokens } from "./tokens.js";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAE,KAAK,UAAU,EAAE,MAAM,aAAa,CAAA;AACvF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EACL,KAAK,cAAc,EACnB,WAAW,EACX,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAE,KAAK,WAAW,EAAE,GAAG,EAAE,KAAK,eAAe,EAAE,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAA;AACnH,OAAO,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,KAAK,MAAM,EAAE,MAAM,aAAa,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export { encodeUuid, ZoomApiSource } from "./api.js";
|
|
2
|
+
export { profileAccountKey, readConfig, setConfig } from "./config.js";
|
|
3
|
+
export { ZoomError } from "./errors.js";
|
|
4
|
+
export { FilesSource, fileMeeting, importFile, readDownloadedFiles, validateDownloadedFiles, } from "./files.js";
|
|
5
|
+
export { login, REDIRECT } from "./login.js";
|
|
6
|
+
export { createProgram, run } from "./program.js";
|
|
7
|
+
export { TokenManager } from "./tokens.js";
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AACpD,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,SAAS,EAAmB,MAAM,aAAa,CAAA;AACvF,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AACvC,OAAO,EAEL,WAAW,EACX,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,YAAY,CAAA;AACnB,OAAO,EAAqB,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AAC/D,OAAO,EAAE,aAAa,EAAoB,GAAG,EAAkD,MAAM,cAAc,CAAA;AACnH,OAAO,EAAE,YAAY,EAAkC,MAAM,aAAa,CAAA"}
|
package/dist/login.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { TokenManager } from "./tokens.js";
|
|
2
|
+
export declare const REDIRECT = "https://wirecat.dev/zoom-callback";
|
|
3
|
+
export interface LoginOptions {
|
|
4
|
+
tokens: TokenManager;
|
|
5
|
+
openBrowser: (url: string) => Promise<void>;
|
|
6
|
+
readPaste?: (signal: AbortSignal) => Promise<string>;
|
|
7
|
+
showUrl?: (url: string) => void;
|
|
8
|
+
timeoutMs?: number;
|
|
9
|
+
}
|
|
10
|
+
export declare const login: (options: LoginOptions) => Promise<{
|
|
11
|
+
loggedIn: boolean;
|
|
12
|
+
scopes: string[];
|
|
13
|
+
}>;
|
|
14
|
+
//# sourceMappingURL=login.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE/C,eAAO,MAAM,QAAQ,sCAAsC,CAAA;AAC3D,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,YAAY,CAAA;IACpB,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC3C,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IACpD,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAA;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AACD,eAAO,MAAM,KAAK,YAAmB,YAAY;;;EA+EhD,CAAA"}
|
package/dist/login.js
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import { createServer } from "node:http";
|
|
3
|
+
import { ZoomError } from "./errors.js";
|
|
4
|
+
export const REDIRECT = "https://wirecat.dev/zoom-callback";
|
|
5
|
+
export const login = async (options) => {
|
|
6
|
+
const verifier = randomBytes(48).toString("base64url");
|
|
7
|
+
const challenge = createHash("sha256").update(verifier).digest("base64url");
|
|
8
|
+
const controller = new AbortController();
|
|
9
|
+
let state = "";
|
|
10
|
+
let accept = () => { };
|
|
11
|
+
let fail = () => { };
|
|
12
|
+
const codePromise = new Promise((resolve, reject) => {
|
|
13
|
+
accept = resolve;
|
|
14
|
+
fail = reject;
|
|
15
|
+
});
|
|
16
|
+
// Startup and paste can fail before the callback is awaited.
|
|
17
|
+
void codePromise.catch(() => { });
|
|
18
|
+
const server = createServer((request, response) => {
|
|
19
|
+
const query = new URL(request.url ?? "/", "http://127.0.0.1");
|
|
20
|
+
if (query.pathname !== "/callback") {
|
|
21
|
+
response.writeHead(404).end();
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
if (query.searchParams.get("state") !== state) {
|
|
25
|
+
response.writeHead(400).end("state does not match");
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const code = query.searchParams.get("code");
|
|
29
|
+
response.end("zm: received, you can close this tab");
|
|
30
|
+
if (code)
|
|
31
|
+
accept(code);
|
|
32
|
+
else
|
|
33
|
+
fail(new ZoomError("authentication_error", "Zoom login was not approved"));
|
|
34
|
+
});
|
|
35
|
+
const timer = setTimeout(() => fail(new ZoomError("authentication_error", "Zoom login timed out")), options.timeoutMs ?? 300000);
|
|
36
|
+
try {
|
|
37
|
+
await new Promise((resolve, reject) => {
|
|
38
|
+
server.once("error", reject);
|
|
39
|
+
server.listen(0, "127.0.0.1", resolve);
|
|
40
|
+
});
|
|
41
|
+
const address = server.address();
|
|
42
|
+
if (!address || typeof address === "string")
|
|
43
|
+
throw new ZoomError("configuration_error", "could not start the local login listener");
|
|
44
|
+
state = `${address.port}.${randomBytes(24).toString("base64url")}`;
|
|
45
|
+
const authorize = new URL("https://zoom.us/oauth/authorize");
|
|
46
|
+
authorize.search = new URLSearchParams({
|
|
47
|
+
response_type: "code",
|
|
48
|
+
client_id: options.tokens.options.clientId,
|
|
49
|
+
redirect_uri: REDIRECT,
|
|
50
|
+
code_challenge: challenge,
|
|
51
|
+
code_challenge_method: "S256",
|
|
52
|
+
state,
|
|
53
|
+
}).toString();
|
|
54
|
+
options.showUrl?.(authorize.toString());
|
|
55
|
+
const pastePromise = options.readPaste?.(controller.signal).then((text) => {
|
|
56
|
+
const query = new URLSearchParams(text.includes("?") ? text.slice(text.indexOf("?") + 1) : text);
|
|
57
|
+
if (query.get("state") !== state || !query.get("code"))
|
|
58
|
+
throw new ZoomError("authentication_error", "pasted login must contain the matching code and state");
|
|
59
|
+
return query.get("code") ?? "";
|
|
60
|
+
});
|
|
61
|
+
// Paste remains available if the browser cannot start or the callback cannot reach loopback.
|
|
62
|
+
void Promise.resolve()
|
|
63
|
+
.then(() => options.openBrowser(authorize.toString()))
|
|
64
|
+
.catch(() => {
|
|
65
|
+
if (!options.readPaste)
|
|
66
|
+
fail(new ZoomError("configuration_error", "could not open the browser; retry with --browser <program>"));
|
|
67
|
+
});
|
|
68
|
+
const code = await (pastePromise ? Promise.race([codePromise, pastePromise]) : codePromise);
|
|
69
|
+
controller.abort();
|
|
70
|
+
const tokens = await options.tokens.exchange({
|
|
71
|
+
grant_type: "authorization_code",
|
|
72
|
+
code,
|
|
73
|
+
redirect_uri: REDIRECT,
|
|
74
|
+
code_verifier: verifier,
|
|
75
|
+
});
|
|
76
|
+
return { loggedIn: true, scopes: tokens.scopes };
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
clearTimeout(timer);
|
|
80
|
+
controller.abort();
|
|
81
|
+
server.close();
|
|
82
|
+
server.closeAllConnections();
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../src/login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { type MeetingSource, type MeetingStore } from "@wirecat/cli-meetings";
|
|
2
|
+
import { Command } from "commander";
|
|
3
|
+
import { readDownloadedFiles } from "./files.js";
|
|
4
|
+
import type { TokenManager } from "./tokens.js";
|
|
5
|
+
export interface StoreConnection {
|
|
6
|
+
store: MeetingStore;
|
|
7
|
+
accountId: number;
|
|
8
|
+
close: () => Promise<void>;
|
|
9
|
+
}
|
|
10
|
+
export interface StoreConnectRequest {
|
|
11
|
+
profile: string;
|
|
12
|
+
externalId: string;
|
|
13
|
+
intent: "read" | "ingestion";
|
|
14
|
+
}
|
|
15
|
+
export interface ProgramDeps {
|
|
16
|
+
configPath: string;
|
|
17
|
+
tokens: TokenManager;
|
|
18
|
+
fetch: typeof fetch;
|
|
19
|
+
store?: MeetingStore;
|
|
20
|
+
accountId?: number;
|
|
21
|
+
connectStore?: (request: StoreConnectRequest) => Promise<StoreConnection>;
|
|
22
|
+
source?: MeetingSource;
|
|
23
|
+
readFiles?: typeof readDownloadedFiles;
|
|
24
|
+
openBrowser: (url: string, browser?: string) => Promise<void>;
|
|
25
|
+
readPaste?: (signal: AbortSignal) => Promise<string>;
|
|
26
|
+
data: (text: string) => void;
|
|
27
|
+
diagnostic: (text: string) => void;
|
|
28
|
+
now?: () => number;
|
|
29
|
+
}
|
|
30
|
+
export declare const createProgram: (deps: ProgramDeps) => Command;
|
|
31
|
+
export declare const run: (args: string[], deps: ProgramDeps) => Promise<number>;
|
|
32
|
+
//# sourceMappingURL=program.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program.d.ts","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,KAAK,aAAa,EAAE,KAAK,YAAY,EAAE,MAAM,uBAAuB,CAAA;AAE3F,OAAO,EAAE,OAAO,EAAkB,MAAM,WAAW,CAAA;AAInD,OAAO,EAA2B,mBAAmB,EAA2B,MAAM,YAAY,CAAA;AAElG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAG/C,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,YAAY,CAAA;IACnB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC3B;AACD,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,GAAG,WAAW,CAAA;CAC7B;AACD,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,YAAY,CAAA;IACpB,KAAK,EAAE,OAAO,KAAK,CAAA;IACnB,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,eAAe,CAAC,CAAA;IACzE,MAAM,CAAC,EAAE,aAAa,CAAA;IACtB,SAAS,CAAC,EAAE,OAAO,mBAAmB,CAAA;IACtC,WAAW,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;IAC7D,SAAS,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;IACpD,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAClC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AAwBD,eAAO,MAAM,aAAa,SAAU,WAAW,KAAG,OAuLjD,CAAA;AACD,eAAO,MAAM,GAAG,SAAgB,MAAM,EAAE,QAAQ,WAAW,KAAG,OAAO,CAAC,MAAM,CAqC3E,CAAA"}
|
package/dist/program.js
ADDED
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
import { MeetingError } from "@wirecat/cli-meetings";
|
|
2
|
+
import { addMeetingCommands } from "@wirecat/cli-meetings/cli";
|
|
3
|
+
import { Command, CommanderError } from "commander";
|
|
4
|
+
import { ZoomApiSource } from "./api.js";
|
|
5
|
+
import { profileAccountKey, readConfig, setConfig } from "./config.js";
|
|
6
|
+
import { ZoomError } from "./errors.js";
|
|
7
|
+
import { FilesSource, importFile, readDownloadedFiles, validateDownloadedFiles } from "./files.js";
|
|
8
|
+
import { login } from "./login.js";
|
|
9
|
+
import { VERSION } from "./version.js";
|
|
10
|
+
const unavailable = async () => {
|
|
11
|
+
throw new ZoomError("configuration_error", "the shared SQLite meeting store is not available yet");
|
|
12
|
+
};
|
|
13
|
+
const unavailableStore = {
|
|
14
|
+
saveMeeting: unavailable,
|
|
15
|
+
meetings: unavailable,
|
|
16
|
+
meeting: unavailable,
|
|
17
|
+
participants: unavailable,
|
|
18
|
+
search: unavailable,
|
|
19
|
+
events: unavailable,
|
|
20
|
+
eventCandidates: unavailable,
|
|
21
|
+
createEvent: unavailable,
|
|
22
|
+
createEventSeries: unavailable,
|
|
23
|
+
setEventSeries: unavailable,
|
|
24
|
+
linkMeeting: unavailable,
|
|
25
|
+
cursor: unavailable,
|
|
26
|
+
setCursor: unavailable,
|
|
27
|
+
};
|
|
28
|
+
const render = (data, format) => {
|
|
29
|
+
if (format === "jsonl" && typeof data === "object" && data !== null && "items" in data && Array.isArray(data.items))
|
|
30
|
+
return data.items.map((row) => `${JSON.stringify(row)}\n`).join("");
|
|
31
|
+
return `${JSON.stringify(data, null, format === "text" ? 2 : undefined)}\n`;
|
|
32
|
+
};
|
|
33
|
+
export const createProgram = (deps) => {
|
|
34
|
+
let config;
|
|
35
|
+
const getConfig = () => (config ??= readConfig(deps.configPath));
|
|
36
|
+
let connection;
|
|
37
|
+
let parsing = false;
|
|
38
|
+
let meetingOutput = [];
|
|
39
|
+
let selectedStore = deps.store;
|
|
40
|
+
let selectedAccountId = deps.accountId;
|
|
41
|
+
const requireAccount = () => {
|
|
42
|
+
if (!Number.isSafeInteger(selectedAccountId) || !selectedAccountId || selectedAccountId < 1)
|
|
43
|
+
throw new ZoomError("configuration_error", "the selected meeting account is unavailable");
|
|
44
|
+
return selectedAccountId;
|
|
45
|
+
};
|
|
46
|
+
const program = new Command()
|
|
47
|
+
.name("zm")
|
|
48
|
+
.version(VERSION)
|
|
49
|
+
.description("Zoom meeting transcripts and summaries")
|
|
50
|
+
.option("--json", "one JSON value")
|
|
51
|
+
.option("--jsonl", "one JSON object per item")
|
|
52
|
+
.option("--no-input", "disable interactive login")
|
|
53
|
+
.exitOverride()
|
|
54
|
+
.configureOutput({ writeOut: deps.data, writeErr: deps.diagnostic, outputError: () => { } });
|
|
55
|
+
program.hook("preAction", async (_root, action) => {
|
|
56
|
+
const config = getConfig();
|
|
57
|
+
const opts = action.optsWithGlobals();
|
|
58
|
+
if (opts.json && opts.jsonl)
|
|
59
|
+
throw new ZoomError("validation_error", "choose --json or --jsonl");
|
|
60
|
+
if (action.name() === "login" || action.parent?.name() === "config")
|
|
61
|
+
return;
|
|
62
|
+
if (!selectedStore) {
|
|
63
|
+
if (!deps.connectStore)
|
|
64
|
+
return unavailable();
|
|
65
|
+
if (!config.accountProfile)
|
|
66
|
+
throw new ZoomError("configuration_error", "select a local profile with zm config set account.profile <label>");
|
|
67
|
+
try {
|
|
68
|
+
connection = await deps.connectStore({
|
|
69
|
+
profile: config.accountProfile,
|
|
70
|
+
externalId: profileAccountKey(config.accountProfile),
|
|
71
|
+
intent: ["pull", "import"].includes(action.name()) ? "ingestion" : "read",
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
if (error instanceof ZoomError || error instanceof MeetingError)
|
|
76
|
+
throw error;
|
|
77
|
+
throw new ZoomError("configuration_error", "could not open the shared meeting store");
|
|
78
|
+
}
|
|
79
|
+
selectedStore = connection.store;
|
|
80
|
+
selectedAccountId = connection.accountId;
|
|
81
|
+
}
|
|
82
|
+
requireAccount();
|
|
83
|
+
});
|
|
84
|
+
const output = (value) => deps.data(render(value, program.opts().json ? "json" : program.opts().jsonl ? "jsonl" : "text"));
|
|
85
|
+
const cfg = program.command("config").description("local Zoom configuration");
|
|
86
|
+
cfg
|
|
87
|
+
.command("show")
|
|
88
|
+
.description("show local configuration")
|
|
89
|
+
.action(() => {
|
|
90
|
+
output(getConfig());
|
|
91
|
+
});
|
|
92
|
+
cfg
|
|
93
|
+
.command("set")
|
|
94
|
+
.description("set a configuration value")
|
|
95
|
+
.argument("<key>")
|
|
96
|
+
.argument("<value>")
|
|
97
|
+
.action((key, value) => {
|
|
98
|
+
output(setConfig(deps.configPath, key, value));
|
|
99
|
+
});
|
|
100
|
+
program
|
|
101
|
+
.command("login")
|
|
102
|
+
.description("log in to Zoom through your browser")
|
|
103
|
+
.option("--browser <program>", "browser program")
|
|
104
|
+
.action(async (opts) => {
|
|
105
|
+
const config = getConfig();
|
|
106
|
+
if (!config.clientId)
|
|
107
|
+
throw new ZoomError("configuration_error", "run zm config set zoom.clientId <Public Client ID> first");
|
|
108
|
+
if (program.opts().input === false)
|
|
109
|
+
throw new ZoomError("configuration_error", "login requires browser approval; remove --no-input");
|
|
110
|
+
output(await login({
|
|
111
|
+
tokens: deps.tokens,
|
|
112
|
+
openBrowser: (url) => deps.openBrowser(url, opts.browser),
|
|
113
|
+
readPaste: deps.readPaste,
|
|
114
|
+
showUrl: (url) => deps.diagnostic(`Open this URL to approve Zoom login:\n${url}\n`),
|
|
115
|
+
}));
|
|
116
|
+
});
|
|
117
|
+
let activeSource;
|
|
118
|
+
const getSource = () => {
|
|
119
|
+
if (deps.source)
|
|
120
|
+
return Promise.resolve(deps.source);
|
|
121
|
+
activeSource ??= (async () => {
|
|
122
|
+
const config = getConfig();
|
|
123
|
+
if (config.source === "api")
|
|
124
|
+
return new ZoomApiSource(deps.tokens, deps.fetch);
|
|
125
|
+
if (!config.filesFolder)
|
|
126
|
+
throw new ZoomError("configuration_error", "set files.folder before pulling from files");
|
|
127
|
+
return new FilesSource(await (deps.readFiles ?? readDownloadedFiles)(config.filesFolder), config.filesTimezone);
|
|
128
|
+
})();
|
|
129
|
+
return activeSource;
|
|
130
|
+
};
|
|
131
|
+
const source = {
|
|
132
|
+
get provider() {
|
|
133
|
+
return deps.source?.provider ?? "zoom";
|
|
134
|
+
},
|
|
135
|
+
get name() {
|
|
136
|
+
return deps.source?.name ?? (getConfig().source === "api" ? "api" : "file");
|
|
137
|
+
},
|
|
138
|
+
get transcriptFormat() {
|
|
139
|
+
return deps.source ? deps.source.transcriptFormat : "vtt";
|
|
140
|
+
},
|
|
141
|
+
async meetings(since) {
|
|
142
|
+
return (await getSource()).meetings(since);
|
|
143
|
+
},
|
|
144
|
+
async participants(id) {
|
|
145
|
+
return (await getSource()).participants(id);
|
|
146
|
+
},
|
|
147
|
+
async transcript(id) {
|
|
148
|
+
return (await getSource()).transcript(id);
|
|
149
|
+
},
|
|
150
|
+
async chat(id) {
|
|
151
|
+
return (await getSource()).chat(id);
|
|
152
|
+
},
|
|
153
|
+
async summary(id) {
|
|
154
|
+
return (await getSource()).summary(id);
|
|
155
|
+
},
|
|
156
|
+
async files(id) {
|
|
157
|
+
return (await getSource()).files(id);
|
|
158
|
+
},
|
|
159
|
+
};
|
|
160
|
+
addMeetingCommands(program, {
|
|
161
|
+
get store() {
|
|
162
|
+
return selectedStore ?? unavailableStore;
|
|
163
|
+
},
|
|
164
|
+
rootIngestion: true,
|
|
165
|
+
get accountId() {
|
|
166
|
+
return requireAccount();
|
|
167
|
+
},
|
|
168
|
+
source,
|
|
169
|
+
readFiles: async (folder) => {
|
|
170
|
+
const config = getConfig();
|
|
171
|
+
return validateDownloadedFiles(await (deps.readFiles ?? readDownloadedFiles)(folder), config.filesTimezone).map((file) => importFile(file, requireAccount(), config.filesTimezone));
|
|
172
|
+
},
|
|
173
|
+
now: deps.now,
|
|
174
|
+
write: (value, format) => {
|
|
175
|
+
meetingOutput.push(render(value, format));
|
|
176
|
+
},
|
|
177
|
+
});
|
|
178
|
+
const parseAsync = program.parseAsync.bind(program);
|
|
179
|
+
program.parseAsync = async (...args) => {
|
|
180
|
+
if (parsing)
|
|
181
|
+
throw new ZoomError("validation_error", "concurrent command parsing is unavailable");
|
|
182
|
+
parsing = true;
|
|
183
|
+
config = undefined;
|
|
184
|
+
activeSource = undefined;
|
|
185
|
+
meetingOutput = [];
|
|
186
|
+
let result = program;
|
|
187
|
+
let failed = false;
|
|
188
|
+
let failure;
|
|
189
|
+
try {
|
|
190
|
+
result = await parseAsync(...args);
|
|
191
|
+
}
|
|
192
|
+
catch (error) {
|
|
193
|
+
failed = true;
|
|
194
|
+
failure = error;
|
|
195
|
+
}
|
|
196
|
+
finally {
|
|
197
|
+
if (connection) {
|
|
198
|
+
const closing = connection;
|
|
199
|
+
connection = undefined;
|
|
200
|
+
selectedStore = deps.store;
|
|
201
|
+
selectedAccountId = deps.accountId;
|
|
202
|
+
try {
|
|
203
|
+
await closing.close();
|
|
204
|
+
}
|
|
205
|
+
catch {
|
|
206
|
+
if (!failed) {
|
|
207
|
+
failed = true;
|
|
208
|
+
failure = new ZoomError("configuration_error", "could not close the shared meeting store");
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
parsing = false;
|
|
214
|
+
if (failed) {
|
|
215
|
+
meetingOutput = [];
|
|
216
|
+
throw failure;
|
|
217
|
+
}
|
|
218
|
+
for (const text of meetingOutput)
|
|
219
|
+
deps.data(text);
|
|
220
|
+
meetingOutput = [];
|
|
221
|
+
return result;
|
|
222
|
+
};
|
|
223
|
+
return program;
|
|
224
|
+
};
|
|
225
|
+
export const run = async (args, deps) => {
|
|
226
|
+
try {
|
|
227
|
+
await createProgram(deps).parseAsync(args, { from: "user" });
|
|
228
|
+
return 0;
|
|
229
|
+
}
|
|
230
|
+
catch (error) {
|
|
231
|
+
if (typeof error === "object" &&
|
|
232
|
+
error !== null &&
|
|
233
|
+
"code" in error &&
|
|
234
|
+
["commander.helpDisplayed", "commander.help", "commander.version"].includes(String(error.code)))
|
|
235
|
+
return 0;
|
|
236
|
+
const code = error instanceof ZoomError || error instanceof MeetingError
|
|
237
|
+
? error.code
|
|
238
|
+
: error instanceof CommanderError
|
|
239
|
+
? "validation_error"
|
|
240
|
+
: "generic_failure";
|
|
241
|
+
const message = error instanceof ZoomError || error instanceof MeetingError
|
|
242
|
+
? error.message
|
|
243
|
+
: "command failed; use --help for usage";
|
|
244
|
+
deps.diagnostic(`${JSON.stringify({ error: { code, message } })}\n`);
|
|
245
|
+
return code === "configuration_error"
|
|
246
|
+
? 3
|
|
247
|
+
: code === "authentication_error"
|
|
248
|
+
? 4
|
|
249
|
+
: code === "provider_error"
|
|
250
|
+
? 11
|
|
251
|
+
: code === "invalid_response"
|
|
252
|
+
? 13
|
|
253
|
+
: code === "not_found"
|
|
254
|
+
? 6
|
|
255
|
+
: code === "generic_failure"
|
|
256
|
+
? 1
|
|
257
|
+
: 2;
|
|
258
|
+
}
|
|
259
|
+
};
|
|
260
|
+
//# sourceMappingURL=program.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
|
package/dist/tokens.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { KeyringStore } from "@wirecat/cli-core";
|
|
2
|
+
export interface Tokens {
|
|
3
|
+
accessToken: string;
|
|
4
|
+
refreshToken: string;
|
|
5
|
+
expiresAt: number;
|
|
6
|
+
scopes: string[];
|
|
7
|
+
}
|
|
8
|
+
export interface TokenOptions {
|
|
9
|
+
clientId: string;
|
|
10
|
+
keyring: KeyringStore;
|
|
11
|
+
service: string;
|
|
12
|
+
fetch: typeof fetch;
|
|
13
|
+
now?: () => number;
|
|
14
|
+
}
|
|
15
|
+
export declare class TokenManager {
|
|
16
|
+
readonly options: TokenOptions;
|
|
17
|
+
private refreshing;
|
|
18
|
+
constructor(options: TokenOptions);
|
|
19
|
+
load(): Tokens | null;
|
|
20
|
+
save(tokens: Tokens): void;
|
|
21
|
+
exchange(params: Record<string, string>, previous?: Tokens): Promise<Tokens>;
|
|
22
|
+
tokens(): Promise<Tokens>;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=tokens.d.ts.map
|