@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.
Files changed (81) hide show
  1. package/README.md +1 -1
  2. package/dist/app.d.ts +60 -54
  3. package/dist/app.embed.d.ts +4 -3
  4. package/dist/app.embed.js +12 -2
  5. package/dist/app.events.d.ts +7 -7
  6. package/dist/app.events.js +1 -1
  7. package/dist/app.js +58 -16
  8. package/dist/app.oauth.d.ts +4 -2
  9. package/dist/app.oauth.js +5 -3
  10. package/dist/app.plugins.d.ts +3 -3
  11. package/dist/app.plugins.js +14 -2
  12. package/dist/app.process.d.ts +2 -2
  13. package/dist/app.process.js +28 -21
  14. package/dist/app.routing.d.ts +9 -5
  15. package/dist/app.routing.js +2 -1
  16. package/dist/contexts/activity-signin.d.ts +1 -1
  17. package/dist/contexts/activity.d.ts +23 -9
  18. package/dist/contexts/activity.js +15 -17
  19. package/dist/contexts/client.d.ts +10 -6
  20. package/dist/contexts/function.d.ts +15 -0
  21. package/dist/events/index.d.ts +1 -0
  22. package/dist/events/index.js +14 -1
  23. package/dist/middleware/auth/jwt-validator.d.ts +60 -0
  24. package/dist/middleware/auth/jwt-validator.js +213 -0
  25. package/dist/middleware/index.d.ts +3 -2
  26. package/dist/middleware/index.js +7 -5
  27. package/dist/middleware/jwt-validation-middleware.d.ts +11 -0
  28. package/dist/middleware/jwt-validation-middleware.js +46 -0
  29. package/dist/middleware/strip-mentions-text.d.ts +1 -1
  30. package/dist/middleware/strip-mentions-text.js +1 -1
  31. package/dist/middleware/with-remote-function-jwt-validation.d.ts +16 -0
  32. package/dist/middleware/with-remote-function-jwt-validation.js +47 -0
  33. package/dist/plugins/http/plugin.d.ts +12 -6
  34. package/dist/plugins/http/plugin.js +39 -21
  35. package/dist/plugins/http/stream.d.ts +10 -6
  36. package/dist/plugins/http/stream.js +88 -37
  37. package/dist/router/index.d.ts +1 -0
  38. package/dist/router/index.js +18 -0
  39. package/dist/router/route.d.ts +9 -0
  40. package/dist/router/route.js +3 -0
  41. package/dist/router/router.d.ts +29 -0
  42. package/dist/router/router.js +101 -0
  43. package/dist/routes/activity.d.ts +2 -2
  44. package/dist/routes/conversation-update.d.ts +2 -2
  45. package/dist/routes/event.d.ts +2 -2
  46. package/dist/routes/index.d.ts +7 -6
  47. package/dist/routes/index.js +4 -4
  48. package/dist/routes/install.d.ts +2 -2
  49. package/dist/routes/invoke/index.d.ts +2 -2
  50. package/dist/routes/message-delete.d.ts +2 -2
  51. package/dist/routes/message-update.d.ts +2 -2
  52. package/dist/types/app-events.d.ts +25 -0
  53. package/dist/types/app-events.js +3 -0
  54. package/dist/types/app-routing.d.ts +11 -0
  55. package/dist/types/app-routing.js +3 -0
  56. package/dist/types/index.d.ts +6 -4
  57. package/dist/types/index.js +7 -5
  58. package/dist/types/plugin/decorators/event.d.ts +1 -1
  59. package/dist/types/plugin/plugin-start-event.d.ts +1 -1
  60. package/dist/types/plugin/plugin.d.ts +11 -6
  61. package/dist/types/plugin/sender.d.ts +1 -1
  62. package/dist/types/plugin/sender.js +2 -1
  63. package/dist/types/route-handler.d.ts +1 -1
  64. package/dist/types/streamer.d.ts +5 -0
  65. package/dist/types/union-to-intersection.d.ts +1 -0
  66. package/dist/types/union-to-intersection.js +3 -0
  67. package/dist/utils/asserts.d.ts +1 -0
  68. package/dist/utils/asserts.js +12 -0
  69. package/dist/utils/function-context.d.ts +5 -0
  70. package/dist/utils/function-context.js +54 -0
  71. package/dist/utils/index.d.ts +2 -0
  72. package/dist/utils/index.js +4 -2
  73. package/dist/utils/promises/retry.d.ts +8 -3
  74. package/dist/utils/promises/retry.js +14 -6
  75. package/package.json +5 -5
  76. package/dist/middleware/entra-token-validator.d.ts +0 -75
  77. package/dist/middleware/entra-token-validator.js +0 -169
  78. package/dist/middleware/with-client-auth.d.ts +0 -13
  79. package/dist/middleware/with-client-auth.js +0 -40
  80. package/dist/router.d.ts +0 -34
  81. 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
  };
