@microsoft/teams.apps 2.0.0-preview.6 → 2.0.0-preview.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/dist/app.embed.js CHANGED
@@ -8,6 +8,7 @@ exports.tab = tab;
8
8
  exports.configTab = configTab;
9
9
  const path_1 = __importDefault(require("path"));
10
10
  const middleware_1 = require("./middleware");
11
+ const utils_1 = require("./utils");
11
12
  /**
12
13
  * add/update a function that can be called remotely
13
14
  * @param name The unique function name
@@ -23,12 +24,21 @@ function func(name, cb) {
23
24
  if (!req.context) {
24
25
  throw new Error('expected client context');
25
26
  }
27
+ const getCurrentConversationId = utils_1.functionContext.getConversationIdResolver(this, log.child('getCurrentConversationId'), req.context);
28
+ const send = async (activity) => {
29
+ const conversationId = await getCurrentConversationId();
30
+ return !conversationId
31
+ ? null
32
+ : await this.send(conversationId, activity);
33
+ };
26
34
  const data = await cb({
27
35
  ...req.context,
28
36
  log,
29
37
  api: this.api,
30
38
  appGraph: this.graph,
31
39
  data: req.body,
40
+ getCurrentConversationId,
41
+ send,
32
42
  });
33
43
  res.send(data);
34
44
  });
@@ -81,4 +91,4 @@ function configTab(url, options) {
81
91
  });
82
92
  return this;
83
93
  }
84
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmVtYmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwcC5lbWJlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWFBLG9CQStCQztBQVVELGtCQThCQztBQU9ELDhCQWdCQztBQTNHRCxnREFBeUI7QUFLekIsNkNBQWlFO0FBR2pFOzs7O0dBSUc7QUFDSCxTQUFnQixJQUFJLENBRWxCLElBQVksRUFDWixFQUE0RDtJQUU1RCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQ1osa0JBQWtCLElBQUksRUFBRSxFQUN4QixJQUFBLDJCQUFjLEVBQUM7UUFDYixNQUFNLEVBQUUsR0FBRztRQUNYLG1CQUFtQixFQUFFLElBQUksQ0FBQyxtQkFBbUI7UUFDN0MsR0FBRyxJQUFJLENBQUMsV0FBVztLQUNwQixDQUFDLEVBQ0YsS0FBSyxFQUFFLEdBQXNCLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDcEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7UUFDN0MsQ0FBQztRQUVELE1BQU0sSUFBSSxHQUFHLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLEdBQUcsR0FBRyxDQUFDLE9BQU87WUFDZCxHQUFHO1lBQ0gsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHO1lBQ2IsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ3BCLElBQUksRUFBRSxHQUFHLENBQUMsSUFBSTtTQUNmLENBQUMsQ0FBQztRQUVILEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakIsQ0FBQyxDQUNGLENBQUM7SUFFRixPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsR0FBRyxDQUVqQixJQUFZLEVBQ1osSUFBWSxFQUNaLE9BQXNFO0lBRXRFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxDQUFDO0lBQzFFLE1BQU0sR0FBRyxHQUF1QjtRQUM5QixRQUFRLEVBQUUsSUFBSTtRQUNkLFVBQVUsRUFBRSxpQ0FBaUMsSUFBSSxFQUFFO1FBQ25ELE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUNwQixHQUFHLE9BQU87S0FDWCxDQUFDO0lBRUYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNYLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztJQUNyQyxDQUFDO1NBQU0sQ0FBQztRQUNOLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN0QyxDQUFDO0lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxJQUFJLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUU7UUFDL0MsR0FBRyxDQUFDLFFBQVEsQ0FBQyxjQUFLLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQy9DLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLFNBQVMsQ0FFdkIsR0FBVyxFQUNYLE9BQXFFO0lBRXJFLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFDckMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7SUFDdkMsQ0FBQztJQUVELElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDO1FBQ25DLGdCQUFnQixFQUFFLEdBQUc7UUFDckIsTUFBTSxFQUFFLENBQUMsTUFBTSxDQUFDO1FBQ2hCLEdBQUcsT0FBTztLQUNYLENBQUMsQ0FBQztJQUVILE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQyJ9
94
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLmVtYmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2FwcC5lbWJlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWdCQSxvQkErQ0M7QUFVRCxrQkE4QkM7QUFPRCw4QkFnQkM7QUE5SEQsZ0RBQXlCO0FBT3pCLDZDQUFpRTtBQUVqRSxtQ0FBMEM7QUFFMUM7Ozs7R0FJRztBQUNILFNBQWdCLElBQUksQ0FFbEIsSUFBWSxFQUNaLEVBQTREO0lBRTVELE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwRCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FDWixrQkFBa0IsSUFBSSxFQUFFLEVBQ3hCLElBQUEsMkJBQWMsRUFBQztRQUNiLE1BQU0sRUFBRSxHQUFHO1FBQ1gsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtRQUM3QyxHQUFHLElBQUksQ0FBQyxXQUFXO0tBQ3BCLENBQUMsRUFDRixLQUFLLEVBQUUsR0FBc0IsRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNwQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBRUQsTUFBTSx3QkFBd0IsR0FDNUIsdUJBQWUsQ0FBQyx5QkFBeUIsQ0FDdkMsSUFBSSxFQUNKLEdBQUcsQ0FBQyxLQUFLLENBQUMsMEJBQTBCLENBQUMsRUFDckMsR0FBRyxDQUFDLE9BQU8sQ0FDWixDQUFDO1FBRUosTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLFFBQXNCLEVBQUUsRUFBRTtZQUM1QyxNQUFNLGNBQWMsR0FBRyxNQUFNLHdCQUF3QixFQUFFLENBQUM7WUFDeEQsT0FBTyxDQUFDLGNBQWM7Z0JBQ3BCLENBQUMsQ0FBQyxJQUFJO2dCQUNOLENBQUMsQ0FB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
@@ -8,13 +8,17 @@ export interface IClientContext {
8
8
  */
