@arbium/enterprise-agent-connect 0.0.0-stage → 0.1.2-dev.9022f22
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 +202 -0
- package/README.md +269 -2
- package/dist/connectors/dell-techdirect/connector.json +39 -0
- package/dist/connectors/dell-techdirect/index.d.ts +8 -0
- package/dist/connectors/dell-techdirect/index.js +7 -0
- package/dist/connectors/dell-techdirect/index.js.map +1 -0
- package/dist/connectors/dell-techdirect/tools.d.ts +2 -0
- package/dist/connectors/dell-techdirect/tools.js +49 -0
- package/dist/connectors/dell-techdirect/tools.js.map +1 -0
- package/dist/connectors/dell-techdirect/vendor.d.ts +6 -0
- package/dist/connectors/dell-techdirect/vendor.js +57 -0
- package/dist/connectors/dell-techdirect/vendor.js.map +1 -0
- package/dist/connectors/dynamics-365/connector.json +228 -0
- package/dist/connectors/dynamics-365/index.d.ts +8 -0
- package/dist/connectors/dynamics-365/index.js +10 -0
- package/dist/connectors/dynamics-365/index.js.map +1 -0
- package/dist/connectors/dynamics-365/tools.d.ts +35 -0
- package/dist/connectors/dynamics-365/tools.js +806 -0
- package/dist/connectors/dynamics-365/tools.js.map +1 -0
- package/dist/connectors/dynamics-365/vendor.d.ts +9 -0
- package/dist/connectors/dynamics-365/vendor.js +110 -0
- package/dist/connectors/dynamics-365/vendor.js.map +1 -0
- package/dist/connectors/entra/connector.json +85 -0
- package/dist/connectors/entra/index.d.ts +2 -0
- package/dist/connectors/entra/index.js +4 -0
- package/dist/connectors/entra/index.js.map +1 -0
- package/dist/connectors/entra/tools.d.ts +14 -0
- package/dist/connectors/entra/tools.js +262 -0
- package/dist/connectors/entra/tools.js.map +1 -0
- package/dist/connectors/fedex/connector.json +118 -0
- package/dist/connectors/fedex/index.d.ts +8 -0
- package/dist/connectors/fedex/index.js +7 -0
- package/dist/connectors/fedex/index.js.map +1 -0
- package/dist/connectors/fedex/tools.d.ts +3 -0
- package/dist/connectors/fedex/tools.js +152 -0
- package/dist/connectors/fedex/tools.js.map +1 -0
- package/dist/connectors/fedex/vendor.d.ts +7 -0
- package/dist/connectors/fedex/vendor.js +98 -0
- package/dist/connectors/fedex/vendor.js.map +1 -0
- package/dist/connectors/gong/connector.json +127 -0
- package/dist/connectors/gong/index.d.ts +8 -0
- package/dist/connectors/gong/index.js +7 -0
- package/dist/connectors/gong/index.js.map +1 -0
- package/dist/connectors/gong/tools.d.ts +8 -0
- package/dist/connectors/gong/tools.js +424 -0
- package/dist/connectors/gong/tools.js.map +1 -0
- package/dist/connectors/gong/vendor.d.ts +4 -0
- package/dist/connectors/gong/vendor.js +89 -0
- package/dist/connectors/gong/vendor.js.map +1 -0
- package/dist/connectors/http/index.d.ts +34 -0
- package/dist/connectors/http/index.js +325 -0
- package/dist/connectors/http/index.js.map +1 -0
- package/dist/connectors/intune/connector.json +106 -0
- package/dist/connectors/intune/index.d.ts +2 -0
- package/dist/connectors/intune/index.js +4 -0
- package/dist/connectors/intune/index.js.map +1 -0
- package/dist/connectors/intune/tools.d.ts +12 -0
- package/dist/connectors/intune/tools.js +416 -0
- package/dist/connectors/intune/tools.js.map +1 -0
- package/dist/connectors/jamf/connector.json +182 -0
- package/dist/connectors/jamf/index.d.ts +8 -0
- package/dist/connectors/jamf/index.js +7 -0
- package/dist/connectors/jamf/index.js.map +1 -0
- package/dist/connectors/jamf/tools.d.ts +7 -0
- package/dist/connectors/jamf/tools.js +659 -0
- package/dist/connectors/jamf/tools.js.map +1 -0
- package/dist/connectors/jamf/vendor.d.ts +5 -0
- package/dist/connectors/jamf/vendor.js +70 -0
- package/dist/connectors/jamf/vendor.js.map +1 -0
- package/dist/connectors/jira/connector.json +272 -0
- package/dist/connectors/jira/index.d.ts +8 -0
- package/dist/connectors/jira/index.js +7 -0
- package/dist/connectors/jira/index.js.map +1 -0
- package/dist/connectors/jira/jql.d.ts +4 -0
- package/dist/connectors/jira/jql.js +67 -0
- package/dist/connectors/jira/jql.js.map +1 -0
- package/dist/connectors/jira/tools.d.ts +3 -0
- package/dist/connectors/jira/tools.js +464 -0
- package/dist/connectors/jira/tools.js.map +1 -0
- package/dist/connectors/jira/vendor.d.ts +3 -0
- package/dist/connectors/jira/vendor.js +100 -0
- package/dist/connectors/jira/vendor.js.map +1 -0
- package/dist/connectors/microsoft/client.d.ts +66 -0
- package/dist/connectors/microsoft/client.js +452 -0
- package/dist/connectors/microsoft/client.js.map +1 -0
- package/dist/connectors/microsoft/provider.json +118 -0
- package/dist/connectors/netsuite/connector.json +317 -0
- package/dist/connectors/netsuite/index.d.ts +8 -0
- package/dist/connectors/netsuite/index.js +7 -0
- package/dist/connectors/netsuite/index.js.map +1 -0
- package/dist/connectors/netsuite/tools.d.ts +24 -0
- package/dist/connectors/netsuite/tools.js +447 -0
- package/dist/connectors/netsuite/tools.js.map +1 -0
- package/dist/connectors/netsuite/vendor.d.ts +26 -0
- package/dist/connectors/netsuite/vendor.js +247 -0
- package/dist/connectors/netsuite/vendor.js.map +1 -0
- package/dist/connectors/odata/index.d.ts +33 -0
- package/dist/connectors/odata/index.js +460 -0
- package/dist/connectors/odata/index.js.map +1 -0
- package/dist/connectors/okta/connector.json +194 -0
- package/dist/connectors/okta/index.d.ts +8 -0
- package/dist/connectors/okta/index.js +7 -0
- package/dist/connectors/okta/index.js.map +1 -0
- package/dist/connectors/okta/tools.d.ts +6 -0
- package/dist/connectors/okta/tools.js +429 -0
- package/dist/connectors/okta/tools.js.map +1 -0
- package/dist/connectors/okta/vendor.d.ts +14 -0
- package/dist/connectors/okta/vendor.js +204 -0
- package/dist/connectors/okta/vendor.js.map +1 -0
- package/dist/connectors/outlook-calendar/connector.json +136 -0
- package/dist/connectors/outlook-calendar/index.d.ts +2 -0
- package/dist/connectors/outlook-calendar/index.js +4 -0
- package/dist/connectors/outlook-calendar/index.js.map +1 -0
- package/dist/connectors/outlook-calendar/tools.d.ts +65 -0
- package/dist/connectors/outlook-calendar/tools.js +398 -0
- package/dist/connectors/outlook-calendar/tools.js.map +1 -0
- package/dist/connectors/outlook-mail/connector.json +154 -0
- package/dist/connectors/outlook-mail/index.d.ts +2 -0
- package/dist/connectors/outlook-mail/index.js +4 -0
- package/dist/connectors/outlook-mail/index.js.map +1 -0
- package/dist/connectors/outlook-mail/tools.d.ts +8 -0
- package/dist/connectors/outlook-mail/tools.js +236 -0
- package/dist/connectors/outlook-mail/tools.js.map +1 -0
- package/dist/connectors/salesforce/connector.json +122 -0
- package/dist/connectors/salesforce/index.d.ts +8 -0
- package/dist/connectors/salesforce/index.js +7 -0
- package/dist/connectors/salesforce/index.js.map +1 -0
- package/dist/connectors/salesforce/soql.d.ts +3 -0
- package/dist/connectors/salesforce/soql.js +60 -0
- package/dist/connectors/salesforce/soql.js.map +1 -0
- package/dist/connectors/salesforce/tools.d.ts +9 -0
- package/dist/connectors/salesforce/tools.js +234 -0
- package/dist/connectors/salesforce/tools.js.map +1 -0
- package/dist/connectors/salesforce/vendor.d.ts +3 -0
- package/dist/connectors/salesforce/vendor.js +113 -0
- package/dist/connectors/salesforce/vendor.js.map +1 -0
- package/dist/connectors/sap-s4hana/connector.json +264 -0
- package/dist/connectors/sap-s4hana/index.d.ts +8 -0
- package/dist/connectors/sap-s4hana/index.js +7 -0
- package/dist/connectors/sap-s4hana/index.js.map +1 -0
- package/dist/connectors/sap-s4hana/tools.d.ts +4 -0
- package/dist/connectors/sap-s4hana/tools.js +761 -0
- package/dist/connectors/sap-s4hana/tools.js.map +1 -0
- package/dist/connectors/sap-s4hana/vendor.d.ts +5 -0
- package/dist/connectors/sap-s4hana/vendor.js +176 -0
- package/dist/connectors/sap-s4hana/vendor.js.map +1 -0
- package/dist/connectors/servicenow/connector.json +228 -0
- package/dist/connectors/servicenow/index.d.ts +8 -0
- package/dist/connectors/servicenow/index.js +7 -0
- package/dist/connectors/servicenow/index.js.map +1 -0
- package/dist/connectors/servicenow/tools.d.ts +4 -0
- package/dist/connectors/servicenow/tools.js +884 -0
- package/dist/connectors/servicenow/tools.js.map +1 -0
- package/dist/connectors/servicenow/vendor.d.ts +3 -0
- package/dist/connectors/servicenow/vendor.js +106 -0
- package/dist/connectors/servicenow/vendor.js.map +1 -0
- package/dist/connectors/sharepoint-files/connector.json +194 -0
- package/dist/connectors/sharepoint-files/excel.d.ts +16 -0
- package/dist/connectors/sharepoint-files/excel.js +300 -0
- package/dist/connectors/sharepoint-files/excel.js.map +1 -0
- package/dist/connectors/sharepoint-files/index.d.ts +8 -0
- package/dist/connectors/sharepoint-files/index.js +12 -0
- package/dist/connectors/sharepoint-files/index.js.map +1 -0
- package/dist/connectors/sharepoint-files/tools.d.ts +52 -0
- package/dist/connectors/sharepoint-files/tools.js +365 -0
- package/dist/connectors/sharepoint-files/tools.js.map +1 -0
- package/dist/connectors/sharepoint-files/vendor.d.ts +11 -0
- package/dist/connectors/sharepoint-files/vendor.js +167 -0
- package/dist/connectors/sharepoint-files/vendor.js.map +1 -0
- package/dist/connectors/slack/connector.json +148 -0
- package/dist/connectors/slack/index.d.ts +8 -0
- package/dist/connectors/slack/index.js +7 -0
- package/dist/connectors/slack/index.js.map +1 -0
- package/dist/connectors/slack/tools.d.ts +3 -0
- package/dist/connectors/slack/tools.js +355 -0
- package/dist/connectors/slack/tools.js.map +1 -0
- package/dist/connectors/slack/vendor.d.ts +17 -0
- package/dist/connectors/slack/vendor.js +189 -0
- package/dist/connectors/slack/vendor.js.map +1 -0
- package/dist/connectors/soap/index.d.ts +16 -0
- package/dist/connectors/soap/index.js +248 -0
- package/dist/connectors/soap/index.js.map +1 -0
- package/dist/connectors/soap/xml.d.ts +12 -0
- package/dist/connectors/soap/xml.js +126 -0
- package/dist/connectors/soap/xml.js.map +1 -0
- package/dist/connectors/sql/engines.d.ts +58 -0
- package/dist/connectors/sql/engines.js +292 -0
- package/dist/connectors/sql/engines.js.map +1 -0
- package/dist/connectors/sql/index.d.ts +16 -0
- package/dist/connectors/sql/index.js +214 -0
- package/dist/connectors/sql/index.js.map +1 -0
- package/dist/connectors/teams/connector.json +298 -0
- package/dist/connectors/teams/index.d.ts +2 -0
- package/dist/connectors/teams/index.js +5 -0
- package/dist/connectors/teams/index.js.map +1 -0
- package/dist/connectors/teams/tools.d.ts +7 -0
- package/dist/connectors/teams/tools.js +392 -0
- package/dist/connectors/teams/tools.js.map +1 -0
- package/dist/connectors/workday/connector.json +188 -0
- package/dist/connectors/workday/index.d.ts +8 -0
- package/dist/connectors/workday/index.js +7 -0
- package/dist/connectors/workday/index.js.map +1 -0
- package/dist/connectors/workday/tools.d.ts +33 -0
- package/dist/connectors/workday/tools.js +410 -0
- package/dist/connectors/workday/tools.js.map +1 -0
- package/dist/connectors/workday/vendor.d.ts +18 -0
- package/dist/connectors/workday/vendor.js +199 -0
- package/dist/connectors/workday/vendor.js.map +1 -0
- package/dist/packages/connector-kit/src/branding.d.ts +57 -0
- package/dist/packages/connector-kit/src/branding.js +102 -0
- package/dist/packages/connector-kit/src/branding.js.map +1 -0
- package/dist/packages/connector-kit/src/certificate.d.ts +19 -0
- package/dist/packages/connector-kit/src/certificate.js +84 -0
- package/dist/packages/connector-kit/src/certificate.js.map +1 -0
- package/dist/packages/connector-kit/src/common.d.ts +36 -0
- package/dist/packages/connector-kit/src/common.js +110 -0
- package/dist/packages/connector-kit/src/common.js.map +1 -0
- package/dist/packages/connector-kit/src/connector.d.ts +1356 -0
- package/dist/packages/connector-kit/src/connector.js +1073 -0
- package/dist/packages/connector-kit/src/connector.js.map +1 -0
- package/dist/packages/connector-kit/src/fetch.d.ts +6 -0
- package/dist/packages/connector-kit/src/fetch.js +44 -0
- package/dist/packages/connector-kit/src/fetch.js.map +1 -0
- package/dist/packages/connector-kit/src/index.d.ts +5 -0
- package/dist/packages/connector-kit/src/index.js +6 -0
- package/dist/packages/connector-kit/src/index.js.map +1 -0
- package/dist/packages/connector-kit/src/oauth.d.ts +15 -0
- package/dist/packages/connector-kit/src/oauth.js +98 -0
- package/dist/packages/connector-kit/src/oauth.js.map +1 -0
- package/dist/packages/connector-kit/src/types.d.ts +87 -0
- package/dist/packages/connector-kit/src/types.js +20 -0
- package/dist/packages/connector-kit/src/types.js.map +1 -0
- package/dist/packages/server/migrations/0001_tables.sql +268 -0
- package/dist/packages/server/migrations/0002_organizations.sql +72 -0
- package/dist/packages/server/migrations/0003_drop_unused.sql +3 -0
- package/dist/packages/server/migrations/0004_trigger_runners.sql +15 -0
- package/dist/packages/server/migrations/0005_run_runner.sql +3 -0
- package/dist/packages/server/migrations/0006_approvals.sql +36 -0
- package/dist/packages/server/migrations/0007_app_events.sql +110 -0
- package/dist/packages/server/migrations/rollback/to-legacy.sql +90 -0
- package/dist/packages/server/src/api.d.ts +3730 -0
- package/dist/packages/server/src/api.js +820 -0
- package/dist/packages/server/src/api.js.map +1 -0
- package/dist/packages/server/src/app.d.ts +23 -0
- package/dist/packages/server/src/app.js +467 -0
- package/dist/packages/server/src/app.js.map +1 -0
- package/dist/packages/server/src/builtin.d.ts +5 -0
- package/dist/packages/server/src/builtin.js +42 -0
- package/dist/packages/server/src/builtin.js.map +1 -0
- package/dist/packages/server/src/consent.d.ts +27 -0
- package/dist/packages/server/src/consent.js +36 -0
- package/dist/packages/server/src/consent.js.map +1 -0
- package/dist/packages/server/src/events/admin.d.ts +156 -0
- package/dist/packages/server/src/events/admin.js +255 -0
- package/dist/packages/server/src/events/admin.js.map +1 -0
- package/dist/packages/server/src/events/deliver.d.ts +43 -0
- package/dist/packages/server/src/events/deliver.js +129 -0
- package/dist/packages/server/src/events/deliver.js.map +1 -0
- package/dist/packages/server/src/events/runtime.d.ts +28 -0
- package/dist/packages/server/src/events/runtime.js +400 -0
- package/dist/packages/server/src/events/runtime.js.map +1 -0
- package/dist/packages/server/src/events/store.d.ts +172 -0
- package/dist/packages/server/src/events/store.js +275 -0
- package/dist/packages/server/src/events/store.js.map +1 -0
- package/dist/packages/server/src/index.d.ts +40 -0
- package/dist/packages/server/src/index.js +186 -0
- package/dist/packages/server/src/index.js.map +1 -0
- package/dist/packages/server/src/migrate.d.ts +11 -0
- package/dist/packages/server/src/migrate.js +134 -0
- package/dist/packages/server/src/migrate.js.map +1 -0
- package/dist/packages/server/src/openapi.d.ts +4 -0
- package/dist/packages/server/src/openapi.js +101 -0
- package/dist/packages/server/src/openapi.js.map +1 -0
- package/dist/packages/server/src/queue.d.ts +10 -0
- package/dist/packages/server/src/queue.js +45 -0
- package/dist/packages/server/src/queue.js.map +1 -0
- package/dist/packages/server/src/secrets.d.ts +19 -0
- package/dist/packages/server/src/secrets.js +76 -0
- package/dist/packages/server/src/secrets.js.map +1 -0
- package/dist/packages/server/src/server.d.ts +1 -0
- package/dist/packages/server/src/server.js +82 -0
- package/dist/packages/server/src/server.js.map +1 -0
- package/dist/packages/server/src/service.d.ts +767 -0
- package/dist/packages/server/src/service.js +924 -0
- package/dist/packages/server/src/service.js.map +1 -0
- package/dist/packages/server/src/store.d.ts +157 -0
- package/dist/packages/server/src/store.js +415 -0
- package/dist/packages/server/src/store.js.map +1 -0
- package/dist/packages/server/src/teams/activity.d.ts +123 -0
- package/dist/packages/server/src/teams/activity.js +188 -0
- package/dist/packages/server/src/teams/activity.js.map +1 -0
- package/dist/packages/server/src/teams/admin.d.ts +335 -0
- package/dist/packages/server/src/teams/admin.js +699 -0
- package/dist/packages/server/src/teams/admin.js.map +1 -0
- package/dist/packages/server/src/teams/approval.d.ts +57 -0
- package/dist/packages/server/src/teams/approval.js +118 -0
- package/dist/packages/server/src/teams/approval.js.map +1 -0
- package/dist/packages/server/src/teams/bot.d.ts +25 -0
- package/dist/packages/server/src/teams/bot.js +124 -0
- package/dist/packages/server/src/teams/bot.js.map +1 -0
- package/dist/packages/server/src/teams/claude.d.ts +46 -0
- package/dist/packages/server/src/teams/claude.js +165 -0
- package/dist/packages/server/src/teams/claude.js.map +1 -0
- package/dist/packages/server/src/teams/jwt.d.ts +17 -0
- package/dist/packages/server/src/teams/jwt.js +121 -0
- package/dist/packages/server/src/teams/jwt.js.map +1 -0
- package/dist/packages/server/src/teams/package.d.ts +79 -0
- package/dist/packages/server/src/teams/package.js +319 -0
- package/dist/packages/server/src/teams/package.js.map +1 -0
- package/dist/packages/server/src/teams/provision.d.ts +84 -0
- package/dist/packages/server/src/teams/provision.js +505 -0
- package/dist/packages/server/src/teams/provision.js.map +1 -0
- package/dist/packages/server/src/teams/runner.d.ts +80 -0
- package/dist/packages/server/src/teams/runner.js +187 -0
- package/dist/packages/server/src/teams/runner.js.map +1 -0
- package/dist/packages/server/src/teams/runtime.d.ts +91 -0
- package/dist/packages/server/src/teams/runtime.js +679 -0
- package/dist/packages/server/src/teams/runtime.js.map +1 -0
- package/dist/packages/server/src/teams/store.d.ts +233 -0
- package/dist/packages/server/src/teams/store.js +507 -0
- package/dist/packages/server/src/teams/store.js.map +1 -0
- package/package.json +68 -4
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { retryAfter, vendorFetch } from "../../packages/connector-kit/src/fetch.js";
|
|
2
|
+
import { ConnectError, } from "../../packages/connector-kit/src/types.js";
|
|
3
|
+
// A Slack app's bot token (xoxb-), made from the manifest in the setup steps and installed to
|
|
4
|
+
// one workspace. Web API methods at slack.com/api/<method>: reads as GET with query arguments,
|
|
5
|
+
// writes as POST JSON (docs.slack.dev/apis/web-api). Slack answers most
|
|
6
|
+
// failures 200 with {ok: false, error}; call() turns those into a status so the service's
|
|
7
|
+
// probes and the tools' VendorFailed treat them like any app's refusal.
|
|
8
|
+
const API = "https://slack.com/api";
|
|
9
|
+
// Where files.getUploadURLExternal points the file's bytes; the only other host called.
|
|
10
|
+
const UPLOAD_HOST = "files.slack.com";
|
|
11
|
+
const STATUS = {
|
|
12
|
+
not_authed: 401,
|
|
13
|
+
invalid_auth: 401,
|
|
14
|
+
account_inactive: 401,
|
|
15
|
+
token_revoked: 401,
|
|
16
|
+
token_expired: 401,
|
|
17
|
+
missing_scope: 403,
|
|
18
|
+
not_allowed_token_type: 403,
|
|
19
|
+
no_permission: 403,
|
|
20
|
+
restricted_action: 403,
|
|
21
|
+
ekm_access_denied: 403,
|
|
22
|
+
channel_not_found: 404,
|
|
23
|
+
message_not_found: 404,
|
|
24
|
+
thread_not_found: 404,
|
|
25
|
+
users_not_found: 404,
|
|
26
|
+
user_not_found: 404,
|
|
27
|
+
ratelimited: 429,
|
|
28
|
+
};
|
|
29
|
+
// Slack's error codes in words an agent or admin can act on; others are passed as they are.
|
|
30
|
+
const WORDS = {
|
|
31
|
+
not_in_channel: "the app is not a member of that channel. Someone in the channel can add it with /invite",
|
|
32
|
+
channel_not_found: "no channel with that id is visible to the app",
|
|
33
|
+
is_archived: "that channel is archived",
|
|
34
|
+
message_not_found: "no message with that timestamp in that channel",
|
|
35
|
+
thread_not_found: "no thread with that timestamp in that channel",
|
|
36
|
+
cant_delete_message: "the app can delete only its own messages",
|
|
37
|
+
msg_too_long: "the message is too long",
|
|
38
|
+
no_text: "the message is empty",
|
|
39
|
+
invalid_name: "no emoji with that name",
|
|
40
|
+
too_many_reactions: "that message has too many reactions",
|
|
41
|
+
users_not_found: "no person with that email address",
|
|
42
|
+
missing_scope: "the Slack app lacks a permission this needs",
|
|
43
|
+
invalid_auth: "Slack no longer accepts the app's token",
|
|
44
|
+
token_revoked: "the app's token was revoked",
|
|
45
|
+
account_inactive: "the app was uninstalled or its token deactivated",
|
|
46
|
+
};
|
|
47
|
+
export function slackError(res) {
|
|
48
|
+
const d = res.data;
|
|
49
|
+
if (res.status === 429) {
|
|
50
|
+
const after = typeof d?.retry_after === "number" ? ` Try again in ${d.retry_after} seconds.` : "";
|
|
51
|
+
return `Slack is limiting how often the app may call it.${after}`;
|
|
52
|
+
}
|
|
53
|
+
const code = typeof d?.error === "string" ? d.error : null;
|
|
54
|
+
if (!code)
|
|
55
|
+
return `Slack answered ${res.status}`;
|
|
56
|
+
const needed = code === "missing_scope" && typeof d?.needed === "string" ? ` (${d.needed})` : "";
|
|
57
|
+
return `Slack answered ${code}: ${WORDS[code] ?? code.replaceAll("_", " ")}${needed}`;
|
|
58
|
+
}
|
|
59
|
+
export function slackVendor(unguarded = fetch, wait) {
|
|
60
|
+
const fetchImpl = vendorFetch("Slack", unguarded, wait);
|
|
61
|
+
async function send(token, request) {
|
|
62
|
+
const upload = request.path.startsWith("https://");
|
|
63
|
+
if (upload && new URL(request.path).host !== UPLOAD_HOST)
|
|
64
|
+
throw new Error("Slack upload address on an unexpected host");
|
|
65
|
+
const res = await fetchImpl(upload ? request.path : `${API}${request.path}`, {
|
|
66
|
+
method: request.method,
|
|
67
|
+
headers: upload
|
|
68
|
+
? { "content-type": "application/octet-stream" }
|
|
69
|
+
: {
|
|
70
|
+
authorization: `Bearer ${token}`,
|
|
71
|
+
...(request.body === undefined
|
|
72
|
+
? {}
|
|
73
|
+
: { "content-type": "application/json; charset=utf-8" }),
|
|
74
|
+
},
|
|
75
|
+
body: request.body === undefined
|
|
76
|
+
? undefined
|
|
77
|
+
: upload
|
|
78
|
+
? String(request.body)
|
|
79
|
+
: JSON.stringify(request.body),
|
|
80
|
+
});
|
|
81
|
+
const raw = await res.text();
|
|
82
|
+
const headers = Object.fromEntries(res.headers);
|
|
83
|
+
if (res.status === 429) {
|
|
84
|
+
const data = {
|
|
85
|
+
ok: false,
|
|
86
|
+
error: "ratelimited",
|
|
87
|
+
retry_after: retryAfter(res.headers.get("retry-after")),
|
|
88
|
+
};
|
|
89
|
+
return { headers: res.headers, response: { status: 429, data, headers } };
|
|
90
|
+
}
|
|
91
|
+
const data = raw ? parse(raw) : null;
|
|
92
|
+
const error = !upload && res.ok ? refusal(data) : null;
|
|
93
|
+
const status = error === null ? res.status : (STATUS[error] ?? 400);
|
|
94
|
+
return { headers: res.headers, response: { status, data, headers } };
|
|
95
|
+
}
|
|
96
|
+
const token = (c) => {
|
|
97
|
+
const t = c.secret.bot_token;
|
|
98
|
+
if (!t)
|
|
99
|
+
throw new Error("Slack connection has no bot token");
|
|
100
|
+
return t;
|
|
101
|
+
};
|
|
102
|
+
const call = async (c, request) => (await send(token(c), request)).response;
|
|
103
|
+
return {
|
|
104
|
+
async connect(fields) {
|
|
105
|
+
const botToken = fields.bot_token?.trim() ?? "";
|
|
106
|
+
if (!botToken.startsWith("xoxb-"))
|
|
107
|
+
throw new ConnectError("Enter the app's Bot User OAuth Token, which starts with xoxb- (Install App in the app's settings)");
|
|
108
|
+
const { response } = await send(botToken, { method: "GET", path: "/auth.test" });
|
|
109
|
+
const d = response.data;
|
|
110
|
+
if (response.status === 401)
|
|
111
|
+
throw new ConnectError("Slack did not accept the token");
|
|
112
|
+
if (response.status !== 200 || typeof d?.team_id !== "string")
|
|
113
|
+
throw new ConnectError(`Slack sign-in failed. ${slackError(response)}`);
|
|
114
|
+
const url = typeof d.url === "string" ? d.url : "";
|
|
115
|
+
const team = typeof d.team === "string" ? d.team : d.team_id;
|
|
116
|
+
return {
|
|
117
|
+
config: { teamId: d.team_id, team, url, botUserId: String(d.user_id ?? "") },
|
|
118
|
+
secret: { bot_token: botToken },
|
|
119
|
+
accountLabel: url ? `${team} (${new URL(url).host})` : team,
|
|
120
|
+
};
|
|
121
|
+
},
|
|
122
|
+
call,
|
|
123
|
+
checks: {
|
|
124
|
+
// auth.test proves the token; Slack names its scopes in x-oauth-scopes on every answer.
|
|
125
|
+
async workspace(connection, { expected }) {
|
|
126
|
+
const { headers, response } = await send(token(connection), {
|
|
127
|
+
method: "GET",
|
|
128
|
+
path: "/auth.test",
|
|
129
|
+
});
|
|
130
|
+
if (response.status !== 200)
|
|
131
|
+
throw new ConnectError(`Slack sign-in failed. ${slackError(response)}`);
|
|
132
|
+
const d = response.data;
|
|
133
|
+
const has = new Set((headers.get("x-oauth-scopes") ?? "").split(",").map((s) => s.trim()));
|
|
134
|
+
const missing = expected.filter((s) => !has.has(s));
|
|
135
|
+
return {
|
|
136
|
+
values: [d.url ? `${d.team} (${new URL(d.url).host})` : String(d.team)],
|
|
137
|
+
...(missing.length
|
|
138
|
+
? {
|
|
139
|
+
warning: `The Slack app is missing these bot scopes: ${missing.join(", ")}. Add them under OAuth & Permissions, reinstall the app to the workspace, then check again.`,
|
|
140
|
+
}
|
|
141
|
+
: {}),
|
|
142
|
+
};
|
|
143
|
+
},
|
|
144
|
+
async channels(connection) {
|
|
145
|
+
return { values: (await memberChannels(call, connection)).map((c) => c.id) };
|
|
146
|
+
},
|
|
147
|
+
},
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
// Every channel the bot is a member of, for the admin's limit choices: at most 5 pages of 200.
|
|
151
|
+
export async function memberChannels(call, connection) {
|
|
152
|
+
const out = [];
|
|
153
|
+
let cursor = "";
|
|
154
|
+
for (let page = 0; page < 5; page++) {
|
|
155
|
+
const res = await call(connection, {
|
|
156
|
+
method: "GET",
|
|
157
|
+
path: `/users.conversations?${channelQuery(200, cursor)}`,
|
|
158
|
+
});
|
|
159
|
+
if (res.status !== 200)
|
|
160
|
+
throw new ConnectError(slackError(res));
|
|
161
|
+
const d = res.data;
|
|
162
|
+
out.push(...(d.channels ?? []));
|
|
163
|
+
cursor = d.response_metadata?.next_cursor ?? "";
|
|
164
|
+
if (!cursor)
|
|
165
|
+
break;
|
|
166
|
+
}
|
|
167
|
+
return out;
|
|
168
|
+
}
|
|
169
|
+
export const channelQuery = (limit, cursor = "") => new URLSearchParams({
|
|
170
|
+
types: "public_channel,private_channel",
|
|
171
|
+
exclude_archived: "true",
|
|
172
|
+
limit: String(limit),
|
|
173
|
+
...(cursor ? { cursor } : {}),
|
|
174
|
+
}).toString();
|
|
175
|
+
function refusal(data) {
|
|
176
|
+
if (!data || typeof data !== "object")
|
|
177
|
+
return null;
|
|
178
|
+
const d = data;
|
|
179
|
+
return d.ok === false ? (typeof d.error === "string" ? d.error : "unknown_error") : null;
|
|
180
|
+
}
|
|
181
|
+
function parse(raw) {
|
|
182
|
+
try {
|
|
183
|
+
return JSON.parse(raw);
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return raw;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=vendor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vendor.js","sourceRoot":"","sources":["../../../connectors/slack/vendor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type Toolset } from "../../packages/connector-kit/src/common.js";
|
|
2
|
+
import { type Connector, type SoapApp, type SoapTool } from "../../packages/connector-kit/src/connector.js";
|
|
3
|
+
import { type Fetch, type Vendor } from "../../packages/connector-kit/src/types.js";
|
|
4
|
+
export declare function renderBody(tool: SoapTool, args: Record<string, unknown>): string;
|
|
5
|
+
export declare function soapVendor(connector: Connector, fetchImpl?: Fetch): Vendor;
|
|
6
|
+
export declare function answer(tool: SoapTool, body: unknown): unknown;
|
|
7
|
+
export declare function soapTools(soap: SoapApp): Toolset;
|
|
8
|
+
/** Binds to any connector with a `soap` block; createAgentConnect uses it for those. */
|
|
9
|
+
declare const _default: {
|
|
10
|
+
id: string;
|
|
11
|
+
create: ({ connector }: import("../../packages/connector-kit/src/connector.js").ConnectorContext) => {
|
|
12
|
+
vendor: Vendor;
|
|
13
|
+
toolset: Toolset;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
export default _default;
|
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { audited, Denied, json, listLimit, VendorFailed, } from "../../packages/connector-kit/src/common.js";
|
|
4
|
+
import { pickDisplay, } from "../../packages/connector-kit/src/connector.js";
|
|
5
|
+
import { vendorError } from "../../packages/connector-kit/src/oauth.js";
|
|
6
|
+
import { ConnectError, } from "../../packages/connector-kit/src/types.js";
|
|
7
|
+
import { answerWithin, authHeaders, formValues, guardedFetch, MAX_BODY_BYTES, paramLimits, zodType, } from "../http/index.js";
|
|
8
|
+
import { escapeXml, localName, parseXml, toJson, XmlError } from "./xml.js";
|
|
9
|
+
// The generic module behind every connector.json with a `soap` block: a SOAP 1.1 or 1.2
|
|
10
|
+
// service described as data. Calls reach only the endpoint's origin, always POSTing to it.
|
|
11
|
+
const ENVELOPE = {
|
|
12
|
+
"1.1": "http://schemas.xmlsoap.org/soap/envelope/",
|
|
13
|
+
"1.2": "http://www.w3.org/2003/05/soap-envelope",
|
|
14
|
+
};
|
|
15
|
+
const WSSE = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
|
|
16
|
+
const WSU = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd";
|
|
17
|
+
const TOKEN_PROFILE = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0";
|
|
18
|
+
const XML_TYPES = /^(text\/|application\/([\w.+-]*\+)?(xml|json))/i;
|
|
19
|
+
// Characters XML 1.0 cannot carry, even escaped.
|
|
20
|
+
const NOT_XML = /[\u0000-\u0008\u000B\u000C\u000E-\u001F]/;
|
|
21
|
+
// The Body content of one call: the template with each value escaped, and an optional
|
|
22
|
+
// param's element dropped when it is left out.
|
|
23
|
+
export function renderBody(tool, args) {
|
|
24
|
+
let body = tool.body;
|
|
25
|
+
for (const [name, p] of Object.entries(tool.params)) {
|
|
26
|
+
if (args[name] !== undefined)
|
|
27
|
+
continue;
|
|
28
|
+
if (p.required)
|
|
29
|
+
throw new Denied(`${name} is required`);
|
|
30
|
+
body = body.replace(new RegExp(`<([\\w.:-]+)(\\s[^>]*)?>\\{${name}\\}</\\1>`), "");
|
|
31
|
+
}
|
|
32
|
+
// One pass, so a value holding "{other}" is never read as a placeholder.
|
|
33
|
+
return body.replace(/\{([a-z][a-z0-9_]*)\}/g, (_, name) => {
|
|
34
|
+
const value = String(args[name]);
|
|
35
|
+
if (NOT_XML.test(value))
|
|
36
|
+
throw new Denied(`${name} has characters XML cannot carry`);
|
|
37
|
+
return escapeXml(value);
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
function usernameToken(username, password, digest) {
|
|
41
|
+
const nonce = randomBytes(16);
|
|
42
|
+
const created = new Date().toISOString();
|
|
43
|
+
const value = digest
|
|
44
|
+
? createHash("sha1")
|
|
45
|
+
.update(Buffer.concat([nonce, Buffer.from(created + password)]))
|
|
46
|
+
.digest("base64")
|
|
47
|
+
: password;
|
|
48
|
+
return (`<wsse:Security xmlns:wsse="${WSSE}" xmlns:wsu="${WSU}"><wsse:UsernameToken>` +
|
|
49
|
+
`<wsse:Username>${escapeXml(username)}</wsse:Username>` +
|
|
50
|
+
`<wsse:Password Type="${TOKEN_PROFILE}#${digest ? "PasswordDigest" : "PasswordText"}">${escapeXml(value)}</wsse:Password>` +
|
|
51
|
+
`<wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">${nonce.toString("base64")}</wsse:Nonce>` +
|
|
52
|
+
`<wsu:Created>${created}</wsu:Created></wsse:UsernameToken></wsse:Security>`);
|
|
53
|
+
}
|
|
54
|
+
const child = (node, name) => node?.children.find((c) => localName(c.name) === name);
|
|
55
|
+
// A SOAP Fault's code and text, from either version's shape.
|
|
56
|
+
function faultText(fault) {
|
|
57
|
+
const f = toJson(fault);
|
|
58
|
+
const first = (v) => (Array.isArray(v) ? v[0] : v);
|
|
59
|
+
const reason = f.Reason;
|
|
60
|
+
const code = f.Code;
|
|
61
|
+
const message = String(first(f.faultstring ?? reason?.Text) ?? "no reason given");
|
|
62
|
+
const kind = f.faultcode ?? code?.Value;
|
|
63
|
+
return `${message.slice(0, 300)}${typeof kind === "string" ? ` (${kind})` : ""}`;
|
|
64
|
+
}
|
|
65
|
+
function failure(status, data) {
|
|
66
|
+
const fault = data?.fault;
|
|
67
|
+
if (fault)
|
|
68
|
+
return `The service refused the call: ${fault}`;
|
|
69
|
+
const detail = vendorError(data);
|
|
70
|
+
return `The service answered ${status}${detail ? `: ${detail}` : ""}`;
|
|
71
|
+
}
|
|
72
|
+
export function soapVendor(connector, fetchImpl = fetch) {
|
|
73
|
+
const soap = connector.soap;
|
|
74
|
+
const endpoint = new URL(soap.endpoint);
|
|
75
|
+
const safe = guardedFetch([endpoint.origin], fetchImpl, XML_TYPES, "XML, JSON or text");
|
|
76
|
+
const ns = Object.entries(soap.namespaces)
|
|
77
|
+
.map(([prefix, uri]) => ` xmlns:${prefix}="${escapeXml(uri)}"`)
|
|
78
|
+
.join("");
|
|
79
|
+
// request.body is the Body's content (already escaped), request.headers.soapaction its action.
|
|
80
|
+
const call = async (c, request) => {
|
|
81
|
+
const ws = soap.wsSecurity;
|
|
82
|
+
const header = ws
|
|
83
|
+
? `<soap:Header>${usernameToken(c.config[ws.username], c.secret[ws.password], ws.digest)}</soap:Header>`
|
|
84
|
+
: "";
|
|
85
|
+
const envelope = `<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:soap="${ENVELOPE[soap.version]}"${ns}>` +
|
|
86
|
+
`${header}<soap:Body>${String(request.body)}</soap:Body></soap:Envelope>`;
|
|
87
|
+
const action = request.headers?.soapaction;
|
|
88
|
+
const res = await safe(endpoint, {
|
|
89
|
+
method: "POST",
|
|
90
|
+
headers: {
|
|
91
|
+
accept: soap.version === "1.1" ? "text/xml" : "application/soap+xml",
|
|
92
|
+
...(soap.auth ? authHeaders(soap.auth, c) : {}),
|
|
93
|
+
...(soap.version === "1.1"
|
|
94
|
+
? { "content-type": "text/xml; charset=utf-8", soapaction: `"${action ?? ""}"` }
|
|
95
|
+
: {
|
|
96
|
+
"content-type": `application/soap+xml; charset=utf-8${action ? `; action="${action}"` : ""}`,
|
|
97
|
+
}),
|
|
98
|
+
},
|
|
99
|
+
body: envelope,
|
|
100
|
+
});
|
|
101
|
+
const raw = await res.text();
|
|
102
|
+
let doc = null;
|
|
103
|
+
try {
|
|
104
|
+
doc = parseXml(raw);
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
if (!(error instanceof XmlError))
|
|
108
|
+
throw error;
|
|
109
|
+
if (res.ok)
|
|
110
|
+
throw new ConnectError(`The service's answer is not usable XML: ${error.message}`);
|
|
111
|
+
}
|
|
112
|
+
const body = doc && localName(doc.name) === "Envelope" ? child(doc, "Body") : undefined;
|
|
113
|
+
if (!body) {
|
|
114
|
+
// A gateway's error page, say: its own words, as for any app.
|
|
115
|
+
if (!res.ok)
|
|
116
|
+
return { status: res.status, data: raw.slice(0, 300) };
|
|
117
|
+
throw new ConnectError("The service answered without a SOAP envelope");
|
|
118
|
+
}
|
|
119
|
+
const fault = child(body, "Fault");
|
|
120
|
+
if (fault)
|
|
121
|
+
return { status: res.ok ? 500 : res.status, data: { fault: faultText(fault) } };
|
|
122
|
+
return { status: res.status, data: toJson(body) };
|
|
123
|
+
};
|
|
124
|
+
return {
|
|
125
|
+
async connect(fields) {
|
|
126
|
+
const { config, secret } = formValues(connector, fields);
|
|
127
|
+
const conn = { config: { host: endpoint.host, ...config }, secret };
|
|
128
|
+
return { ...conn, accountLabel: conn.config[connector.accountKey] ?? endpoint.host };
|
|
129
|
+
},
|
|
130
|
+
call,
|
|
131
|
+
checks: soap.verify
|
|
132
|
+
? {
|
|
133
|
+
// The connector's `verify` call, with the admin's own arguments.
|
|
134
|
+
async operation(c) {
|
|
135
|
+
const verify = soap.verify;
|
|
136
|
+
const tool = soap.tools.find((t) => t.name === verify.tool);
|
|
137
|
+
const res = await call(c, {
|
|
138
|
+
method: "POST",
|
|
139
|
+
path: "",
|
|
140
|
+
body: renderBody(tool, verify.args),
|
|
141
|
+
headers: tool.soapAction ? { soapaction: tool.soapAction } : {},
|
|
142
|
+
});
|
|
143
|
+
if (res.status < 200 || res.status >= 300)
|
|
144
|
+
throw new ConnectError(failure(res.status, res.data));
|
|
145
|
+
const shown = answer(tool, res.data);
|
|
146
|
+
return {
|
|
147
|
+
values: (Array.isArray(shown) ? shown : [shown]).flatMap((item) => pickDisplay(item, verify.show)),
|
|
148
|
+
};
|
|
149
|
+
},
|
|
150
|
+
}
|
|
151
|
+
: undefined,
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
// The tool's part of the Body: its `result` path, a list when it ends in [], and only its
|
|
155
|
+
// `fields`.
|
|
156
|
+
export function answer(tool, body) {
|
|
157
|
+
const path = tool.result ?? `${tool.operation}Response`;
|
|
158
|
+
const list = path.endsWith("[]");
|
|
159
|
+
let value = body;
|
|
160
|
+
for (const key of path.replace(/\[\]$/, "").split(".")) {
|
|
161
|
+
value =
|
|
162
|
+
value && typeof value === "object" && !Array.isArray(value) && Object.hasOwn(value, key)
|
|
163
|
+
? value[key]
|
|
164
|
+
: undefined;
|
|
165
|
+
}
|
|
166
|
+
if (list)
|
|
167
|
+
value = value === undefined || value === "" ? [] : [value].flat();
|
|
168
|
+
const keep = tool.fields;
|
|
169
|
+
if (!keep)
|
|
170
|
+
return value ?? null;
|
|
171
|
+
const trim = (item) => item && typeof item === "object"
|
|
172
|
+
? Object.fromEntries(keep.flatMap((k) => Object.hasOwn(item, k) ? [[k, item[k]]] : []))
|
|
173
|
+
: item;
|
|
174
|
+
return Array.isArray(value) ? value.map(trim) : trim(value ?? null);
|
|
175
|
+
}
|
|
176
|
+
export function soapTools(soap) {
|
|
177
|
+
return {
|
|
178
|
+
names: soap.tools.map((t) => t.name),
|
|
179
|
+
register(server, ctx, allowed) {
|
|
180
|
+
for (const tool of soap.tools) {
|
|
181
|
+
if (!allowed.has(tool.name))
|
|
182
|
+
continue;
|
|
183
|
+
const shape = Object.fromEntries(Object.entries(tool.params).map(([name, p]) => {
|
|
184
|
+
const type = zodType[p.type].describe(p.description);
|
|
185
|
+
return [name, p.required ? type : type.optional()];
|
|
186
|
+
}));
|
|
187
|
+
server.registerTool(tool.name, {
|
|
188
|
+
description: tool.description,
|
|
189
|
+
inputSchema: z.object(shape).strict(),
|
|
190
|
+
annotations: {
|
|
191
|
+
readOnlyHint: tool.readOnly,
|
|
192
|
+
destructiveHint: tool.destructive,
|
|
193
|
+
openWorldHint: true,
|
|
194
|
+
},
|
|
195
|
+
}, (args) => audited(ctx, tool.name, JSON.stringify(args).slice(0, 300), async (mark) => {
|
|
196
|
+
paramLimits(ctx.limits, tool.params, args);
|
|
197
|
+
const body = renderBody(tool, args);
|
|
198
|
+
if (Buffer.byteLength(body) > MAX_BODY_BYTES)
|
|
199
|
+
throw new Denied(`The request is larger than ${MAX_BODY_BYTES / 1024} KB`);
|
|
200
|
+
let res;
|
|
201
|
+
try {
|
|
202
|
+
res = await ctx.call({
|
|
203
|
+
method: "POST",
|
|
204
|
+
path: "",
|
|
205
|
+
body,
|
|
206
|
+
headers: tool.soapAction ? { soapaction: tool.soapAction } : {},
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
if (error instanceof ConnectError)
|
|
211
|
+
throw new VendorFailed(502, error.message);
|
|
212
|
+
throw error;
|
|
213
|
+
}
|
|
214
|
+
mark(res.status);
|
|
215
|
+
if (res.status < 200 || res.status >= 300) {
|
|
216
|
+
throw new VendorFailed(res.status, failure(res.status, res.data));
|
|
217
|
+
}
|
|
218
|
+
const result = answer(tool, res.data);
|
|
219
|
+
for (const a of tool.answerLimits) {
|
|
220
|
+
const values = listLimit(ctx.limits, a.limit);
|
|
221
|
+
if (values && !answerWithin(result, a.field, values))
|
|
222
|
+
throw new Denied(`The answer's ${a.field} is outside this agent's limits`);
|
|
223
|
+
}
|
|
224
|
+
return json(result);
|
|
225
|
+
}));
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
/** Binds to any connector with a `soap` block; createAgentConnect uses it for those. */
|
|
231
|
+
export default {
|
|
232
|
+
id: "soap",
|
|
233
|
+
create: ({ connector }) => {
|
|
234
|
+
const soap = connector.soap;
|
|
235
|
+
// Each body must be well-formed once filled, so a typo fails at startup, not on a call.
|
|
236
|
+
for (const tool of soap.tools) {
|
|
237
|
+
const sample = tool.body.replace(/\{[a-z][a-z0-9_]*\}/g, "x");
|
|
238
|
+
try {
|
|
239
|
+
parseXml(`<soap:Body xmlns:soap="${ENVELOPE[soap.version]}">${sample}</soap:Body>`);
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
throw new Error(`${connector.id}: ${tool.name}'s body is not XML: ${error.message}`);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return { vendor: soapVendor(connector), toolset: soapTools(soap) };
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../connectors/soap/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type XmlNode = {
|
|
2
|
+
name: string;
|
|
3
|
+
attrs: Record<string, string>;
|
|
4
|
+
children: XmlNode[];
|
|
5
|
+
text: string;
|
|
6
|
+
};
|
|
7
|
+
export declare class XmlError extends Error {
|
|
8
|
+
}
|
|
9
|
+
export declare function parseXml(xml: string): XmlNode;
|
|
10
|
+
export declare const localName: (name: string) => string;
|
|
11
|
+
export declare function toJson(node: XmlNode): unknown;
|
|
12
|
+
export declare const escapeXml: (value: string) => string;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
// A small XML reader for SOAP answers, WSDL and OData $metadata: elements, attributes, text
|
|
2
|
+
// and CDATA. A document type declaration is refused, so there are no external or expanding
|
|
3
|
+
// entities: only XML's five named ones and character references.
|
|
4
|
+
export class XmlError extends Error {
|
|
5
|
+
}
|
|
6
|
+
const MAX_DEPTH = 100;
|
|
7
|
+
const START = /<([A-Za-z_][\w.:-]*)((?:\s+[A-Za-z_][\w.:-]*\s*=\s*(?:"[^"<]*"|'[^'<]*'))*)\s*(\/?)>/y;
|
|
8
|
+
const ATTR = /([A-Za-z_][\w.:-]*)\s*=\s*(?:"([^"<]*)"|'([^'<]*)')/g;
|
|
9
|
+
const NAMED = { amp: "&", lt: "<", gt: ">", quot: '"', apos: "'" };
|
|
10
|
+
function decode(raw) {
|
|
11
|
+
return raw.replace(/&(?:#x([0-9a-fA-F]+)|#([0-9]+)|([a-z]+))?;?/g, (m, hex, dec, name) => {
|
|
12
|
+
if (!m.endsWith(";") || m === "&;")
|
|
13
|
+
throw new XmlError("A bare & in the text");
|
|
14
|
+
if (name !== undefined) {
|
|
15
|
+
if (!Object.hasOwn(NAMED, name))
|
|
16
|
+
throw new XmlError(`Unknown entity &${name};`);
|
|
17
|
+
return NAMED[name];
|
|
18
|
+
}
|
|
19
|
+
const code = hex !== undefined ? parseInt(hex, 16) : Number(dec);
|
|
20
|
+
if (!(code > 0 && code <= 0x10ffff))
|
|
21
|
+
throw new XmlError("A character reference out of range");
|
|
22
|
+
return String.fromCodePoint(code);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
export function parseXml(xml) {
|
|
26
|
+
const root = { name: "", attrs: {}, children: [], text: "" };
|
|
27
|
+
const stack = [root];
|
|
28
|
+
const until = (end, from) => {
|
|
29
|
+
const at = xml.indexOf(end, from);
|
|
30
|
+
if (at === -1)
|
|
31
|
+
throw new XmlError(`Unclosed ${xml.slice(from, from + 9)}`);
|
|
32
|
+
return at;
|
|
33
|
+
};
|
|
34
|
+
let i = 0;
|
|
35
|
+
while (i < xml.length) {
|
|
36
|
+
const lt = xml.indexOf("<", i);
|
|
37
|
+
const text = xml.slice(i, lt === -1 ? xml.length : lt);
|
|
38
|
+
if (stack.length > 1)
|
|
39
|
+
stack.at(-1).text += decode(text);
|
|
40
|
+
else if (text.trim())
|
|
41
|
+
throw new XmlError("Text outside the root element");
|
|
42
|
+
if (lt === -1)
|
|
43
|
+
break;
|
|
44
|
+
if (xml.startsWith("<!--", lt))
|
|
45
|
+
i = until("-->", lt + 4) + 3;
|
|
46
|
+
else if (xml.startsWith("<![CDATA[", lt)) {
|
|
47
|
+
const end = until("]]>", lt + 9);
|
|
48
|
+
if (stack.length === 1)
|
|
49
|
+
throw new XmlError("Text outside the root element");
|
|
50
|
+
stack.at(-1).text += xml.slice(lt + 9, end);
|
|
51
|
+
i = end + 3;
|
|
52
|
+
}
|
|
53
|
+
else if (xml.startsWith("<!", lt))
|
|
54
|
+
throw new XmlError("A document type declaration is not accepted");
|
|
55
|
+
else if (xml.startsWith("<?", lt))
|
|
56
|
+
i = until("?>", lt + 2) + 2;
|
|
57
|
+
else if (xml.startsWith("</", lt)) {
|
|
58
|
+
const end = until(">", lt + 2);
|
|
59
|
+
const name = xml.slice(lt + 2, end).trim();
|
|
60
|
+
const open = stack.pop();
|
|
61
|
+
if (stack.length === 0 || open.name !== name)
|
|
62
|
+
throw new XmlError(`Unexpected closing tag ${name}`);
|
|
63
|
+
i = end + 1;
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
START.lastIndex = lt;
|
|
67
|
+
const m = START.exec(xml);
|
|
68
|
+
if (!m)
|
|
69
|
+
throw new XmlError("A malformed tag");
|
|
70
|
+
const node = { name: m[1], attrs: {}, children: [], text: "" };
|
|
71
|
+
for (const a of m[2].matchAll(ATTR)) {
|
|
72
|
+
if (Object.hasOwn(node.attrs, a[1]))
|
|
73
|
+
throw new XmlError(`Attribute ${a[1]} twice`);
|
|
74
|
+
node.attrs[a[1]] = decode(a[2] ?? a[3]);
|
|
75
|
+
}
|
|
76
|
+
if (stack.length === 1 && root.children.length)
|
|
77
|
+
throw new XmlError("Two root elements");
|
|
78
|
+
stack.at(-1).children.push(node);
|
|
79
|
+
if (!m[3])
|
|
80
|
+
stack.push(node);
|
|
81
|
+
if (stack.length > MAX_DEPTH)
|
|
82
|
+
throw new XmlError("The XML is nested too deeply");
|
|
83
|
+
i = START.lastIndex;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
if (stack.length !== 1 || root.children.length !== 1)
|
|
87
|
+
throw new XmlError("Unclosed elements");
|
|
88
|
+
return root.children[0];
|
|
89
|
+
}
|
|
90
|
+
export const localName = (name) => name.slice(name.indexOf(":") + 1);
|
|
91
|
+
// A key set as data, never as the object's prototype (an element named __proto__).
|
|
92
|
+
function put(out, key, value) {
|
|
93
|
+
Object.defineProperty(out, key, { value, enumerable: true, writable: true, configurable: true });
|
|
94
|
+
}
|
|
95
|
+
// An element as plain JSON: names without prefixes, repeated children as a list, text
|
|
96
|
+
// trimmed, an element with only text as its text, xsi:nil as null. Attributes with a prefix
|
|
97
|
+
// (namespaces, xsi:type) are left out; others become keys, which child elements win over.
|
|
98
|
+
export function toJson(node) {
|
|
99
|
+
const nil = Object.entries(node.attrs).some(([k, v]) => localName(k) === "nil" && v === "true");
|
|
100
|
+
if (nil)
|
|
101
|
+
return null;
|
|
102
|
+
const out = {};
|
|
103
|
+
const listed = new Set();
|
|
104
|
+
for (const child of node.children) {
|
|
105
|
+
const key = localName(child.name);
|
|
106
|
+
const value = toJson(child);
|
|
107
|
+
if (!listed.has(key))
|
|
108
|
+
put(out, key, value);
|
|
109
|
+
else if (Array.isArray(out[key]))
|
|
110
|
+
out[key].push(value);
|
|
111
|
+
else
|
|
112
|
+
put(out, key, [out[key], value]);
|
|
113
|
+
listed.add(key);
|
|
114
|
+
}
|
|
115
|
+
for (const [k, v] of Object.entries(node.attrs))
|
|
116
|
+
if (!k.includes(":") && k !== "xmlns" && !listed.has(k))
|
|
117
|
+
put(out, k, v);
|
|
118
|
+
const text = node.text.trim();
|
|
119
|
+
if (!Object.keys(out).length)
|
|
120
|
+
return text;
|
|
121
|
+
if (text)
|
|
122
|
+
put(out, "_text", text);
|
|
123
|
+
return out;
|
|
124
|
+
}
|
|
125
|
+
export const escapeXml = (value) => value.replace(/[&<>"']/g, (c) => ({ "&": "&", "<": "<", ">": ">", '"': """, "'": "'" })[c]);
|
|
126
|
+
//# sourceMappingURL=xml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml.js","sourceRoot":"","sources":["../../../connectors/soap/xml.ts"],"names":[],"mappings":"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"}
|