@microsoft/teams.apps 0.2.7
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 +35 -0
- package/dist/api.d.ts +21 -0
- package/dist/api.js +66 -0
- package/dist/app.d.ts +1137 -0
- package/dist/app.embed.d.ts +24 -0
- package/dist/app.embed.js +83 -0
- package/dist/app.events.d.ts +14 -0
- package/dist/app.events.js +51 -0
- package/dist/app.js +411 -0
- package/dist/app.oauth.d.ts +13 -0
- package/dist/app.oauth.js +106 -0
- package/dist/app.plugins.d.ts +24 -0
- package/dist/app.plugins.js +96 -0
- package/dist/app.process.d.ts +11 -0
- package/dist/app.process.js +141 -0
- package/dist/app.routing.d.ts +22 -0
- package/dist/app.routing.js +40 -0
- package/dist/container/container.d.ts +37 -0
- package/dist/container/container.js +46 -0
- package/dist/container/index.d.ts +2 -0
- package/dist/container/index.js +19 -0
- package/dist/container/provider.d.ts +9 -0
- package/dist/container/provider.js +11 -0
- package/dist/contexts/activity-error.d.ts +8 -0
- package/dist/contexts/activity-error.js +3 -0
- package/dist/contexts/activity-signin.d.ts +8 -0
- package/dist/contexts/activity-signin.js +3 -0
- package/dist/contexts/activity.d.ts +117 -0
- package/dist/contexts/activity.js +133 -0
- package/dist/contexts/client.d.ts +53 -0
- package/dist/contexts/client.js +3 -0
- package/dist/contexts/function.d.ts +17 -0
- package/dist/contexts/function.js +3 -0
- package/dist/contexts/index.d.ts +5 -0
- package/dist/contexts/index.js +22 -0
- package/dist/events/activity-response.d.ts +16 -0
- package/dist/events/activity-response.js +3 -0
- package/dist/events/activity-sent.d.ts +16 -0
- package/dist/events/activity-sent.js +3 -0
- package/dist/events/activity.d.ts +20 -0
- package/dist/events/activity.js +3 -0
- package/dist/events/error.d.ts +16 -0
- package/dist/events/error.js +3 -0
- package/dist/events/index.d.ts +18 -0
- package/dist/events/index.js +21 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +47 -0
- package/dist/manifest.d.ts +1241 -0
- package/dist/manifest.js +3 -0
- package/dist/middleware/entra-token-validator.d.ts +75 -0
- package/dist/middleware/entra-token-validator.js +169 -0
- package/dist/middleware/index.d.ts +3 -0
- package/dist/middleware/index.js +22 -0
- package/dist/middleware/strip-mentions-text.d.ts +3 -0
- package/dist/middleware/strip-mentions-text.js +48 -0
- package/dist/middleware/with-client-auth.d.ts +13 -0
- package/dist/middleware/with-client-auth.js +40 -0
- package/dist/oauth.d.ts +9 -0
- package/dist/oauth.js +7 -0
- package/dist/plugins/http/index.d.ts +2 -0
- package/dist/plugins/http/index.js +19 -0
- package/dist/plugins/http/plugin.d.ts +986 -0
- package/dist/plugins/http/plugin.js +238 -0
- package/dist/plugins/http/stream.d.ts +956 -0
- package/dist/plugins/http/stream.js +128 -0
- package/dist/plugins/index.d.ts +1 -0
- package/dist/plugins/index.js +18 -0
- package/dist/router.d.ts +34 -0
- package/dist/router.js +91 -0
- package/dist/routes/activity.d.ts +8 -0
- package/dist/routes/activity.js +3 -0
- package/dist/routes/conversation-update.d.ts +6 -0
- package/dist/routes/conversation-update.js +3 -0
- package/dist/routes/event.d.ts +17 -0
- package/dist/routes/event.js +11 -0
- package/dist/routes/index.d.ts +20 -0
- package/dist/routes/index.js +24 -0
- package/dist/routes/install.d.ts +8 -0
- package/dist/routes/install.js +3 -0
- package/dist/routes/invoke/file-consent.d.ts +6 -0
- package/dist/routes/invoke/file-consent.js +3 -0
- package/dist/routes/invoke/index.d.ts +39 -0
- package/dist/routes/invoke/index.js +45 -0
- package/dist/routes/invoke/message-extension-submit.d.ts +6 -0
- package/dist/routes/invoke/message-extension-submit.js +3 -0
- package/dist/routes/invoke/message-submit.d.ts +10 -0
- package/dist/routes/invoke/message-submit.js +3 -0
- package/dist/routes/message-delete.d.ts +6 -0
- package/dist/routes/message-delete.js +3 -0
- package/dist/routes/message-update.d.ts +6 -0
- package/dist/routes/message-update.js +3 -0
- package/dist/types/constructor.d.ts +7 -0
- package/dist/types/constructor.js +3 -0
- package/dist/types/event-handler.d.ts +1 -0
- package/dist/types/event-handler.js +3 -0
- package/dist/types/event.d.ts +11 -0
- package/dist/types/event.js +3 -0
- package/dist/types/index.d.ts +7 -0
- package/dist/types/index.js +24 -0
- package/dist/types/plugin/decorators/dependency.d.ts +135 -0
- package/dist/types/plugin/decorators/dependency.js +49 -0
- package/dist/types/plugin/decorators/event.d.ts +18 -0
- package/dist/types/plugin/decorators/event.js +24 -0
- package/dist/types/plugin/decorators/index.d.ts +3 -0
- package/dist/types/plugin/decorators/index.js +12 -0
- package/dist/types/plugin/decorators/plugin.d.ts +25 -0
- package/dist/types/plugin/decorators/plugin.js +23 -0
- package/dist/types/plugin/index.d.ts +8 -0
- package/dist/types/plugin/index.js +25 -0
- package/dist/types/plugin/plugin-activity-event.d.ts +20 -0
- package/dist/types/plugin/plugin-activity-event.js +3 -0
- package/dist/types/plugin/plugin-activity-response-event.d.ts +20 -0
- package/dist/types/plugin/plugin-activity-response-event.js +3 -0
- package/dist/types/plugin/plugin-activity-sent-event.d.ts +16 -0
- package/dist/types/plugin/plugin-activity-sent-event.js +3 -0
- package/dist/types/plugin/plugin-error-event.d.ts +20 -0
- package/dist/types/plugin/plugin-error-event.js +3 -0
- package/dist/types/plugin/plugin-start-event.d.ts +11 -0
- package/dist/types/plugin/plugin-start-event.js +3 -0
- package/dist/types/plugin/plugin.d.ts +74 -0
- package/dist/types/plugin/plugin.js +3 -0
- package/dist/types/plugin/sender.d.ts +18 -0
- package/dist/types/plugin/sender.js +3 -0
- package/dist/types/prefixed.d.ts +3 -0
- package/dist/types/prefixed.js +3 -0
- package/dist/types/route-handler.d.ts +2 -0
- package/dist/types/route-handler.js +3 -0
- package/dist/types/streamer.d.ts +31 -0
- package/dist/types/streamer.js +3 -0
- package/dist/types/suffixed.d.ts +3 -0
- package/dist/types/suffixed.js +3 -0
- package/package.json +70 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { App } from './app';
|
|
2
|
+
import { IFunctionContext } from './contexts';
|
|
3
|
+
import * as manifest from './manifest';
|
|
4
|
+
/**
|
|
5
|
+
* add/update a function that can be called remotely
|
|
6
|
+
* @param name The unique function name
|
|
7
|
+
* @param cb The callback to handle the function
|
|
8
|
+
*/
|
|
9
|
+
export declare function func<TData>(this: App, name: string, cb: (context: IFunctionContext<TData>) => any | Promise<any>): App;
|
|
10
|
+
/**
|
|
11
|
+
* add/update a static tab.
|
|
12
|
+
* the tab will be hosted at
|
|
13
|
+
* `http://localhost:{{PORT}}/tabs/{{name}}` or `https://{{BOT_DOMAIN}}/tabs/{{name}}`
|
|
14
|
+
* @remark scopes default to `personal`
|
|
15
|
+
* @param name A unique identifier for the entity which the tab displays.
|
|
16
|
+
* @param path The path to the web `dist` folder.
|
|
17
|
+
*/
|
|
18
|
+
export declare function tab(this: App, name: string, path: string, options?: Partial<Omit<manifest.StaticTab, 'contentUrl' | 'entityId'>>): App;
|
|
19
|
+
/**
|
|
20
|
+
* add a configurable tab
|
|
21
|
+
* @remark scopes defaults to `team`
|
|
22
|
+
* @param url The url to use when configuring the tab.
|
|
23
|
+
*/
|
|
24
|
+
export declare function configTab(this: App, url: string, options?: Partial<Omit<manifest.ConfigurableTab, 'configurationUrl'>>): App;
|
|
@@ -0,0 +1,83 @@
|
|
|
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.func = func;
|
|
7
|
+
exports.tab = tab;
|
|
8
|
+
exports.configTab = configTab;
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
const middleware_1 = require("./middleware");
|
|
11
|
+
/**
|
|
12
|
+
* add/update a function that can be called remotely
|
|
13
|
+
* @param name The unique function name
|
|
14
|
+
* @param cb The callback to handle the function
|
|
15
|
+
*/
|
|
16
|
+
function func(name, cb) {
|
|
17
|
+
const log = this.log.child('functions').child(name);
|
|
18
|
+
this.http.post(`/api/functions/${name}`, (0, middleware_1.withClientAuth)({
|
|
19
|
+
logger: log,
|
|
20
|
+
entraTokenValidator: this.entraTokenValidator,
|
|
21
|
+
...this.credentials,
|
|
22
|
+
}), async (req, res) => {
|
|
23
|
+
if (!req.context) {
|
|
24
|
+
throw new Error('expected client context');
|
|
25
|
+
}
|
|
26
|
+
const data = await cb({
|
|
27
|
+
...req.context,
|
|
28
|
+
log,
|
|
29
|
+
api: this.api,
|
|
30
|
+
data: req.body,
|
|
31
|
+
});
|
|
32
|
+
res.send(data);
|
|
33
|
+
});
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* add/update a static tab.
|
|
38
|
+
* the tab will be hosted at
|
|
39
|
+
* `http://localhost:{{PORT}}/tabs/{{name}}` or `https://{{BOT_DOMAIN}}/tabs/{{name}}`
|
|
40
|
+
* @remark scopes default to `personal`
|
|
41
|
+
* @param name A unique identifier for the entity which the tab displays.
|
|
42
|
+
* @param path The path to the web `dist` folder.
|
|
43
|
+
*/
|
|
44
|
+
function tab(name, path, options) {
|
|
45
|
+
if (!this._manifest.staticTabs) {
|
|
46
|
+
this._manifest.staticTabs = [];
|
|
47
|
+
}
|
|
48
|
+
const i = this._manifest.staticTabs.findIndex((t) => t.entityId === name);
|
|
49
|
+
const tab = {
|
|
50
|
+
entityId: name,
|
|
51
|
+
contentUrl: `https://\${{BOT_DOMAIN}}/tabs/${name}`,
|
|
52
|
+
scopes: ['personal'],
|
|
53
|
+
...options,
|
|
54
|
+
};
|
|
55
|
+
if (i > -1) {
|
|
56
|
+
this._manifest.staticTabs[i] = tab;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
this._manifest.staticTabs.push(tab);
|
|
60
|
+
}
|
|
61
|
+
this.http.static(`/tabs/${name}`, path);
|
|
62
|
+
this.http.use(`/tabs/${name}*`, async (_, res) => {
|
|
63
|
+
res.sendFile(path_1.default.join(path, 'index.html'));
|
|
64
|
+
});
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* add a configurable tab
|
|
69
|
+
* @remark scopes defaults to `team`
|
|
70
|
+
* @param url The url to use when configuring the tab.
|
|
71
|
+
*/
|
|
72
|
+
function configTab(url, options) {
|
|
73
|
+
if (!this._manifest.configurableTabs) {
|
|
74
|
+
this._manifest.configurableTabs = [];
|
|
75
|
+
}
|
|
76
|
+
this._manifest.configurableTabs.push({
|
|
77
|
+
configurationUrl: url,
|
|
78
|
+
scopes: ['team'],
|
|
79
|
+
...options,
|
|
80
|
+
});
|
|
81
|
+
return this;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmVtYmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwcC5lbWJlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQVlBLG9CQThCQztBQVVELGtCQThCQztBQU9ELDhCQWdCQztBQXpHRCxnREFBeUI7QUFJekIsNkNBQWlFO0FBR2pFOzs7O0dBSUc7QUFDSCxTQUFnQixJQUFJLENBRWxCLElBQVksRUFDWixFQUE0RDtJQUU1RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osa0JBQWtCLElBQUksRUFBRSxFQUN4QixJQUFBLDJCQUFjLEVBQUM7UUFDYixNQUFNLEVBQUUsR0FBRztRQUNYLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUI7UUFDN0MsR0FBRyxJQUFJLENBQUMsV0FBVztLQUNwQixDQUFDLEVBQ0YsS0FBSyxFQUFFLEdBQXNCLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLEdBQUcsR0FBRyxDQUFDLE9BQU87WUFDZCxHQUFHO1lBQ0gsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO1NBQ2YsQ0FBQyxDQUFDO1FBRUgsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNqQixDQUFDLENBQ0YsQ0FBQztJQUVGLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixHQUFHLENBRWpCLElBQVksRUFDWixJQUFZLEVBQ1osT0FBc0U7SUFFdEUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLENBQUM7SUFDMUUsTUFBTSxHQUFHLEdBQXVCO1FBQzlCLFFBQVEsRUFBRSxJQUFJO1FBQ2QsVUFBVSxFQUFFLGlDQUFpQyxJQUFJLEVBQUU7UUFDbkQsTUFBTSxFQUFFLENBQUMsVUFBVSxDQUFDO1FBQ3BCLEdBQUcsT0FBTztLQUNYLENBQUM7SUFFRixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ3JDLENBQUM7U0FBTSxDQUFDO1FBQ04sSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7SUFFRCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsSUFBSSxHQUFHLEVBQUUsS0FBSyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUMvQyxHQUFHLENBQUMsUUFBUSxDQUFDLGNBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsU0FBUyxDQUV2QixHQUFXLEVBQ1gsT0FBcUU7SUFFckUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNyQyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUM7UUFDbkMsZ0JBQWdCLEVBQUUsR0FBRztRQUNyQixNQUFNLEVBQUUsQ0FBQyxNQUFNLENBQUM7UUFDaEIsR0FBRyxPQUFPO0tBQ1gsQ0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIn0=
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { EventHandler } from '@microsoft/teams.common';
|
|
2
|
+
import { App } from './app';
|
|
3
|
+
import { ISender } from './types';
|
|
4
|
+
import { IActivityEvent, IActivityResponseEvent, IActivitySentEvent, IErrorEvent, IEvents } from './events';
|
|
5
|
+
/**
|
|
6
|
+
* subscribe to an event
|
|
7
|
+
* @param name the event to subscribe to
|
|
8
|
+
* @param cb the callback to invoke
|
|
9
|
+
*/
|
|
10
|
+
export declare function event<Name extends keyof IEvents>(this: App, name: Name, cb: EventHandler<IEvents[Name]>): App;
|
|
11
|
+
export declare function onError(this: App, event: IErrorEvent): Promise<void>;
|
|
12
|
+
export declare function onActivity(this: App, sender: ISender, event: IActivityEvent): Promise<void>;
|
|
13
|
+
export declare function onActivitySent(this: App, sender: ISender, event: IActivitySentEvent): Promise<void>;
|
|
14
|
+
export declare function onActivityResponse(this: App, sender: ISender, event: IActivityResponseEvent): Promise<void>;
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.event = event;
|
|
4
|
+
exports.onError = onError;
|
|
5
|
+
exports.onActivity = onActivity;
|
|
6
|
+
exports.onActivitySent = onActivitySent;
|
|
7
|
+
exports.onActivityResponse = onActivityResponse;
|
|
8
|
+
/**
|
|
9
|
+
* subscribe to an event
|
|
10
|
+
* @param name the event to subscribe to
|
|
11
|
+
* @param cb the callback to invoke
|
|
12
|
+
*/
|
|
13
|
+
function event(name, cb) {
|
|
14
|
+
this.events.on(name, cb);
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
async function onError(event) {
|
|
18
|
+
for (const plugin of this.plugins) {
|
|
19
|
+
if (plugin.onError) {
|
|
20
|
+
await plugin.onError(event);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
this.events.emit('error', event);
|
|
24
|
+
}
|
|
25
|
+
async function onActivity(sender, event) {
|
|
26
|
+
this.events.emit('activity', event);
|
|
27
|
+
await this.process(sender, { ...event, sender });
|
|
28
|
+
}
|
|
29
|
+
async function onActivitySent(sender, event) {
|
|
30
|
+
for (const plugin of this.plugins) {
|
|
31
|
+
if (plugin.onActivitySent) {
|
|
32
|
+
await plugin.onActivitySent({
|
|
33
|
+
...event,
|
|
34
|
+
sender,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
this.events.emit('activity.sent', { ...event, sender });
|
|
39
|
+
}
|
|
40
|
+
async function onActivityResponse(sender, event) {
|
|
41
|
+
for (const plugin of this.plugins) {
|
|
42
|
+
if (plugin.onActivityResponse) {
|
|
43
|
+
await plugin.onActivityResponse({
|
|
44
|
+
...event,
|
|
45
|
+
sender,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
this.events.emit('activity.response', { ...event, sender });
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmV2ZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9hcHAuZXZlbnRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBaUJBLHNCQU9DO0FBRUQsMEJBUUM7QUFFRCxnQ0FHQztBQUVELHdDQVdDO0FBRUQsZ0RBZUM7QUF6REQ7Ozs7R0FJRztBQUNILFNBQWdCLEtBQUssQ0FFbkIsSUFBVSxFQUNWLEVBQStCO0lBRS9CLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6QixPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFTSxLQUFLLFVBQVUsT0FBTyxDQUFZLEtBQWtCO0lBQ3pELEtBQUssTUFBTSxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ2xDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ25CLE1BQU0sTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixDQUFDO0lBQ0gsQ0FBQztJQUVELElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRU0sS0FBSyxVQUFVLFVBQVUsQ0FBWSxNQUFlLEVBQUUsS0FBcUI7SUFDaEYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFTSxLQUFLLFVBQVUsY0FBYyxDQUFZLE1BQWUsRUFBRSxLQUF5QjtJQUN4RixLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQyxJQUFJLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMxQixNQUFNLE1BQU0sQ0FBQyxjQUFjLENBQUM7Z0JBQzFCLEdBQUcsS0FBSztnQkFDUixNQUFNO2FBQ1AsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFTSxLQUFLLFVBQVUsa0JBQWtCLENBRXRDLE1BQWUsRUFDZixLQUE2QjtJQUU3QixLQUFLLE1BQU0sTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNsQyxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzlCLE1BQU0sTUFBTSxDQUFDLGtCQUFrQixDQUFDO2dCQUM5QixHQUFHLEtBQUs7Z0JBQ1IsTUFBTTthQUNQLENBQUMsQ0FBQztRQUNMLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO0FBQzlELENBQUMifQ==
|
package/dist/app.js
ADDED
|
@@ -0,0 +1,411 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.App = exports.REFRESH_TOKEN_BUFFER_MS = void 0;
|
|
40
|
+
const events_1 = require("@microsoft/teams.common/events");
|
|
41
|
+
const http = __importStar(require("@microsoft/teams.common/http"));
|
|
42
|
+
const logging_1 = require("@microsoft/teams.common/logging");
|
|
43
|
+
const storage_1 = require("@microsoft/teams.common/storage");
|
|
44
|
+
const axios_1 = require("axios");
|
|
45
|
+
const teams_api_1 = require("@microsoft/teams.api");
|
|
46
|
+
const package_json_1 = __importDefault(require("../package.json"));
|
|
47
|
+
const api_1 = require("./api");
|
|
48
|
+
const middleware = __importStar(require("./middleware"));
|
|
49
|
+
const oauth_1 = require("./oauth");
|
|
50
|
+
const plugins_1 = require("./plugins");
|
|
51
|
+
const router_1 = require("./router");
|
|
52
|
+
const app_embed_1 = require("./app.embed");
|
|
53
|
+
const app_events_1 = require("./app.events");
|
|
54
|
+
const app_oauth_1 = require("./app.oauth");
|
|
55
|
+
const app_plugins_1 = require("./app.plugins");
|
|
56
|
+
const app_process_1 = require("./app.process");
|
|
57
|
+
const app_routing_1 = require("./app.routing");
|
|
58
|
+
const container_1 = require("./container");
|
|
59
|
+
exports.REFRESH_TOKEN_BUFFER_MS = 1000 * 60 * 5; // 5 minutes
|
|
60
|
+
/**
|
|
61
|
+
* The orchestrator for receiving/sending activities
|
|
62
|
+
*/
|
|
63
|
+
class App {
|
|
64
|
+
options;
|
|
65
|
+
api;
|
|
66
|
+
log;
|
|
67
|
+
http;
|
|
68
|
+
client;
|
|
69
|
+
storage;
|
|
70
|
+
credentials;
|
|
71
|
+
entraTokenValidator;
|
|
72
|
+
/**
|
|
73
|
+
* the apps id
|
|
74
|
+
*/
|
|
75
|
+
get id() {
|
|
76
|
+
return this.tokens.bot?.appId || this.tokens.graph?.appId;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* the apps name
|
|
80
|
+
*/
|
|
81
|
+
get name() {
|
|
82
|
+
return this.tokens.bot?.appDisplayName || this.tokens.graph?.appDisplayName;
|
|
83
|
+
}
|
|
84
|
+
get oauth() {
|
|
85
|
+
return {
|
|
86
|
+
...this.options.oauth,
|
|
87
|
+
...oauth_1.DEFAULT_OAUTH_SETTINGS,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* the apps manifest
|
|
92
|
+
*/
|
|
93
|
+
get manifest() {
|
|
94
|
+
return {
|
|
95
|
+
id: this.id,
|
|
96
|
+
name: {
|
|
97
|
+
short: this.name || '??',
|
|
98
|
+
full: this.name || '??',
|
|
99
|
+
...this._manifest.name,
|
|
100
|
+
},
|
|
101
|
+
bots: [
|
|
102
|
+
{
|
|
103
|
+
botId: this.id || '??',
|
|
104
|
+
scopes: ['personal'],
|
|
105
|
+
},
|
|
106
|
+
],
|
|
107
|
+
webApplicationInfo: {
|
|
108
|
+
id: this.credentials?.clientId || '??',
|
|
109
|
+
resource: `api://\${{BOT_DOMAIN}}/${this.credentials?.clientId || '??'}`,
|
|
110
|
+
...this._manifest.webApplicationInfo,
|
|
111
|
+
},
|
|
112
|
+
...this._manifest,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
_manifest;
|
|
116
|
+
/**
|
|
117
|
+
* the apps auth tokens
|
|
118
|
+
*/
|
|
119
|
+
get tokens() {
|
|
120
|
+
return this._tokens;
|
|
121
|
+
}
|
|
122
|
+
_tokens = {};
|
|
123
|
+
container = new container_1.Container();
|
|
124
|
+
plugins = [];
|
|
125
|
+
router = new router_1.Router();
|
|
126
|
+
tenantTokens = new storage_1.LocalStorage({}, { max: 20000 });
|
|
127
|
+
events = new events_1.EventEmitter();
|
|
128
|
+
startedAt;
|
|
129
|
+
port;
|
|
130
|
+
_userAgent = `teams[apps]/${package_json_1.default.version}`;
|
|
131
|
+
constructor(options = {}) {
|
|
132
|
+
this.options = options;
|
|
133
|
+
this.log = this.options.logger || new logging_1.ConsoleLogger('@teams/app');
|
|
134
|
+
this.storage = this.options.storage || new storage_1.LocalStorage();
|
|
135
|
+
this._manifest = this.options.manifest || {};
|
|
136
|
+
if (!options.client) {
|
|
137
|
+
this.client = new http.Client({
|
|
138
|
+
headers: {
|
|
139
|
+
'User-Agent': this._userAgent,
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
else if (typeof options.client === 'function') {
|
|
144
|
+
this.client = options.client().clone({
|
|
145
|
+
headers: {
|
|
146
|
+
'User-Agent': this._userAgent,
|
|
147
|
+
},
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
else if ('request' in options.client) {
|
|
151
|
+
this.client = options.client.clone({
|
|
152
|
+
headers: {
|
|
153
|
+
'User-Agent': this._userAgent,
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
this.client = new http.Client({
|
|
159
|
+
...options.client,
|
|
160
|
+
headers: {
|
|
161
|
+
...options.client.headers,
|
|
162
|
+
'User-Agent': this._userAgent,
|
|
163
|
+
},
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
this.api = new api_1.AppClient('https://smba.trafficmanager.net/teams', this.client.clone({ token: () => this._tokens.bot }), this.client.clone({ token: () => this._tokens.graph }));
|
|
167
|
+
// initialize credentials
|
|
168
|
+
const clientId = this.options.clientId || process.env.CLIENT_ID;
|
|
169
|
+
const clientSecret = ('clientSecret' in this.options ? this.options.clientSecret : undefined) ||
|
|
170
|
+
process.env.CLIENT_SECRET;
|
|
171
|
+
const tenantId = ('tenantId' in this.options ? this.options.tenantId : undefined) || process.env.TENANT_ID;
|
|
172
|
+
const token = 'token' in this.options ? this.options.token : undefined;
|
|
173
|
+
if (clientId && clientSecret) {
|
|
174
|
+
this.credentials = {
|
|
175
|
+
clientId,
|
|
176
|
+
clientSecret,
|
|
177
|
+
tenantId,
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
if (clientId && token) {
|
|
181
|
+
this.credentials = {
|
|
182
|
+
clientId,
|
|
183
|
+
tenantId,
|
|
184
|
+
token,
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
if (clientId) {
|
|
188
|
+
this.entraTokenValidator = new middleware.EntraTokenValidator({
|
|
189
|
+
clientId,
|
|
190
|
+
tenantId: tenantId || 'common',
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
// add/validate plugins
|
|
194
|
+
const plugins = this.options.plugins || [];
|
|
195
|
+
let httpPlugin = plugins.find((p) => {
|
|
196
|
+
const meta = (0, app_plugins_1.getMetadata)(p);
|
|
197
|
+
return meta.name === 'http';
|
|
198
|
+
});
|
|
199
|
+
if (!httpPlugin) {
|
|
200
|
+
httpPlugin = new plugins_1.HttpPlugin();
|
|
201
|
+
plugins.unshift(httpPlugin);
|
|
202
|
+
}
|
|
203
|
+
this.http = httpPlugin;
|
|
204
|
+
// add injectable items to container
|
|
205
|
+
this.container.register('id', { useValue: this.id });
|
|
206
|
+
this.container.register('name', { useValue: this.name });
|
|
207
|
+
this.container.register('manifest', { useValue: this.manifest });
|
|
208
|
+
this.container.register('credentials', { useValue: this.credentials });
|
|
209
|
+
this.container.register('botToken', { useFactory: () => this.tokens.bot });
|
|
210
|
+
this.container.register('graphToken', { useFactory: () => this.tokens.graph });
|
|
211
|
+
this.container.register('ILogger', { useValue: this.log });
|
|
212
|
+
this.container.register('IStorage', { useValue: this.storage });
|
|
213
|
+
this.container.register(this.client.constructor.name, { useFactory: () => this.client });
|
|
214
|
+
for (const plugin of plugins) {
|
|
215
|
+
this.plugin(plugin);
|
|
216
|
+
}
|
|
217
|
+
if (this.options.activity?.mentions?.stripText) {
|
|
218
|
+
const options = this.options.activity?.mentions?.stripText;
|
|
219
|
+
this.use(middleware.stripMentionsText(typeof options === 'boolean' ? {} : options));
|
|
220
|
+
}
|
|
221
|
+
// default event handlers
|
|
222
|
+
this.on('signin.token-exchange', this.onTokenExchange.bind(this));
|
|
223
|
+
this.on('signin.verify-state', this.onVerifyState.bind(this));
|
|
224
|
+
this.event('error', ({ error }) => {
|
|
225
|
+
this.log.error(error.message);
|
|
226
|
+
if (error instanceof axios_1.AxiosError) {
|
|
227
|
+
this.log.error(error.request.path);
|
|
228
|
+
this.log.error(error.response?.data);
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* start the app
|
|
234
|
+
* @param port port to listen on
|
|
235
|
+
*/
|
|
236
|
+
async start(port) {
|
|
237
|
+
this.port = +(port || process.env.PORT || 3000);
|
|
238
|
+
try {
|
|
239
|
+
await this.refreshTokens();
|
|
240
|
+
// initialize plugins
|
|
241
|
+
for (const plugin of this.plugins) {
|
|
242
|
+
// inject dependencies
|
|
243
|
+
this.inject(plugin);
|
|
244
|
+
if (plugin.onInit) {
|
|
245
|
+
plugin.onInit();
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
// start plugins
|
|
249
|
+
for (const plugin of this.plugins) {
|
|
250
|
+
if (plugin.onStart) {
|
|
251
|
+
await plugin.onStart({ port: this.port });
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
this.events.emit('start', this.log);
|
|
255
|
+
this.startedAt = new Date();
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
this.onError({ error });
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
/**
|
|
262
|
+
* stop the app
|
|
263
|
+
*/
|
|
264
|
+
async stop() {
|
|
265
|
+
try {
|
|
266
|
+
for (const plugin of this.plugins) {
|
|
267
|
+
if (plugin.onStop) {
|
|
268
|
+
await plugin.onStop();
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
this.onError({ error });
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* send an activity proactively
|
|
278
|
+
* @param conversationId the conversation to send to
|
|
279
|
+
* @param activity the activity to send
|
|
280
|
+
*/
|
|
281
|
+
async send(conversationId, activity) {
|
|
282
|
+
if (!this.id || !this.name) {
|
|
283
|
+
throw new Error('app not started');
|
|
284
|
+
}
|
|
285
|
+
const ref = {
|
|
286
|
+
channelId: 'msteams',
|
|
287
|
+
serviceUrl: this.api.serviceUrl,
|
|
288
|
+
bot: {
|
|
289
|
+
id: this.id,
|
|
290
|
+
name: this.name,
|
|
291
|
+
role: 'bot',
|
|
292
|
+
},
|
|
293
|
+
conversation: {
|
|
294
|
+
id: conversationId,
|
|
295
|
+
conversationType: 'personal',
|
|
296
|
+
},
|
|
297
|
+
};
|
|
298
|
+
const res = await this.http.send((0, teams_api_1.toActivityParams)(activity), ref);
|
|
299
|
+
return res;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* subscribe to an event
|
|
303
|
+
* @param name event to subscribe to
|
|
304
|
+
* @param cb callback to invoke
|
|
305
|
+
*/
|
|
306
|
+
on = app_routing_1.on;
|
|
307
|
+
/**
|
|
308
|
+
* subscribe to a message event for a specific pattern
|
|
309
|
+
* @param pattern pattern to match against message text
|
|
310
|
+
* @param cb callback to invoke
|
|
311
|
+
*/
|
|
312
|
+
message = app_routing_1.message;
|
|
313
|
+
/**
|
|
314
|
+
* register a middleware
|
|
315
|
+
* @param cb callback to invoke
|
|
316
|
+
*/
|
|
317
|
+
use = app_routing_1.use;
|
|
318
|
+
/**
|
|
319
|
+
* subscribe to an event
|
|
320
|
+
* @param name the event to subscribe to
|
|
321
|
+
* @param cb the callback to invoke
|
|
322
|
+
*/
|
|
323
|
+
event = app_events_1.event;
|
|
324
|
+
/**
|
|
325
|
+
* add a plugin
|
|
326
|
+
* @param plugin plugin to add
|
|
327
|
+
*/
|
|
328
|
+
plugin = app_plugins_1.plugin;
|
|
329
|
+
/**
|
|
330
|
+
* get a plugin
|
|
331
|
+
*/
|
|
332
|
+
getPlugin = app_plugins_1.getPlugin;
|
|
333
|
+
/**
|
|
334
|
+
* add/update a function that can be called remotely
|
|
335
|
+
* @param name The unique function name
|
|
336
|
+
* @param cb The callback to handle the function
|
|
337
|
+
*/
|
|
338
|
+
function = app_embed_1.func;
|
|
339
|
+
/**
|
|
340
|
+
* add/update a static tab.
|
|
341
|
+
* the tab will be hosted at
|
|
342
|
+
* `http://localhost:{{PORT}}/tabs/{{name}}` or `https://{{BOT_DOMAIN}}/tabs/{{name}}`
|
|
343
|
+
* @remark scopes default to `personal`
|
|
344
|
+
* @param name A unique identifier for the entity which the tab displays.
|
|
345
|
+
* @param path The path to the web `dist` folder.
|
|
346
|
+
*/
|
|
347
|
+
tab = app_embed_1.tab;
|
|
348
|
+
/**
|
|
349
|
+
* add a configurable tab
|
|
350
|
+
* @remark scopes defaults to `team`
|
|
351
|
+
* @param url The url to use when configuring the tab.
|
|
352
|
+
*/
|
|
353
|
+
configTab = app_embed_1.configTab;
|
|
354
|
+
/**
|
|
355
|
+
* activity handler called when an inbound activity is received
|
|
356
|
+
* @param sender the plugin to use for sending activities
|
|
357
|
+
* @param event the received activity event
|
|
358
|
+
*/
|
|
359
|
+
process = app_process_1.$process;
|
|
360
|
+
///
|
|
361
|
+
/// OAuth
|
|
362
|
+
///
|
|
363
|
+
onTokenExchange = app_oauth_1.onTokenExchange;
|
|
364
|
+
onVerifyState = app_oauth_1.onVerifyState;
|
|
365
|
+
///
|
|
366
|
+
/// Events
|
|
367
|
+
///
|
|
368
|
+
inject = app_plugins_1.inject;
|
|
369
|
+
onError = app_events_1.onError;
|
|
370
|
+
onActivity = app_events_1.onActivity;
|
|
371
|
+
onActivitySent = app_events_1.onActivitySent;
|
|
372
|
+
onActivityResponse = app_events_1.onActivityResponse;
|
|
373
|
+
///
|
|
374
|
+
/// Token
|
|
375
|
+
///
|
|
376
|
+
/**
|
|
377
|
+
* Refresh the tokens for the app
|
|
378
|
+
*/
|
|
379
|
+
async refreshTokens() {
|
|
380
|
+
await this.refreshBotToken();
|
|
381
|
+
await this.refreshGraphToken();
|
|
382
|
+
}
|
|
383
|
+
async refreshBotToken(force = false) {
|
|
384
|
+
if (this.credentials) {
|
|
385
|
+
// Only do it if the token isn't there, or if it's expired, or if force is true
|
|
386
|
+
if (!this._tokens.bot ||
|
|
387
|
+
(this._tokens.bot.expiration != null &&
|
|
388
|
+
this._tokens.bot.expiration < Date.now() + exports.REFRESH_TOKEN_BUFFER_MS) ||
|
|
389
|
+
force) {
|
|
390
|
+
this.log.debug('Refreshing bot token');
|
|
391
|
+
const botResponse = await this.api.bots.token.get(this.credentials);
|
|
392
|
+
this._tokens.bot = new teams_api_1.JsonWebToken(botResponse.access_token);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
async refreshGraphToken(force = false) {
|
|
397
|
+
if (this.credentials) {
|
|
398
|
+
// Only do it if the token isn't there, or if it's expired, or if force is true
|
|
399
|
+
if (!this._tokens.graph ||
|
|
400
|
+
(this._tokens.graph.expiration != null &&
|
|
401
|
+
this._tokens.graph.expiration < Date.now() + exports.REFRESH_TOKEN_BUFFER_MS) ||
|
|
402
|
+
force) {
|
|
403
|
+
this.log.debug('Refreshing graph token');
|
|
404
|
+
const graphResponse = await this.api.bots.token.getGraph(this.credentials);
|
|
405
|
+
this._tokens.graph = new teams_api_1.JsonWebToken(graphResponse.access_token);
|
|
406
|
+
}
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
exports.App = App;
|
|
411
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyREFBOEQ7QUFDOUQsbUVBQXFEO0FBQ3JELDZEQUF5RTtBQUN6RSw2REFBeUU7QUFDekUsaUNBQW1DO0FBRW5DLG9EQVE4QjtBQUU5QixtRUFBa0M7QUFFbEMsK0JBQWtDO0FBR2xDLHlEQUEyQztBQUMzQyxtQ0FBZ0U7QUFDaEUsdUNBQXVDO0FBQ3ZDLHFDQUFrQztBQUdsQywyQ0FBbUQ7QUFDbkQsNkNBQThGO0FBQzlGLDJDQUE2RDtBQUM3RCwrQ0FBdUU7QUFDdkUsK0NBQXlDO0FBQ3pDLCtDQUFpRDtBQUNqRCwyQ0FBd0M7QUFFM0IsUUFBQSx1QkFBdUIsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFlBQVk7QUFnRWxFOztHQUVHO0FBQ0gsTUFBYSxHQUFHO0lBMkVPO0lBMUVaLEdBQUcsQ0FBWTtJQUNmLEdBQUcsQ0FBVTtJQUNiLElBQUksQ0FBYTtJQUNqQixNQUFNLENBQWM7SUFDcEIsT0FBTyxDQUFXO0lBQ2xCLFdBQVcsQ0FBZTtJQUMxQixtQkFBbUIsQ0FBa0M7SUFFOUQ7O09BRUc7SUFDSCxJQUFJLEVBQUU7UUFDSixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUM7SUFDNUQsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxjQUFjLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsY0FBYyxDQUFDO0lBQzlFLENBQUM7SUFFRCxJQUFJLEtBQUs7UUFDUCxPQUFPO1lBQ0wsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFD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QUMsUUFBUSxDQUFDLElBQUksRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUNyRCxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDekQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFlBQVksRUFBRSxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzNELElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUNoRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFFekYsS0FB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
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ISignInTokenExchangeInvokeActivity, ISignInVerifyStateInvokeActivity, TokenExchangeInvokeResponse } from '@microsoft/teams.api';
|
|
2
|
+
import { App } from './app';
|
|
3
|
+
import * as contexts from './contexts';
|
|
4
|
+
export declare function onTokenExchange(this: App, ctx: contexts.IActivityContext<ISignInTokenExchangeInvokeActivity>): Promise<{
|
|
5
|
+
status: number;
|
|
6
|
+
body?: undefined;
|
|
7
|
+
} | {
|
|
8
|
+
status: number;
|
|
9
|
+
body: TokenExchangeInvokeResponse;
|
|
10
|
+
}>;
|
|
11
|
+
export declare function onVerifyState(this: App, ctx: contexts.IActivityContext<ISignInVerifyStateInvokeActivity>): Promise<{
|
|
12
|
+
status: number;
|
|
13
|
+
}>;
|