9
9
  readonly appSessionId: string;
10
10
  /**
11
- * The Microsoft Entra tenant ID of the current user.
11
+ * The Microsoft Entra tenant ID of the current user, extracted from request auth token.
12
12
  */
13
- readonly tenantId?: string;
13
+ readonly tenantId: string;
14
14
  /**
15
- * The Microsoft Entra object id of the current user.
15
+ * The Microsoft Entra object id of the current user, extracted from the request auth token.
16
16
  */
17
- readonly userId?: string;
17
+ readonly userId: string;
18
+ /**
19
+ * The name of the current user, extracted from the request auth token.
20
+ */
21
+ readonly userName: string;
18
22
  /**
19
23
  * The Microsoft Teams ID for the team with which the content is associated.
20
24
  */
@@ -33,7 +37,7 @@ export interface IClientContext {
33
37
  */
34
38
  readonly chatId?: string;
35
39
  /**
36
- * Meeting Id used by tab when running in meeting context
40
+ * Meeting ID used by tab when running in meeting context
37
41
  */
38
42
  readonly meetingId?: string;
39
43
  /**
@@ -49,5 +53,5 @@ export interface IClientContext {
49
53
  /**
50
54
  * The MSAL entra token.
51
55
  */
52
- readonly authToken?: string;
56
+ readonly authToken: string;
53
57
  }
@@ -1,3 +1,4 @@
1
+ import { ActivityLike, SentActivity } from '@microsoft/teams.api';
1
2
  import { ILogger } from '@microsoft/teams.common';
2
3
  import { ApiClient, GraphClient } from '../api';
3
4
  import { IClientContext } from './client';
