@gakr-gakr/google-meet 0.1.0 → 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/dist/calendar-jJZtOkWj.js +136 -0
- package/dist/chrome-create-2c1xWu3v.js +965 -0
- package/dist/cli-HmWm3hO2.js +1390 -0
- package/dist/create-C-g41aLC.js +108 -0
- package/dist/doctor-contract-api.js +56 -0
- package/dist/index.js +4979 -0
- package/dist/oauth-vijycKgL.js +141 -0
- package/package.json +15 -4
- package/doctor-contract-api.ts +0 -1
- package/index.ts +0 -1224
- package/src/agent-consult.ts +0 -158
- package/src/calendar.ts +0 -252
- package/src/cli.ts +0 -2350
- package/src/config-compat.ts +0 -84
- package/src/config.ts +0 -589
- package/src/create.ts +0 -157
- package/src/drive.ts +0 -72
- package/src/google-api-errors.ts +0 -20
- package/src/meet.ts +0 -1024
- package/src/node-host.ts +0 -520
- package/src/oauth.ts +0 -229
- package/src/realtime-node.ts +0 -780
- package/src/realtime.ts +0 -1334
- package/src/runtime.ts +0 -1008
- package/src/setup.ts +0 -285
- package/src/transports/chrome-browser-proxy.ts +0 -204
- package/src/transports/chrome-create.ts +0 -364
- package/src/transports/chrome.ts +0 -1065
- package/src/transports/twilio.ts +0 -57
- package/src/transports/types.ts +0 -147
- package/src/voice-call-gateway.ts +0 -241
- package/tsconfig.json +0 -16
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { _ as googleApiError } from "./chrome-create-2c1xWu3v.js";
|
|
2
|
+
import { fetchWithSsrFGuard } from "autobot/plugin-sdk/ssrf-runtime";
|
|
3
|
+
//#region extensions/google-meet/src/calendar.ts
|
|
4
|
+
const GOOGLE_CALENDAR_API_BASE_URL = "https://www.googleapis.com/calendar/v3";
|
|
5
|
+
const GOOGLE_CALENDAR_API_HOST = "www.googleapis.com";
|
|
6
|
+
const GOOGLE_MEET_URL_HOST = "meet.google.com";
|
|
7
|
+
const GOOGLE_CALENDAR_EVENTS_SCOPE = "https://www.googleapis.com/auth/calendar.events.readonly";
|
|
8
|
+
function appendQuery(url, query) {
|
|
9
|
+
const parsed = new URL(url);
|
|
10
|
+
for (const [key, value] of Object.entries(query)) if (value !== void 0) parsed.searchParams.set(key, String(value));
|
|
11
|
+
return parsed.toString();
|
|
12
|
+
}
|
|
13
|
+
function isGoogleMeetUri(value) {
|
|
14
|
+
if (!value?.trim()) return false;
|
|
15
|
+
try {
|
|
16
|
+
return new URL(value).hostname === GOOGLE_MEET_URL_HOST;
|
|
17
|
+
} catch {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function extractGoogleMeetUriFromText(value) {
|
|
22
|
+
return (value?.match(/https:\/\/meet\.google\.com\/[a-z0-9-]+/i))?.[0];
|
|
23
|
+
}
|
|
24
|
+
function extractGoogleMeetUriFromCalendarEvent(event) {
|
|
25
|
+
if (isGoogleMeetUri(event.hangoutLink)) return event.hangoutLink;
|
|
26
|
+
const entryPoints = event.conferenceData?.entryPoints ?? [];
|
|
27
|
+
const videoEntry = entryPoints.find((entry) => entry.entryPointType === "video" && isGoogleMeetUri(entry.uri));
|
|
28
|
+
if (videoEntry?.uri) return videoEntry.uri;
|
|
29
|
+
const meetEntry = entryPoints.find((entry) => isGoogleMeetUri(entry.uri));
|
|
30
|
+
if (meetEntry?.uri) return meetEntry.uri;
|
|
31
|
+
return extractGoogleMeetUriFromText(event.location) ?? extractGoogleMeetUriFromText(event.description);
|
|
32
|
+
}
|
|
33
|
+
function buildGoogleMeetCalendarDayWindow(now = /* @__PURE__ */ new Date()) {
|
|
34
|
+
const start = new Date(now);
|
|
35
|
+
start.setHours(0, 0, 0, 0);
|
|
36
|
+
const end = new Date(start);
|
|
37
|
+
end.setDate(start.getDate() + 1);
|
|
38
|
+
return {
|
|
39
|
+
timeMin: start.toISOString(),
|
|
40
|
+
timeMax: end.toISOString()
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function parseCalendarEventTime(value) {
|
|
44
|
+
const raw = value?.dateTime ?? value?.date;
|
|
45
|
+
if (!raw) return;
|
|
46
|
+
const parsed = Date.parse(raw);
|
|
47
|
+
return Number.isFinite(parsed) ? parsed : void 0;
|
|
48
|
+
}
|
|
49
|
+
function rankCalendarEvent(event, nowMs) {
|
|
50
|
+
const startMs = parseCalendarEventTime(event.start) ?? Number.POSITIVE_INFINITY;
|
|
51
|
+
const endMs = parseCalendarEventTime(event.end) ?? startMs;
|
|
52
|
+
if (startMs <= nowMs && endMs >= nowMs) return 0;
|
|
53
|
+
if (startMs > nowMs) return startMs - nowMs;
|
|
54
|
+
return nowMs - startMs + 720 * 60 * 60 * 1e3;
|
|
55
|
+
}
|
|
56
|
+
function chooseBestMeetCalendarEvent(events, now) {
|
|
57
|
+
const nowMs = now.getTime();
|
|
58
|
+
let selected;
|
|
59
|
+
let selectedRank = Number.POSITIVE_INFINITY;
|
|
60
|
+
for (const event of events) {
|
|
61
|
+
if (event.status === "cancelled" || !extractGoogleMeetUriFromCalendarEvent(event)) continue;
|
|
62
|
+
const rank = rankCalendarEvent(event, nowMs);
|
|
63
|
+
if (!selected || rank < selectedRank) {
|
|
64
|
+
selected = event;
|
|
65
|
+
selectedRank = rank;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return selected;
|
|
69
|
+
}
|
|
70
|
+
async function fetchGoogleCalendarEvents(params) {
|
|
71
|
+
const calendarId = params.calendarId?.trim() || "primary";
|
|
72
|
+
const now = params.now ?? /* @__PURE__ */ new Date();
|
|
73
|
+
const defaultTimeMax = new Date(now);
|
|
74
|
+
defaultTimeMax.setDate(defaultTimeMax.getDate() + 7);
|
|
75
|
+
const { response, release } = await fetchWithSsrFGuard({
|
|
76
|
+
url: appendQuery(`${GOOGLE_CALENDAR_API_BASE_URL}/calendars/${encodeURIComponent(calendarId)}/events`, {
|
|
77
|
+
maxResults: params.maxResults ?? 50,
|
|
78
|
+
orderBy: "startTime",
|
|
79
|
+
q: params.eventQuery?.trim() || void 0,
|
|
80
|
+
showDeleted: false,
|
|
81
|
+
singleEvents: true,
|
|
82
|
+
timeMin: params.timeMin ?? now.toISOString(),
|
|
83
|
+
timeMax: params.timeMax ?? defaultTimeMax.toISOString()
|
|
84
|
+
}),
|
|
85
|
+
init: { headers: {
|
|
86
|
+
Authorization: `Bearer ${params.accessToken}`,
|
|
87
|
+
Accept: "application/json"
|
|
88
|
+
} },
|
|
89
|
+
policy: { allowedHostnames: [GOOGLE_CALENDAR_API_HOST] },
|
|
90
|
+
auditContext: "google-meet.calendar.events.list"
|
|
91
|
+
});
|
|
92
|
+
try {
|
|
93
|
+
if (!response.ok) throw await googleApiError({
|
|
94
|
+
response,
|
|
95
|
+
detail: await response.text(),
|
|
96
|
+
prefix: "Google Calendar events.list",
|
|
97
|
+
scopes: [GOOGLE_CALENDAR_EVENTS_SCOPE]
|
|
98
|
+
});
|
|
99
|
+
const payload = await response.json();
|
|
100
|
+
if (payload.items !== void 0 && !Array.isArray(payload.items)) throw new Error("Google Calendar events.list response had non-array items");
|
|
101
|
+
return {
|
|
102
|
+
calendarId,
|
|
103
|
+
events: payload.items ?? [],
|
|
104
|
+
now
|
|
105
|
+
};
|
|
106
|
+
} finally {
|
|
107
|
+
await release();
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
async function listGoogleMeetCalendarEvents(params) {
|
|
111
|
+
const { calendarId, events, now } = await fetchGoogleCalendarEvents(params);
|
|
112
|
+
const best = chooseBestMeetCalendarEvent(events, now);
|
|
113
|
+
return {
|
|
114
|
+
calendarId,
|
|
115
|
+
events: events.map((event) => {
|
|
116
|
+
const meetingUri = extractGoogleMeetUriFromCalendarEvent(event);
|
|
117
|
+
return meetingUri ? {
|
|
118
|
+
event,
|
|
119
|
+
meetingUri,
|
|
120
|
+
selected: event === best
|
|
121
|
+
} : void 0;
|
|
122
|
+
}).filter((event) => Boolean(event))
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
async function findGoogleMeetCalendarEvent(params) {
|
|
126
|
+
const result = await listGoogleMeetCalendarEvents(params);
|
|
127
|
+
const selected = result.events.find((event) => event.selected) ?? result.events[0];
|
|
128
|
+
if (!selected) throw new Error("No Google Calendar event with a Google Meet link matched the query");
|
|
129
|
+
return {
|
|
130
|
+
calendarId: result.calendarId,
|
|
131
|
+
event: selected.event,
|
|
132
|
+
meetingUri: selected.meetingUri
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//#endregion
|
|
136
|
+
export { findGoogleMeetCalendarEvent as n, listGoogleMeetCalendarEvents as r, buildGoogleMeetCalendarDayWindow as t };
|