@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.
Files changed (132) hide show
  1. package/README.md +35 -0
  2. package/dist/api.d.ts +21 -0
  3. package/dist/api.js +66 -0
  4. package/dist/app.d.ts +1137 -0
  5. package/dist/app.embed.d.ts +24 -0
  6. package/dist/app.embed.js +83 -0
  7. package/dist/app.events.d.ts +14 -0
  8. package/dist/app.events.js +51 -0
  9. package/dist/app.js +411 -0
  10. package/dist/app.oauth.d.ts +13 -0
  11. package/dist/app.oauth.js +106 -0
  12. package/dist/app.plugins.d.ts +24 -0
  13. package/dist/app.plugins.js +96 -0
  14. package/dist/app.process.d.ts +11 -0
  15. package/dist/app.process.js +141 -0
  16. package/dist/app.routing.d.ts +22 -0
  17. package/dist/app.routing.js +40 -0
  18. package/dist/container/container.d.ts +37 -0
  19. package/dist/container/container.js +46 -0
  20. package/dist/container/index.d.ts +2 -0
  21. package/dist/container/index.js +19 -0
  22. package/dist/container/provider.d.ts +9 -0
  23. package/dist/container/provider.js +11 -0
  24. package/dist/contexts/activity-error.d.ts +8 -0
  25. package/dist/contexts/activity-error.js +3 -0
  26. package/dist/contexts/activity-signin.d.ts +8 -0
  27. package/dist/contexts/activity-signin.js +3 -0
  28. package/dist/contexts/activity.d.ts +117 -0
  29. package/dist/contexts/activity.js +133 -0
  30. package/dist/contexts/client.d.ts +53 -0
  31. package/dist/contexts/client.js +3 -0
  32. package/dist/contexts/function.d.ts +17 -0
  33. package/dist/contexts/function.js +3 -0
  34. package/dist/contexts/index.d.ts +5 -0
  35. package/dist/contexts/index.js +22 -0
  36. package/dist/events/activity-response.d.ts +16 -0
  37. package/dist/events/activity-response.js +3 -0
  38. package/dist/events/activity-sent.d.ts +16 -0
  39. package/dist/events/activity-sent.js +3 -0
  40. package/dist/events/activity.d.ts +20 -0
  41. package/dist/events/activity.js +3 -0
  42. package/dist/events/error.d.ts +16 -0
  43. package/dist/events/error.js +3 -0
  44. package/dist/events/index.d.ts +18 -0
  45. package/dist/events/index.js +21 -0
  46. package/dist/index.d.ts +7 -0
  47. package/dist/index.js +47 -0
  48. package/dist/manifest.d.ts +1241 -0
  49. package/dist/manifest.js +3 -0
  50. package/dist/middleware/entra-token-validator.d.ts +75 -0
  51. package/dist/middleware/entra-token-validator.js +169 -0
  52. package/dist/middleware/index.d.ts +3 -0
  53. package/dist/middleware/index.js +22 -0
  54. package/dist/middleware/strip-mentions-text.d.ts +3 -0
  55. package/dist/middleware/strip-mentions-text.js +48 -0
  56. package/dist/middleware/with-client-auth.d.ts +13 -0
  57. package/dist/middleware/with-client-auth.js +40 -0
  58. package/dist/oauth.d.ts +9 -0
  59. package/dist/oauth.js +7 -0
  60. package/dist/plugins/http/index.d.ts +2 -0
  61. package/dist/plugins/http/index.js +19 -0
  62. package/dist/plugins/http/plugin.d.ts +986 -0
  63. package/dist/plugins/http/plugin.js +238 -0
  64. package/dist/plugins/http/stream.d.ts +956 -0
  65. package/dist/plugins/http/stream.js +128 -0
  66. package/dist/plugins/index.d.ts +1 -0
  67. package/dist/plugins/index.js +18 -0
  68. package/dist/router.d.ts +34 -0
  69. package/dist/router.js +91 -0
  70. package/dist/routes/activity.d.ts +8 -0
  71. package/dist/routes/activity.js +3 -0
  72. package/dist/routes/conversation-update.d.ts +6 -0
  73. package/dist/routes/conversation-update.js +3 -0
  74. package/dist/routes/event.d.ts +17 -0
  75. package/dist/routes/event.js +11 -0
  76. package/dist/routes/index.d.ts +20 -0
  77. package/dist/routes/index.js +24 -0
  78. package/dist/routes/install.d.ts +8 -0
  79. package/dist/routes/install.js +3 -0
  80. package/dist/routes/invoke/file-consent.d.ts +6 -0
  81. package/dist/routes/invoke/file-consent.js +3 -0
  82. package/dist/routes/invoke/index.d.ts +39 -0
  83. package/dist/routes/invoke/index.js +45 -0
  84. package/dist/routes/invoke/message-extension-submit.d.ts +6 -0
  85. package/dist/routes/invoke/message-extension-submit.js +3 -0
  86. package/dist/routes/invoke/message-submit.d.ts +10 -0
  87. package/dist/routes/invoke/message-submit.js +3 -0
  88. package/dist/routes/message-delete.d.ts +6 -0
  89. package/dist/routes/message-delete.js +3 -0
  90. package/dist/routes/message-update.d.ts +6 -0
  91. package/dist/routes/message-update.js +3 -0
  92. package/dist/types/constructor.d.ts +7 -0
  93. package/dist/types/constructor.js +3 -0
  94. package/dist/types/event-handler.d.ts +1 -0
  95. package/dist/types/event-handler.js +3 -0
  96. package/dist/types/event.d.ts +11 -0
  97. package/dist/types/event.js +3 -0
  98. package/dist/types/index.d.ts +7 -0
  99. package/dist/types/index.js +24 -0
  100. package/dist/types/plugin/decorators/dependency.d.ts +135 -0
  101. package/dist/types/plugin/decorators/dependency.js +49 -0
  102. package/dist/types/plugin/decorators/event.d.ts +18 -0
  103. package/dist/types/plugin/decorators/event.js +24 -0
  104. package/dist/types/plugin/decorators/index.d.ts +3 -0
  105. package/dist/types/plugin/decorators/index.js +12 -0
  106. package/dist/types/plugin/decorators/plugin.d.ts +25 -0
  107. package/dist/types/plugin/decorators/plugin.js +23 -0
  108. package/dist/types/plugin/index.d.ts +8 -0
  109. package/dist/types/plugin/index.js +25 -0
  110. package/dist/types/plugin/plugin-activity-event.d.ts +20 -0
  111. package/dist/types/plugin/plugin-activity-event.js +3 -0
  112. package/dist/types/plugin/plugin-activity-response-event.d.ts +20 -0
  113. package/dist/types/plugin/plugin-activity-response-event.js +3 -0
  114. package/dist/types/plugin/plugin-activity-sent-event.d.ts +16 -0
  115. package/dist/types/plugin/plugin-activity-sent-event.js +3 -0
  116. package/dist/types/plugin/plugin-error-event.d.ts +20 -0
  117. package/dist/types/plugin/plugin-error-event.js +3 -0
  118. package/dist/types/plugin/plugin-start-event.d.ts +11 -0
  119. package/dist/types/plugin/plugin-start-event.js +3 -0
  120. package/dist/types/plugin/plugin.d.ts +74 -0
  121. package/dist/types/plugin/plugin.js +3 -0
  122. package/dist/types/plugin/sender.d.ts +18 -0
  123. package/dist/types/plugin/sender.js +3 -0
  124. package/dist/types/prefixed.d.ts +3 -0
  125. package/dist/types/prefixed.js +3 -0
  126. package/dist/types/route-handler.d.ts +2 -0
  127. package/dist/types/route-handler.js +3 -0
  128. package/dist/types/streamer.d.ts +31 -0
  129. package/dist/types/streamer.js +3 -0
  130. package/dist/types/suffixed.d.ts +3 -0
  131. package/dist/types/suffixed.js +3 -0
  132. package/package.json +70 -0
