@microsoft/teams.apps 2.0.0-preview.8 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/app.d.ts +6 -5
- package/dist/app.embed.js +2 -2
- package/dist/app.js +19 -11
- package/dist/app.oauth.d.ts +3 -2
- package/dist/app.oauth.js +5 -3
- package/dist/app.process.js +21 -7
- package/dist/app.routing.d.ts +8 -4
- 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/middleware/index.d.ts +2 -2
- package/dist/middleware/index.js +6 -5
- package/dist/middleware/jwt-validation-middleware.js +6 -6
- 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 +3 -3
- package/dist/plugins/http/plugin.js +2 -2
- package/dist/plugins/http/stream.d.ts +7 -4
- package/dist/plugins/http/stream.js +72 -33
- 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 +1 -1
- package/dist/types/app-routing.d.ts +11 -0
- package/dist/types/app-routing.js +3 -0
- package/dist/types/plugin/plugin-start-event.d.ts +1 -1
- package/dist/types/plugin/plugin.d.ts +2 -2
- package/dist/types/route-handler.d.ts +1 -1
- package/dist/types/streamer.d.ts +5 -0
- 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 -45
- 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JvdXRlci9yb3V0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBR0Esc0NBQW1FO0FBS25FLE1BQWEsTUFBTTtJQUNFLE1BQU0sR0FBc0MsRUFBRSxDQUFDO0lBRWxFOzs7T0FHRztJQUNILE1BQU0sQ0FBQyxRQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQyxNQUFNO2FBQ2YsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2FBQ2pDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQStDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUSxDQUE2QixLQUE2QjtRQUNoRSwyREFBMkQ7UUFDM0QscUNBQXFDO1FBQ3JDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxNQUFNLEVBQUUsQ0FBQztZQUMxQixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDO1lBRW5GLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ1gsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNCLENBQUM7UUFDSCxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDeEIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsR0FBRyxDQUFDLFFBQW9GLEVBQUUsSUFBZ0I7UUFDeEcsSUFBSSxDQUFDLFFB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
|
|
@@ -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
|
};
|
|
@@ -4,7 +4,7 @@ import { UnionToIntersection } from './union-to-intersection';
|
|
|
4
4
|
/**
|
|
5
5
|
* Extracts the events from a plugin if it extends PluginWithEvents
|
|
6
6
|
*/
|
|
7
|
-
export type PluginEvents<T> = T extends IPlugin<infer Events> ? Events : {};
|
|
7
|
+
export type PluginEvents<T> = T extends IPlugin<any, infer Events> ? Events : {};
|
|
8
8
|
type MergePluginEventMaps<TPlugins> = UnionToIntersection<TPlugins extends readonly unknown[] ? PluginEvents<TPlugins[number]> : PluginEvents<TPlugins>>;
|
|
9
9
|
/**
|
|
10
10
|
* Combines two sets of event types:
|
|
@@ -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
|
|
@@ -21,7 +21,7 @@ export type OnErrorPluginEvent = (event: IErrorEvent) => void;
|
|
|
21
21
|
* receives an activity
|
|
22
22
|
*/
|
|
23
23
|
export type OnActivityPluginEvent = (event: IActivityEvent) => void;
|
|
24
|
-
export interface IPlugin<TEvents extends {} = {}> {
|
|
24
|
+
export interface IPlugin<TActivityContext extends {} = {}, TEvents extends {} = {}> {
|
|
25
25
|
/**
|
|
26
26
|
* The event types that this plugin can emit. This is just a type, but we need it
|
|
27
27
|
* for the type system to pick it up. You don't actually need to assign this to
|
|
@@ -53,7 +53,7 @@ export interface IPlugin<TEvents extends {} = {}> {
|
|
|
53
53
|
* called by the `App`
|
|
54
54
|
* when an activity is received
|
|
55
55
|
*/
|
|
56
|
-
onActivity?(event: IPluginActivityEvent): void | Promise<void>;
|
|
56
|
+
onActivity?(event: IPluginActivityEvent): void | TActivityContext | Promise<void | TActivityContext>;
|
|
57
57
|
/**
|
|
58
58
|
* called by the `App`
|
|
59
59
|
* when an activity is sent
|
|
@@ -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
|
*/
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@microsoft/teams.apps",
|
|
3
|
-
"version": "2.0.0
|
|
3
|
+
"version": "2.0.0",
|
|
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
|
|
50
|
-
"@microsoft/teams.common": "2.0.0
|
|
51
|
-
"@microsoft/teams.graph": "2.0.0
|
|
49
|
+
"@microsoft/teams.api": "2.0.0",
|
|
50
|
+
"@microsoft/teams.common": "2.0.0",
|
|
51
|
+
"@microsoft/teams.graph": "2.0.0"
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
|
-
"@microsoft/teams.config": "2.0.0
|
|
54
|
+
"@microsoft/teams.config": "2.0.0",
|
|
55
55
|
"@types/cors": "^2.8.17",
|
|
56
56
|
"@types/express": "^5.0.0",
|
|
57
57
|
"@types/jest": "^29.5.12",
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import jwt, { type JwtPayload } from 'jsonwebtoken';
|
|
2
|
-
import jwksClient, { JwksClient } from 'jwks-rsa';
|
|
3
|
-
import { ILogger } from '@microsoft/teams.common';
|
|
4
|
-
/**
|
|
5
|
-
* Entra token validator parameters
|
|
6
|
-
*/
|
|
7
|
-
type EntraTokenValidatorParams = {
|
|
8
|
-
/**
|
|
9
|
-
* App tenant ID. Used to find public keys to validate token signature, and to validate issuer for single-tenant apps.
|
|
10
|
-
* This can be 'common', 'organization', or 'consumers' for a multi-tenant app, or a specific tenant ID for a single-tenant app.
|
|
11
|
-
*/
|
|
12
|
-
tenantId: string;
|
|
13
|
-
/** App client ID. Used to validate token audience. */
|
|
14
|
-
clientId: string;
|
|
15
|
-
options?: {
|
|
16
|
-
/**
|
|
17
|
-
* For multi-tenant apps that only allows sign-in from specific tenants, this is the list of allowed tenant IDs.
|
|
18
|
-
* If empty or not provided, any tenant is considered valid.
|
|
19
|
-
* This is ignored for single-tenant apps.
|
|
20
|
-
*/
|
|
21
|
-
allowedTenantIds?: string[];
|
|
22
|
-
};
|
|
23
|
-
};
|
|
24
|
-
export declare const getJwksClient: (options: jwksClient.Options) => JwksClient;
|
|
25
|
-
/**
|
|
26
|
-
* And Entra token validator that can validate access tokens issued by Microsoft Entra for app specific use.
|
|
27
|
-
*/
|
|
28
|
-
export declare class EntraTokenValidator {
|
|
29
|
-
readonly tenantId: string;
|
|
30
|
-
readonly clientId: string;
|
|
31
|
-
readonly validIssuerTenantIds: string[];
|
|
32
|
-
private keyClient;
|
|
33
|
-
constructor({ tenantId, clientId, options }: EntraTokenValidatorParams);
|
|
34
|
-
/**
|
|
35
|
-
* Validates a JWT access token
|
|
36
|
-
* @param {ILogger} logger The logger to use.
|
|
37
|
-
* @param {string} rawAccessToken The access token as a string.
|
|
38
|
-
* @param { string | undefined } requiredScope If provided, the token will only be considered valid if issued for this scope.
|
|
39
|
-
* @returns {Promise<jwt.Jwt | null>} The validated token if the signature is valid and the claims are valid.
|
|
40
|
-
*/
|
|
41
|
-
validateAccessToken(logger: ILogger, rawAccessToken: string, requiredScope?: string): Promise<jwt.Jwt | null>;
|
|
42
|
-
getTokenPayload(token: jwt.Jwt): JwtPayload | null;
|
|
43
|
-
/**
|
|
44
|
-
* Validates the token claims: that it's valid for the intended purpose, it's not expired, it has the right audience & issuer,
|
|
45
|
-
* it's issued for the requisite scope.
|
|
46
|
-
* @param {ILogger} logger The logger to use.
|
|
47
|
-
* @param {jwt.Jwt} token The token to validate.
|
|
48
|
-
* @param { string | undefined } requiredScope If provided, the token will only be considered valid if issued for this scope.
|
|
49
|
-
* @returns {boolean} True if the claims validation passed.
|
|
50
|
-
*/
|
|
51
|
-
private validateAccessTokenClaims;
|
|
52
|
-
/**
|
|
53
|
-
* Decodes an access token without verifying if the signature is valid.
|
|
54
|
-
* @param {ILogger} logger The logger to use.
|
|
55
|
-
* @param {string} rawAccessToken the raw access token.
|
|
56
|
-
* @returns {jwt.JWT | null} A decoded token if the raw access token is well formed.
|
|
57
|
-
*/
|
|
58
|
-
private decodeToken;
|
|
59
|
-
/**
|
|
60
|
-
* Gets the public key from the key identifier in a token header
|
|
61
|
-
* @param {ILogger} logger The logger to use.
|
|
62
|
-
* @param {jwt.JwtHeader} header the token header
|
|
63
|
-
* @returns {Promise<string | undefined>} the public key corresponding to the header key identifier, if available
|
|
64
|
-
*/
|
|
65
|
-
private getPublicKey;
|
|
66
|
-
/**
|
|
67
|
-
* Decodes the access token and verifies it against the public key
|
|
68
|
-
* @param {ILogger} logger The logger to use.
|
|
69
|
-
* @param {string} rawAccessToken the raw access token.
|
|
70
|
-
* @param {string} publicKey the public key to verify signature against.
|
|
71
|
-
* @returns {Promise<jwt.JWT | null>} A decoded token if the raw token is well formed and the signature is valid.
|
|
72
|
-
*/
|
|
73
|
-
private validateTokenSignature;
|
|
74
|
-
}
|
|
75
|
-
export {};
|
|
@@ -1,169 +0,0 @@
|
|
|
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.EntraTokenValidator = exports.getJwksClient = void 0;
|
|
7
|
-
const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
|
|
8
|
-
const jwks_rsa_1 = __importDefault(require("jwks-rsa"));
|
|
9
|
-
const getJwksClient = (options) => (0, jwks_rsa_1.default)(options);
|
|
10
|
-
exports.getJwksClient = getJwksClient;
|
|
11
|
-
/**
|
|
12
|
-
* And Entra token validator that can validate access tokens issued by Microsoft Entra for app specific use.
|
|
13
|
-
*/
|
|
14
|
-
class EntraTokenValidator {
|
|
15
|
-
tenantId;
|
|
16
|
-
clientId;
|
|
17
|
-
validIssuerTenantIds;
|
|
18
|
-
keyClient;
|
|
19
|
-
constructor({ tenantId, clientId, options }) {
|
|
20
|
-
this.tenantId = tenantId;
|
|
21
|
-
this.clientId = clientId;
|
|
22
|
-
// single-tenant applications only allow tokens issued by this app's tenant
|
|
23
|
-
// multi tenant applications allow tokens issued by any tenant, unless the
|
|
24
|
-
// allowedTenantIds option is provided to limit the set of allowed issuers.
|
|
25
|
-
const isMultiTenant = ['common', 'organizations', 'consumers'].some((val) => tenantId === val);
|
|
26
|
-
this.validIssuerTenantIds = isMultiTenant ? options?.allowedTenantIds ?? [] : [this.tenantId];
|
|
27
|
-
this.keyClient = (0, exports.getJwksClient)({
|
|
28
|
-
jwksUri: `https://login.microsoftonline.com/${tenantId}/discovery/v2.0/keys`,
|
|
29
|
-
});
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* Validates a JWT access token
|
|
33
|
-
* @param {ILogger} logger The logger to use.
|
|
34
|
-
* @param {string} rawAccessToken The access token as a string.
|
|
35
|
-
* @param { string | undefined } requiredScope If provided, the token will only be considered valid if issued for this scope.
|
|
36
|
-
* @returns {Promise<jwt.Jwt | null>} The validated token if the signature is valid and the claims are valid.
|
|
37
|
-
*/
|
|
38
|
-
async validateAccessToken(logger, rawAccessToken, requiredScope) {
|
|
39
|
-
if (!rawAccessToken) {
|
|
40
|
-
logger.error('No token provided');
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
const token = this.decodeToken(logger, rawAccessToken);
|
|
44
|
-
if (!token) {
|
|
45
|
-
logger.error('Failed to decode the access token');
|
|
46
|
-
return null;
|
|
47
|
-
}
|
|
48
|
-
const publicKey = await this.getPublicKey(logger, token.header);
|
|
49
|
-
if (!publicKey) {
|
|
50
|
-
logger.error(`Failed to find public key for the key identifier "${token.header.kid}"`);
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
const validatedToken = this.validateTokenSignature(logger, rawAccessToken, publicKey);
|
|
54
|
-
if (!validatedToken) {
|
|
55
|
-
logger.error('Failed to validate the token signature');
|
|
56
|
-
return null;
|
|
57
|
-
}
|
|
58
|
-
if (!this.validateAccessTokenClaims(logger, validatedToken, requiredScope)) {
|
|
59
|
-
logger.error('Failed to validate the access token claims');
|
|
60
|
-
return null;
|
|
61
|
-
}
|
|
62
|
-
return validatedToken;
|
|
63
|
-
}
|
|
64
|
-
getTokenPayload(token) {
|
|
65
|
-
return token.payload instanceof Object ? token.payload : null;
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Validates the token claims: that it's valid for the intended purpose, it's not expired, it has the right audience & issuer,
|
|
69
|
-
* it's issued for the requisite scope.
|
|
70
|
-
* @param {ILogger} logger The logger to use.
|
|
71
|
-
* @param {jwt.Jwt} token The token to validate.
|
|
72
|
-
* @param { string | undefined } requiredScope If provided, the token will only be considered valid if issued for this scope.
|
|
73
|
-
* @returns {boolean} True if the claims validation passed.
|
|
74
|
-
*/
|
|
75
|
-
validateAccessTokenClaims(logger, token, requiredScope) {
|
|
76
|
-
const payload = this.getTokenPayload(token);
|
|
77
|
-
if (!payload) {
|
|
78
|
-
logger.error('Invalid token payload.');
|
|
79
|
-
return false;
|
|
80
|
-
}
|
|
81
|
-
// validate iat (issued at) and exp (expiration) fields.
|
|
82
|
-
// these are expressed as number of seconds since Unix epoch.
|
|
83
|
-
const now = Math.round(new Date().getTime() / 1000.0);
|
|
84
|
-
const checkTimestamp = payload.iat && payload.iat <= now && payload.exp && payload.exp >= now;
|
|
85
|
-
if (!checkTimestamp) {
|
|
86
|
-
logger.error('The token is expired or not yet valid.');
|
|
87
|
-
return false;
|
|
88
|
-
}
|
|
89
|
-
// validate audience
|
|
90
|
-
const checkAudience = payload.aud === this.clientId || payload.aud === `api://${this.clientId}`;
|
|
91
|
-
if (!checkAudience) {
|
|
92
|
-
logger.error('The token is not issued for the expected audience.');
|
|
93
|
-
return false;
|
|
94
|
-
}
|
|
95
|
-
const tokenIssuer = payload.iss;
|
|
96
|
-
if (!tokenIssuer) {
|
|
97
|
-
logger.error('Invalid token issuer.');
|
|
98
|
-
return false;
|
|
99
|
-
}
|
|
100
|
-
// validate token issuer
|
|
101
|
-
// - if this is a single-tenant application, validate that the token is issued by the expected tenant
|
|
102
|
-
// - if this is a multi-tenant application that only allows sign-in from specific tenants, validate that
|
|
103
|
-
// the token is issued by one of those
|
|
104
|
-
// - if this is a multi-tenant that does not limit sign-in to specific tenants, any issuer is considered valid.
|
|
105
|
-
const checkIssuer = !this.validIssuerTenantIds.length ||
|
|
106
|
-
this.validIssuerTenantIds.some((tenantId) => tokenIssuer.startsWith(`https://login.microsoftonline.com/${tenantId}/`));
|
|
107
|
-
if (!checkIssuer) {
|
|
108
|
-
logger.error(`The token is issued by unexpected tenant: ${payload.iss}`);
|
|
109
|
-
return false;
|
|
110
|
-
}
|
|
111
|
-
// validate that the token is issued for the required scope
|
|
112
|
-
const checkRequiredScope = !requiredScope || payload.scp?.includes(requiredScope);
|
|
113
|
-
if (!checkRequiredScope) {
|
|
114
|
-
logger.error(`The token is not issued for the required scope: ${requiredScope}`);
|
|
115
|
-
return false;
|
|
116
|
-
}
|
|
117
|
-
// all checks passed
|
|
118
|
-
return true;
|
|
119
|
-
}
|
|
120
|
-
/**
|
|
121
|
-
* Decodes an access token without verifying if the signature is valid.
|
|
122
|
-
* @param {ILogger} logger The logger to use.
|
|
123
|
-
* @param {string} rawAccessToken the raw access token.
|
|
124
|
-
* @returns {jwt.JWT | null} A decoded token if the raw access token is well formed.
|
|
125
|
-
*/
|
|
126
|
-
decodeToken(logger, rawAccessToken) {
|
|
127
|
-
try {
|
|
128
|
-
return jsonwebtoken_1.default.decode(rawAccessToken, { complete: true });
|
|
129
|
-
}
|
|
130
|
-
catch (error) {
|
|
131
|
-
logger.error(error);
|
|
132
|
-
return null;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* Gets the public key from the key identifier in a token header
|
|
137
|
-
* @param {ILogger} logger The logger to use.
|
|
138
|
-
* @param {jwt.JwtHeader} header the token header
|
|
139
|
-
* @returns {Promise<string | undefined>} the public key corresponding to the header key identifier, if available
|
|
140
|
-
*/
|
|
141
|
-
async getPublicKey(logger, header) {
|
|
142
|
-
try {
|
|
143
|
-
const signingKey = await this.keyClient.getSigningKey(header.kid);
|
|
144
|
-
return signingKey.getPublicKey() ?? null;
|
|
145
|
-
}
|
|
146
|
-
catch (error) {
|
|
147
|
-
logger.error(error);
|
|
148
|
-
return null;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
/**
|
|
152
|
-
* Decodes the access token and verifies it against the public key
|
|
153
|
-
* @param {ILogger} logger The logger to use.
|
|
154
|
-
* @param {string} rawAccessToken the raw access token.
|
|
155
|
-
* @param {string} publicKey the public key to verify signature against.
|
|
156
|
-
* @returns {Promise<jwt.JWT | null>} A decoded token if the raw token is well formed and the signature is valid.
|
|
157
|
-
*/
|
|
158
|
-
validateTokenSignature(logger, rawAccessToken, publicKey) {
|
|
159
|
-
try {
|
|
160
|
-
return jsonwebtoken_1.default.verify(rawAccessToken, publicKey, { complete: true });
|
|
161
|
-
}
|
|
162
|
-
catch (error) {
|
|
163
|
-
logger.error(error);
|
|
164
|
-
return null;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
exports.EntraTokenValidator = EntraTokenValidator;
|
|
169
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50cmEtdG9rZW4tdmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZGRsZXdhcmUvZW50cmEtdG9rZW4tdmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLGdFQUFvRDtBQUNwRCx3REFBa0Q7QUF5QjNDLE1BQU0sYUFBYSxHQUFHLENBQUMsT0FBMkIsRUFBYyxFQUFFLENBQUMsSUFBQSxrQkFBVSxFQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQWpGLFFBQUEsYUFBYSxpQkFBb0U7QUFFOUY7O0dBRUc7QUFDSCxNQUFhLG1CQUFtQjtJQUNyQixRQUFRLENBQVM7SUFDakIsUUFBUSxDQUFTO0lBQ2pCLG9CQUFvQixDQUFXO0lBQ2hDLFNBQVMsQ0FBYTtJQUU5QixZQUFZLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQTZCO1FBQ3BFLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDO1FBRXpCLDJFQUEyRTtRQUMzRSwwRUFBMEU7UUFDMUUsMkVBQTJFO1FBQzNFLE1BQU0sYUFBYSxHQUFHLENBQUMsUUFBUSxFQUFFLGVBQWUsRUFBRSxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLFFBQVEsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUMvRixJQUFJLENBQUMsb0JBQW9CLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU5RixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUEscUJBQWEsRUFBQztZQUM3QixPQUFPLEVBQUUscUNBQXFDLFFBQVEsc0JBQXNCO1NBQzdFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFL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
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import express from 'express';
|
|
2
|
-
import { Credentials } from '@microsoft/teams.api';
|
|
3
|
-
import { ILogger } from '@microsoft/teams.common';
|
|
4
|
-
import { IClientContext } from '../contexts';
|
|
5
|
-
import { EntraTokenValidator } from './entra-token-validator';
|
|
6
|
-
export type WithClientAuthParams = Partial<Credentials> & {
|
|
7
|
-
entraTokenValidator?: Pick<EntraTokenValidator, 'validateAccessToken' | 'getTokenPayload'>;
|
|
8
|
-
readonly logger: ILogger;
|
|
9
|
-
};
|
|
10
|
-
export type ClientAuthRequest = express.Request & {
|
|
11
|
-
context?: IClientContext;
|
|
12
|
-
};
|
|
13
|
-
export declare function withClientAuth(params: WithClientAuthParams): (req: ClientAuthRequest, res: express.Response, next: express.NextFunction) => Promise<void>;
|