@agnostack/next-shopify 1.7.7-alpha.1 → 1.7.7-alpha.3
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.
|
@@ -25,7 +25,8 @@ const handleAppUninstalled = (serverRuntimeConfig) => async (req, res) => {
|
|
|
25
25
|
if (utils_1.stringEmpty(shop)) {
|
|
26
26
|
return res.status(200).json({ handler: 'uninstall', error: 'Missing shop' });
|
|
27
27
|
}
|
|
28
|
-
const { shopify, findSessionIds, deleteSessions } = await
|
|
28
|
+
// const { shopify, findSessionIds, deleteSessions } = await getShopifyHelpers(serverRuntimeConfig, { shop })
|
|
29
|
+
const { shopify, findSessionIds } = await utils_1.getShopifyHelpers(serverRuntimeConfig, { shop });
|
|
29
30
|
// NOTE raw request body is required for Shopify webhook validation
|
|
30
31
|
const rawBody = await raw_body_1.default(req);
|
|
31
32
|
const _b = await shopify.webhooks.validate({
|
|
@@ -37,7 +38,8 @@ const handleAppUninstalled = (serverRuntimeConfig) => async (req, res) => {
|
|
|
37
38
|
try {
|
|
38
39
|
const sessionsIds = await findSessionIds(shop);
|
|
39
40
|
if (utils_1.arrayNotEmpty(sessionsIds)) {
|
|
40
|
-
|
|
41
|
+
console.log(`>>> ~ SKIP sessionsIds`, sessionsIds);
|
|
42
|
+
// await deleteSessions(sessionsIds)
|
|
41
43
|
}
|
|
42
44
|
return res.status(200).json({ handler: 'uninstall', message: 'success' });
|
|
43
45
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/handlers/api/uninstall.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,wDAAiC;AAEjC,uCAIoB;AAEpB,4DAA4D;AACrD,MAAM,oBAAoB,GAAG,CAAC,mBAAmB,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;;IAC9E,IAAI;QACF,MAAM,EAAE,uBAAuB,EAAE,IAAI,EAAE,GAAG,MAAA,GAAG,CAAC,OAAO,mCAAI,EAAE,CAAA;QAE3D,IAAI,mBAAW,CAAC,IAAI,CAAC,EAAE;YACrB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAA;SAC7E;QAED,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"uninstall.js","sourceRoot":"","sources":["../../../src/handlers/api/uninstall.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,wDAAiC;AAEjC,uCAIoB;AAEpB,4DAA4D;AACrD,MAAM,oBAAoB,GAAG,CAAC,mBAAmB,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;;IAC9E,IAAI;QACF,MAAM,EAAE,uBAAuB,EAAE,IAAI,EAAE,GAAG,MAAA,GAAG,CAAC,OAAO,mCAAI,EAAE,CAAA;QAE3D,IAAI,mBAAW,CAAC,IAAI,CAAC,EAAE;YACrB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAA;SAC7E;QAED,6GAA6G;QAC7G,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,yBAAiB,CAAC,mBAAmB,EAAE,EAAE,IAAI,EAAE,CAAC,CAAA;QAE1F,mEAAmE;QACnE,MAAM,OAAO,GAAG,MAAM,kBAAU,CAAC,GAAG,CAAC,CAAA;QACrC,MAAM,KAA6B,MAAM,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACjE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE;YAC3B,UAAU,EAAE,GAAG;YACf,WAAW,EAAE,GAAG;SACjB,CAAC,EAJI,EAAE,KAAK,OAIX,EAJgB,YAAY,cAAxB,SAA0B,CAI9B,CAAA;QAEF,IAAI,KAAK,EAAE;YACT,IAAI;gBACF,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAA;gBAC9C,IAAI,qBAAa,CAAC,WAAW,CAAC,EAAE;oBAC9B,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,WAAW,CAAC,CAAA;oBAClD,oCAAoC;iBACrC;gBACD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;aAC1E;YAAC,OAAO,KAAK,EAAE;gBACd,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,OAAO,EAAE,CAAC,CAAA;aAC7E;SACF;QAED,OAAO,CAAC,IAAI,CAAC,sCAAsC,EAAE,YAAY,CAAC,CAAA;QAClE,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,sCAAsC,EAAE,CAAC,CAAA;KACrG;IAAC,OAAO,KAAK,EAAE;QACd,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAA;QAChD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAA;KACzF;AACH,CAAC,CAAA;AAtCY,QAAA,oBAAoB,wBAsChC"}
|
package/dist/utils/session.js
CHANGED
|
@@ -20,14 +20,6 @@ const display_1 = require("./display");
|
|
|
20
20
|
const shopify_1 = require("./shopify");
|
|
21
21
|
const firebase_1 = require("./firebase");
|
|
22
22
|
const errors_1 = require("./errors");
|
|
23
|
-
const getPublicKey = (encryptedPublicKey, sharedSecret) => {
|
|
24
|
-
const { initialVector: hiddenPublicIv, encrypted: recryptedPublicKey, } = crypto_1.getRecrypted(encryptedPublicKey);
|
|
25
|
-
return crypto_1.wrapKeyData(crypto_1.decryptAES(recryptedPublicKey, sharedSecret, hiddenPublicIv), 'RSA PUBLIC');
|
|
26
|
-
};
|
|
27
|
-
const getPrivateKey = (encryptedPrivateKey, sharedSecret) => {
|
|
28
|
-
const { initialVector: hiddenPrivateIv, encrypted: recryptedPrivateKey, } = crypto_1.getRecrypted(encryptedPrivateKey);
|
|
29
|
-
return crypto_1.wrapKeyData(crypto_1.decryptAES(recryptedPrivateKey, sharedSecret, hiddenPrivateIv));
|
|
30
|
-
};
|
|
31
23
|
const getShopifyHelpers = async (serverRuntimeConfig, { shop }) => {
|
|
32
24
|
var _a;
|
|
33
25
|
const shopify = await shopify_1.getInitializedShopify(serverRuntimeConfig);
|
|
@@ -36,6 +28,13 @@ const getShopifyHelpers = async (serverRuntimeConfig, { shop }) => {
|
|
|
36
28
|
collection: FB_ROOT_COLLECTION,
|
|
37
29
|
config: { configurationId: APP_ID, shop: (_a = shopify === null || shopify === void 0 ? void 0 : shopify.utils) === null || _a === void 0 ? void 0 : _a.sanitizeShop(shop) },
|
|
38
30
|
});
|
|
31
|
+
const _now = Date.now();
|
|
32
|
+
console.log(`>>> > ${_now - Date.now()} > getShopifyHelpers > get crypto`);
|
|
33
|
+
const { initialVector: hiddenPublicIv, encrypted: recryptedPublicKey, } = crypto_1.getRecrypted(SESSION_CONFIG.encryptedPublicKey);
|
|
34
|
+
const publicKey = (crypto_1.decryptAES(recryptedPublicKey, SESSION_CONFIG.sharedSecret, hiddenPublicIv), 'RSA PUBLIC');
|
|
35
|
+
const { initialVector: hiddenPrivateIv, encrypted: recryptedPrivateKey, } = crypto_1.getRecrypted(SESSION_CONFIG.encryptedPrivateKey);
|
|
36
|
+
const privateKey = crypto_1.wrapKeyData(crypto_1.decryptAES(recryptedPrivateKey, SESSION_CONFIG.sharedSecret, hiddenPrivateIv));
|
|
37
|
+
console.log(`>>> > ${_now - Date.now()} > getShopifyHelpers > have crypto`);
|
|
39
38
|
const decryptVerifySession = async ({ req, res } = {}) => {
|
|
40
39
|
var _a, _b;
|
|
41
40
|
const now = Date.now();
|
|
@@ -62,8 +61,6 @@ const getShopifyHelpers = async (serverRuntimeConfig, { shop }) => {
|
|
|
62
61
|
if (!sessionActive) {
|
|
63
62
|
throw new Error('Inactive session');
|
|
64
63
|
}
|
|
65
|
-
console.log(`>>> > ${now - Date.now()} > decryptVerifySession > get payload`);
|
|
66
|
-
const publicKey = getPublicKey(SESSION_CONFIG.encryptedPublicKey, SESSION_CONFIG.sharedSecret);
|
|
67
64
|
const payload = Object.assign(Object.assign({}, session), { accessToken: JSON.parse(crypto_1.decryptRSAPublic(encryptedAccessToken, publicKey)) });
|
|
68
65
|
console.log(`>>> > ${now - Date.now()} > decryptVerifySession > have payload`);
|
|
69
66
|
return payload;
|
|
@@ -74,7 +71,6 @@ const getShopifyHelpers = async (serverRuntimeConfig, { shop }) => {
|
|
|
74
71
|
};
|
|
75
72
|
const encryptStoreSession = async (_session) => {
|
|
76
73
|
const { accessToken } = _session, session = __rest(_session, ["accessToken"]);
|
|
77
|
-
const privateKey = getPrivateKey(SESSION_CONFIG.encryptedPrivateKey, SESSION_CONFIG.sharedSecret);
|
|
78
74
|
const encryptedAccessToken = crypto_1.encryptRSAPrivate(accessToken, privateKey);
|
|
79
75
|
return firebase_1.storeCallback(sessionHandler, Object.assign(Object.assign({}, session), { accessToken: encryptedAccessToken }));
|
|
80
76
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/utils/session.js"],"names":[],"mappings":";;;;;;;;;;;;;;AAAA,sDAAwD;AACxD,iCAAgC;AAEhC,uCAAyC;AACzC,qCAAqG;AACrG,uCAAoE;AACpE,uCAA6D;AAC7D,yCAMmB;AACnB,qCAAqD;
|
|
1
|
+
{"version":3,"file":"session.js","sourceRoot":"","sources":["../../src/utils/session.js"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agnostack/next-shopify",
|
|
3
|
-
"version": "1.7.7-alpha.
|
|
3
|
+
"version": "1.7.7-alpha.3",
|
|
4
4
|
"author": "agnoStack Dev <developers@agnostack.com> (https://agnostack.com)",
|
|
5
5
|
"owner": "agnoStack",
|
|
6
6
|
"description": "Please contact agnoStack via info@agnostack.com for any questions",
|