@microsoft/teams.apps 2.0.0-preview.1 → 2.0.0-preview.11
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 +1 -1
- package/dist/app.d.ts +60 -54
- package/dist/app.embed.d.ts +4 -3
- package/dist/app.embed.js +12 -2
- package/dist/app.events.d.ts +7 -7
- package/dist/app.events.js +1 -1
- package/dist/app.js +58 -16
- package/dist/app.oauth.d.ts +4 -2
- package/dist/app.oauth.js +5 -3
- package/dist/app.plugins.d.ts +3 -3
- package/dist/app.plugins.js +14 -2
- package/dist/app.process.d.ts +2 -2
- package/dist/app.process.js +28 -21
- package/dist/app.routing.d.ts +9 -5
- package/dist/app.routing.js +2 -1
- package/dist/contexts/activity-signin.d.ts +1 -1
- package/dist/contexts/activity.d.ts +23 -9
- package/dist/contexts/activity.js +15 -17
- package/dist/contexts/client.d.ts +10 -6
- package/dist/contexts/function.d.ts +15 -0
- package/dist/events/index.d.ts +1 -0
- package/dist/events/index.js +14 -1
- package/dist/middleware/auth/jwt-validator.d.ts +60 -0
- package/dist/middleware/auth/jwt-validator.js +213 -0
- package/dist/middleware/index.d.ts +3 -2
- package/dist/middleware/index.js +7 -5
- package/dist/middleware/jwt-validation-middleware.d.ts +11 -0
- package/dist/middleware/jwt-validation-middleware.js +46 -0
- package/dist/middleware/strip-mentions-text.d.ts +1 -1
- package/dist/middleware/strip-mentions-text.js +1 -1
- package/dist/middleware/with-remote-function-jwt-validation.d.ts +16 -0
- package/dist/middleware/with-remote-function-jwt-validation.js +47 -0
- package/dist/plugins/http/plugin.d.ts +12 -6
- package/dist/plugins/http/plugin.js +39 -21
- package/dist/plugins/http/stream.d.ts +10 -6
- package/dist/plugins/http/stream.js +88 -37
- package/dist/router/index.d.ts +1 -0
- package/dist/router/index.js +18 -0
- package/dist/router/route.d.ts +9 -0
- package/dist/router/route.js +3 -0
- package/dist/router/router.d.ts +29 -0
- package/dist/router/router.js +101 -0
- package/dist/routes/activity.d.ts +2 -2
- package/dist/routes/conversation-update.d.ts +2 -2
- package/dist/routes/event.d.ts +2 -2
- package/dist/routes/index.d.ts +7 -6
- package/dist/routes/index.js +4 -4
- package/dist/routes/install.d.ts +2 -2
- package/dist/routes/invoke/index.d.ts +2 -2
- package/dist/routes/message-delete.d.ts +2 -2
- package/dist/routes/message-update.d.ts +2 -2
- package/dist/types/app-events.d.ts +25 -0
- package/dist/types/app-events.js +3 -0
- package/dist/types/app-routing.d.ts +11 -0
- package/dist/types/app-routing.js +3 -0
- package/dist/types/index.d.ts +6 -4
- package/dist/types/index.js +7 -5
- package/dist/types/plugin/decorators/event.d.ts +1 -1
- package/dist/types/plugin/plugin-start-event.d.ts +1 -1
- package/dist/types/plugin/plugin.d.ts +11 -6
- package/dist/types/plugin/sender.d.ts +1 -1
- package/dist/types/plugin/sender.js +2 -1
- package/dist/types/route-handler.d.ts +1 -1
- package/dist/types/streamer.d.ts +5 -0
- package/dist/types/union-to-intersection.d.ts +1 -0
- package/dist/types/union-to-intersection.js +3 -0
- package/dist/utils/asserts.d.ts +1 -0
- package/dist/utils/asserts.js +12 -0
- package/dist/utils/function-context.d.ts +5 -0
- package/dist/utils/function-context.js +54 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.js +4 -2
- package/dist/utils/promises/retry.d.ts +8 -3
- package/dist/utils/promises/retry.js +14 -6
- package/package.json +5 -5
- package/dist/middleware/entra-token-validator.d.ts +0 -75
- package/dist/middleware/entra-token-validator.js +0 -169
- package/dist/middleware/with-client-auth.d.ts +0 -13
- package/dist/middleware/with-client-auth.js +0 -40
- package/dist/router.d.ts +0 -34
- package/dist/router.js +0 -91
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Router = void 0;
|
|
4
|
+
const routes_1 = require("../routes");
|
|
5
|
+
class Router {
|
|
6
|
+
routes = [];
|
|
7
|
+
/**
|
|
8
|
+
* select routes that match the inbound activity
|
|
9
|
+
* @param activity the inbound activity
|
|
10
|
+
*/
|
|
11
|
+
select(activity) {
|
|
12
|
+
return this.routes
|
|
13
|
+
.filter((r) => r.select(activity))
|
|
14
|
+
.map((r) => r.callback);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* register a new route
|
|
18
|
+
* @param route the route to register
|
|
19
|
+
*/
|
|
20
|
+
register(route) {
|
|
21
|
+
// replace system registered (default) route implementation
|
|
22
|
+
// if developer registers replacement
|
|
23
|
+
if (route.type === 'user') {
|
|
24
|
+
const i = this.routes.findIndex(r => r.name === route.name && r.type === 'system');
|
|
25
|
+
if (i > -1) {
|
|
26
|
+
this.routes.splice(i, 1);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
this.routes.push(route);
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* register a middleware
|
|
34
|
+
* @param callback the callback to invoke
|
|
35
|
+
*/
|
|
36
|
+
use(callback, type) {
|
|
37
|
+
this.register({
|
|
38
|
+
type: type || 'user',
|
|
39
|
+
select: () => true,
|
|
40
|
+
callback,
|
|
41
|
+
});
|
|
42
|
+
return this;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* register an activity route
|
|
46
|
+
* @param event event to subscribe to
|
|
47
|
+
* @param callback the callback to invoke
|
|
48
|
+
*/
|
|
49
|
+
on(event, callback, type) {
|
|
50
|
+
this.register({
|
|
51
|
+
name: event,
|
|
52
|
+
type: type || 'user',
|
|
53
|
+
select: (activity) => {
|
|
54
|
+
if (event === 'activity') {
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
if (event === activity.type) {
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
if (activity.type === 'conversationUpdate') {
|
|
61
|
+
return event === activity.channelData?.eventType;
|
|
62
|
+
}
|
|
63
|
+
if (activity.type === 'installationUpdate') {
|
|
64
|
+
return event === `install.${activity.action}`;
|
|
65
|
+
}
|
|
66
|
+
if (activity.type === 'messageDelete') {
|
|
67
|
+
return event === activity.channelData?.eventType;
|
|
68
|
+
}
|
|
69
|
+
if (activity.type === 'messageUpdate') {
|
|
70
|
+
return event === activity.channelData?.eventType;
|
|
71
|
+
}
|
|
72
|
+
if (activity.type === 'event') {
|
|
73
|
+
return event === routes_1.EVENT_ALIASES[activity.name];
|
|
74
|
+
}
|
|
75
|
+
if (activity.type === 'invoke') {
|
|
76
|
+
if (event === routes_1.INVOKE_ALIASES[activity.name]) {
|
|
77
|
+
return true;
|
|
78
|
+
}
|
|
79
|
+
if (activity.name === 'fileConsent/invoke') {
|
|
80
|
+
return event === `file.consent.${activity.value.action}`;
|
|
81
|
+
}
|
|
82
|
+
if (activity.name === 'composeExtension/submitAction') {
|
|
83
|
+
return event === `message.ext.${activity.value.botMessagePreviewAction}`;
|
|
84
|
+
}
|
|
85
|
+
if (activity.name === 'message/submitAction') {
|
|
86
|
+
return event === `message.submit.${activity.value.actionName}`;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// custom routes
|
|
90
|
+
if (event === 'mention' && activity.entities?.some((e) => e.type === 'mention')) {
|
|
91
|
+
return (activity.entities?.find((e) => e.type === 'mention' && e.mentioned.id === activity.recipient.id) !== undefined);
|
|
92
|
+
}
|
|
93
|
+
return false;
|
|
94
|
+
},
|
|
95
|
+
callback,
|
|
96
|
+
});
|
|
97
|
+
return this;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.Router = Router;
|
|
101
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JvdXRlci9yb3V0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0Esc0NBQW1FO0FBS25FLE1BQWEsTUFBTTtJQUNFLE1BQU0sR0FBc0MsRUFBRSxDQUFDO0lBRWxFOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxRQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxNQUFNO2FBQ2YsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ2pDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQStDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxDQUE2QixLQUE2QjtRQUNoRSwyREFBMkQ7UUFDM0QscUNBQXFDO1FBQ3JDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUMxQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDO1lBRW5GLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRyxDQUFDLFFBQW9GLEVBQUUsSUFBZ0I7UUFDeEcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNaLElBQUksRUFBRSxJQUFJLElBQUksTUFBTTtZQUNwQixNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSTtZQUNsQixRQUFRO1NBQ1QsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEVBQUUsQ0FBNkIsS0FBVyxFQUFFLFFBQXNELEVBQUUsSUFBZ0I7UUFDbEgsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUNaLElBQUksRUFBRSxLQUFLO1lBQ1gsSUFBSSxFQUFFLElBQUksSUFBSSxNQUFNO1lBQ3BCLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxFQUFFO2dCQUNuQixJQUFJLEtBQUssS0FBSyxVQUFVLEVBQUUsQ0FBQztvQkFDekIsT0FBTyxJQUFJLENBQUM7Z0JBQ2QsQ0FBQztnQkFFRCxJQUFJLEtBQUssS0FBSyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQzVCLE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7Z0JBRUQsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLG9CQUFvQixFQUFFLENBQUM7b0JBQzNDLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDO2dCQUNuRCxDQUFDO2dCQUVELElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxvQkFBb0IsRUFBRSxDQUFDO29CQUMzQyxPQUFPLEtBQUssS0FBSyxXQUFXLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDaEQsQ0FBQztnQkFFRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssZUFBZSxFQUFFLENBQUM7b0JBQ3RDLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDO2dCQUNuRCxDQUFDO2dCQUVELElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxlQUFlLEVBQUUsQ0FBQztvQkFDdEMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUFDLFdBQVcsRUFBRSxTQUFTLENBQUM7Z0JBQ25ELENBQUM7Z0JBRUQsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO29CQUM5QixPQUFPLEtBQUssS0FBSyxzQkFBYSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDaEQsQ0FBQztnQkFFRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQy9CLElBQUksS0FBSyxLQUFLLHVCQUFjLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7d0JBQzVDLE9BQU8sSUFBSSxDQUFDO29CQUNkLENBQUM7b0JBRUQsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLG9CQUFvQixFQUFFLENBQUM7d0JBQzNDLE9BQU8sS0FBSyxLQUFLLGdCQUFnQixRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUMzRCxDQUFDO29CQUVELElBQUksUUFBUSxDQUFDLElBQUksS0FBSywrQkFBK0IsRUFBRSxDQUFDO3dCQUN0RCxPQUFPLEtBQUssS0FBSyxlQUFlLFFBQVEsQ0FBQyxLQUFLLENBQUMsdUJBQXVCLEVBQUUsQ0FBQztvQkFDM0UsQ0FBQztvQkFFRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssc0JBQXNCLEVBQUUsQ0FBQzt3QkFDN0MsT0FBTyxLQUFLLEtBQUssa0JBQWtCLFFBQVEsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ2pFLENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxnQkFBZ0I7Z0JBQ2hCLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxRQUFRLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsRUFBRSxDQUFDO29CQUNoRixPQUFPLENBQ0wsUUFBUSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQ3JCLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsS0FBSyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FDeEUsS0FBSyxTQUFTLENBQ2hCLENBQUM7Z0JBQ0osQ0FBQztnQkFFRCxPQUFPLEtBQUssQ0FBQztZQUNmLENBQUM7WUFDRCxRQUFRO1NBQ1QsQ0FBQyxDQUFDO1FBRUgsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0Y7QUF0SEQsd0JBc0hDIn0=
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { Activity } from '@microsoft/teams.api';
|
|
2
2
|
import { IActivityContext } from '../contexts';
|
|
3
3
|
import { RouteHandler } from '../types';
|
|
4
|
-
export type ActivityRoutes = {
|
|
4
|
+
export type ActivityRoutes<TExtraCtx extends Record<string, any> = Record<string, any>> = {
|
|
5
5
|
[K in Activity['type']]?: RouteHandler<IActivityContext<Extract<Activity, {
|
|
6
6
|
type: K;
|
|
7
|
-
}
|
|
7
|
+
}>, TExtraCtx>>;
|
|
8
8
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { IConversationUpdateActivity } from '@microsoft/teams.api';
|
|
2
2
|
import { IActivityContext } from '../contexts';
|
|
3
3
|
import { RouteHandler } from '../types';
|
|
4
|
-
export type ConversationUpdateActivityRoutes = {
|
|
5
|
-
[K in IConversationUpdateActivity['channelData']['eventType'] as K]?: RouteHandler<IActivityContext<IConversationUpdateActivity>, void>;
|
|
4
|
+
export type ConversationUpdateActivityRoutes<TExtraCtx extends Record<string, any> = Record<string, any>> = {
|
|
5
|
+
[K in IConversationUpdateActivity['channelData']['eventType'] as K]?: RouteHandler<IActivityContext<IConversationUpdateActivity, TExtraCtx>, void>;
|
|
6
6
|
};
|
package/dist/routes/event.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { EventActivity } from '@microsoft/teams.api';
|
|
2
2
|
import { IActivityContext } from '../contexts';
|
|
3
3
|
import { RouteHandler } from '../types';
|
|
4
|
-
export type EventActivityRoutes = {
|
|
4
|
+
export type EventActivityRoutes<TExtraCtx extends Record<string, any> = Record<string, any>> = {
|
|
5
5
|
[K in EventActivity['name'] as EventAliases[K]]?: RouteHandler<IActivityContext<Extract<EventActivity, {
|
|
6
6
|
name: K;
|
|
7
|
-
}
|
|
7
|
+
}>, TExtraCtx>, void>;
|
|
8
8
|
};
|
|
9
9
|
type EventAliases = {
|
|
10
10
|
'application/vnd.microsoft.readReceipt': 'readReceipt';
|
package/dist/routes/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Activity } from '@microsoft/teams.api';
|
|
1
2
|
import { IActivityContext } from '../contexts';
|
|
2
3
|
import { RouteHandler } from '../types';
|
|
3
4
|
import { ActivityRoutes } from './activity';
|
|
@@ -7,14 +8,14 @@ import { InstallActivityRoutes } from './install';
|
|
|
7
8
|
import { InvokeActivityRoutes } from './invoke';
|
|
8
9
|
import { MessageDeleteActivityRoutes } from './message-delete';
|
|
9
10
|
import { MessageUpdateActivityRoutes } from './message-update';
|
|
10
|
-
export interface IRoutes extends
|
|
11
|
-
mention?: RouteHandler<IActivityContext
|
|
12
|
-
activity?: RouteHandler<IActivityContext
|
|
11
|
+
export interface IRoutes<TExtraCtx extends Record<string, any> = Record<string, any>> extends ActivityRoutes<TExtraCtx>, InvokeActivityRoutes<TExtraCtx>, InstallActivityRoutes<TExtraCtx>, ConversationUpdateActivityRoutes<TExtraCtx>, MessageUpdateActivityRoutes<TExtraCtx>, MessageDeleteActivityRoutes<TExtraCtx>, EventActivityRoutes<TExtraCtx> {
|
|
12
|
+
mention?: RouteHandler<IActivityContext<Activity, TExtraCtx>>;
|
|
13
|
+
activity?: RouteHandler<IActivityContext<Activity, TExtraCtx>>;
|
|
13
14
|
}
|
|
14
15
|
export * from './activity';
|
|
16
|
+
export * from './conversation-update';
|
|
17
|
+
export * from './event';
|
|
15
18
|
export * from './install';
|
|
16
19
|
export * from './invoke';
|
|
17
|
-
export * from './conversation-update';
|
|
18
|
-
export * from './message-update';
|
|
19
20
|
export * from './message-delete';
|
|
20
|
-
export * from './
|
|
21
|
+
export * from './message-update';
|
package/dist/routes/index.js
CHANGED
|
@@ -15,10 +15,10 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./activity"), exports);
|
|
18
|
+
__exportStar(require("./conversation-update"), exports);
|
|
19
|
+
__exportStar(require("./event"), exports);
|
|
18
20
|
__exportStar(require("./install"), exports);
|
|
19
21
|
__exportStar(require("./invoke"), exports);
|
|
20
|
-
__exportStar(require("./conversation-update"), exports);
|
|
21
|
-
__exportStar(require("./message-update"), exports);
|
|
22
22
|
__exportStar(require("./message-delete"), exports);
|
|
23
|
-
__exportStar(require("./
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
__exportStar(require("./message-update"), exports);
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcm91dGVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5QkEsNkNBQTJCO0FBQzNCLHdEQUFzQztBQUN0QywwQ0FBd0I7QUFDeEIsNENBQTBCO0FBQzFCLDJDQUF5QjtBQUN6QixtREFBaUM7QUFDakMsbURBQWlDIn0=
|
package/dist/routes/install.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { InstallUpdateActivity } from '@microsoft/teams.api';
|
|
2
2
|
import { IActivityContext } from '../contexts';
|
|
3
3
|
import { RouteHandler } from '../types';
|
|
4
|
-
export type InstallActivityRoutes = {
|
|
4
|
+
export type InstallActivityRoutes<TExtraCtx extends Record<string, any> = Record<string, any>> = {
|
|
5
5
|
[K in InstallUpdateActivity['action'] as `install.${K}`]?: RouteHandler<IActivityContext<Extract<InstallUpdateActivity, {
|
|
6
6
|
action: K;
|
|
7
|
-
}
|
|
7
|
+
}>, TExtraCtx>, void>;
|
|
8
8
|
};
|
|
@@ -4,10 +4,10 @@ import { RouteHandler } from '../../types';
|
|
|
4
4
|
import { FileConsentActivityRoutes } from './file-consent';
|
|
5
5
|
import { MessageExtensionSubmitActivityRoutes } from './message-extension-submit';
|
|
6
6
|
import { MessageSubmitActivityRoutes } from './message-submit';
|
|
7
|
-
export type InvokeActivityRoutes = {
|
|
7
|
+
export type InvokeActivityRoutes<TExtraCtx extends Record<string, any> = Record<string, any>> = {
|
|
8
8
|
[K in InvokeActivity['name'] as InvokeAliases[K]]?: RouteHandler<IActivityContext<Extract<InvokeActivity, {
|
|
9
9
|
name: K;
|
|
10
|
-
}
|
|
10
|
+
}>, TExtraCtx>, InvokeResponse<K> | InvokeResponse<K>['body']>;
|
|
11
11
|
} & FileConsentActivityRoutes & MessageExtensionSubmitActivityRoutes & MessageSubmitActivityRoutes;
|
|
12
12
|
type InvokeAliases = {
|
|
13
13
|
'config/fetch': 'config.open';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { IMessageDeleteActivity } from '@microsoft/teams.api';
|
|
2
2
|
import { IActivityContext } from '../contexts';
|
|
3
3
|
import { RouteHandler } from '../types';
|
|
4
|
-
export type MessageDeleteActivityRoutes = {
|
|
5
|
-
[K in IMessageDeleteActivity['channelData']['eventType'] as K]?: RouteHandler<IActivityContext<IMessageDeleteActivity>, void>;
|
|
4
|
+
export type MessageDeleteActivityRoutes<TExtraCtx extends Record<string, any> = Record<string, any>> = {
|
|
5
|
+
[K in IMessageDeleteActivity['channelData']['eventType'] as K]?: RouteHandler<IActivityContext<IMessageDeleteActivity, TExtraCtx>, void>;
|
|
6
6
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { IMessageUpdateActivity } from '@microsoft/teams.api';
|
|
2
2
|
import { IActivityContext } from '../contexts';
|
|
3
3
|
import { RouteHandler } from '../types';
|
|
4
|
-
export type MessageUpdateActivityRoutes = {
|
|
5
|
-
[K in IMessageUpdateActivity['channelData']['eventType'] as K]?: RouteHandler<IActivityContext<IMessageUpdateActivity>, void>;
|
|
4
|
+
export type MessageUpdateActivityRoutes<TExtraCtx extends Record<string, any> = Record<string, any>> = {
|
|
5
|
+
[K in IMessageUpdateActivity['channelData']['eventType'] as K]?: RouteHandler<IActivityContext<IMessageUpdateActivity, TExtraCtx>, void>;
|
|
6
6
|
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { IEvents } from '../events';
|
|
2
|
+
import { IPlugin } from './plugin';
|
|
3
|
+
import { UnionToIntersection } from './union-to-intersection';
|
|
4
|
+
/**
|
|
5
|
+
* Extracts the events from a plugin if it extends PluginWithEvents
|
|
6
|
+
*/
|
|
7
|
+
export type PluginEvents<T> = T extends IPlugin<any, infer Events> ? Events : {};
|
|
8
|
+
type MergePluginEventMaps<TPlugins> = UnionToIntersection<TPlugins extends readonly unknown[] ? PluginEvents<TPlugins[number]> : PluginEvents<TPlugins>>;
|
|
9
|
+
/**
|
|
10
|
+
* Combines two sets of event types:
|
|
11
|
+
* 1. Base events from IEvents interface (these are core-events)
|
|
12
|
+
* 2. Custom events from all registered plugins that extend PluginWithEvents
|
|
13
|
+
*
|
|
14
|
+
* For any given event key K:
|
|
15
|
+
* - If K exists in IEvents, use the event type from IEvents (i.e. prioritizes core-events)
|
|
16
|
+
* - If K exists in plugin events, use the event type from plugins
|
|
17
|
+
* - Otherwise, the type is never
|
|
18
|
+
*
|
|
19
|
+
* This creates a unified event type map that prioritizes base events
|
|
20
|
+
* while still including all plugin-specific events.
|
|
21
|
+
*/
|
|
22
|
+
export type AppEvents<TPlugins> = {
|
|
23
|
+
[K in keyof IEvents | keyof MergePluginEventMaps<TPlugins>]: K extends keyof IEvents ? IEvents[K] : K extends keyof MergePluginEventMaps<TPlugins> ? MergePluginEventMaps<TPlugins>[K] : never;
|
|
24
|
+
};
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWV2ZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90eXBlcy9hcHAtZXZlbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { IPlugin } from './plugin';
|
|
2
|
+
import { UnionToIntersection } from './union-to-intersection';
|
|
3
|
+
import type { App } from '../app';
|
|
4
|
+
import type { IRoutes } from '../routes';
|
|
5
|
+
/**
|
|
6
|
+
* Extracts the events from a plugin if it extends PluginWithEvents
|
|
7
|
+
*/
|
|
8
|
+
export type PluginAdditionalContext<T> = UnionToIntersection<T extends IPlugin<infer Ctx, any> ? Ctx : {}> extends infer R ? R extends Record<string, any> ? R : {} : {};
|
|
9
|
+
type AppPlugin<TApp extends App> = TApp extends App<infer TPlugin> ? TPlugin : never;
|
|
10
|
+
export type AppRoutingHandler<Name extends keyof IRoutes, TApp extends App<any>> = Exclude<IRoutes<PluginAdditionalContext<AppPlugin<TApp>>>[Name], undefined>;
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXJvdXRpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvYXBwLXJvdXRpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
|
package/dist/types/index.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
export * from './
|
|
2
|
-
export * from './streamer';
|
|
3
|
-
export * from './event-handler';
|
|
1
|
+
export * from './app-events';
|
|
4
2
|
export * from './event';
|
|
5
|
-
export * from './
|
|
3
|
+
export * from './event-handler';
|
|
4
|
+
export * from './plugin';
|
|
6
5
|
export * from './prefixed';
|
|
6
|
+
export * from './route-handler';
|
|
7
|
+
export * from './streamer';
|
|
7
8
|
export * from './suffixed';
|
|
9
|
+
export * from './union-to-intersection';
|
package/dist/types/index.js
CHANGED
|
@@ -14,11 +14,13 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
15
|
};
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./
|
|
18
|
-
__exportStar(require("./streamer"), exports);
|
|
19
|
-
__exportStar(require("./event-handler"), exports);
|
|
17
|
+
__exportStar(require("./app-events"), exports);
|
|
20
18
|
__exportStar(require("./event"), exports);
|
|
21
|
-
__exportStar(require("./
|
|
19
|
+
__exportStar(require("./event-handler"), exports);
|
|
20
|
+
__exportStar(require("./plugin"), exports);
|
|
22
21
|
__exportStar(require("./prefixed"), exports);
|
|
22
|
+
__exportStar(require("./route-handler"), exports);
|
|
23
|
+
__exportStar(require("./streamer"), exports);
|
|
23
24
|
__exportStar(require("./suffixed"), exports);
|
|
24
|
-
|
|
25
|
+
__exportStar(require("./union-to-intersection"), exports);
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLCtDQUE2QjtBQUM3QiwwQ0FBd0I7QUFDeEIsa0RBQWdDO0FBQ2hDLDJDQUF5QjtBQUN6Qiw2Q0FBMkI7QUFDM0Isa0RBQWdDO0FBQ2hDLDZDQUEyQjtBQUMzQiw2Q0FBMkI7QUFDM0IsMERBQXdDIn0=
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import 'reflect-metadata';
|
|
2
2
|
export declare const PLUGIN_EVENTS_METADATA_KEY = "teams:plugin:events";
|
|
3
|
-
export type PluginEventName = 'error' | 'activity';
|
|
3
|
+
export type PluginEventName = 'error' | 'activity' | 'custom';
|
|
4
4
|
export type EventMetadata = {
|
|
5
5
|
/**
|
|
6
6
|
* the property name
|
|
@@ -21,11 +21,14 @@ export type OnErrorPluginEvent = (event: IErrorEvent) => void;
|
|
|
21
21
|
* receives an activity
|
|
22
22
|
*/
|
|
23
23
|
export type OnActivityPluginEvent = (event: IActivityEvent) => void;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
export interface IPlugin<TActivityContext extends {} = {}, TEvents extends {} = {}> {
|
|
25
|
+
/**
|
|
26
|
+
* The event types that this plugin can emit. This is just a type, but we need it
|
|
27
|
+
* for the type system to pick it up. You don't actually need to assign this to
|
|
28
|
+
* anything.
|
|
29
|
+
* Simply having `__eventType!: MyEvents` works.
|
|
30
|
+
*/
|
|
31
|
+
__eventType?: TEvents;
|
|
29
32
|
/**
|
|
30
33
|
* lifecycle method called by the `App`
|
|
31
34
|
* once during initialization
|
|
@@ -50,7 +53,7 @@ export interface IPlugin {
|
|
|
50
53
|
* called by the `App`
|
|
51
54
|
* when an activity is received
|
|
52
55
|
*/
|
|
53
|
-
onActivity?(event: IPluginActivityEvent): void | Promise<void>;
|
|
56
|
+
onActivity?(event: IPluginActivityEvent): void | TActivityContext | Promise<void | TActivityContext>;
|
|
54
57
|
/**
|
|
55
58
|
* called by the `App`
|
|
56
59
|
* when an activity is sent
|
|
@@ -72,3 +75,5 @@ export interface IPlugin {
|
|
|
72
75
|
*/
|
|
73
76
|
createStream?(ref: ConversationReference): IStreamer;
|
|
74
77
|
}
|
|
78
|
+
export type EmitPluginEvent<TEvents extends {}> = <Name extends keyof TEvents>(name: Name, arg: TEvents[Name]) => void;
|
|
79
|
+
export type PluginWithEvents<TEvents extends {}> = Pick<Required<IPlugin<TEvents>>, '__eventType'>;
|
|
@@ -4,7 +4,7 @@ import { IPlugin } from './plugin';
|
|
|
4
4
|
/**
|
|
5
5
|
* a plugin that can send activities
|
|
6
6
|
*/
|
|
7
|
-
export interface ISender extends IPlugin {
|
|
7
|
+
export interface ISender<TCustomEvents extends {} = {}> extends IPlugin<TCustomEvents> {
|
|
8
8
|
/**
|
|
9
9
|
* called by the `App`
|
|
10
10
|
* to send an activity
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
3
|
+
;
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3R5cGVzL3BsdWdpbi9zZW5kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFxQkMsQ0FBQyJ9
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import { IActivityContext } from '../contexts';
|
|
2
|
-
export type RouteHandler<In extends IActivityContext<any>, Out = void> = (ctx: In) => Out | Promise<Out>;
|
|
2
|
+
export type RouteHandler<In extends IActivityContext<any, any>, Out = void> = (ctx: In) => Out | Promise<Out>;
|
package/dist/types/streamer.d.ts
CHANGED
|
@@ -24,6 +24,11 @@ export interface IStreamer {
|
|
|
24
24
|
* @param activity the activity to send
|
|
25
25
|
*/
|
|
26
26
|
emit(activity: Partial<IMessageActivity | ITypingActivity> | string): void;
|
|
27
|
+
/**
|
|
28
|
+
* send status updates before emitting (ex. "Thinking...")
|
|
29
|
+
* @param text the status text to send
|
|
30
|
+
*/
|
|
31
|
+
update(text: string): void;
|
|
27
32
|
/**
|
|
28
33
|
* close the stream
|
|
29
34
|
*/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (k: infer I) => void ? I : never;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pb24tdG8taW50ZXJzZWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3R5cGVzL3VuaW9uLXRvLWludGVyc2VjdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const assertNever: (value: never, message?: string) => never;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.assertNever = void 0;
|
|
7
|
+
const assert_1 = __importDefault(require("assert"));
|
|
8
|
+
const assertNever = (value, message) => {
|
|
9
|
+
(0, assert_1.default)(false, message ?? `Unexpected value: ${value}`);
|
|
10
|
+
};
|
|
11
|
+
exports.assertNever = assertNever;
|
|
12
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNzZXJ0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9hc3NlcnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLG9EQUE0QjtBQUVyQixNQUFNLFdBQVcsR0FBRyxDQUFDLEtBQVksRUFBRSxPQUFnQixFQUFTLEVBQUU7SUFDakUsSUFBQSxnQkFBTSxFQUFDLEtBQUssRUFBRSxPQUFPLElBQUkscUJBQXFCLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDM0QsQ0FBQyxDQUFDO0FBRlcsUUFBQSxXQUFXLGVBRXRCIn0=
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { ILogger } from '@microsoft/teams.common';
|
|
2
|
+
import { App } from '../app';
|
|
3
|
+
import { IFunctionContext } from '../contexts';
|
|
4
|
+
import { IPlugin } from '../types';
|
|
5
|
+
export declare function getConversationIdResolver<TPlugin extends IPlugin>(app: App<TPlugin>, log: ILogger, context: Pick<IFunctionContext, 'channelId' | 'chatId' | 'meetingId' | 'userId' | 'userName' | 'tenantId'>): () => Promise<string | undefined>;
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getConversationIdResolver = getConversationIdResolver;
|
|
4
|
+
function getConversationIdResolver(app, log, context) {
|
|
5
|
+
let state;
|
|
6
|
+
const { userId, userName, tenantId } = context;
|
|
7
|
+
const conversationId = context.chatId ?? context.channelId;
|
|
8
|
+
return async () => {
|
|
9
|
+
if (state) {
|
|
10
|
+
// This conversation has already been resolved.
|
|
11
|
+
return state.id;
|
|
12
|
+
}
|
|
13
|
+
if (!conversationId) {
|
|
14
|
+
// Conversation ID can be missing if the app is running in a personal scope. In this case, create
|
|
15
|
+
// a conversation between the bot and the user. This will either create a new conversation or return
|
|
16
|
+
// a pre-existing one.
|
|
17
|
+
try {
|
|
18
|
+
const conversation = await app.api.conversations.create({
|
|
19
|
+
bot: { id: app.id },
|
|
20
|
+
members: [{ id: userId, role: 'user', name: userName }],
|
|
21
|
+
tenantId: tenantId,
|
|
22
|
+
isGroup: false,
|
|
23
|
+
});
|
|
24
|
+
state = { id: conversation.id };
|
|
25
|
+
}
|
|
26
|
+
catch {
|
|
27
|
+
state = { id: undefined };
|
|
28
|
+
log.error('failed to create conversation with user', {
|
|
29
|
+
userId,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
// Validate that the bot and user are both members of the conversation.
|
|
35
|
+
try {
|
|
36
|
+
const member = await app.api.conversations
|
|
37
|
+
.members(conversationId)
|
|
38
|
+
.getById(userId);
|
|
39
|
+
state = { id: !member ? undefined : conversationId };
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
state = { id: undefined };
|
|
43
|
+
}
|
|
44
|
+
if (!state.id) {
|
|
45
|
+
log.warn('either the bot or the user are not in this conversation', {
|
|
46
|
+
conversationId,
|
|
47
|
+
userId,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return state.id;
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuY3Rpb24tY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9mdW5jdGlvbi1jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBTUEsOERBMERDO0FBMURELFNBQWdCLHlCQUF5QixDQUN2QyxHQUFpQixFQUNqQixHQUFZLEVBQ1osT0FHQztJQUVELElBQUksS0FBa0MsQ0FBQztJQUV2QyxNQUFNLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsR0FBRyxPQUFPLENBQUM7SUFDL0MsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDO0lBRTNELE9BQU8sS0FBSyxJQUFJLEVBQUU7UUFDaEIsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLCtDQUErQztZQUMvQyxPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDbEIsQ0FBQztRQUVELElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUNwQixpR0FBaUc7WUFDakcsb0dBQW9HO1lBQ3BHLHNCQUFzQjtZQUN0QixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxZQUFZLEdBQUcsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUM7b0JBQ3RELEdBQUcsRUFBRSxFQUFFLEVBQUUsRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFO29CQUNuQixPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLENBQUM7b0JBQ3ZELFFBQVEsRUFBRSxRQUFRO29CQUNsQixPQUFPLEVBQUUsS0FBSztpQkFDZixDQUFDLENBQUM7Z0JBQ0gsS0FBSyxHQUFHLEVBQUUsRUFBRSxFQUFFLFlBQVksQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNsQyxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLEtBQUssR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQztnQkFDMUIsR0FBRyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsRUFBRTtvQkFDbkQsTUFBTTtpQkFDUCxDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQzthQUFNLENBQUM7WUFDTix1RUFBdUU7WUFDdkUsSUFBSSxDQUFDO2dCQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhO3FCQUN2QyxPQUFPLENBQUMsY0FBYyxDQUFDO3FCQUN2QixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7Z0JBQ25CLEtBQUssR0FBRyxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN2RCxDQUFDO1lBQUMsTUFBTSxDQUFDO2dCQUNQLEtBQUssR0FBRyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsQ0FBQztZQUM1QixDQUFDO1lBRUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDZCxHQUFHLENBQUMsSUFBSSxDQUFDLHlEQUF5RCxFQUFFO29CQUNsRSxjQUFjO29CQUNkLE1BQU07aUJBQ1AsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPLEtBQUssQ0FBQyxFQUFFLENBQUM7SUFDbEIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyJ9
|
package/dist/utils/index.d.ts
CHANGED
package/dist/utils/index.js
CHANGED
|
@@ -33,6 +33,8 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.promises = void 0;
|
|
36
|
+
exports.functionContext = exports.promises = exports.asserts = void 0;
|
|
37
|
+
exports.asserts = __importStar(require("./asserts"));
|
|
37
38
|
exports.promises = __importStar(require("./promises"));
|
|
38
|
-
|
|
39
|
+
exports.functionContext = __importStar(require("./function-context"));
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEscURBQXFDO0FBQ3JDLHVEQUF1QztBQUN2QyxzRUFBc0QifQ==
|
|
@@ -1,13 +1,18 @@
|
|
|
1
|
+
import { ILogger } from '@microsoft/teams.common';
|
|
1
2
|
export type RetryOptions = {
|
|
2
3
|
/**
|
|
3
4
|
* the max number of retry attempts
|
|
4
|
-
* @default
|
|
5
|
+
* @default 5
|
|
5
6
|
*/
|
|
6
7
|
readonly max?: number;
|
|
7
8
|
/**
|
|
8
9
|
* the delay in ms per retry
|
|
9
|
-
* @default
|
|
10
|
+
* @default 500ms
|
|
10
11
|
*/
|
|
11
12
|
readonly delay?: number;
|
|
13
|
+
/**
|
|
14
|
+
* the logger to use
|
|
15
|
+
*/
|
|
16
|
+
readonly logger?: ILogger;
|
|
12
17
|
};
|
|
13
|
-
export declare function retry<T = any>(
|
|
18
|
+
export declare function retry<T = any>(factory: () => Promise<T>, options?: RetryOptions): Promise<T>;
|
|
@@ -1,18 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.retry = retry;
|
|
4
|
-
async function retry(
|
|
5
|
-
const max = options?.max
|
|
6
|
-
const delay = options?.delay
|
|
4
|
+
async function retry(factory, options) {
|
|
5
|
+
const max = options?.max ?? 5;
|
|
6
|
+
const delay = options?.delay ?? 500;
|
|
7
|
+
const log = options?.logger?.child('retry');
|
|
7
8
|
try {
|
|
8
|
-
return await
|
|
9
|
+
return await factory();
|
|
9
10
|
}
|
|
10
11
|
catch (err) {
|
|
11
12
|
if (max > 0) {
|
|
13
|
+
log?.debug(`delaying ${delay}ms...`);
|
|
12
14
|
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
13
|
-
|
|
15
|
+
log?.debug('retrying...');
|
|
16
|
+
return retry(factory, {
|
|
17
|
+
max: max - 1,
|
|
18
|
+
delay: delay * 2,
|
|
19
|
+
logger: options?.logger,
|
|
20
|
+
});
|
|
14
21
|
}
|
|
22
|
+
log?.error(err);
|
|
15
23
|
throw err;
|
|
16
24
|
}
|
|
17
25
|
}
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcHJvbWlzZXMvcmV0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFxQkEsc0JBc0JDO0FBdEJNLEtBQUssVUFBVSxLQUFLLENBQVUsT0FBeUIsRUFBRSxPQUFzQjtJQUNwRixNQUFNLEdBQUcsR0FBRyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUM5QixNQUFNLEtBQUssR0FBRyxPQUFPLEVBQUUsS0FBSyxJQUFJLEdBQUcsQ0FBQztJQUNwQyxNQUFNLEdBQUcsR0FBRyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUU1QyxJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sT0FBTyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNaLEdBQUcsRUFBRSxLQUFLLENBQUMsWUFBWSxLQUFLLE9BQU8sQ0FBQyxDQUFDO1lBQ3JDLE1BQU0sSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUMzRCxHQUFHLEVBQUUsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQzFCLE9BQU8sS0FBSyxDQUFDLE9BQU8sRUFBRTtnQkFDcEIsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDO2dCQUNaLEtBQUssRUFBRSxLQUFLLEdBQUcsQ0FBQztnQkFDaEIsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNO2FBQ3hCLENBQUMsQ0FBQztRQUNMLENBQUM7UUFFRCxHQUFHLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hCLE1BQU0sR0FBRyxDQUFDO0lBQ1osQ0FBQztBQUNILENBQUMifQ==
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@microsoft/teams.apps",
|
|
3
|
-
"version": "2.0.0-preview.
|
|
3
|
+
"version": "2.0.0-preview.11",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -46,12 +46,12 @@
|
|
|
46
46
|
"reflect-metadata": "^0.2.2"
|
|
47
47
|
},
|
|
48
48
|
"peerDependencies": {
|
|
49
|
-
"@microsoft/teams.api": "2.0.0-preview.
|
|
50
|
-
"@microsoft/teams.common": "2.0.0-preview.
|
|
51
|
-
"@microsoft/teams.graph": "2.0.0-preview.
|
|
49
|
+
"@microsoft/teams.api": "2.0.0-preview.11",
|
|
50
|
+
"@microsoft/teams.common": "2.0.0-preview.11",
|
|
51
|
+
"@microsoft/teams.graph": "2.0.0-preview.11"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
|
-
"@microsoft/teams.config": "2.0.0-preview.
|
|
54
|
+
"@microsoft/teams.config": "2.0.0-preview.11",
|
|
55
55
|
"@types/cors": "^2.8.17",
|
|
56
56
|
"@types/express": "^5.0.0",
|
|
57
57
|
"@types/jest": "^29.5.12",
|