@tellescope/sdk 0.0.20 → 0.0.24
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/lib/cjs/enduser.d.ts +163 -13
- package/lib/cjs/enduser.d.ts.map +1 -1
- package/lib/cjs/enduser.js.map +1 -1
- package/lib/cjs/sdk.d.ts +171 -9
- package/lib/cjs/sdk.d.ts.map +1 -1
- package/lib/cjs/sdk.js +3 -0
- package/lib/cjs/sdk.js.map +1 -1
- package/lib/cjs/tests/tests.js +64 -31
- package/lib/cjs/tests/tests.js.map +1 -1
- package/lib/cjs/tests/webhooks_tests.d.ts +2 -0
- package/lib/cjs/tests/webhooks_tests.d.ts.map +1 -0
- package/lib/cjs/tests/webhooks_tests.js +276 -0
- package/lib/cjs/tests/webhooks_tests.js.map +1 -0
- package/lib/esm/enduser.d.ts +163 -13
- package/lib/esm/enduser.d.ts.map +1 -1
- package/lib/esm/enduser.js.map +1 -1
- package/lib/esm/sdk.d.ts +171 -9
- package/lib/esm/sdk.d.ts.map +1 -1
- package/lib/esm/sdk.js +3 -0
- package/lib/esm/sdk.js.map +1 -1
- package/lib/esm/tests/tests.js +64 -31
- package/lib/esm/tests/tests.js.map +1 -1
- package/lib/esm/tests/webhooks_tests.d.ts +2 -0
- package/lib/esm/tests/webhooks_tests.d.ts.map +1 -0
- package/lib/esm/tests/webhooks_tests.js +271 -0
- package/lib/esm/tests/webhooks_tests.js.map +1 -0
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +14 -11
- package/src/enduser.ts +6 -4
- package/src/sdk.ts +13 -3
- package/src/tests/tests.ts +24 -7
- package/src/tests/webhooks_tests.ts +207 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
12
|
+
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
13
|
+
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
14
|
+
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
15
|
+
function step(op) {
|
|
16
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
17
|
+
while (_) try {
|
|
18
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
19
|
+
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
20
|
+
switch (op[0]) {
|
|
21
|
+
case 0: case 1: t = op; break;
|
|
22
|
+
case 4: _.label++; return { value: op[1], done: false };
|
|
23
|
+
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
24
|
+
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
25
|
+
default:
|
|
26
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
27
|
+
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
28
|
+
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
29
|
+
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
30
|
+
if (t[2]) _.ops.pop();
|
|
31
|
+
_.trys.pop(); continue;
|
|
32
|
+
}
|
|
33
|
+
op = body.call(thisArg, _);
|
|
34
|
+
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
35
|
+
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
39
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
40
|
+
};
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
var express_1 = __importDefault(require("express"));
|
|
43
|
+
var body_parser_1 = __importDefault(require("body-parser"));
|
|
44
|
+
var crypto_1 = __importDefault(require("crypto"));
|
|
45
|
+
var testing_1 = require("@tellescope/testing");
|
|
46
|
+
var utilities_1 = require("@tellescope/utilities");
|
|
47
|
+
var types_models_1 = require("@tellescope/types-models");
|
|
48
|
+
var sdk_1 = require("../sdk");
|
|
49
|
+
var _a = [process.env.TEST_EMAIL, process.env.TEST_PASSWORD], email = _a[0], password = _a[1];
|
|
50
|
+
var _b = [process.env.TEST_EMAIL_2, process.env.TEST_PASSWORD_2], email2 = _b[0], password2 = _b[1];
|
|
51
|
+
var _c = [process.env.NON_ADMIN_EMAIL, process.env.NON_ADMIN_PASSWORD], nonAdminEmail = _c[0], nonAdminPassword = _c[1];
|
|
52
|
+
if (!(email && password && email2 && password2 && nonAdminEmail && nonAdminPassword)) {
|
|
53
|
+
console.error("Set TEST_EMAIL and TEST_PASSWORD");
|
|
54
|
+
process.exit();
|
|
55
|
+
}
|
|
56
|
+
var sdk = new sdk_1.Session({ host: 'http://localhost:8080' });
|
|
57
|
+
var nonAdminSdk = new sdk_1.Session({ host: 'http://localhost:8080' });
|
|
58
|
+
var app = (0, express_1.default)();
|
|
59
|
+
app.use(body_parser_1.default.urlencoded({ extended: true, limit: '25mb' }));
|
|
60
|
+
app.use(body_parser_1.default.json({ limit: "25mb" }));
|
|
61
|
+
var PORT = 4000;
|
|
62
|
+
var TEST_SECRET = "this is a test secret for verifying integrity of web hooks";
|
|
63
|
+
var webhookEndpoint = '/handle-webhook';
|
|
64
|
+
var webhookURL = "http://127.0.0.1:".concat(PORT).concat(webhookEndpoint);
|
|
65
|
+
var sha256 = function (s) { return crypto_1.default.createHash('sha256').update(s).digest('hex'); };
|
|
66
|
+
var verify_integrity = function (records, timestamp, integrity) { return (sha256(records.map(function (r) { return r.id; }).join('') + timestamp + TEST_SECRET) === integrity); };
|
|
67
|
+
var handledEvents = [];
|
|
68
|
+
app.post(webhookEndpoint, function (req, res) {
|
|
69
|
+
var body = req.body;
|
|
70
|
+
// console.log('got hook', body.records, body.timestamp, body.integrity)
|
|
71
|
+
if (!verify_integrity(body.records, body.timestamp, body.integrity)) {
|
|
72
|
+
console.error("Integrity check failed for request", JSON.stringify(body, null, 2));
|
|
73
|
+
process.exit();
|
|
74
|
+
}
|
|
75
|
+
handledEvents.push(req.body);
|
|
76
|
+
res.status(204).end();
|
|
77
|
+
});
|
|
78
|
+
var fullSubscription = {};
|
|
79
|
+
var emptySubscription = {};
|
|
80
|
+
for (var model in types_models_1.WEBHOOK_MODELS) {
|
|
81
|
+
fullSubscription[model] = { create: true, update: true, delete: true };
|
|
82
|
+
emptySubscription[model] = { create: false, update: false, delete: false };
|
|
83
|
+
}
|
|
84
|
+
var webhookIndex = 0;
|
|
85
|
+
var check_next_webhook = function (evaluate, name, error, isSubscribed) { return __awaiter(void 0, void 0, void 0, function () {
|
|
86
|
+
var event, success;
|
|
87
|
+
return __generator(this, function (_a) {
|
|
88
|
+
switch (_a.label) {
|
|
89
|
+
case 0:
|
|
90
|
+
if (isSubscribed === false)
|
|
91
|
+
return [2 /*return*/];
|
|
92
|
+
return [4 /*yield*/, (0, testing_1.wait)(undefined, 25)]; // wait for hook to post
|
|
93
|
+
case 1:
|
|
94
|
+
_a.sent(); // wait for hook to post
|
|
95
|
+
event = handledEvents[webhookIndex];
|
|
96
|
+
(0, testing_1.assert)(!!event, 'did not get hook', 'got hook');
|
|
97
|
+
if (!event)
|
|
98
|
+
return [2 /*return*/]; // ensure webhookIndex not incremented
|
|
99
|
+
success = evaluate(event);
|
|
100
|
+
(0, testing_1.assert)(success, error, name);
|
|
101
|
+
if (!success) {
|
|
102
|
+
console.error('Got', event);
|
|
103
|
+
}
|
|
104
|
+
webhookIndex++;
|
|
105
|
+
return [2 /*return*/];
|
|
106
|
+
}
|
|
107
|
+
});
|
|
108
|
+
}); };
|
|
109
|
+
var chats_tests = function (isSubscribed) { return __awaiter(void 0, void 0, void 0, function () {
|
|
110
|
+
var room, chat;
|
|
111
|
+
return __generator(this, function (_a) {
|
|
112
|
+
switch (_a.label) {
|
|
113
|
+
case 0:
|
|
114
|
+
(0, testing_1.log_header)("Chats Tests, isSubscribed=".concat(isSubscribed));
|
|
115
|
+
return [4 /*yield*/, sdk.api.chat_rooms.createOne({ userIds: [sdk.userInfo.id] })];
|
|
116
|
+
case 1:
|
|
117
|
+
room = _a.sent();
|
|
118
|
+
return [4 /*yield*/, sdk.api.chats.createOne({ roomId: room.id, message: "Hello hello hi hello" })];
|
|
119
|
+
case 2:
|
|
120
|
+
chat = _a.sent();
|
|
121
|
+
return [4 /*yield*/, check_next_webhook(function (_a) {
|
|
122
|
+
var _b, _c, _d;
|
|
123
|
+
var records = _a.records, relatedRecords = _a.relatedRecords;
|
|
124
|
+
var record = records[0];
|
|
125
|
+
return ((0, utilities_1.objects_equivalent)(record, chat) &&
|
|
126
|
+
relatedRecords[record.roomId] !== undefined &&
|
|
127
|
+
relatedRecords[record.senderId] !== undefined &&
|
|
128
|
+
((_b = relatedRecords[record.roomId]) === null || _b === void 0 ? void 0 : _b.id) === room.id &&
|
|
129
|
+
((_c = relatedRecords[record.senderId]) === null || _c === void 0 ? void 0 : _c.id) === ((_d = room.userIds) === null || _d === void 0 ? void 0 : _d[0]));
|
|
130
|
+
}, 'Create chat error', 'Create chat webhook', isSubscribed)
|
|
131
|
+
// cleanup
|
|
132
|
+
];
|
|
133
|
+
case 3:
|
|
134
|
+
_a.sent();
|
|
135
|
+
// cleanup
|
|
136
|
+
return [4 /*yield*/, sdk.api.chat_rooms.deleteOne(room.id)
|
|
137
|
+
// when chatroom support added for webhooks, check deletion here
|
|
138
|
+
// await check_next_webhook(a => objects_equivalent(a.records, [chat_room]), 'Delete chat room error', 'Delete chat room webhook', isSubscribed)
|
|
139
|
+
]; // also cleans up messages
|
|
140
|
+
case 4:
|
|
141
|
+
// cleanup
|
|
142
|
+
_a.sent(); // also cleans up messages
|
|
143
|
+
return [2 /*return*/];
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
}); };
|
|
147
|
+
var meetings_tests = function (isSubscribed) { return __awaiter(void 0, void 0, void 0, function () {
|
|
148
|
+
var meeting;
|
|
149
|
+
return __generator(this, function (_a) {
|
|
150
|
+
switch (_a.label) {
|
|
151
|
+
case 0:
|
|
152
|
+
(0, testing_1.log_header)("Meetings Tests, isSubscribed=".concat(isSubscribed));
|
|
153
|
+
return [4 /*yield*/, sdk.api.meetings.start_meeting()];
|
|
154
|
+
case 1:
|
|
155
|
+
meeting = _a.sent();
|
|
156
|
+
return [4 /*yield*/, check_next_webhook(function (a) { return (0, utilities_1.objects_equivalent)(a.records, [meeting]); }, 'Create meeting error', 'Create meeting webhook', isSubscribed)
|
|
157
|
+
// cleanup
|
|
158
|
+
];
|
|
159
|
+
case 2:
|
|
160
|
+
_a.sent();
|
|
161
|
+
// cleanup
|
|
162
|
+
return [4 /*yield*/, sdk.api.meetings.end_meeting({ id: meeting.id })]; // also cleans up messages
|
|
163
|
+
case 3:
|
|
164
|
+
// cleanup
|
|
165
|
+
_a.sent(); // also cleans up messages
|
|
166
|
+
return [2 /*return*/];
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
}); };
|
|
170
|
+
var tests = {
|
|
171
|
+
chats: chats_tests,
|
|
172
|
+
meetings: meetings_tests,
|
|
173
|
+
};
|
|
174
|
+
var run_tests = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
175
|
+
var _a, _b, _i, t, finalLength, _c, _d, _e, t;
|
|
176
|
+
return __generator(this, function (_f) {
|
|
177
|
+
switch (_f.label) {
|
|
178
|
+
case 0:
|
|
179
|
+
(0, testing_1.log_header)("Webhooks Tests");
|
|
180
|
+
return [4 /*yield*/, sdk.authenticate(email, password)];
|
|
181
|
+
case 1:
|
|
182
|
+
_f.sent();
|
|
183
|
+
return [4 /*yield*/, sdk.reset_db()];
|
|
184
|
+
case 2:
|
|
185
|
+
_f.sent();
|
|
186
|
+
return [4 /*yield*/, nonAdminSdk.authenticate(nonAdminEmail, nonAdminPassword)];
|
|
187
|
+
case 3:
|
|
188
|
+
_f.sent();
|
|
189
|
+
return [4 /*yield*/, (0, testing_1.async_test)('configure webhook is admin only', function () { return nonAdminSdk.api.webhooks.configure({ url: webhookURL, secret: TEST_SECRET }); }, { shouldError: true, onError: function (e) { return e.message === "Inaccessible" || e.message === "Admin access only"; } })];
|
|
190
|
+
case 4:
|
|
191
|
+
_f.sent();
|
|
192
|
+
return [4 /*yield*/, (0, testing_1.async_test)('update webhook is admin only', function () { return nonAdminSdk.api.webhooks.update({ subscriptionUpdates: fullSubscription }); }, { shouldError: true, onError: function (e) { return e.message === "Inaccessible" || e.message === "Admin access only"; } })];
|
|
193
|
+
case 5:
|
|
194
|
+
_f.sent();
|
|
195
|
+
return [4 /*yield*/, (0, testing_1.async_test)('configure webhook', function () { return sdk.api.webhooks.configure({ url: webhookURL, secret: TEST_SECRET }); }, { onResult: function (_) { return true; } })];
|
|
196
|
+
case 6:
|
|
197
|
+
_f.sent();
|
|
198
|
+
return [4 /*yield*/, (0, testing_1.async_test)('configure webhook (only callable once)', function () { return sdk.api.webhooks.configure({ url: webhookURL, secret: TEST_SECRET }); }, { shouldError: true, onError: function (e) { return e.message === "Only one webhook configuration is supported per organization. Use /update-webooks to update your configuration."; } })];
|
|
199
|
+
case 7:
|
|
200
|
+
_f.sent();
|
|
201
|
+
return [4 /*yield*/, (0, testing_1.async_test)('update webhook (set empty subscription)', function () { return sdk.api.webhooks.update({ subscriptionUpdates: {} }); }, { onResult: function (_) { return true; } })];
|
|
202
|
+
case 8:
|
|
203
|
+
_f.sent();
|
|
204
|
+
return [4 /*yield*/, (0, testing_1.async_test)('update webhook (set partial subscription)', function () { return sdk.api.webhooks.update({ subscriptionUpdates: { chats: { create: true } } }); }, { onResult: function (_) { return true; } })];
|
|
205
|
+
case 9:
|
|
206
|
+
_f.sent();
|
|
207
|
+
return [4 /*yield*/, (0, testing_1.async_test)('update webhook (set subscriptions)', function () { return sdk.api.webhooks.update({ subscriptionUpdates: fullSubscription }); }, { onResult: function (_) { return true; } })];
|
|
208
|
+
case 10:
|
|
209
|
+
_f.sent();
|
|
210
|
+
return [4 /*yield*/, (0, testing_1.async_test)('update webhook invalid model', function () { return sdk.api.webhooks.update({ subscriptionUpdates: { notAModel: { create: false } } }); }, { shouldError: true, onError: function (e) { return e.message === "Error parsing field subscriptionUpdates: Got unexpected field(s) [notAModel]"; } })];
|
|
211
|
+
case 11:
|
|
212
|
+
_f.sent();
|
|
213
|
+
(0, testing_1.log_header)("Webhooks Tests with Subscriptions");
|
|
214
|
+
_a = [];
|
|
215
|
+
for (_b in tests)
|
|
216
|
+
_a.push(_b);
|
|
217
|
+
_i = 0;
|
|
218
|
+
_f.label = 12;
|
|
219
|
+
case 12:
|
|
220
|
+
if (!(_i < _a.length)) return [3 /*break*/, 15];
|
|
221
|
+
t = _a[_i];
|
|
222
|
+
return [4 /*yield*/, tests[t](true)];
|
|
223
|
+
case 13:
|
|
224
|
+
_f.sent();
|
|
225
|
+
_f.label = 14;
|
|
226
|
+
case 14:
|
|
227
|
+
_i++;
|
|
228
|
+
return [3 /*break*/, 12];
|
|
229
|
+
case 15:
|
|
230
|
+
finalLength = handledEvents.length;
|
|
231
|
+
return [4 /*yield*/, (0, testing_1.async_test)('update webhook (set subscriptions empty)', function () { return sdk.api.webhooks.update({ subscriptionUpdates: emptySubscription }); }, { onResult: function (_) { return true; } })];
|
|
232
|
+
case 16:
|
|
233
|
+
_f.sent();
|
|
234
|
+
(0, testing_1.log_header)("Webhooks Tests without Subscriptions");
|
|
235
|
+
_c = [];
|
|
236
|
+
for (_d in tests)
|
|
237
|
+
_c.push(_d);
|
|
238
|
+
_e = 0;
|
|
239
|
+
_f.label = 17;
|
|
240
|
+
case 17:
|
|
241
|
+
if (!(_e < _c.length)) return [3 /*break*/, 20];
|
|
242
|
+
t = _c[_e];
|
|
243
|
+
return [4 /*yield*/, tests[t](false)];
|
|
244
|
+
case 18:
|
|
245
|
+
_f.sent();
|
|
246
|
+
_f.label = 19;
|
|
247
|
+
case 19:
|
|
248
|
+
_e++;
|
|
249
|
+
return [3 /*break*/, 17];
|
|
250
|
+
case 20:
|
|
251
|
+
(0, testing_1.assert)(finalLength === handledEvents.length, 'length changed after subscriptions', 'No webhooks posted when no subscription');
|
|
252
|
+
return [2 /*return*/];
|
|
253
|
+
}
|
|
254
|
+
});
|
|
255
|
+
}); };
|
|
256
|
+
app.listen(PORT, function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
257
|
+
var err_1;
|
|
258
|
+
return __generator(this, function (_a) {
|
|
259
|
+
switch (_a.label) {
|
|
260
|
+
case 0:
|
|
261
|
+
_a.trys.push([0, 2, , 3]);
|
|
262
|
+
return [4 /*yield*/, run_tests()];
|
|
263
|
+
case 1:
|
|
264
|
+
_a.sent();
|
|
265
|
+
return [3 /*break*/, 3];
|
|
266
|
+
case 2:
|
|
267
|
+
err_1 = _a.sent();
|
|
268
|
+
console.error(err_1);
|
|
269
|
+
return [3 /*break*/, 3];
|
|
270
|
+
case 3:
|
|
271
|
+
process.exit();
|
|
272
|
+
return [2 /*return*/];
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
}); });
|
|
276
|
+
//# sourceMappingURL=webhooks_tests.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhooks_tests.js","sourceRoot":"","sources":["../../../src/tests/webhooks_tests.ts"],"names":[],"mappings":"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"}
|