@oomol-lab/open-connector 1.7.0 → 1.8.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.
- package/README.md +4 -0
- package/assets/open-connector/catalog/apps/airtable.json +134 -0
- package/assets/open-connector/catalog/apps/aisa.json +916 -76
- package/assets/open-connector/catalog/apps/cal.json +24 -6
- package/assets/open-connector/catalog/apps/discordbot.json +2 -2
- package/assets/open-connector/catalog/apps/enormail.json +411 -0
- package/assets/open-connector/catalog/apps/feishu_app_bot.json +158 -0
- package/assets/open-connector/catalog/apps/github.json +275 -0
- package/assets/open-connector/catalog/apps/gitlab.json +125 -0
- package/assets/open-connector/catalog/apps/gmail.json +151 -0
- package/assets/open-connector/catalog/apps/googlecalendar.json +206 -0
- package/assets/open-connector/catalog/apps/googledrive.json +479 -0
- package/assets/open-connector/catalog/apps/googlesheets.json +144 -0
- package/assets/open-connector/catalog/apps/hithink_finance.json +6 -3
- package/assets/open-connector/catalog/apps/indexed.json +1115 -0
- package/assets/open-connector/catalog/apps/linear.json +116 -0
- package/assets/open-connector/catalog/apps/notion.json +142 -0
- package/assets/open-connector/catalog/apps/one_drive.json +185 -0
- package/assets/open-connector/catalog/apps/outlook.json +182 -0
- package/assets/open-connector/catalog/apps/shopify.json +282 -0
- package/assets/open-connector/catalog/apps/slack.json +182 -0
- package/assets/open-connector/catalog/apps/spotify.json +46 -43
- package/assets/open-connector/catalog/apps/stripe.json +96 -0
- package/assets/open-connector/catalog/apps/telegram.json +138 -0
- package/assets/open-connector/catalog/apps/weixin_store.json +543 -2
- package/assets/open-connector/catalog/apps/woocommerce.json +127 -0
- package/assets/open-connector/catalog/apps/zendesk.json +152 -0
- package/assets/open-connector/catalog/apps/zerotier.json +9 -9
- package/assets/open-connector/catalog/apps-index.json +1 -1
- package/assets/open-connector/migrations/0014_saas_project.sql +55 -0
- package/assets/open-connector/migrations/0015_saas_cleanup_runtime.sql +8 -0
- package/assets/open-connector/migrations/0016_trigger_policy.sql +1 -0
- package/assets/open-connector/migrations/0017_trigger_subscriptions.sql +17 -0
- package/assets/open-connector/migrations/postgresql/0014_saas_project.sql +55 -0
- package/assets/open-connector/migrations/postgresql/0015_saas_cleanup_runtime.sql +8 -0
- package/assets/open-connector/migrations/postgresql/0016_trigger_policy.sql +1 -0
- package/assets/open-connector/migrations/postgresql/0017_trigger_subscriptions.sql +17 -0
- package/package.json +2 -2
- package/src/connection-service.d.ts +40 -7
- package/src/connection-service.js +60 -18
- package/src/core/action-policy.d.ts +8 -1
- package/src/core/action-policy.js +51 -0
- package/src/core/cast.d.ts +3 -0
- package/src/core/cast.js +4 -1
- package/src/core/guarded-fetch.d.ts +5 -0
- package/src/core/guarded-fetch.js +13 -4
- package/src/core/remote-http.d.ts +33 -0
- package/src/core/remote-http.js +104 -0
- package/src/core/request.d.ts +1 -0
- package/src/core/request.js +7 -0
- package/src/core/types.d.ts +4 -0
- package/src/marketplace/marketplace-service.d.ts +0 -1
- package/src/marketplace/marketplace-service.js +80 -92
- package/src/mcp.js +19 -5
- package/src/oauth/oauth-flow-service.d.ts +8 -1
- package/src/oauth/oauth-flow-service.js +10 -4
- package/src/providers/action-contracts.generated.d.ts +4 -2
- package/src/providers/airtable/executors.d.ts +3 -0
- package/src/providers/airtable/executors.js +2 -0
- package/src/providers/airtable/trigger-on-record-changed.d.ts +2 -0
- package/src/providers/airtable/trigger-on-record-changed.definition.d.ts +4 -0
- package/src/providers/airtable/trigger-on-record-changed.definition.js +54 -0
- package/src/providers/airtable/trigger-on-record-changed.js +235 -0
- package/src/providers/aisa/executors.js +196 -22
- package/src/providers/cal/actions.js +5 -1
- package/src/providers/enormail/executors.d.ts +4 -0
- package/src/providers/enormail/executors.js +97 -0
- package/src/providers/feishu_app_bot/executors.d.ts +3 -0
- package/src/providers/feishu_app_bot/executors.js +2 -0
- package/src/providers/feishu_app_bot/trigger-config.d.ts +1 -0
- package/src/providers/feishu_app_bot/trigger-config.js +10 -0
- package/src/providers/feishu_app_bot/trigger-on-event.d.ts +2 -0
- package/src/providers/feishu_app_bot/trigger-on-event.definition.d.ts +4 -0
- package/src/providers/feishu_app_bot/trigger-on-event.definition.js +63 -0
- package/src/providers/feishu_app_bot/trigger-on-event.js +29 -0
- package/src/providers/feishu_app_bot/trigger-subscriptions.d.ts +5 -0
- package/src/providers/feishu_app_bot/trigger-subscriptions.js +70 -0
- package/src/providers/github/executors.d.ts +3 -0
- package/src/providers/github/executors.js +6 -0
- package/src/providers/github/trigger-on-repo-event.d.ts +2 -0
- package/src/providers/github/trigger-on-repo-event.definition.d.ts +4 -0
- package/src/providers/github/trigger-on-repo-event.definition.js +94 -0
- package/src/providers/github/trigger-on-repo-event.js +168 -0
- package/src/providers/github/trigger-watch-pull-request.d.ts +2 -0
- package/src/providers/github/trigger-watch-pull-request.definition.d.ts +4 -0
- package/src/providers/github/trigger-watch-pull-request.definition.js +49 -0
- package/src/providers/github/trigger-watch-pull-request.js +106 -0
- package/src/providers/gitlab/executors.d.ts +3 -0
- package/src/providers/gitlab/executors.js +2 -0
- package/src/providers/gitlab/trigger-on-project-event.d.ts +2 -0
- package/src/providers/gitlab/trigger-on-project-event.definition.d.ts +5 -0
- package/src/providers/gitlab/trigger-on-project-event.definition.js +63 -0
- package/src/providers/gitlab/trigger-on-project-event.js +186 -0
- package/src/providers/gmail/executors.d.ts +3 -0
- package/src/providers/gmail/executors.js +2 -0
- package/src/providers/gmail/trigger-on-message-received.d.ts +2 -0
- package/src/providers/gmail/trigger-on-message-received.definition.d.ts +4 -0
- package/src/providers/gmail/trigger-on-message-received.definition.js +74 -0
- package/src/providers/gmail/trigger-on-message-received.js +232 -0
- package/src/providers/googlecalendar/executors.d.ts +3 -0
- package/src/providers/googlecalendar/executors.js +2 -0
- package/src/providers/googlecalendar/trigger-on-event-changed.d.ts +2 -0
- package/src/providers/googlecalendar/trigger-on-event-changed.definition.d.ts +4 -0
- package/src/providers/googlecalendar/trigger-on-event-changed.definition.js +74 -0
- package/src/providers/googlecalendar/trigger-on-event-changed.js +233 -0
- package/src/providers/googledrive/executors.d.ts +3 -0
- package/src/providers/googledrive/executors.js +7 -0
- package/src/providers/googledrive/trigger-changes.d.ts +12 -0
- package/src/providers/googledrive/trigger-changes.definition.d.ts +7 -0
- package/src/providers/googledrive/trigger-changes.definition.js +101 -0
- package/src/providers/googledrive/trigger-changes.js +452 -0
- package/src/providers/googledrive/trigger-on-file-change.d.ts +2 -0
- package/src/providers/googledrive/trigger-on-file-change.definition.d.ts +4 -0
- package/src/providers/googledrive/trigger-on-file-change.definition.js +77 -0
- package/src/providers/googledrive/trigger-on-file-change.js +258 -0
- package/src/providers/googlesheets/executors.d.ts +3 -0
- package/src/providers/googlesheets/executors.js +2 -0
- package/src/providers/googlesheets/trigger-on-row-added.d.ts +2 -0
- package/src/providers/googlesheets/trigger-on-row-added.definition.d.ts +4 -0
- package/src/providers/googlesheets/trigger-on-row-added.definition.js +54 -0
- package/src/providers/googlesheets/trigger-on-row-added.js +234 -0
- package/src/providers/hithink_finance/runtime.js +1 -1
- package/src/providers/indexed/executors.d.ts +4 -0
- package/src/providers/indexed/executors.js +16 -0
- package/src/providers/indexed/runtime.d.ts +26 -0
- package/src/providers/indexed/runtime.js +129 -0
- package/src/providers/linear/executors.d.ts +3 -0
- package/src/providers/linear/executors.js +2 -0
- package/src/providers/linear/trigger-on-issue-changed.d.ts +2 -0
- package/src/providers/linear/trigger-on-issue-changed.definition.d.ts +5 -0
- package/src/providers/linear/trigger-on-issue-changed.definition.js +43 -0
- package/src/providers/linear/trigger-on-issue-changed.js +215 -0
- package/src/providers/notion/executors.d.ts +3 -0
- package/src/providers/notion/executors.js +2 -0
- package/src/providers/notion/trigger-on-database-page-event.d.ts +2 -0
- package/src/providers/notion/trigger-on-database-page-event.definition.d.ts +4 -0
- package/src/providers/notion/trigger-on-database-page-event.definition.js +63 -0
- package/src/providers/notion/trigger-on-database-page-event.js +293 -0
- package/src/providers/one_drive/executors.d.ts +3 -0
- package/src/providers/one_drive/executors.js +2 -0
- package/src/providers/one_drive/trigger-on-item-changed.d.ts +2 -0
- package/src/providers/one_drive/trigger-on-item-changed.definition.d.ts +4 -0
- package/src/providers/one_drive/trigger-on-item-changed.definition.js +63 -0
- package/src/providers/one_drive/trigger-on-item-changed.js +214 -0
- package/src/providers/outlook/executors.d.ts +3 -0
- package/src/providers/outlook/executors.js +2 -0
- package/src/providers/outlook/trigger-on-message-received.d.ts +2 -0
- package/src/providers/outlook/trigger-on-message-received.definition.d.ts +4 -0
- package/src/providers/outlook/trigger-on-message-received.definition.js +93 -0
- package/src/providers/outlook/trigger-on-message-received.js +226 -0
- package/src/providers/outlook_calendar/executors.js +6 -0
- package/src/providers/provider-loader.d.ts +5 -0
- package/src/providers/provider-loader.js +4 -0
- package/src/providers/registry.generated.js +2 -0
- package/src/providers/shopify/executors.d.ts +3 -0
- package/src/providers/shopify/executors.js +2 -0
- package/src/providers/shopify/trigger-on-shop-event.d.ts +2 -0
- package/src/providers/shopify/trigger-on-shop-event.definition.d.ts +4 -0
- package/src/providers/shopify/trigger-on-shop-event.definition.js +214 -0
- package/src/providers/shopify/trigger-on-shop-event.js +165 -0
- package/src/providers/slack/executors.d.ts +3 -0
- package/src/providers/slack/executors.js +2 -0
- package/src/providers/slack/trigger-on-message-posted.d.ts +2 -0
- package/src/providers/slack/trigger-on-message-posted.definition.d.ts +4 -0
- package/src/providers/slack/trigger-on-message-posted.definition.js +80 -0
- package/src/providers/slack/trigger-on-message-posted.js +176 -0
- package/src/providers/spotify/runtime.js +15 -4
- package/src/providers/stripe/executors.d.ts +3 -0
- package/src/providers/stripe/executors.js +2 -0
- package/src/providers/stripe/trigger-on-event.d.ts +2 -0
- package/src/providers/stripe/trigger-on-event.definition.d.ts +4 -0
- package/src/providers/stripe/trigger-on-event.definition.js +43 -0
- package/src/providers/stripe/trigger-on-event.js +212 -0
- package/src/providers/telegram/executors.d.ts +3 -0
- package/src/providers/telegram/executors.js +2 -0
- package/src/providers/telegram/trigger-on-update.d.ts +2 -0
- package/src/providers/telegram/trigger-on-update.definition.d.ts +5 -0
- package/src/providers/telegram/trigger-on-update.definition.js +78 -0
- package/src/providers/telegram/trigger-on-update.js +141 -0
- package/src/providers/weixin_store/access-token.d.ts +2 -1
- package/src/providers/weixin_store/access-token.js +15 -4
- package/src/providers/weixin_store/executors.js +97 -12
- package/src/providers/woocommerce/executors.d.ts +3 -0
- package/src/providers/woocommerce/executors.js +2 -0
- package/src/providers/woocommerce/trigger-on-store-event.d.ts +2 -0
- package/src/providers/woocommerce/trigger-on-store-event.definition.d.ts +4 -0
- package/src/providers/woocommerce/trigger-on-store-event.definition.js +55 -0
- package/src/providers/woocommerce/trigger-on-store-event.js +179 -0
- package/src/providers/zendesk/executors.d.ts +3 -0
- package/src/providers/zendesk/executors.js +2 -0
- package/src/providers/zendesk/trigger-on-event.d.ts +2 -0
- package/src/providers/zendesk/trigger-on-event.definition.d.ts +5 -0
- package/src/providers/zendesk/trigger-on-event.definition.js +101 -0
- package/src/providers/zendesk/trigger-on-event.js +188 -0
- package/src/saas/saas-cleanup-service.d.ts +26 -0
- package/src/saas/saas-cleanup-service.js +124 -0
- package/src/saas/saas-client.d.ts +86 -0
- package/src/saas/saas-client.js +369 -0
- package/src/saas/saas-execution-service.d.ts +15 -0
- package/src/saas/saas-execution-service.js +21 -0
- package/src/saas/saas-oauth-service.d.ts +25 -0
- package/src/saas/saas-oauth-service.js +197 -0
- package/src/saas/saas-project-service.d.ts +61 -0
- package/src/saas/saas-project-service.js +211 -0
- package/src/server/actions/action-idempotency.d.ts +1 -0
- package/src/server/actions/action-idempotency.js +1 -0
- package/src/server/actions/action-runner.d.ts +7 -0
- package/src/server/actions/action-runner.js +43 -7
- package/src/server/actions/run-log-summary.js +9 -0
- package/src/server/api/auth.d.ts +1 -0
- package/src/server/api/auth.js +13 -2
- package/src/server/api/cache-policy.js +4 -1
- package/src/server/api/connection-input.d.ts +7 -1
- package/src/server/api/connection-input.js +7 -1
- package/src/server/api/connection-routes.d.ts +3 -1
- package/src/server/api/connection-routes.js +21 -3
- package/src/server/api/http-utils.d.ts +4 -3
- package/src/server/api/oauth-completion-page.d.ts +124 -0
- package/src/server/api/oauth-completion-page.js +113 -18
- package/src/server/api/openapi.js +112 -14
- package/src/server/api/policy-input.js +6 -0
- package/src/server/api/runtime-api.d.ts +10 -2
- package/src/server/api/runtime-api.js +17 -4
- package/src/server/api/saas-completion-page.d.ts +2 -0
- package/src/server/api/saas-completion-page.js +103 -0
- package/src/server/connect-app.d.ts +5 -0
- package/src/server/connect-app.js +50 -0
- package/src/server/connect-server.d.ts +12 -0
- package/src/server/connect-server.js +147 -13
- package/src/server/connector-runtime.d.ts +3 -1
- package/src/server/connector-runtime.js +5 -2
- package/src/server/files/transit-files.js +16 -7
- package/src/server/proxy/proxy-runner.d.ts +5 -1
- package/src/server/proxy/proxy-runner.js +72 -26
- package/src/server/storage/connection-request-store.d.ts +41 -1
- package/src/server/storage/connection-request-store.js +245 -20
- package/src/server/storage/connection-store.d.ts +16 -0
- package/src/server/storage/connection-store.js +119 -0
- package/src/server/storage/node-runtime-database.js +3 -3
- package/src/server/storage/{postgres-migrations.d.ts → postgres/migrations.d.ts} +2 -2
- package/src/server/storage/{postgres-migrations.js → postgres/migrations.js} +1 -1
- package/src/server/storage/postgres/runtime-store.d.ts +43 -0
- package/src/server/storage/{postgres-runtime-store.js → postgres/runtime-store.js} +59 -94
- package/src/server/storage/runtime-database.d.ts +4 -0
- package/src/server/storage/runtime-sql.d.ts +1 -1
- package/src/server/storage/runtime-sql.js +2 -1
- package/src/server/storage/runtime-store.d.ts +1 -0
- package/src/server/storage/runtime-token-service.d.ts +2 -0
- package/src/server/storage/runtime-token-service.js +3 -0
- package/src/server/storage/saas-project-store.d.ts +77 -0
- package/src/server/storage/saas-project-store.js +273 -0
- package/src/server/storage/{sqlite-runtime-store.d.ts → sqlite/runtime-store.d.ts} +21 -25
- package/src/server/storage/{sqlite-runtime-store.js → sqlite/runtime-store.js} +100 -115
- package/src/server/storage/trigger-store.d.ts +16 -0
- package/src/server/storage/trigger-store.js +96 -0
- package/src/triggers/common/config.d.ts +2 -0
- package/src/triggers/common/config.js +17 -0
- package/src/triggers/common/configOptions.d.ts +13 -0
- package/src/triggers/common/configOptions.js +1 -0
- package/src/triggers/common/encoding.d.ts +3 -0
- package/src/triggers/common/encoding.js +19 -0
- package/src/triggers/common/integration.d.ts +115 -0
- package/src/triggers/common/integration.js +31 -0
- package/src/triggers/common/json.d.ts +6 -0
- package/src/triggers/common/json.js +91 -0
- package/src/triggers/common/poll.d.ts +41 -0
- package/src/triggers/common/poll.js +15 -0
- package/src/triggers/common/proxy.d.ts +14 -0
- package/src/triggers/common/proxy.js +1 -0
- package/src/triggers/common/types.d.ts +42 -0
- package/src/triggers/common/types.js +1 -0
- package/src/triggers/maintenance.d.ts +40 -0
- package/src/triggers/maintenance.js +120 -0
- package/src/triggers/metadata.d.ts +8 -0
- package/src/triggers/metadata.js +1 -0
- package/src/triggers/request.d.ts +33 -0
- package/src/triggers/request.js +52 -0
- package/src/triggers/resources.d.ts +12 -0
- package/src/triggers/resources.js +121 -0
- package/src/triggers/signature.d.ts +4 -0
- package/src/triggers/signature.js +48 -0
- package/src/triggers/store.d.ts +29 -0
- package/src/triggers/store.js +1 -0
- package/src/triggers/subscriptions.d.ts +22 -0
- package/src/triggers/subscriptions.js +220 -0
- package/src/triggers/trigger-runner.d.ts +34 -0
- package/src/triggers/trigger-runner.js +169 -0
- package/src/server/storage/postgres-runtime-store.d.ts +0 -39
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { eventsPollOutputs, maximumPollEventsPerPage, PermanentPollError, PollConnectionError, TransientPollError, } from "../../triggers/common/poll.js";
|
|
2
|
+
import { snapshot } from "./trigger-on-event-changed.definition.js";
|
|
3
|
+
const quotaReasons = new Set(["rateLimitExceeded", "userRateLimitExceeded", "quotaExceeded", "usageLimits"]);
|
|
4
|
+
export const googleCalendarEventChanged = {
|
|
5
|
+
buildOutputs: eventsPollOutputs,
|
|
6
|
+
snapshot,
|
|
7
|
+
async poll(context) {
|
|
8
|
+
const config = resolveConfig(context.config);
|
|
9
|
+
if (context.checkpoint === null)
|
|
10
|
+
return seed(context, config, context.now.toISOString());
|
|
11
|
+
const checkpoint = readCheckpoint(context.checkpoint);
|
|
12
|
+
if (checkpoint.calendarId !== config.calendarId)
|
|
13
|
+
return seed(context, config, context.now.toISOString());
|
|
14
|
+
if ("seedTimeMin" in checkpoint)
|
|
15
|
+
return seed(context, config, checkpoint.seedTimeMin, checkpoint.pageToken);
|
|
16
|
+
return incremental(context, config, checkpoint);
|
|
17
|
+
},
|
|
18
|
+
};
|
|
19
|
+
function resolveConfig(value) {
|
|
20
|
+
return {
|
|
21
|
+
calendarId: value.calendarId,
|
|
22
|
+
changes: new Set(value.changes),
|
|
23
|
+
matchTerm: value.matchTerm.trim(),
|
|
24
|
+
maxEventsPerPoll: value.maxEventsPerPoll,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
function readCheckpoint(value) {
|
|
28
|
+
const checkpoint = record(value);
|
|
29
|
+
const pageToken = typeof checkpoint?.pageToken == "string" ? checkpoint.pageToken : undefined;
|
|
30
|
+
const calendarId = typeof checkpoint?.calendarId == "string" ? checkpoint.calendarId : undefined;
|
|
31
|
+
if (typeof checkpoint?.syncToken == "string" && checkpoint.syncToken.length > 0) {
|
|
32
|
+
return {
|
|
33
|
+
calendarId,
|
|
34
|
+
...(pageToken == null ? {} : { pageToken }),
|
|
35
|
+
syncToken: checkpoint.syncToken,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
if (typeof checkpoint?.seedTimeMin == "string" && checkpoint.seedTimeMin.length > 0) {
|
|
39
|
+
return {
|
|
40
|
+
calendarId,
|
|
41
|
+
...(pageToken == null ? {} : { pageToken }),
|
|
42
|
+
seedTimeMin: checkpoint.seedTimeMin,
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
throw new PermanentPollError("Google Calendar checkpoint is invalid; recreate the Trigger.");
|
|
46
|
+
}
|
|
47
|
+
async function seed(context, config, timeMin, startPageToken) {
|
|
48
|
+
let pageToken = startPageToken;
|
|
49
|
+
for (let page = 0; page < 2; page += 1) {
|
|
50
|
+
const result = await list(context, config.calendarId, {
|
|
51
|
+
maxResults: 2_500,
|
|
52
|
+
pageToken,
|
|
53
|
+
showDeleted: "true",
|
|
54
|
+
singleEvents: "false",
|
|
55
|
+
timeMin,
|
|
56
|
+
});
|
|
57
|
+
if (pageToken != null && stalePage(result))
|
|
58
|
+
return { checkpoint: { calendarId: config.calendarId, seedTimeMin: timeMin }, events: [] };
|
|
59
|
+
success(context, result, "seed full sync");
|
|
60
|
+
const parsed = (record(result.data) ?? {});
|
|
61
|
+
if (parsed.nextSyncToken)
|
|
62
|
+
return {
|
|
63
|
+
checkpoint: { calendarId: config.calendarId, syncToken: parsed.nextSyncToken },
|
|
64
|
+
events: [],
|
|
65
|
+
};
|
|
66
|
+
if (!parsed.nextPageToken)
|
|
67
|
+
throw new TransientPollError("Google Calendar seed response has no continuation token.");
|
|
68
|
+
pageToken = parsed.nextPageToken;
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
checkpoint: {
|
|
72
|
+
calendarId: config.calendarId,
|
|
73
|
+
...(pageToken == null ? {} : { pageToken }),
|
|
74
|
+
seedTimeMin: timeMin,
|
|
75
|
+
},
|
|
76
|
+
events: [],
|
|
77
|
+
hasMore: true,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
async function incremental(context, config, checkpoint) {
|
|
81
|
+
const events = [];
|
|
82
|
+
let filtered = 0;
|
|
83
|
+
const result = await list(context, config.calendarId, {
|
|
84
|
+
maxResults: Math.min(config.maxEventsPerPoll, maximumPollEventsPerPage),
|
|
85
|
+
pageToken: checkpoint.pageToken,
|
|
86
|
+
showDeleted: "true",
|
|
87
|
+
singleEvents: "false",
|
|
88
|
+
syncToken: checkpoint.syncToken,
|
|
89
|
+
});
|
|
90
|
+
if (checkpoint.pageToken != null && stalePage(result)) {
|
|
91
|
+
return {
|
|
92
|
+
checkpoint: { calendarId: config.calendarId, syncToken: checkpoint.syncToken },
|
|
93
|
+
events,
|
|
94
|
+
filtered,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
success(context, result, "incremental sync");
|
|
98
|
+
const parsed = (record(result.data) ?? {});
|
|
99
|
+
for (const item of parsed.items ?? []) {
|
|
100
|
+
if (item.id == null || item.id.length == 0)
|
|
101
|
+
continue;
|
|
102
|
+
const change = classify(item);
|
|
103
|
+
if (!config.changes.has(change) || !matches(item, config.matchTerm)) {
|
|
104
|
+
filtered += 1;
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
events.push(event(item, item.id, change, config.calendarId));
|
|
108
|
+
}
|
|
109
|
+
if (parsed.nextSyncToken) {
|
|
110
|
+
return {
|
|
111
|
+
checkpoint: { calendarId: config.calendarId, syncToken: parsed.nextSyncToken },
|
|
112
|
+
events,
|
|
113
|
+
filtered,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
if (!parsed.nextPageToken)
|
|
117
|
+
throw new TransientPollError("Google Calendar sync response has no continuation token.");
|
|
118
|
+
return {
|
|
119
|
+
checkpoint: {
|
|
120
|
+
calendarId: config.calendarId,
|
|
121
|
+
pageToken: parsed.nextPageToken,
|
|
122
|
+
syncToken: checkpoint.syncToken,
|
|
123
|
+
},
|
|
124
|
+
events,
|
|
125
|
+
filtered,
|
|
126
|
+
hasMore: true,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function classify(value) {
|
|
130
|
+
if (value.status == "cancelled")
|
|
131
|
+
return "cancelled";
|
|
132
|
+
const created = epochSecond(value.created);
|
|
133
|
+
const updated = epochSecond(value.updated);
|
|
134
|
+
return created != null && created == updated ? "created" : "updated";
|
|
135
|
+
}
|
|
136
|
+
function matches(value, term) {
|
|
137
|
+
if (term.length == 0)
|
|
138
|
+
return true;
|
|
139
|
+
const needle = term.toLowerCase();
|
|
140
|
+
return [value.summary, value.description, value.location, ...(value.attendees ?? []).map(({ email }) => email)].some((candidate) => typeof candidate == "string" && candidate.toLowerCase().includes(needle));
|
|
141
|
+
}
|
|
142
|
+
function event(item, eventId, change, calendarId) {
|
|
143
|
+
return {
|
|
144
|
+
dedupeKey: `${eventId}:${item.updated ?? item.etag ?? ""}`,
|
|
145
|
+
payload: {
|
|
146
|
+
attendeeEmails: (item.attendees ?? []).flatMap(({ email }) => email == null || email.length == 0 ? [] : [email]),
|
|
147
|
+
calendarId,
|
|
148
|
+
changeType: change,
|
|
149
|
+
created: iso(item.created),
|
|
150
|
+
creatorEmail: item.creator?.email ?? null,
|
|
151
|
+
description: item.description ?? null,
|
|
152
|
+
end: item.end ?? null,
|
|
153
|
+
eventId,
|
|
154
|
+
eventType: item.eventType ?? null,
|
|
155
|
+
htmlLink: item.htmlLink ?? null,
|
|
156
|
+
isAllDay: item.start?.date != null,
|
|
157
|
+
location: item.location ?? null,
|
|
158
|
+
organizerEmail: item.organizer?.email ?? null,
|
|
159
|
+
recurringEventId: item.recurringEventId ?? null,
|
|
160
|
+
start: item.start ?? null,
|
|
161
|
+
status: item.status ?? "",
|
|
162
|
+
summary: item.summary ?? null,
|
|
163
|
+
updated: iso(item.updated),
|
|
164
|
+
},
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
async function list(context, calendarId, query) {
|
|
168
|
+
const endpoint = `/calendars/${encodeURIComponent(calendarId)}/events`;
|
|
169
|
+
try {
|
|
170
|
+
return await context.connector.execute({
|
|
171
|
+
endpoint,
|
|
172
|
+
method: "GET",
|
|
173
|
+
query: Object.fromEntries(Object.entries(query).filter((entry) => entry[1] != null)),
|
|
174
|
+
}, context.signal);
|
|
175
|
+
}
|
|
176
|
+
catch (cause) {
|
|
177
|
+
throw new TransientPollError(`Google Calendar proxy request to ${endpoint} failed.`, { cause });
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function success(context, result, operation) {
|
|
181
|
+
if (result.status >= 200 && result.status < 300)
|
|
182
|
+
return;
|
|
183
|
+
if (result.status == 410 || (result.status == 400 && fullSyncRequired(result.data))) {
|
|
184
|
+
throw new PermanentPollError("Google Calendar sync token expired; recreate the Trigger.");
|
|
185
|
+
}
|
|
186
|
+
if (result.status == 400 || (result.status == 404 && context.checkpoint === null)) {
|
|
187
|
+
throw new PermanentPollError(`Google Calendar ${operation} rejected the configuration.`);
|
|
188
|
+
}
|
|
189
|
+
if (result.status == 401)
|
|
190
|
+
throw new PollConnectionError(`Google Calendar ${operation} rejected the Connection.`);
|
|
191
|
+
if (result.status == 403) {
|
|
192
|
+
if (reasons(result.data).some((reason) => quotaReasons.has(reason))) {
|
|
193
|
+
throw new TransientPollError(`Google Calendar ${operation} was rate limited.`);
|
|
194
|
+
}
|
|
195
|
+
throw new PollConnectionError(`Google Calendar ${operation} rejected the Connection.`);
|
|
196
|
+
}
|
|
197
|
+
throw new TransientPollError(`Google Calendar ${operation} failed with status ${result.status}.`);
|
|
198
|
+
}
|
|
199
|
+
function stalePage(result) {
|
|
200
|
+
return result.status == 400 && !fullSyncRequired(result.data);
|
|
201
|
+
}
|
|
202
|
+
function reasons(data) {
|
|
203
|
+
const errors = record(record(data)?.error)?.errors;
|
|
204
|
+
if (!Array.isArray(errors))
|
|
205
|
+
return [];
|
|
206
|
+
return errors.flatMap((value) => {
|
|
207
|
+
const reason = record(value)?.reason;
|
|
208
|
+
return typeof reason == "string" ? [reason] : [];
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
function fullSyncRequired(data) {
|
|
212
|
+
if (reasons(data).includes("fullSyncRequired"))
|
|
213
|
+
return true;
|
|
214
|
+
const message = record(record(data)?.error)?.message;
|
|
215
|
+
return typeof message == "string" && message.includes("fullSyncRequired");
|
|
216
|
+
}
|
|
217
|
+
function iso(value) {
|
|
218
|
+
if (value == null || value.length == 0)
|
|
219
|
+
return null;
|
|
220
|
+
const milliseconds = Date.parse(value);
|
|
221
|
+
return Number.isNaN(milliseconds) ? null : new Date(milliseconds).toISOString();
|
|
222
|
+
}
|
|
223
|
+
function epochSecond(value) {
|
|
224
|
+
if (value == null || value.length == 0)
|
|
225
|
+
return null;
|
|
226
|
+
const milliseconds = Date.parse(value);
|
|
227
|
+
return Number.isNaN(milliseconds) ? null : Math.floor(milliseconds / 1_000);
|
|
228
|
+
}
|
|
229
|
+
function record(value) {
|
|
230
|
+
return value != null && typeof value == "object" && !Array.isArray(value)
|
|
231
|
+
? value
|
|
232
|
+
: undefined;
|
|
233
|
+
}
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import type { CredentialValidators, ProviderExecutors, ProviderProxyExecutor } from "../../core/types.ts";
|
|
2
|
+
import type { IntegrationDefinition } from "../../triggers/common/integration.ts";
|
|
3
|
+
import type { PollDefinition } from "../../triggers/common/poll.ts";
|
|
2
4
|
export declare const executors: ProviderExecutors;
|
|
3
5
|
export declare const credentialValidators: CredentialValidators;
|
|
4
6
|
export declare const proxy: ProviderProxyExecutor;
|
|
7
|
+
export declare const triggers: readonly (IntegrationDefinition | PollDefinition)[];
|
|
@@ -7,6 +7,8 @@ import { createComment, createPermission, createReply, deleteComment, deletePerm
|
|
|
7
7
|
import { googleJsonRequest, googleRequest } from "./runtime-request.js";
|
|
8
8
|
import { asObject, asOptionalObject, asOptionalInteger, asStringArray, asStringRecord, compactObject, compactUnknownObject, optionalBoolean, optionalNestedString, optionalString, parseSizeBytes, pickOptionalBoolean, pickOptionalInteger, pickOptionalString, resolveFileId, resolveRequiredString, resolveSupportsAllDrives, } from "./runtime-shared.js";
|
|
9
9
|
import { googledriveOAuthScopes } from "./scopes.js";
|
|
10
|
+
import { googleDriveChanges, googleDriveChangeListener } from "./trigger-changes.js";
|
|
11
|
+
import { googleDriveFileChange } from "./trigger-on-file-change.js";
|
|
10
12
|
const service = "googledrive";
|
|
11
13
|
const driveApiBaseUrl = "https://www.googleapis.com/drive/v3";
|
|
12
14
|
const driveUploadApiBaseUrl = "https://www.googleapis.com/upload/drive/v3";
|
|
@@ -863,3 +865,8 @@ export const proxy = defineProviderProxy({
|
|
|
863
865
|
auth: googleBearerProxyAuth(googledriveOAuthScopes),
|
|
864
866
|
allowedEndpoint: providerProxyEndpointPrefixes("/drive/v3", "/upload/drive/v3"),
|
|
865
867
|
});
|
|
868
|
+
export const triggers = [
|
|
869
|
+
googleDriveChanges,
|
|
870
|
+
googleDriveChangeListener,
|
|
871
|
+
googleDriveFileChange,
|
|
872
|
+
];
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { IntegrationDefinition } from "../../triggers/common/integration.ts";
|
|
2
|
+
import type { ConnectorProxy } from "../../triggers/common/proxy.ts";
|
|
3
|
+
import type { JsonValue } from "../../triggers/common/types.ts";
|
|
4
|
+
interface ReadContext {
|
|
5
|
+
readonly config: Readonly<Record<string, JsonValue>>;
|
|
6
|
+
readonly connector: ConnectorProxy;
|
|
7
|
+
readonly signal?: AbortSignal;
|
|
8
|
+
}
|
|
9
|
+
export declare const googleDriveChanges: IntegrationDefinition;
|
|
10
|
+
export declare function googleDriveStartPageToken(context: ReadContext): Promise<string>;
|
|
11
|
+
export declare const googleDriveChangeListener: IntegrationDefinition;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { TriggerKeySnapshot } from "../../triggers/common/types.ts";
|
|
2
|
+
export declare const snapshot: TriggerKeySnapshot & {
|
|
3
|
+
readonly type: "integration";
|
|
4
|
+
};
|
|
5
|
+
export declare const additionalSnapshot0: TriggerKeySnapshot & {
|
|
6
|
+
readonly type: "integration";
|
|
7
|
+
};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { jsonSchema as s } from "../../core/json-schema.js";
|
|
2
|
+
const defaultPageSize = 100;
|
|
3
|
+
export const snapshot = {
|
|
4
|
+
configInputs: [
|
|
5
|
+
{
|
|
6
|
+
handle: "driveId",
|
|
7
|
+
jsonSchema: s.string({ maxLength: 256, minLength: 1 }),
|
|
8
|
+
nullable: true,
|
|
9
|
+
description: "Optional shared drive ID. Omit it to monitor the connected account.",
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
handle: "includeCorpusRemovals",
|
|
13
|
+
jsonSchema: s.boolean(),
|
|
14
|
+
nullable: false,
|
|
15
|
+
value: false,
|
|
16
|
+
description: "Include the accessible file resource when an item leaves the change corpus.",
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
handle: "includeItemsFromAllDrives",
|
|
20
|
+
jsonSchema: s.boolean(),
|
|
21
|
+
nullable: false,
|
|
22
|
+
value: true,
|
|
23
|
+
description: "Include items from My Drive and shared drives.",
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
handle: "includeRemoved",
|
|
27
|
+
jsonSchema: s.boolean(),
|
|
28
|
+
nullable: false,
|
|
29
|
+
value: true,
|
|
30
|
+
description: "Include changes caused by deletion or loss of access.",
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
handle: "pageSize",
|
|
34
|
+
jsonSchema: s.integer({ maximum: 100, minimum: 1 }),
|
|
35
|
+
nullable: false,
|
|
36
|
+
value: defaultPageSize,
|
|
37
|
+
description: "Maximum changes included in one Flow Run.",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
handle: "restrictToMyDrive",
|
|
41
|
+
jsonSchema: s.boolean(),
|
|
42
|
+
nullable: false,
|
|
43
|
+
value: false,
|
|
44
|
+
description: "Restrict changes to the My Drive hierarchy.",
|
|
45
|
+
},
|
|
46
|
+
],
|
|
47
|
+
definitionVersion: 2,
|
|
48
|
+
description: "Uses a Google Drive changes.watch channel and triggers when Drive changes are available.",
|
|
49
|
+
displayName: "Changes Detected",
|
|
50
|
+
endpoint: {
|
|
51
|
+
body: { allowArray: false, allowEmpty: true, formats: ["json"] },
|
|
52
|
+
methods: ["POST"],
|
|
53
|
+
successStatus: 204,
|
|
54
|
+
},
|
|
55
|
+
key: "googledrive.changes_detected",
|
|
56
|
+
name: "changes_detected",
|
|
57
|
+
outputs: [
|
|
58
|
+
{
|
|
59
|
+
handle: "events",
|
|
60
|
+
jsonSchema: s.array(s.object({
|
|
61
|
+
changeId: s.string(),
|
|
62
|
+
changeType: { type: ["string", "null"] },
|
|
63
|
+
driveId: { type: ["string", "null"] },
|
|
64
|
+
file: { type: ["object", "null"] },
|
|
65
|
+
fileId: { type: ["string", "null"] },
|
|
66
|
+
notification: s.object({
|
|
67
|
+
changedTypes: s.array(s.string()),
|
|
68
|
+
messageNumber: { type: ["string", "null"] },
|
|
69
|
+
resourceState: s.string(),
|
|
70
|
+
resourceUri: { type: ["string", "null"] },
|
|
71
|
+
}, {
|
|
72
|
+
additionalProperties: false,
|
|
73
|
+
required: ["resourceState", "changedTypes", "messageNumber", "resourceUri"],
|
|
74
|
+
}),
|
|
75
|
+
removed: s.boolean(),
|
|
76
|
+
time: { type: ["string", "null"] },
|
|
77
|
+
}, {
|
|
78
|
+
additionalProperties: false,
|
|
79
|
+
required: ["changeId", "changeType", "removed", "time", "fileId", "driveId", "file", "notification"],
|
|
80
|
+
})),
|
|
81
|
+
nullable: false,
|
|
82
|
+
},
|
|
83
|
+
],
|
|
84
|
+
provider: "googledrive",
|
|
85
|
+
type: "integration",
|
|
86
|
+
};
|
|
87
|
+
export const additionalSnapshot0 = {
|
|
88
|
+
...snapshot,
|
|
89
|
+
configInputs: snapshot.configInputs,
|
|
90
|
+
key: "googledrive.watch_changes",
|
|
91
|
+
name: "watch_changes",
|
|
92
|
+
displayName: "Watch Changes",
|
|
93
|
+
description: "Monitors Drive changes using notifications and periodic scans of the same change stream.",
|
|
94
|
+
outputs: [
|
|
95
|
+
{
|
|
96
|
+
handle: "events",
|
|
97
|
+
jsonSchema: s.array({ type: "object" }),
|
|
98
|
+
nullable: false,
|
|
99
|
+
},
|
|
100
|
+
],
|
|
101
|
+
};
|