@slates/provider-handler 1.0.0-rc.35 → 1.0.0-rc.37
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/index.cjs +13 -10
- package/dist/index.module.js +13 -10
- package/package.json +3 -3
- package/src/exposure.test.ts +55 -0
- package/src/index.ts +5 -3
- package/src/spec.test.ts +37 -1
- package/src/spec.ts +11 -7
- package/src/webhookProcess.test.ts +99 -0
package/dist/index.cjs
CHANGED
|
@@ -113,6 +113,7 @@ var mapAuthMethod = (slate, m) => ({
|
|
|
113
113
|
description: s.description
|
|
114
114
|
})) : void 0,
|
|
115
115
|
adapters: "adapters" in m ? m.adapters : void 0,
|
|
116
|
+
..."syncTokensAcrossConnections" in m && m.syncTokensAcrossConnections ? { syncTokensAcrossConnections: true } : {},
|
|
116
117
|
inputSchema: toJsonSchema(m.inputSchema ?? import_zod.default.object({})),
|
|
117
118
|
outputSchema: toJsonSchema(slate.spec.auth.outputSchema),
|
|
118
119
|
capabilities: {
|
|
@@ -128,14 +129,14 @@ var mapAuthMethod = (slate, m) => ({
|
|
|
128
129
|
docs: m.docs ?? []
|
|
129
130
|
});
|
|
130
131
|
var getAction = (slate, actionId) => {
|
|
131
|
-
let action = slate.actions.find((m) => m.key === actionId);
|
|
132
|
+
let action = (slate.actions ?? []).find((m) => m.key === actionId);
|
|
132
133
|
if (!action) {
|
|
133
134
|
throw new import_error2.ServiceError((0, import_error2.notFoundError)(`action`, actionId));
|
|
134
135
|
}
|
|
135
136
|
return action;
|
|
136
137
|
};
|
|
137
138
|
var getAdapter = (slate, adapterId) => {
|
|
138
|
-
let adapter = slate.adapters.find((m) => m.id === adapterId);
|
|
139
|
+
let adapter = (slate.adapters ?? []).find((m) => m.id === adapterId);
|
|
139
140
|
if (!adapter) {
|
|
140
141
|
throw new import_error2.ServiceError((0, import_error2.notFoundError)(`adapter`, adapterId));
|
|
141
142
|
}
|
|
@@ -144,7 +145,7 @@ var getAdapter = (slate, adapterId) => {
|
|
|
144
145
|
var mapAdapter = (adapter) => ({
|
|
145
146
|
id: adapter.id,
|
|
146
147
|
name: adapter.name,
|
|
147
|
-
capabilities: adapter.capabilities
|
|
148
|
+
capabilities: adapter.capabilities ?? []
|
|
148
149
|
});
|
|
149
150
|
var getActionWithType = (slate, type, actionId) => {
|
|
150
151
|
let action = getAction(slate, actionId);
|
|
@@ -196,7 +197,7 @@ var getMappableAction = (slate, actionId) => {
|
|
|
196
197
|
}
|
|
197
198
|
return action;
|
|
198
199
|
};
|
|
199
|
-
var getExposedActions = (slate, includeAdapterActions) => slate.actions.filter(
|
|
200
|
+
var getExposedActions = (slate, includeAdapterActions) => (slate.actions ?? []).filter(
|
|
200
201
|
(action) => isMappableTrigger(action) && (includeAdapterActions || !action.adapter)
|
|
201
202
|
);
|
|
202
203
|
var getExposedAction = (slate, actionId, includeAdapterActions) => {
|
|
@@ -207,13 +208,13 @@ var getExposedAction = (slate, actionId, includeAdapterActions) => {
|
|
|
207
208
|
return action;
|
|
208
209
|
};
|
|
209
210
|
var getTriggerGroup = (slate, triggerGroupId) => {
|
|
210
|
-
let group = slate.triggerGroups.find((g) => g.key === triggerGroupId);
|
|
211
|
+
let group = (slate.triggerGroups ?? []).find((g) => g.key === triggerGroupId);
|
|
211
212
|
if (!group) {
|
|
212
213
|
throw new import_error2.ServiceError((0, import_error2.notFoundError)(`trigger_group`, triggerGroupId));
|
|
213
214
|
}
|
|
214
215
|
return group;
|
|
215
216
|
};
|
|
216
|
-
var getTriggersForGroup = (slate, triggerGroupId) => slate.actions.filter(
|
|
217
|
+
var getTriggersForGroup = (slate, triggerGroupId) => (slate.actions ?? []).filter(
|
|
217
218
|
(action) => action.type === "trigger" && action.triggerGroup?.key === triggerGroupId
|
|
218
219
|
);
|
|
219
220
|
var getExposedTriggerGroups = (slate, includeAdapterActions) => {
|
|
@@ -222,7 +223,7 @@ var getExposedTriggerGroups = (slate, includeAdapterActions) => {
|
|
|
222
223
|
(action) => action.type === "trigger" && action.triggerGroup ? [action.triggerGroup.key] : []
|
|
223
224
|
)
|
|
224
225
|
);
|
|
225
|
-
return slate.triggerGroups.filter((group) => triggerGroupIds.has(group.key));
|
|
226
|
+
return (slate.triggerGroups ?? []).filter((group) => triggerGroupIds.has(group.key));
|
|
226
227
|
};
|
|
227
228
|
var evaluateTriggerMatches = (slate, triggerGroupId, payload) => getTriggersForGroup(slate, triggerGroupId).filter((trigger) => trigger.matches(payload)).map((trigger) => trigger.key);
|
|
228
229
|
var getWebhookAutoRegistration = (group) => {
|
|
@@ -1014,7 +1015,7 @@ var createProviderHandler = (slate, listeners) => (0, import_proto.createSlatesP
|
|
|
1014
1015
|
manager.onRequest("slates/adapters.list", async () => {
|
|
1015
1016
|
getContextBasic();
|
|
1016
1017
|
return {
|
|
1017
|
-
adapters: supportsAdapters() ? slate.adapters.map(mapAdapter) : []
|
|
1018
|
+
adapters: supportsAdapters() ? (slate.adapters ?? []).map(mapAdapter) : []
|
|
1018
1019
|
};
|
|
1019
1020
|
});
|
|
1020
1021
|
manager.onRequest("slates/adapter.get", async ({ params }) => {
|
|
@@ -1401,7 +1402,8 @@ var createProviderHandler = (slate, listeners) => (0, import_proto.createSlatesP
|
|
|
1401
1402
|
},
|
|
1402
1403
|
onSuccess: (result) => ({
|
|
1403
1404
|
eventCount: result.events.length,
|
|
1404
|
-
hasResponse: result.response !== void 0
|
|
1405
|
+
hasResponse: result.response !== void 0,
|
|
1406
|
+
skipped: !!result.skipped
|
|
1405
1407
|
})
|
|
1406
1408
|
},
|
|
1407
1409
|
() => (0, import_provider2.runWithContext)(context, () => group.webhook.process(context))
|
|
@@ -1423,7 +1425,8 @@ var createProviderHandler = (slate, listeners) => (0, import_proto.createSlatesP
|
|
|
1423
1425
|
idempotencyKey: event.idempotencyKey,
|
|
1424
1426
|
triggerIds: evaluateTriggerMatches(slate, group.key, event.payload)
|
|
1425
1427
|
})),
|
|
1426
|
-
response
|
|
1428
|
+
response,
|
|
1429
|
+
skipped: res.skipped ?? null
|
|
1427
1430
|
});
|
|
1428
1431
|
});
|
|
1429
1432
|
manager.onRequest("slates/trigger_group.routing_matchers.get", async ({ params }) => {
|
package/dist/index.module.js
CHANGED
|
@@ -96,6 +96,7 @@ var mapAuthMethod = (slate, m) => ({
|
|
|
96
96
|
description: s.description
|
|
97
97
|
})) : void 0,
|
|
98
98
|
adapters: "adapters" in m ? m.adapters : void 0,
|
|
99
|
+
..."syncTokensAcrossConnections" in m && m.syncTokensAcrossConnections ? { syncTokensAcrossConnections: true } : {},
|
|
99
100
|
inputSchema: toJsonSchema(m.inputSchema ?? z.object({})),
|
|
100
101
|
outputSchema: toJsonSchema(slate.spec.auth.outputSchema),
|
|
101
102
|
capabilities: {
|
|
@@ -111,14 +112,14 @@ var mapAuthMethod = (slate, m) => ({
|
|
|
111
112
|
docs: m.docs ?? []
|
|
112
113
|
});
|
|
113
114
|
var getAction = (slate, actionId) => {
|
|
114
|
-
let action = slate.actions.find((m) => m.key === actionId);
|
|
115
|
+
let action = (slate.actions ?? []).find((m) => m.key === actionId);
|
|
115
116
|
if (!action) {
|
|
116
117
|
throw new ServiceError2(notFoundError(`action`, actionId));
|
|
117
118
|
}
|
|
118
119
|
return action;
|
|
119
120
|
};
|
|
120
121
|
var getAdapter = (slate, adapterId) => {
|
|
121
|
-
let adapter = slate.adapters.find((m) => m.id === adapterId);
|
|
122
|
+
let adapter = (slate.adapters ?? []).find((m) => m.id === adapterId);
|
|
122
123
|
if (!adapter) {
|
|
123
124
|
throw new ServiceError2(notFoundError(`adapter`, adapterId));
|
|
124
125
|
}
|
|
@@ -127,7 +128,7 @@ var getAdapter = (slate, adapterId) => {
|
|
|
127
128
|
var mapAdapter = (adapter) => ({
|
|
128
129
|
id: adapter.id,
|
|
129
130
|
name: adapter.name,
|
|
130
|
-
capabilities: adapter.capabilities
|
|
131
|
+
capabilities: adapter.capabilities ?? []
|
|
131
132
|
});
|
|
132
133
|
var getActionWithType = (slate, type, actionId) => {
|
|
133
134
|
let action = getAction(slate, actionId);
|
|
@@ -179,7 +180,7 @@ var getMappableAction = (slate, actionId) => {
|
|
|
179
180
|
}
|
|
180
181
|
return action;
|
|
181
182
|
};
|
|
182
|
-
var getExposedActions = (slate, includeAdapterActions) => slate.actions.filter(
|
|
183
|
+
var getExposedActions = (slate, includeAdapterActions) => (slate.actions ?? []).filter(
|
|
183
184
|
(action) => isMappableTrigger(action) && (includeAdapterActions || !action.adapter)
|
|
184
185
|
);
|
|
185
186
|
var getExposedAction = (slate, actionId, includeAdapterActions) => {
|
|
@@ -190,13 +191,13 @@ var getExposedAction = (slate, actionId, includeAdapterActions) => {
|
|
|
190
191
|
return action;
|
|
191
192
|
};
|
|
192
193
|
var getTriggerGroup = (slate, triggerGroupId) => {
|
|
193
|
-
let group = slate.triggerGroups.find((g) => g.key === triggerGroupId);
|
|
194
|
+
let group = (slate.triggerGroups ?? []).find((g) => g.key === triggerGroupId);
|
|
194
195
|
if (!group) {
|
|
195
196
|
throw new ServiceError2(notFoundError(`trigger_group`, triggerGroupId));
|
|
196
197
|
}
|
|
197
198
|
return group;
|
|
198
199
|
};
|
|
199
|
-
var getTriggersForGroup = (slate, triggerGroupId) => slate.actions.filter(
|
|
200
|
+
var getTriggersForGroup = (slate, triggerGroupId) => (slate.actions ?? []).filter(
|
|
200
201
|
(action) => action.type === "trigger" && action.triggerGroup?.key === triggerGroupId
|
|
201
202
|
);
|
|
202
203
|
var getExposedTriggerGroups = (slate, includeAdapterActions) => {
|
|
@@ -205,7 +206,7 @@ var getExposedTriggerGroups = (slate, includeAdapterActions) => {
|
|
|
205
206
|
(action) => action.type === "trigger" && action.triggerGroup ? [action.triggerGroup.key] : []
|
|
206
207
|
)
|
|
207
208
|
);
|
|
208
|
-
return slate.triggerGroups.filter((group) => triggerGroupIds.has(group.key));
|
|
209
|
+
return (slate.triggerGroups ?? []).filter((group) => triggerGroupIds.has(group.key));
|
|
209
210
|
};
|
|
210
211
|
var evaluateTriggerMatches = (slate, triggerGroupId, payload) => getTriggersForGroup(slate, triggerGroupId).filter((trigger) => trigger.matches(payload)).map((trigger) => trigger.key);
|
|
211
212
|
var getWebhookAutoRegistration = (group) => {
|
|
@@ -997,7 +998,7 @@ var createProviderHandler = (slate, listeners) => createSlatesProviderProtoHandl
|
|
|
997
998
|
manager.onRequest("slates/adapters.list", async () => {
|
|
998
999
|
getContextBasic();
|
|
999
1000
|
return {
|
|
1000
|
-
adapters: supportsAdapters() ? slate.adapters.map(mapAdapter) : []
|
|
1001
|
+
adapters: supportsAdapters() ? (slate.adapters ?? []).map(mapAdapter) : []
|
|
1001
1002
|
};
|
|
1002
1003
|
});
|
|
1003
1004
|
manager.onRequest("slates/adapter.get", async ({ params }) => {
|
|
@@ -1384,7 +1385,8 @@ var createProviderHandler = (slate, listeners) => createSlatesProviderProtoHandl
|
|
|
1384
1385
|
},
|
|
1385
1386
|
onSuccess: (result) => ({
|
|
1386
1387
|
eventCount: result.events.length,
|
|
1387
|
-
hasResponse: result.response !== void 0
|
|
1388
|
+
hasResponse: result.response !== void 0,
|
|
1389
|
+
skipped: !!result.skipped
|
|
1388
1390
|
})
|
|
1389
1391
|
},
|
|
1390
1392
|
() => runWithContext(context, () => group.webhook.process(context))
|
|
@@ -1406,7 +1408,8 @@ var createProviderHandler = (slate, listeners) => createSlatesProviderProtoHandl
|
|
|
1406
1408
|
idempotencyKey: event.idempotencyKey,
|
|
1407
1409
|
triggerIds: evaluateTriggerMatches(slate, group.key, event.payload)
|
|
1408
1410
|
})),
|
|
1409
|
-
response
|
|
1411
|
+
response,
|
|
1412
|
+
skipped: res.skipped ?? null
|
|
1410
1413
|
});
|
|
1411
1414
|
});
|
|
1412
1415
|
manager.onRequest("slates/trigger_group.routing_matchers.get", async ({ params }) => {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@slates/provider-handler",
|
|
3
|
-
"version": "1.0.0-rc.
|
|
3
|
+
"version": "1.0.0-rc.37",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -32,8 +32,8 @@
|
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@lowerdeck/error": "^1.1.0",
|
|
35
|
-
"@slates/proto": "1.0.0-rc.
|
|
36
|
-
"@slates/provider": "1.0.0-rc.
|
|
35
|
+
"@slates/proto": "1.0.0-rc.23",
|
|
36
|
+
"@slates/provider": "1.0.0-rc.27",
|
|
37
37
|
"p-queue": "^6.6.2",
|
|
38
38
|
"zod": "^4.2.1"
|
|
39
39
|
},
|
package/src/exposure.test.ts
CHANGED
|
@@ -158,4 +158,59 @@ describe('adapter capability exposure', () => {
|
|
|
158
158
|
}
|
|
159
159
|
});
|
|
160
160
|
});
|
|
161
|
+
|
|
162
|
+
it('returns empty adapter and trigger group lists for older slates that omit those collections', async () => {
|
|
163
|
+
let manager = await createProviderHandler(
|
|
164
|
+
{
|
|
165
|
+
spec: { key: 'legacy', name: 'Legacy' },
|
|
166
|
+
actions: [
|
|
167
|
+
{
|
|
168
|
+
key: 'provider_tool',
|
|
169
|
+
type: 'tool',
|
|
170
|
+
name: 'Action',
|
|
171
|
+
description: undefined,
|
|
172
|
+
instructions: undefined,
|
|
173
|
+
constraints: undefined,
|
|
174
|
+
tags: [],
|
|
175
|
+
metadata: {},
|
|
176
|
+
scopes: [],
|
|
177
|
+
authMethods: [],
|
|
178
|
+
docs: [],
|
|
179
|
+
inputSchema: z.object({}),
|
|
180
|
+
outputSchema: z.object({}),
|
|
181
|
+
isPublic: false
|
|
182
|
+
}
|
|
183
|
+
]
|
|
184
|
+
} as any,
|
|
185
|
+
[]
|
|
186
|
+
).run();
|
|
187
|
+
|
|
188
|
+
await SlatesProviderProtoHandlerManager.handleInput(manager, {
|
|
189
|
+
jsonrpc: '2.0',
|
|
190
|
+
method: 'slates/hello',
|
|
191
|
+
params: { protocol: SLATES_PROTOCOL_VERSION }
|
|
192
|
+
});
|
|
193
|
+
await SlatesProviderProtoHandlerManager.handleInput(manager, {
|
|
194
|
+
jsonrpc: '2.0',
|
|
195
|
+
method: 'slates/participant.set',
|
|
196
|
+
params: { participants: [] }
|
|
197
|
+
});
|
|
198
|
+
await SlatesProviderProtoHandlerManager.handleInput(manager, {
|
|
199
|
+
jsonrpc: '2.0',
|
|
200
|
+
method: 'slates/hub.capabilities.set',
|
|
201
|
+
params: { capabilities: { adapters: true, triggers: true } }
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
expect(await request(manager, 'slates/adapters.list')).toMatchObject({
|
|
205
|
+
result: { adapters: [] }
|
|
206
|
+
});
|
|
207
|
+
expect(await request(manager, 'slates/trigger_groups.list')).toMatchObject({
|
|
208
|
+
result: { triggerGroups: [] }
|
|
209
|
+
});
|
|
210
|
+
expect(
|
|
211
|
+
await request(manager, 'slates/actions.list', { includeAdapterActions: true })
|
|
212
|
+
).toMatchObject({
|
|
213
|
+
result: { actions: [{ id: 'provider_tool' }] }
|
|
214
|
+
});
|
|
215
|
+
});
|
|
161
216
|
});
|
package/src/index.ts
CHANGED
|
@@ -894,7 +894,7 @@ export let createProviderHandler = <ConfigType extends {}, AuthType extends {}>(
|
|
|
894
894
|
getContextBasic();
|
|
895
895
|
|
|
896
896
|
return {
|
|
897
|
-
adapters: supportsAdapters() ? slate.adapters.map(mapAdapter) : []
|
|
897
|
+
adapters: supportsAdapters() ? (slate.adapters ?? []).map(mapAdapter) : []
|
|
898
898
|
};
|
|
899
899
|
});
|
|
900
900
|
|
|
@@ -1337,7 +1337,8 @@ export let createProviderHandler = <ConfigType extends {}, AuthType extends {}>(
|
|
|
1337
1337
|
},
|
|
1338
1338
|
onSuccess: result => ({
|
|
1339
1339
|
eventCount: result.events.length,
|
|
1340
|
-
hasResponse: result.response !== undefined
|
|
1340
|
+
hasResponse: result.response !== undefined,
|
|
1341
|
+
skipped: !!result.skipped
|
|
1341
1342
|
})
|
|
1342
1343
|
},
|
|
1343
1344
|
() => runWithContext(context, () => group.webhook!.process(context))
|
|
@@ -1365,7 +1366,8 @@ export let createProviderHandler = <ConfigType extends {}, AuthType extends {}>(
|
|
|
1365
1366
|
idempotencyKey: event.idempotencyKey,
|
|
1366
1367
|
triggerIds: evaluateTriggerMatches(slate, group.key, event.payload)
|
|
1367
1368
|
})),
|
|
1368
|
-
response
|
|
1369
|
+
response,
|
|
1370
|
+
skipped: res.skipped ?? null
|
|
1369
1371
|
});
|
|
1370
1372
|
});
|
|
1371
1373
|
|
package/src/spec.test.ts
CHANGED
|
@@ -8,7 +8,9 @@ import {
|
|
|
8
8
|
getMappableAction,
|
|
9
9
|
getTriggersForGroup,
|
|
10
10
|
isMappableTrigger,
|
|
11
|
-
mapAction
|
|
11
|
+
mapAction,
|
|
12
|
+
mapAdapter,
|
|
13
|
+
mapAuthMethod
|
|
12
14
|
} from './spec';
|
|
13
15
|
|
|
14
16
|
let baseAction = {
|
|
@@ -131,4 +133,38 @@ describe('adapter exposure', () => {
|
|
|
131
133
|
expect(getExposedTriggerGroups(slate, false)).toEqual([providerGroup]);
|
|
132
134
|
expect(getExposedTriggerGroups(slate, true)).toEqual([providerGroup, adapterGroup]);
|
|
133
135
|
});
|
|
136
|
+
|
|
137
|
+
it('treats missing adapters and trigger groups as empty collections', () => {
|
|
138
|
+
let legacySlate = { actions: [providerTool, providerTrigger] } as any;
|
|
139
|
+
|
|
140
|
+
expect(getExposedActions(legacySlate, true)).toEqual([providerTool, providerTrigger]);
|
|
141
|
+
expect(getExposedTriggerGroups(legacySlate, true)).toEqual([]);
|
|
142
|
+
expect(mapAdapter({ id: 'chat', name: 'Chat' } as any)).toEqual({
|
|
143
|
+
id: 'chat',
|
|
144
|
+
name: 'Chat',
|
|
145
|
+
capabilities: []
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
describe('mapAuthMethod', () => {
|
|
151
|
+
let slate: any = { spec: { auth: { outputSchema: z.object({ token: z.string() }) } } };
|
|
152
|
+
let oauthMethod: any = {
|
|
153
|
+
type: 'auth.oauth',
|
|
154
|
+
key: 'oauth',
|
|
155
|
+
name: 'OAuth',
|
|
156
|
+
scopes: [],
|
|
157
|
+
getAuthorizationUrl: async () => ({ url: '' }),
|
|
158
|
+
handleCallback: async () => ({ output: { token: '' } })
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
it('emits syncTokensAcrossConnections only when the method opts in', () => {
|
|
162
|
+
expect(
|
|
163
|
+
mapAuthMethod(slate, { ...oauthMethod, syncTokensAcrossConnections: true })
|
|
164
|
+
).toMatchObject({ syncTokensAcrossConnections: true });
|
|
165
|
+
|
|
166
|
+
for (let method of [oauthMethod, { ...oauthMethod, syncTokensAcrossConnections: false }]) {
|
|
167
|
+
expect(mapAuthMethod(slate, method)).not.toHaveProperty('syncTokensAcrossConnections');
|
|
168
|
+
}
|
|
169
|
+
});
|
|
134
170
|
});
|
package/src/spec.ts
CHANGED
|
@@ -49,6 +49,10 @@ export let mapAuthMethod = <ConfigType extends {}, AuthType extends {}>(
|
|
|
49
49
|
|
|
50
50
|
adapters: 'adapters' in m ? m.adapters : undefined,
|
|
51
51
|
|
|
52
|
+
...('syncTokensAcrossConnections' in m && m.syncTokensAcrossConnections
|
|
53
|
+
? { syncTokensAcrossConnections: true }
|
|
54
|
+
: {}),
|
|
55
|
+
|
|
52
56
|
inputSchema: toJsonSchema(m.inputSchema ?? z.object({})),
|
|
53
57
|
outputSchema: toJsonSchema(slate.spec.auth.outputSchema),
|
|
54
58
|
|
|
@@ -70,7 +74,7 @@ export let getAction = <ConfigType extends {}, AuthType extends {}>(
|
|
|
70
74
|
slate: Slate<ConfigType, AuthType>,
|
|
71
75
|
actionId: string
|
|
72
76
|
) => {
|
|
73
|
-
let action = slate.actions.find(m => m.key === actionId);
|
|
77
|
+
let action = (slate.actions ?? []).find(m => m.key === actionId);
|
|
74
78
|
if (!action) {
|
|
75
79
|
throw new ServiceError(notFoundError(`action`, actionId));
|
|
76
80
|
}
|
|
@@ -82,7 +86,7 @@ export let getAdapter = <ConfigType extends {}, AuthType extends {}>(
|
|
|
82
86
|
slate: Slate<ConfigType, AuthType>,
|
|
83
87
|
adapterId: string
|
|
84
88
|
) => {
|
|
85
|
-
let adapter = slate.adapters.find(m => m.id === adapterId);
|
|
89
|
+
let adapter = (slate.adapters ?? []).find(m => m.id === adapterId);
|
|
86
90
|
if (!adapter) {
|
|
87
91
|
throw new ServiceError(notFoundError(`adapter`, adapterId));
|
|
88
92
|
}
|
|
@@ -95,7 +99,7 @@ export let mapAdapter = <ConfigType extends {}, AuthType extends {}>(
|
|
|
95
99
|
): SlatesAdapter => ({
|
|
96
100
|
id: adapter.id,
|
|
97
101
|
name: adapter.name,
|
|
98
|
-
capabilities: adapter.capabilities
|
|
102
|
+
capabilities: adapter.capabilities ?? []
|
|
99
103
|
});
|
|
100
104
|
|
|
101
105
|
export let getActionWithType = <
|
|
@@ -177,7 +181,7 @@ export let getExposedActions = <ConfigType extends {}, AuthType extends {}>(
|
|
|
177
181
|
slate: Slate<ConfigType, AuthType>,
|
|
178
182
|
includeAdapterActions: boolean
|
|
179
183
|
) =>
|
|
180
|
-
slate.actions.filter(
|
|
184
|
+
(slate.actions ?? []).filter(
|
|
181
185
|
action => isMappableTrigger(action) && (includeAdapterActions || !action.adapter)
|
|
182
186
|
);
|
|
183
187
|
|
|
@@ -198,7 +202,7 @@ export let getTriggerGroup = <ConfigType extends {}, AuthType extends {}>(
|
|
|
198
202
|
slate: Slate<ConfigType, AuthType>,
|
|
199
203
|
triggerGroupId: string
|
|
200
204
|
) => {
|
|
201
|
-
let group = slate.triggerGroups.find(g => g.key === triggerGroupId);
|
|
205
|
+
let group = (slate.triggerGroups ?? []).find(g => g.key === triggerGroupId);
|
|
202
206
|
if (!group) {
|
|
203
207
|
throw new ServiceError(notFoundError(`trigger_group`, triggerGroupId));
|
|
204
208
|
}
|
|
@@ -210,7 +214,7 @@ export let getTriggersForGroup = <ConfigType extends {}, AuthType extends {}>(
|
|
|
210
214
|
slate: Slate<ConfigType, AuthType>,
|
|
211
215
|
triggerGroupId: string
|
|
212
216
|
): SlateTrigger<ConfigType, AuthType, any, any>[] =>
|
|
213
|
-
slate.actions.filter(
|
|
217
|
+
(slate.actions ?? []).filter(
|
|
214
218
|
(action): action is SlateTrigger<ConfigType, AuthType, any, any> =>
|
|
215
219
|
action.type === 'trigger' && action.triggerGroup?.key === triggerGroupId
|
|
216
220
|
);
|
|
@@ -225,7 +229,7 @@ export let getExposedTriggerGroups = <ConfigType extends {}, AuthType extends {}
|
|
|
225
229
|
)
|
|
226
230
|
);
|
|
227
231
|
|
|
228
|
-
return slate.triggerGroups.filter(group => triggerGroupIds.has(group.key));
|
|
232
|
+
return (slate.triggerGroups ?? []).filter(group => triggerGroupIds.has(group.key));
|
|
229
233
|
};
|
|
230
234
|
|
|
231
235
|
export let evaluateTriggerMatches = <ConfigType extends {}, AuthType extends {}>(
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { SLATES_PROTOCOL_VERSION, SlatesProviderProtoHandlerManager } from '@slates/proto';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { createProviderHandler } from './index';
|
|
4
|
+
|
|
5
|
+
let createManager = async (
|
|
6
|
+
process: () => Promise<{
|
|
7
|
+
events: any[];
|
|
8
|
+
response?: { status?: number; body?: string };
|
|
9
|
+
skipped?: { reason: string };
|
|
10
|
+
}>
|
|
11
|
+
) => {
|
|
12
|
+
let webhookGroup = {
|
|
13
|
+
key: 'webhook_group',
|
|
14
|
+
name: 'Webhook Group',
|
|
15
|
+
description: undefined,
|
|
16
|
+
metadata: {},
|
|
17
|
+
source: 'webhook',
|
|
18
|
+
webhook: {
|
|
19
|
+
autoRegistration: {
|
|
20
|
+
webhookTargetList: async () => ({ targets: [], nextPageToken: null }),
|
|
21
|
+
webhookRegister: async () => ({
|
|
22
|
+
webhookRegistrationIdentifier: 'reg',
|
|
23
|
+
webhookRegistrationPayload: {}
|
|
24
|
+
}),
|
|
25
|
+
webhookUnregister: async () => {}
|
|
26
|
+
},
|
|
27
|
+
process
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
let slate = {
|
|
31
|
+
spec: { key: 'test', name: 'Test' },
|
|
32
|
+
adapters: [],
|
|
33
|
+
actions: [],
|
|
34
|
+
triggerGroups: [webhookGroup]
|
|
35
|
+
};
|
|
36
|
+
let manager = await createProviderHandler(slate as any, []).run();
|
|
37
|
+
|
|
38
|
+
await SlatesProviderProtoHandlerManager.handleInput(manager, {
|
|
39
|
+
jsonrpc: '2.0',
|
|
40
|
+
method: 'slates/hello',
|
|
41
|
+
params: { protocol: SLATES_PROTOCOL_VERSION }
|
|
42
|
+
});
|
|
43
|
+
await SlatesProviderProtoHandlerManager.handleInput(manager, {
|
|
44
|
+
jsonrpc: '2.0',
|
|
45
|
+
method: 'slates/participant.set',
|
|
46
|
+
params: { participants: [] }
|
|
47
|
+
});
|
|
48
|
+
await SlatesProviderProtoHandlerManager.handleInput(manager, {
|
|
49
|
+
jsonrpc: '2.0',
|
|
50
|
+
method: 'slates/hub.capabilities.set',
|
|
51
|
+
params: { capabilities: { triggers: true } }
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
return manager;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
let processWebhook = (manager: SlatesProviderProtoHandlerManager) =>
|
|
58
|
+
SlatesProviderProtoHandlerManager.handleInput(manager, {
|
|
59
|
+
jsonrpc: '2.0',
|
|
60
|
+
id: 'process',
|
|
61
|
+
method: 'slates/trigger_group.webhook.process',
|
|
62
|
+
params: {
|
|
63
|
+
triggerGroupId: 'webhook_group',
|
|
64
|
+
url: 'https://hub.example/receive/key',
|
|
65
|
+
method: 'POST',
|
|
66
|
+
headers: {},
|
|
67
|
+
body: null,
|
|
68
|
+
webhookRegistrationPayload: {}
|
|
69
|
+
}
|
|
70
|
+
} as any);
|
|
71
|
+
|
|
72
|
+
describe('slates/trigger_group.webhook.process', () => {
|
|
73
|
+
it('passes the skipped marker through to the hub', async () => {
|
|
74
|
+
let manager = await createManager(async () => ({
|
|
75
|
+
events: [],
|
|
76
|
+
response: { status: 401, body: 'Invalid webhook signature.' },
|
|
77
|
+
skipped: { reason: 'invalid_signature' }
|
|
78
|
+
}));
|
|
79
|
+
|
|
80
|
+
expect(await processWebhook(manager)).toMatchObject({
|
|
81
|
+
result: {
|
|
82
|
+
events: [],
|
|
83
|
+
response: { status: 401 },
|
|
84
|
+
skipped: { reason: 'invalid_signature' }
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('reports null skipped when the handler did not skip', async () => {
|
|
90
|
+
let manager = await createManager(async () => ({
|
|
91
|
+
events: [],
|
|
92
|
+
response: { status: 200, body: '' }
|
|
93
|
+
}));
|
|
94
|
+
|
|
95
|
+
expect(await processWebhook(manager)).toMatchObject({
|
|
96
|
+
result: { events: [], skipped: null }
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
});
|