@shopify/shopify-api 6.0.0-rc6 → 6.0.0-rc7
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/CHANGELOG.md +2 -2
- package/adapters/cf-worker/adapter.d.ts.map +1 -1
- package/adapters/cf-worker/adapter.js +3 -2
- package/adapters/cf-worker/adapter.js.map +1 -1
- package/adapters/mock/adapter.d.ts.map +1 -1
- package/adapters/mock/adapter.js +3 -0
- package/adapters/mock/adapter.js.map +1 -1
- package/adapters/node/adapter.d.ts.map +1 -1
- package/adapters/node/adapter.js +2 -1
- package/adapters/node/adapter.js.map +1 -1
- package/docs/migrating-to-v6.md +72 -77
- package/docs/usage/webhooks.md +113 -103
- package/lib/error.d.ts +2 -0
- package/lib/error.d.ts.map +1 -1
- package/lib/error.js +9 -1
- package/lib/error.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/webhooks/index.d.ts +3 -5
- package/lib/webhooks/index.d.ts.map +1 -1
- package/lib/webhooks/index.js +8 -8
- package/lib/webhooks/index.js.map +1 -1
- package/lib/webhooks/process.d.ts +5 -0
- package/lib/webhooks/process.d.ts.map +1 -0
- package/lib/webhooks/process.js +171 -0
- package/lib/webhooks/process.js.map +1 -0
- package/lib/webhooks/query-template.d.ts +4 -0
- package/lib/webhooks/query-template.d.ts.map +1 -0
- package/lib/webhooks/query-template.js +14 -0
- package/lib/webhooks/query-template.js.map +1 -0
- package/lib/webhooks/register.d.ts +6 -0
- package/lib/webhooks/register.d.ts.map +1 -0
- package/lib/webhooks/register.js +391 -0
- package/lib/webhooks/register.js.map +1 -0
- package/lib/webhooks/registry.d.ts +8 -11
- package/lib/webhooks/registry.d.ts.map +1 -1
- package/lib/webhooks/registry.js +85 -340
- package/lib/webhooks/registry.js.map +1 -1
- package/lib/webhooks/types.d.ts +45 -24
- package/lib/webhooks/types.d.ts.map +1 -1
- package/lib/webhooks/types.js +7 -1
- package/lib/webhooks/types.js.map +1 -1
- package/package.json +2 -2
package/lib/webhooks/registry.js
CHANGED
|
@@ -1,365 +1,110 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var _a;
|
|
3
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.
|
|
3
|
+
exports.addHostToCallbackUrl = exports.handlerIdentifier = exports.createGetHandlers = exports.createGetTopicsAdded = exports.createAddHandlers = exports.topicForStorage = exports.createRegistry = void 0;
|
|
5
4
|
var tslib_1 = require("tslib");
|
|
6
|
-
var
|
|
7
|
-
var http_1 = require("../../runtime/http");
|
|
8
|
-
var crypto_1 = require("../../runtime/crypto");
|
|
9
|
-
var types_1 = require("../../runtime/crypto/types");
|
|
10
|
-
var graphql_client_1 = require("../clients/graphql/graphql_client");
|
|
5
|
+
var error_1 = require("../error");
|
|
11
6
|
var base_types_1 = require("../base-types");
|
|
12
|
-
var
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
function isSuccess(result, deliveryMethod, webhookId) {
|
|
16
|
-
var endpoint;
|
|
17
|
-
switch (deliveryMethod) {
|
|
18
|
-
case types_2.DeliveryMethod.Http:
|
|
19
|
-
endpoint = 'webhookSubscription';
|
|
20
|
-
break;
|
|
21
|
-
case types_2.DeliveryMethod.EventBridge:
|
|
22
|
-
endpoint = 'eventBridgeWebhookSubscription';
|
|
23
|
-
break;
|
|
24
|
-
case types_2.DeliveryMethod.PubSub:
|
|
25
|
-
endpoint = 'pubSubWebhookSubscription';
|
|
26
|
-
break;
|
|
27
|
-
default:
|
|
28
|
-
return false;
|
|
29
|
-
}
|
|
30
|
-
endpoint += webhookId ? 'Update' : 'Create';
|
|
31
|
-
return Boolean(result.data &&
|
|
32
|
-
result.data[endpoint] &&
|
|
33
|
-
result.data[endpoint].webhookSubscription);
|
|
34
|
-
}
|
|
35
|
-
function buildCheckQuery(_a) {
|
|
36
|
-
var topic = _a.topic;
|
|
37
|
-
return "{\n webhookSubscriptions(first: 1, topics: ".concat(topic, ") {\n edges {\n node {\n id\n endpoint {\n __typename\n ... on WebhookHttpEndpoint {\n callbackUrl\n }\n ... on WebhookEventBridgeEndpoint {\n arn\n }\n ... on WebhookPubSubEndpoint {\n pubSubProject\n pubSubTopic\n }\n }\n }\n }\n }\n }");
|
|
7
|
+
var types_1 = require("./types");
|
|
8
|
+
function createRegistry() {
|
|
9
|
+
return {};
|
|
38
10
|
}
|
|
39
|
-
exports.
|
|
40
|
-
function buildQuery(_a) {
|
|
41
|
-
var _b;
|
|
42
|
-
var topic = _a.topic, address = _a.address, _c = _a.deliveryMethod, deliveryMethod = _c === void 0 ? types_2.DeliveryMethod.Http : _c, webhookId = _a.webhookId;
|
|
43
|
-
var identifier;
|
|
44
|
-
if (webhookId) {
|
|
45
|
-
identifier = "id: \"".concat(webhookId, "\"");
|
|
46
|
-
}
|
|
47
|
-
else {
|
|
48
|
-
identifier = "topic: ".concat(topic);
|
|
49
|
-
}
|
|
50
|
-
var mutationName;
|
|
51
|
-
var webhookSubscriptionArgs;
|
|
52
|
-
var pubSubProject;
|
|
53
|
-
var pubSubTopic;
|
|
54
|
-
switch (deliveryMethod) {
|
|
55
|
-
case types_2.DeliveryMethod.Http:
|
|
56
|
-
mutationName = webhookId
|
|
57
|
-
? 'webhookSubscriptionUpdate'
|
|
58
|
-
: 'webhookSubscriptionCreate';
|
|
59
|
-
webhookSubscriptionArgs = "{callbackUrl: \"".concat(address, "\"}");
|
|
60
|
-
break;
|
|
61
|
-
case types_2.DeliveryMethod.EventBridge:
|
|
62
|
-
mutationName = webhookId
|
|
63
|
-
? 'eventBridgeWebhookSubscriptionUpdate'
|
|
64
|
-
: 'eventBridgeWebhookSubscriptionCreate';
|
|
65
|
-
webhookSubscriptionArgs = "{arn: \"".concat(address, "\"}");
|
|
66
|
-
break;
|
|
67
|
-
case types_2.DeliveryMethod.PubSub:
|
|
68
|
-
mutationName = webhookId
|
|
69
|
-
? 'pubSubWebhookSubscriptionUpdate'
|
|
70
|
-
: 'pubSubWebhookSubscriptionCreate';
|
|
71
|
-
_b = tslib_1.__read(address
|
|
72
|
-
.replace(/^pubsub:\/\//, '')
|
|
73
|
-
.split(':'), 2), pubSubProject = _b[0], pubSubTopic = _b[1];
|
|
74
|
-
webhookSubscriptionArgs = "{pubSubProject: \"".concat(pubSubProject, "\",\n pubSubTopic: \"").concat(pubSubTopic, "\"}");
|
|
75
|
-
break;
|
|
76
|
-
}
|
|
77
|
-
return "\n mutation webhookSubscription {\n ".concat(mutationName, "(").concat(identifier, ", webhookSubscription: ").concat(webhookSubscriptionArgs, ") {\n userErrors {\n field\n message\n }\n webhookSubscription {\n id\n }\n }\n }\n ");
|
|
78
|
-
}
|
|
79
|
-
exports.buildQuery = buildQuery;
|
|
11
|
+
exports.createRegistry = createRegistry;
|
|
80
12
|
function topicForStorage(topic) {
|
|
81
13
|
return topic.toUpperCase().replace(/\//g, '_');
|
|
82
14
|
}
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
15
|
+
exports.topicForStorage = topicForStorage;
|
|
16
|
+
function createAddHandlers(config, webhookRegistry) {
|
|
17
|
+
return function addHandlers(handlersToAdd) {
|
|
18
|
+
Object.entries(handlersToAdd).forEach(function (_a) {
|
|
19
|
+
var e_1, _b;
|
|
20
|
+
var _c = tslib_1.__read(_a, 2), topic = _c[0], handlers = _c[1];
|
|
21
|
+
var topicKey = topicForStorage(topic);
|
|
22
|
+
if (Array.isArray(handlers)) {
|
|
23
|
+
try {
|
|
24
|
+
for (var handlers_1 = tslib_1.__values(handlers), handlers_1_1 = handlers_1.next(); !handlers_1_1.done; handlers_1_1 = handlers_1.next()) {
|
|
25
|
+
var handler = handlers_1_1.value;
|
|
26
|
+
mergeOrAddHandler(config, webhookRegistry, topicKey, handler);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
30
|
+
finally {
|
|
31
|
+
try {
|
|
32
|
+
if (handlers_1_1 && !handlers_1_1.done && (_b = handlers_1.return)) _b.call(handlers_1);
|
|
33
|
+
}
|
|
34
|
+
finally { if (e_1) throw e_1.error; }
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
mergeOrAddHandler(config, webhookRegistry, topicKey, handlers);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
101
41
|
};
|
|
102
42
|
}
|
|
103
|
-
exports.
|
|
104
|
-
function createGetTopicsAdded(
|
|
43
|
+
exports.createAddHandlers = createAddHandlers;
|
|
44
|
+
function createGetTopicsAdded(webhookRegistry) {
|
|
105
45
|
return function getTopicsAdded() {
|
|
106
|
-
return Object.keys(
|
|
46
|
+
return Object.keys(webhookRegistry);
|
|
107
47
|
};
|
|
108
48
|
}
|
|
109
49
|
exports.createGetTopicsAdded = createGetTopicsAdded;
|
|
110
|
-
function
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
var path = _a.path, topic = _a.topic, accessToken = _a.accessToken, shop = _a.shop, _b = _a.deliveryMethod, deliveryMethod = _b === void 0 ? types_2.DeliveryMethod.Http : _b;
|
|
114
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
115
|
-
var registerReturn, client, address, checkResult, error_1, result, webhookId, mustRegister, node, endpointAddress, result;
|
|
116
|
-
return tslib_1.__generator(this, function (_c) {
|
|
117
|
-
switch (_c.label) {
|
|
118
|
-
case 0:
|
|
119
|
-
registerReturn = {};
|
|
120
|
-
if (base_types_1.gdprTopics.includes(topic)) {
|
|
121
|
-
registerReturn[topic] = {
|
|
122
|
-
success: false,
|
|
123
|
-
result: {
|
|
124
|
-
errors: [
|
|
125
|
-
{
|
|
126
|
-
message: "GDPR topic '".concat(topic, "' cannot be registered here. Please set the appropriate webhook endpoint in the 'GDPR mandatory webhooks' section of 'App setup' in the Partners Dashboard"),
|
|
127
|
-
},
|
|
128
|
-
],
|
|
129
|
-
},
|
|
130
|
-
};
|
|
131
|
-
return [2 /*return*/, registerReturn];
|
|
132
|
-
}
|
|
133
|
-
client = new GraphqlClient({ domain: shop, accessToken: accessToken });
|
|
134
|
-
address = deliveryMethod === types_2.DeliveryMethod.Http
|
|
135
|
-
? "".concat(config.hostScheme, "://").concat(config.hostName).concat(path)
|
|
136
|
-
: path;
|
|
137
|
-
_c.label = 1;
|
|
138
|
-
case 1:
|
|
139
|
-
_c.trys.push([1, 3, , 4]);
|
|
140
|
-
return [4 /*yield*/, client.query({
|
|
141
|
-
data: buildCheckQuery({ topic: topic }),
|
|
142
|
-
})];
|
|
143
|
-
case 2:
|
|
144
|
-
checkResult = _c.sent();
|
|
145
|
-
return [3 /*break*/, 4];
|
|
146
|
-
case 3:
|
|
147
|
-
error_1 = _c.sent();
|
|
148
|
-
result = error_1 instanceof ShopifyErrors.GraphqlQueryError ? error_1.response : {};
|
|
149
|
-
registerReturn[topic] = { success: false, result: result };
|
|
150
|
-
return [2 /*return*/, registerReturn];
|
|
151
|
-
case 4:
|
|
152
|
-
mustRegister = true;
|
|
153
|
-
if (checkResult.body.data.webhookSubscriptions.edges.length) {
|
|
154
|
-
node = checkResult.body.data.webhookSubscriptions.edges[0].node;
|
|
155
|
-
endpointAddress = '';
|
|
156
|
-
if (node.endpoint.__typename === 'WebhookHttpEndpoint') {
|
|
157
|
-
endpointAddress = node.endpoint.callbackUrl;
|
|
158
|
-
}
|
|
159
|
-
else if (node.endpoint.__typename === 'WebhookEventBridgeEndpoint') {
|
|
160
|
-
endpointAddress = node.endpoint.arn;
|
|
161
|
-
}
|
|
162
|
-
webhookId = node.id;
|
|
163
|
-
if (endpointAddress === address) {
|
|
164
|
-
mustRegister = false;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
if (!mustRegister) return [3 /*break*/, 6];
|
|
168
|
-
return [4 /*yield*/, client.query({
|
|
169
|
-
data: buildQuery({ topic: topic, address: address, deliveryMethod: deliveryMethod, webhookId: webhookId }),
|
|
170
|
-
})];
|
|
171
|
-
case 5:
|
|
172
|
-
result = _c.sent();
|
|
173
|
-
registerReturn[topic] = {
|
|
174
|
-
success: isSuccess(result.body, deliveryMethod, webhookId),
|
|
175
|
-
result: result.body,
|
|
176
|
-
};
|
|
177
|
-
return [3 /*break*/, 7];
|
|
178
|
-
case 6:
|
|
179
|
-
registerReturn[topic] = {
|
|
180
|
-
success: true,
|
|
181
|
-
result: {},
|
|
182
|
-
};
|
|
183
|
-
_c.label = 7;
|
|
184
|
-
case 7: return [2 /*return*/, registerReturn];
|
|
185
|
-
}
|
|
186
|
-
});
|
|
187
|
-
});
|
|
50
|
+
function createGetHandlers(webhookRegistry) {
|
|
51
|
+
return function getHandlers(topic) {
|
|
52
|
+
return webhookRegistry[topicForStorage(topic)] || [];
|
|
188
53
|
};
|
|
189
54
|
}
|
|
190
|
-
exports.
|
|
191
|
-
function
|
|
192
|
-
var
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
registerReturn = {};
|
|
204
|
-
topics = getTopicsAdded();
|
|
205
|
-
_c.label = 1;
|
|
206
|
-
case 1:
|
|
207
|
-
_c.trys.push([1, 6, 7, 8]);
|
|
208
|
-
topics_1 = tslib_1.__values(topics), topics_1_1 = topics_1.next();
|
|
209
|
-
_c.label = 2;
|
|
210
|
-
case 2:
|
|
211
|
-
if (!!topics_1_1.done) return [3 /*break*/, 5];
|
|
212
|
-
topic = topics_1_1.value;
|
|
213
|
-
handler = getHttpHandler(topic);
|
|
214
|
-
if (!handler) return [3 /*break*/, 4];
|
|
215
|
-
webhook = {
|
|
216
|
-
path: path,
|
|
217
|
-
topic: topic,
|
|
218
|
-
accessToken: accessToken,
|
|
219
|
-
shop: shop,
|
|
220
|
-
deliveryMethod: types_2.DeliveryMethod.Http,
|
|
221
|
-
};
|
|
222
|
-
return [4 /*yield*/, register(webhook)];
|
|
223
|
-
case 3:
|
|
224
|
-
returnedRegister = _c.sent();
|
|
225
|
-
registerReturn = tslib_1.__assign(tslib_1.__assign({}, registerReturn), returnedRegister);
|
|
226
|
-
_c.label = 4;
|
|
227
|
-
case 4:
|
|
228
|
-
topics_1_1 = topics_1.next();
|
|
229
|
-
return [3 /*break*/, 2];
|
|
230
|
-
case 5: return [3 /*break*/, 8];
|
|
231
|
-
case 6:
|
|
232
|
-
e_1_1 = _c.sent();
|
|
233
|
-
e_1 = { error: e_1_1 };
|
|
234
|
-
return [3 /*break*/, 8];
|
|
235
|
-
case 7:
|
|
236
|
-
try {
|
|
237
|
-
if (topics_1_1 && !topics_1_1.done && (_b = topics_1.return)) _b.call(topics_1);
|
|
238
|
-
}
|
|
239
|
-
finally { if (e_1) throw e_1.error; }
|
|
240
|
-
return [7 /*endfinally*/];
|
|
241
|
-
case 8: return [2 /*return*/, registerReturn];
|
|
242
|
-
}
|
|
243
|
-
});
|
|
244
|
-
});
|
|
245
|
-
};
|
|
55
|
+
exports.createGetHandlers = createGetHandlers;
|
|
56
|
+
function handlerIdentifier(config, handler) {
|
|
57
|
+
var prefix = handler.deliveryMethod;
|
|
58
|
+
switch (handler.deliveryMethod) {
|
|
59
|
+
case types_1.DeliveryMethod.Http:
|
|
60
|
+
return "".concat(prefix, "_").concat(addHostToCallbackUrl(config, handler.callbackUrl));
|
|
61
|
+
case types_1.DeliveryMethod.EventBridge:
|
|
62
|
+
return "".concat(prefix, "_").concat(handler.arn);
|
|
63
|
+
case types_1.DeliveryMethod.PubSub:
|
|
64
|
+
return "".concat(prefix, "_").concat(handler.pubSubProject, ":").concat(handler.pubSubTopic);
|
|
65
|
+
default:
|
|
66
|
+
throw new error_1.InvalidDeliveryMethodError("Unrecognized delivery method '".concat(handler.deliveryMethod, "'"));
|
|
67
|
+
}
|
|
246
68
|
}
|
|
247
|
-
exports.
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
missingHeaders.push(base_types_1.ShopifyHeader.Topic);
|
|
69
|
+
exports.handlerIdentifier = handlerIdentifier;
|
|
70
|
+
function addHostToCallbackUrl(config, callbackUrl) {
|
|
71
|
+
if (callbackUrl.startsWith('/')) {
|
|
72
|
+
return "".concat(config.hostScheme, "://").concat(config.hostName).concat(callbackUrl);
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
return callbackUrl;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.addHostToCallbackUrl = addHostToCallbackUrl;
|
|
79
|
+
function mergeOrAddHandler(config, webhookRegistry, topic, handler) {
|
|
80
|
+
var _a, _b, _c;
|
|
81
|
+
(_a = handler.includeFields) === null || _a === void 0 ? void 0 : _a.sort();
|
|
82
|
+
(_b = handler.metafieldNamespaces) === null || _b === void 0 ? void 0 : _b.sort();
|
|
83
|
+
if (handler.deliveryMethod === types_1.DeliveryMethod.Http) {
|
|
84
|
+
(_c = handler.privateMetafieldNamespaces) === null || _c === void 0 ? void 0 : _c.sort();
|
|
85
|
+
}
|
|
86
|
+
if (!(topic in webhookRegistry)) {
|
|
87
|
+
webhookRegistry[topic] = [handler];
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
var identifier = handlerIdentifier(config, handler);
|
|
91
|
+
for (var index in webhookRegistry[topic]) {
|
|
92
|
+
if (!Object.prototype.hasOwnProperty.call(webhookRegistry[topic], index)) {
|
|
93
|
+
continue;
|
|
273
94
|
}
|
|
274
|
-
|
|
275
|
-
|
|
95
|
+
var existingHandler = webhookRegistry[topic][index];
|
|
96
|
+
var existingIdentifier = handlerIdentifier(config, existingHandler);
|
|
97
|
+
if (identifier !== existingIdentifier) {
|
|
98
|
+
continue;
|
|
276
99
|
}
|
|
277
|
-
if (
|
|
278
|
-
|
|
279
|
-
|
|
100
|
+
if (handler.deliveryMethod === types_1.DeliveryMethod.Http) {
|
|
101
|
+
config.logFunction(base_types_1.LogSeverity.Info, "Detected multiple handlers for '".concat(topic, "', webhooks.process will call them sequentially"));
|
|
102
|
+
break;
|
|
280
103
|
}
|
|
281
104
|
else {
|
|
282
|
-
|
|
283
|
-
retVal.topic = topic;
|
|
284
|
-
retVal.domain = domain;
|
|
105
|
+
throw new error_1.InvalidDeliveryMethodError("Can only add multiple handlers when deliveryMethod is Http. Invalid handler: ".concat(JSON.stringify(handler)));
|
|
285
106
|
}
|
|
286
107
|
}
|
|
287
|
-
|
|
288
|
-
retVal.webhookOk = false;
|
|
289
|
-
retVal.errorMessage = 'No body was received when processing webhook';
|
|
290
|
-
}
|
|
291
|
-
return retVal;
|
|
292
|
-
}
|
|
293
|
-
function createProcess(config, httpWebhookRegistry) {
|
|
294
|
-
var getHttpHandler = createGetHttpHandler(httpWebhookRegistry);
|
|
295
|
-
return function process(_a) {
|
|
296
|
-
var rawBody = _a.rawBody, adapterArgs = tslib_1.__rest(_a, ["rawBody"]);
|
|
297
|
-
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
298
|
-
var request, response, webhookCheck, webhookOk, hmac, topic, domain, errorMessage, generatedHash, graphqlTopic, handler, error_2, returnResponse;
|
|
299
|
-
return tslib_1.__generator(this, function (_b) {
|
|
300
|
-
switch (_b.label) {
|
|
301
|
-
case 0: return [4 /*yield*/, (0, http_1.abstractConvertRequest)(adapterArgs)];
|
|
302
|
-
case 1:
|
|
303
|
-
request = _b.sent();
|
|
304
|
-
response = {
|
|
305
|
-
statusCode: network_1.StatusCode.Ok,
|
|
306
|
-
statusText: statusTextLookup[network_1.StatusCode.Ok],
|
|
307
|
-
headers: {},
|
|
308
|
-
};
|
|
309
|
-
webhookCheck = checkWebhookRequest(rawBody, request.headers);
|
|
310
|
-
webhookOk = webhookCheck.webhookOk, hmac = webhookCheck.hmac, topic = webhookCheck.topic, domain = webhookCheck.domain;
|
|
311
|
-
errorMessage = webhookCheck.errorMessage;
|
|
312
|
-
if (!webhookOk) return [3 /*break*/, 11];
|
|
313
|
-
return [4 /*yield*/, (0, crypto_1.createSHA256HMAC)(config.apiSecretKey, rawBody, types_1.HashFormat.Base64)];
|
|
314
|
-
case 2:
|
|
315
|
-
generatedHash = _b.sent();
|
|
316
|
-
if (!(0, safe_compare_1.safeCompare)(generatedHash, hmac)) return [3 /*break*/, 9];
|
|
317
|
-
graphqlTopic = topicForStorage(topic);
|
|
318
|
-
handler = getHttpHandler(graphqlTopic);
|
|
319
|
-
if (!handler) return [3 /*break*/, 7];
|
|
320
|
-
_b.label = 3;
|
|
321
|
-
case 3:
|
|
322
|
-
_b.trys.push([3, 5, , 6]);
|
|
323
|
-
return [4 /*yield*/, handler(graphqlTopic, domain, rawBody)];
|
|
324
|
-
case 4:
|
|
325
|
-
_b.sent();
|
|
326
|
-
response.statusCode = network_1.StatusCode.Ok;
|
|
327
|
-
return [3 /*break*/, 6];
|
|
328
|
-
case 5:
|
|
329
|
-
error_2 = _b.sent();
|
|
330
|
-
response.statusCode = network_1.StatusCode.InternalServerError;
|
|
331
|
-
errorMessage = error_2.message;
|
|
332
|
-
return [3 /*break*/, 6];
|
|
333
|
-
case 6: return [3 /*break*/, 8];
|
|
334
|
-
case 7:
|
|
335
|
-
response.statusCode = network_1.StatusCode.NotFound;
|
|
336
|
-
errorMessage = "No webhook is registered for topic ".concat(topic);
|
|
337
|
-
_b.label = 8;
|
|
338
|
-
case 8: return [3 /*break*/, 10];
|
|
339
|
-
case 9:
|
|
340
|
-
response.statusCode = network_1.StatusCode.Unauthorized;
|
|
341
|
-
errorMessage = "Could not validate request for topic ".concat(topic);
|
|
342
|
-
_b.label = 10;
|
|
343
|
-
case 10: return [3 /*break*/, 12];
|
|
344
|
-
case 11:
|
|
345
|
-
response.statusCode = network_1.StatusCode.BadRequest;
|
|
346
|
-
_b.label = 12;
|
|
347
|
-
case 12:
|
|
348
|
-
response.statusText = statusTextLookup[response.statusCode];
|
|
349
|
-
return [4 /*yield*/, (0, http_1.abstractConvertResponse)(response, adapterArgs)];
|
|
350
|
-
case 13:
|
|
351
|
-
returnResponse = _b.sent();
|
|
352
|
-
if (!(0, http_1.isOK)(response)) {
|
|
353
|
-
throw new ShopifyErrors.InvalidWebhookError({
|
|
354
|
-
message: errorMessage,
|
|
355
|
-
response: returnResponse,
|
|
356
|
-
});
|
|
357
|
-
}
|
|
358
|
-
return [2 /*return*/, Promise.resolve(returnResponse)];
|
|
359
|
-
}
|
|
360
|
-
});
|
|
361
|
-
});
|
|
362
|
-
};
|
|
108
|
+
webhookRegistry[topic].push(handler);
|
|
363
109
|
}
|
|
364
|
-
exports.createProcess = createProcess;
|
|
365
110
|
//# sourceMappingURL=registry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["registry.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["registry.ts"],"names":[],"mappings":"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"}
|
package/lib/webhooks/types.d.ts
CHANGED
|
@@ -6,25 +6,48 @@ export declare enum DeliveryMethod {
|
|
|
6
6
|
PubSub = "pubsub"
|
|
7
7
|
}
|
|
8
8
|
export declare type WebhookHandlerFunction = (topic: string, shop_domain: string, body: string) => Promise<void>;
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
interface BaseWebhookHandler {
|
|
10
|
+
id?: string;
|
|
11
|
+
includeFields?: string[];
|
|
12
|
+
metafieldNamespaces?: string[];
|
|
11
13
|
}
|
|
12
|
-
export interface
|
|
13
|
-
|
|
14
|
+
export interface HttpWebhookHandler extends BaseWebhookHandler {
|
|
15
|
+
deliveryMethod: DeliveryMethod.Http;
|
|
16
|
+
privateMetafieldNamespaces?: string[];
|
|
17
|
+
callbackUrl: string;
|
|
18
|
+
callback: WebhookHandlerFunction;
|
|
19
|
+
}
|
|
20
|
+
export interface EventBridgeWebhookHandler extends BaseWebhookHandler {
|
|
21
|
+
deliveryMethod: DeliveryMethod.EventBridge;
|
|
22
|
+
arn: string;
|
|
23
|
+
}
|
|
24
|
+
export interface PubSubWebhookHandler extends BaseWebhookHandler {
|
|
25
|
+
deliveryMethod: DeliveryMethod.PubSub;
|
|
26
|
+
pubSubProject: string;
|
|
27
|
+
pubSubTopic: string;
|
|
28
|
+
}
|
|
29
|
+
export declare type WebhookHandler = HttpWebhookHandler | EventBridgeWebhookHandler | PubSubWebhookHandler;
|
|
30
|
+
export interface WebhookRegistry {
|
|
31
|
+
[topic: string]: WebhookHandler[];
|
|
32
|
+
}
|
|
33
|
+
export declare enum WebhookOperation {
|
|
34
|
+
Create = "create",
|
|
35
|
+
Update = "update",
|
|
36
|
+
Delete = "delete"
|
|
37
|
+
}
|
|
38
|
+
export interface RegisterParams {
|
|
14
39
|
shop: string;
|
|
15
40
|
accessToken: string;
|
|
16
41
|
}
|
|
17
|
-
export interface
|
|
18
|
-
|
|
19
|
-
deliveryMethod
|
|
42
|
+
export interface RegisterResult {
|
|
43
|
+
success: boolean;
|
|
44
|
+
deliveryMethod: DeliveryMethod;
|
|
45
|
+
result: unknown;
|
|
20
46
|
}
|
|
21
47
|
export interface RegisterReturn {
|
|
22
|
-
[topic: string]:
|
|
23
|
-
success: boolean;
|
|
24
|
-
result: unknown;
|
|
25
|
-
};
|
|
48
|
+
[topic: string]: RegisterResult[];
|
|
26
49
|
}
|
|
27
|
-
interface WebhookCheckResponseNode<T = {
|
|
50
|
+
export interface WebhookCheckResponseNode<T = {
|
|
28
51
|
endpoint: {
|
|
29
52
|
__typename: 'WebhookHttpEndpoint';
|
|
30
53
|
callbackUrl: string;
|
|
@@ -39,27 +62,25 @@ interface WebhookCheckResponseNode<T = {
|
|
|
39
62
|
}> {
|
|
40
63
|
node: {
|
|
41
64
|
id: string;
|
|
65
|
+
topic: string;
|
|
66
|
+
includeFields: string[];
|
|
67
|
+
metafieldNamespaces: string[];
|
|
68
|
+
privateMetafieldNamespaces: string[];
|
|
42
69
|
} & T;
|
|
43
70
|
}
|
|
44
71
|
export interface WebhookCheckResponse<T = WebhookCheckResponseNode> {
|
|
45
72
|
data: {
|
|
46
73
|
webhookSubscriptions: {
|
|
47
74
|
edges: T[];
|
|
75
|
+
pageInfo: {
|
|
76
|
+
endCursor: string;
|
|
77
|
+
hasNextPage: boolean;
|
|
78
|
+
};
|
|
48
79
|
};
|
|
49
80
|
};
|
|
50
81
|
}
|
|
51
|
-
export interface
|
|
52
|
-
topic: string;
|
|
53
|
-
}
|
|
54
|
-
export interface BuildQueryParams {
|
|
55
|
-
topic: string;
|
|
56
|
-
address: string;
|
|
57
|
-
deliveryMethod: DeliveryMethod;
|
|
58
|
-
webhookId?: string;
|
|
59
|
-
}
|
|
60
|
-
export interface AddHandlerParams {
|
|
61
|
-
topic: string;
|
|
62
|
-
handler: WebhookHandlerFunction;
|
|
82
|
+
export interface AddHandlersParams {
|
|
83
|
+
[topic: string]: WebhookHandler | WebhookHandler[];
|
|
63
84
|
}
|
|
64
85
|
export interface WebhookProcessParams extends AdapterArgs {
|
|
65
86
|
rawBody: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAC;AAE1C,OAAO,KAAK,EAAC,eAAe,EAAC,MAAM,GAAG,CAAC;AAEvC,oBAAY,cAAc;IACxB,IAAI,SAAS;IACb,WAAW,gBAAgB;IAC3B,MAAM,WAAW;CAClB;AAED,oBAAY,sBAAsB,GAAG,CACnC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,EACnB,IAAI,EAAE,MAAM,KACT,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":"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"}
|
package/lib/webhooks/types.js
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DeliveryMethod = void 0;
|
|
3
|
+
exports.WebhookOperation = exports.DeliveryMethod = void 0;
|
|
4
4
|
var DeliveryMethod;
|
|
5
5
|
(function (DeliveryMethod) {
|
|
6
6
|
DeliveryMethod["Http"] = "http";
|
|
7
7
|
DeliveryMethod["EventBridge"] = "eventbridge";
|
|
8
8
|
DeliveryMethod["PubSub"] = "pubsub";
|
|
9
9
|
})(DeliveryMethod = exports.DeliveryMethod || (exports.DeliveryMethod = {}));
|
|
10
|
+
var WebhookOperation;
|
|
11
|
+
(function (WebhookOperation) {
|
|
12
|
+
WebhookOperation["Create"] = "create";
|
|
13
|
+
WebhookOperation["Update"] = "update";
|
|
14
|
+
WebhookOperation["Delete"] = "delete";
|
|
15
|
+
})(WebhookOperation = exports.WebhookOperation || (exports.WebhookOperation = {}));
|
|
10
16
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":";;;AAIA,IAAY,cAIX;AAJD,WAAY,cAAc;IACxB,+BAAa,CAAA;IACb,6CAA2B,CAAA;IAC3B,mCAAiB,CAAA;AACnB,CAAC,EAJW,cAAc,GAAd,sBAAc,KAAd,sBAAc,QAIzB"}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["types.ts"],"names":[],"mappings":";;;AAIA,IAAY,cAIX;AAJD,WAAY,cAAc;IACxB,+BAAa,CAAA;IACb,6CAA2B,CAAA;IAC3B,mCAAiB,CAAA;AACnB,CAAC,EAJW,cAAc,GAAd,sBAAc,KAAd,sBAAc,QAIzB;AA0CD,IAAY,gBAIX;AAJD,WAAY,gBAAgB;IAC1B,qCAAiB,CAAA;IACjB,qCAAiB,CAAA;IACjB,qCAAiB,CAAA;AACnB,CAAC,EAJW,gBAAgB,GAAhB,wBAAgB,KAAhB,wBAAgB,QAI3B"}
|