@@ -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
- }>>, void>;
7
+ }>, TExtraCtx>, void>;
8
8
  };
9
9
  type EventAliases = {
10
10
  'application/vnd.microsoft.readReceipt': 'readReceipt';
@@ -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 ActivityRoutes, InvokeActivityRoutes, InstallActivityRoutes, ConversationUpdateActivityRoutes, MessageUpdateActivityRoutes, MessageDeleteActivityRoutes, EventActivityRoutes {
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 './event';
21
+ export * from './message-update';
@@ -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("./event"), exports);
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcm91dGVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkEsNkNBQTJCO0FBQzNCLDRDQUEwQjtBQUMxQiwyQ0FBeUI7QUFDekIsd0RBQXNDO0FBQ3RDLG1EQUFpQztBQUNqQyxtREFBaUM7QUFDakMsMENBQXdCIn0=
23
+ __exportStar(require("./message-update"), exports);
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcm91dGVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5QkEsNkNBQTJCO0FBQzNCLHdEQUFzQztBQUN0QywwQ0FBd0I7QUFDeEIsNENBQTBCO0FBQzFCLDJDQUF5QjtBQUN6QixtREFBaUM7QUFDakMsbURBQWlDIn0=
@@ -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
- }>>, void>;
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
- }>>, InvokeResponse<K> | InvokeResponse<K>['body']>;
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
@@ -1,7 +1,9 @@
1
- export * from './plugin';
2
- export * from './streamer';
3
- export * from './event-handler';
1
+ export * from './app-events';
4
2
  export * from './event';
5
- export * from './route-handler';
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';
@@ -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("./plugin"), exports);
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("./route-handler"), exports);
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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUF5QjtBQUN6Qiw2Q0FBMkI7QUFDM0Isa0RBQWdDO0FBQ2hDLDBDQUF3QjtBQUN4QixrREFBZ0M7QUFDaEMsNkNBQTJCO0FBQzNCLDZDQUEyQiJ9
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
@@ -7,5 +7,5 @@ export interface IPluginStartEvent {
7
7
  * the port given to the
8
8
  * `app.start()` method
9
9
  */
10
- readonly port: number;
10
+ readonly port: number | string;
11
11
  }
@@ -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
- * a component for extending the base
26
- * `App` functionality
27
- */
28
- export interface IPlugin {
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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3R5cGVzL3BsdWdpbi9zZW5kZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
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>;
@@ -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
@@ -1 +1,3 @@
1
+ export * as asserts from './asserts';
1
2
  export * as promises from './promises';
3
+ export * as functionContext from './function-context';
@@ -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
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdURBQXVDIn0=
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 3
5
+ * @default 5
5
6
  */
6
7
  readonly max?: number;
7
8
  /**
8
9
  * the delay in ms per retry
9
- * @default 200
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>(promise: Promise<T>, options?: RetryOptions): Promise<T>;
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(promise, options) {
5
- const max = options?.max || 3;
6
- const delay = options?.delay || 200;
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 promise;
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
- return retry(promise, { max: max - 1, delay: delay * 2 });
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvcHJvbWlzZXMvcmV0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFjQSxzQkFjQztBQWRNLEtBQUssVUFBVSxLQUFLLENBQVUsT0FBbUIsRUFBRSxPQUFzQjtJQUM5RSxNQUFNLEdBQUcsR0FBRyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUM5QixNQUFNLEtBQUssR0FBRyxPQUFPLEVBQUUsS0FBSyxJQUFJLEdBQUcsQ0FBQztJQUVwQyxJQUFJLENBQUM7UUFDSCxPQUFPLE1BQU0sT0FBTyxDQUFDO0lBQ3ZCLENBQUM7SUFBQyxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDM0QsT0FBTyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsR0FBRyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVELENBQUM7UUFFRCxNQUFNLEdBQUcsQ0FBQztJQUNaLENBQUM7QUFDSCxDQUFDIn0=
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.1",
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.1",
50
- "@microsoft/teams.common": "2.0.0-preview.1",
51
- "@microsoft/teams.graph": "2.0.0-preview.1"
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.1",
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",