@@ -0,0 +1,238 @@
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 __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var __importDefault = (this && this.__importDefault) || function (mod) {
45
+ return (mod && mod.__esModule) ? mod : { "default": mod };
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.HttpPlugin = void 0;
49
+ const http_1 = __importDefault(require("http"));
50
+ const express_1 = __importDefault(require("express"));
51
+ const cors_1 = __importDefault(require("cors"));
52
+ const $http = __importStar(require("@microsoft/teams.common/http"));
53
+ const teams_api_1 = require("@microsoft/teams.api");
54
+ const types_1 = require("../../types");
55
+ const package_json_1 = __importDefault(require("../../../package.json"));
56
+ const stream_1 = require("./stream");
57
+ /**
58
+ * Can send/receive activities via http
59
+ */
60
+ let HttpPlugin = class HttpPlugin {
61
+ logger;
62
+ client;
63
+ manifest;
64
+ botToken;
65
+ graphToken;
66
+ $onError;
67
+ $onActivity;
68
+ get;
69
+ post;
70
+ patch;
71
+ put;
72
+ delete;
73
+ route;
74
+ use;
75
+ get server() {
76
+ return this._server;
77
+ }
78
+ _server;
79
+ get port() {
80
+ return this._port;
81
+ }
82
+ _port;
83
+ express;
84
+ pending = {};
85
+ constructor() {
86
+ this.express = (0, express_1.default)();
87
+ this._server = http_1.default.createServer(this.express);
88
+ this.get = this.express.get.bind(this.express);
89
+ this.post = this.express.post.bind(this.express);
90
+ this.patch = this.express.patch.bind(this.express);
91
+ this.put = this.express.put.bind(this.express);
92
+ this.delete = this.express.delete.bind(this.express);
93
+ this.route = this.express.route.bind(this.express);
94
+ this.use = this.express.use.bind(this.express);
95
+ this.express.use((0, cors_1.default)());
96
+ this.express.use('/api*', express_1.default.json());
97
+ this.express.post('/api/messages', this.onRequest.bind(this));
98
+ }
99
+ /**
100
+ * serve static files
101
+ * @param path the url path to serve
102
+ * @param dist the dist file path to serve
103
+ */
104
+ static(path, dist) {
105
+ this.express.use(path, express_1.default.static(dist));
106
+ return this;
107
+ }
108
+ async onStart({ port }) {
109
+ this._port = port;
110
+ this.express.get('/', (_, res) => {
111
+ res.send(this.manifest);
112
+ });
113
+ return await new Promise((resolve, reject) => {
114
+ this._server = this.express.listen(port, async (err) => {
115
+ if (err) {
116
+ this.$onError({ error: err });
117
+ reject(err);
118
+ return;
119
+ }
120
+ this.logger.info(`listening on port ${port} 🚀`);
121
+ resolve();
122
+ });
123
+ });
124
+ }
125
+ onStop() {
126
+ this._server.close();
127
+ }
128
+ onError({ error, activity }) {
129
+ if (!activity)
130
+ return;
131
+ const res = this.pending[activity.id];
132
+ if (!res) {
133
+ return;
134
+ }
135
+ if (!res.headersSent) {
136
+ res.status(500).send(error.message);
137
+ }
138
+ delete this.pending[activity.id];
139
+ }
140
+ onActivityResponse({ response, activity }) {
141
+ const res = this.pending[activity.id];
142
+ if (!res) {
143
+ return;
144
+ }
145
+ if (!res.headersSent) {
146
+ res.status(response.status || 200).send(JSON.stringify(response.body || null));
147
+ }
148
+ delete this.pending[activity.id];
149
+ }
150
+ async send(activity, ref) {
151
+ const api = new teams_api_1.Client(ref.serviceUrl, this.client.clone({
152
+ token: () => this.botToken,
153
+ }));
154
+ activity = {
155
+ ...activity,
156
+ from: ref.bot,
157
+ conversation: ref.conversation,
158
+ };
159
+ if (activity.id) {
160
+ const res = await api.conversations
161
+ .activities(ref.conversation.id)
162
+ .update(activity.id, activity);
163
+ return { ...activity, ...res };
164
+ }
165
+ const res = await api.conversations.activities(ref.conversation.id).create(activity);
166
+ return { ...activity, ...res };
167
+ }
168
+ createStream(ref) {
169
+ return new stream_1.HttpStream(new teams_api_1.Client(ref.serviceUrl, this.client.clone({
170
+ token: () => this.botToken,
171
+ })), ref);
172
+ }
173
+ /**
174
+ * validates an incoming http request
175
+ * @param req the incoming http request
176
+ * @param res the http response
177
+ */
178
+ async onRequest(req, res, _next) {
179
+ const authorization = req.headers.authorization?.replace('Bearer ', '');
180
+ if (!authorization && process.env.NODE_ENV !== 'local') {
181
+ res.status(401).send('unauthorized');
182
+ return;
183
+ }
184
+ const activity = req.body;
185
+ const token = authorization
186
+ ? new teams_api_1.JsonWebToken(authorization)
187
+ : {
188
+ appId: '',
189
+ from: 'azure',
190
+ fromId: '',
191
+ serviceUrl: activity.serviceUrl || '',
192
+ };
193
+ this.pending[activity.id] = res;
194
+ this.$onActivity({
195
+ sender: this,
196
+ activity,
197
+ token,
198
+ });
199
+ }
200
+ };
201
+ exports.HttpPlugin = HttpPlugin;
202
+ __decorate([
203
+ (0, types_1.Logger)(),
204
+ __metadata("design:type", Object)
205
+ ], HttpPlugin.prototype, "logger", void 0);
206
+ __decorate([
207
+ (0, types_1.Dependency)(),
208
+ __metadata("design:type", $http.Client)
209
+ ], HttpPlugin.prototype, "client", void 0);
210
+ __decorate([
211
+ (0, types_1.Dependency)(),
212
+ __metadata("design:type", Object)
213
+ ], HttpPlugin.prototype, "manifest", void 0);
214
+ __decorate([
215
+ (0, types_1.Dependency)({ optional: true }),
216
+ __metadata("design:type", Object)
217
+ ], HttpPlugin.prototype, "botToken", void 0);
218
+ __decorate([
219
+ (0, types_1.Dependency)({ optional: true }),
220
+ __metadata("design:type", Object)
221
+ ], HttpPlugin.prototype, "graphToken", void 0);
222
+ __decorate([
223
+ (0, types_1.Event)('error'),
224
+ __metadata("design:type", Function)
225
+ ], HttpPlugin.prototype, "$onError", void 0);
226
+ __decorate([
227
+ (0, types_1.Event)('activity'),
228
+ __metadata("design:type", Function)
229
+ ], HttpPlugin.prototype, "$onActivity", void 0);
230
+ exports.HttpPlugin = HttpPlugin = __decorate([
231
+ (0, types_1.Plugin)({
232
+ name: 'http',
233
+ version: package_json_1.default.version,
234
+ description: 'the default plugin for sending/receiving activities',
235
+ }),
236
+ __metadata("design:paramtypes", [])
237
+ ], HttpPlugin);
238
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3BsdWdpbnMvaHR0cC9wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsZ0RBQXdCO0FBQ3hCLHNEQUE4QjtBQUM5QixnREFBd0I7QUFHeEIsb0VBQXNEO0FBRXRELG9EQU84QjtBQUU5Qix1Q0FVcUI7QUFFckIseUVBQXdDO0FBR3hDLHFDQUFzQztBQUV0Qzs7R0FFRztBQU1JLElBQU0sVUFBVSxHQUFoQixNQUFNLFVBQVU7SUFFWixNQUFNLENBQVc7SUFHakIsTUFBTSxDQUFnQjtJQUd0QixRQUFRLENBQXFCO0lBRzdCLFFBQVEsQ0FBVTtJQUdsQixVQUFVLENBQVU7SUFHcEIsUUFBUSxDQUFnQztJQUd4QyxXQUFXLENBQW1DO0lBRTlDLEdBQUcsQ0FBNkI7SUFDaEMsSUFBSSxDQUE4QjtJQUNsQyxLQUFLLENBQStCO0lBQ3BDLEdBQUcsQ0FBNkI7SUFDaEMsTUFBTSxDQUFnQztJQUN0QyxLQUFLLENBQStCO0lBQ3BDLEdBQUcsQ0FBNkI7SUFFekMsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFDUyxPQUFPLENBQWM7SUFFL0IsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7SUFDUyxLQUFLLENBQVU7SUFFZixPQUFPLENBQXNCO0lBQzdCLE9BQU8sR0FBcUMsRUFBRSxDQUFDO0lBRXpEO1FBQ0UsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFBLGlCQUFPLEdBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsT0FBTyxHQUFHLGNBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8s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