@@ -18,4 +19,18 @@ export interface IFunctionContext<T = any> extends IClientContext {
18
19
  * the function payload
19
20
  */
20
21
  data: T;
22
+ /**
23
+ * Attempts to find the ID of the conversation in which the app is being used, and verifies that the bot and the
24
+ * user making the function call are both present in the conversation. Depending on the conversation type, this
25
+ * is the ID of a chat (for group chats, 1:1 chats and channel meetings), a channel, a meeting, or a user-bot
26
+ * conversation (when the app is hosted in personal scope).
27
+ * Returns undefined if the conversation ID cannot be determined or is invalid.
28
+ */
29
+ getCurrentConversationId: () => Promise<string | undefined>;
30
+ /**
31
+ * send an activity to the current conversation.
32
+ * Returns null if the conversation ID cannot be determined or is invalid.
33
+ * @param activity activity to send
34
+ */
35
+ send: (activity: ActivityLike) => Promise<SentActivity | null>;
21
36
  }
@@ -14,12 +14,16 @@ function withClientAuth(params) {
14
14
  const validatedToken = !entraTokenValidator
15
15
  ? null
16
16
  : await entraTokenValidator.validateAccessToken(log, authToken);
17
- if (!pageId || !appSessionId || !validatedToken || !entraTokenValidator) {
17
+ const tokenPayload = validatedToken && entraTokenValidator?.getTokenPayload(validatedToken);
18
+ if (!pageId ||
19
+ !appSessionId ||
20
+ !validatedToken ||
21
+ !entraTokenValidator ||
22
+ !tokenPayload) {
18
23
  log.debug('unauthorized');
19
24
  res.status(401).send('unauthorized');
20
25
  return;
21
26
  }
22
- const tokenPayload = entraTokenValidator.getTokenPayload(validatedToken);
23
27
  req.context = {
24
28
  appId: tokenPayload?.['appId'],
25
29
  appSessionId,
@@ -31,10 +35,11 @@ function withClientAuth(params) {
31
35
  pageId,
32
36
  subPageId: req.header('X-Teams-Sub-Page-Id'),
33
37
  teamId: req.header('X-Teams-Team-Id'),
34
- tenantId: tokenPayload?.['tid'],
35
- userId: tokenPayload?.['oid'],
38
+ tenantId: tokenPayload['tid'],
39
+ userId: tokenPayload['oid'],
40
+ userName: tokenPayload['name'],
36
41
  };
37
42
  next();
38
43
  };
39
44
  }
40
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1jbGllbnQtYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL3dpdGgtY2xpZW50LWF1dGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFrQkEsd0NBMENDO0FBMUNELFNBQWdCLGNBQWMsQ0FBQyxNQUE0QjtJQUN6RCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztJQUN2RCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBRTFCLE9BQU8sS0FBSyxFQUFFLEdBQXNCLEVBQUUsR0FBcUIsRUFBRSxJQUEwQixFQUFFLEVBQUU7UUFDekYsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQzFELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM3QyxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5RCxNQUFNLFNBQVMsR0FDYixhQUFhLEVBQUUsTUFBTSxLQUFLLENBQUMsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssUUFBUTtZQUN4RSxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUNsQixDQUFDLENBQUMsRUFBRSxDQUFDO1FBRVQsTUFBTSxjQUFjLEdBQUcsQ0FBQyxtQkFBbUI7WUFDekMsQ0FBQyxDQUFDLElBQUk7WUFDTixDQUFDLENBQUMsTUFBTSxtQkFBbUIsQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFbEUsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7WUFDeEUsR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUMxQixHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNyQyxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sWUFBWSxHQUFHLG1CQUFtQixDQUFDLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV6RSxHQUFHLENBQUMsT0FBTyxHQUFHO1lBQ1osS0FBSyxFQUFFLFlBQVksRUFBRSxDQUFDLE9BQU8sQ0FBQztZQUM5QixZQUFZO1lBQ1osU0FBUztZQUNULFNBQVMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDO1lBQzNDLE1BQU0sRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDO1lBQ3JDLFNBQVMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDO1lBQzNDLFNBQVMsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDO1lBQzNDLE1BQU07WUFDTixTQUFTLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQztZQUM1QyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztZQUNyQyxRQUFRLEVBQUUsWUFBWSxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQy9CLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQyxLQUFLLENBQUM7U0FDOUIsQ0FBQztRQUVGLElBQUksRUFBRSxDQUFDO0lBQ1QsQ0FBQyxDQUFDO0FBQ0osQ0FBQyJ9
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l0aC1jbGllbnQtYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWRkbGV3YXJlL3dpdGgtY2xpZW50LWF1dGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFxQkEsd0NBcURDO0FBckRELFNBQWdCLGNBQWMsQ0FBQyxNQUE0QjtJQUN6RCxNQUFNLG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztJQUN2RCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBRTFCLE9BQU8sS0FBSyxFQUNWLEdBQXNCLEVBQ3RCLEdBQXFCLEVBQ3JCLElBQTBCLEVBQzFCLEVBQUU7UUFDRixNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDMUQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzlELE1BQU0sU0FBUyxHQUNiLGFBQWEsRUFBRSxNQUFNLEtBQUssQ0FBQyxJQUFJLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsS0FBSyxRQUFRO1lBQ3hFLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO1lBQ2xCLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFFVCxNQUFNLGNBQWMsR0FBRyxDQUFDLG1CQUFtQjtZQUN6QyxDQUFDLENBQUMsSUFBSTtZQUNOLENBQUMsQ0FBQyxNQUFNLG1CQUFtQixDQUFDLG1CQUFtQixDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNsRSxNQUFNLFlBQVksR0FDaEIsY0FBYyxJQUFJLG1CQUFtQixFQUFFLGVBQWUsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV6RSxJQUNFLENBQUMsTUFBTTtZQUNQLENBQUMsWUFBWTtZQUNiLENBQUMsY0FBYztZQUNmLENBQUMsbUJBQW1CO1lBQ3BCLENBQUMsWUFBWSxFQUNiLENBQUM7WUFDRCxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQzFCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3JDLE9BQU87UUFDVCxDQUFDO1FBRUQsR0FBRyxDQUFDLE9BQU8sR0FBRztZQUNaLEtBQUssRUFBRSxZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUM7WUFDOUIsWUFBWTtZQUNaLFNBQVM7WUFDVCxTQUFTLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQztZQUMzQyxNQUFNLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztZQUNyQyxTQUFTLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQztZQUMzQyxTQUFTLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxvQkFBb0IsQ0FBQztZQUMzQyxNQUFNO1lBQ04sU0FBUyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMscUJBQXFCLENBQUM7WUFDNUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUM7WUFDckMsUUFBUSxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFDN0IsTUFBTSxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUM7WUFDM0IsUUFBUSxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUM7U0FDL0IsQ0FBQztRQUVGLElBQUksRUFBRSxDQUFDO0lBQ1QsQ0FBQyxDQUFDO0FBQ0osQ0FBQyJ9
@@ -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,2 @@
1
1
  export * as promises from './promises';
2
+ export * as functionContext from './function-context';
@@ -33,6 +33,7 @@ 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 = void 0;
37
37
  exports.promises = __importStar(require("./promises"));
38
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdURBQXVDIn0=
38
+ exports.functionContext = __importStar(require("./function-context"));
39
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsdURBQXVDO0FBQ3ZDLHNFQUFzRCJ9
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@microsoft/teams.apps",
3
- "version": "2.0.0-preview.6",
3
+ "version": "2.0.0-preview.7",
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.6",
50
- "@microsoft/teams.common": "2.0.0-preview.6",
51
- "@microsoft/teams.graph": "2.0.0-preview.6"
49
+ "@microsoft/teams.api": "2.0.0-preview.7",
50
+ "@microsoft/teams.common": "2.0.0-preview.7",
51
+ "@microsoft/teams.graph": "2.0.0-preview.7"
52
52
  },
53
53
  "devDependencies": {
54
- "@microsoft/teams.config": "2.0.0-preview.6",
54
+ "@microsoft/teams.config": "2.0.0-preview.7",
55
55
  "@types/cors": "^2.8.17",
56
56
  "@types/express": "^5.0.0",
57
57
  "@types/jest": "^29.5.12",