@shopify/shopify-app-session-storage-redis 3.0.3 → 3.0.5

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 (39) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/migrations.js +33 -0
  3. package/dist/cjs/migrations.js.map +1 -0
  4. package/dist/cjs/redis-connection.js +51 -0
  5. package/dist/cjs/redis-connection.js.map +1 -0
  6. package/dist/cjs/redis-migrator.js +37 -0
  7. package/dist/cjs/redis-migrator.js.map +1 -0
  8. package/dist/cjs/redis.js +106 -0
  9. package/dist/cjs/redis.js.map +1 -0
  10. package/dist/esm/migrations.mjs +30 -0
  11. package/dist/esm/migrations.mjs.map +1 -0
  12. package/dist/esm/redis-connection.mjs +49 -0
  13. package/dist/esm/redis-connection.mjs.map +1 -0
  14. package/dist/esm/redis-migrator.mjs +35 -0
  15. package/dist/esm/redis-migrator.mjs.map +1 -0
  16. package/dist/esm/redis.mjs +104 -0
  17. package/dist/esm/redis.mjs.map +1 -0
  18. package/dist/tsconfig.build.tsbuildinfo +1 -0
  19. package/package.json +20 -10
  20. package/build/cjs/migrations.js +0 -33
  21. package/build/cjs/redis-connection.js +0 -54
  22. package/build/cjs/redis-migrator.js +0 -39
  23. package/build/cjs/redis.js +0 -111
  24. package/build/ts/migrations.js +0 -83
  25. package/build/ts/migrations.js.map +0 -1
  26. package/build/ts/redis-connection.js +0 -96
  27. package/build/ts/redis-connection.js.map +0 -1
  28. package/build/ts/redis-migrator.js +0 -72
  29. package/build/ts/redis-migrator.js.map +0 -1
  30. package/build/ts/redis.js +0 -237
  31. package/build/ts/redis.js.map +0 -1
  32. /package/{build → dist}/ts/migrations.d.ts +0 -0
  33. /package/{build → dist}/ts/migrations.d.ts.map +0 -0
  34. /package/{build → dist}/ts/redis-connection.d.ts +0 -0
  35. /package/{build → dist}/ts/redis-connection.d.ts.map +0 -0
  36. /package/{build → dist}/ts/redis-migrator.d.ts +0 -0
  37. /package/{build → dist}/ts/redis-migrator.d.ts.map +0 -0
  38. /package/{build → dist}/ts/redis.d.ts +0 -0
  39. /package/{build → dist}/ts/redis.d.ts.map +0 -0
package/README.md CHANGED
@@ -35,4 +35,4 @@ const shopify = shopifyApp({
35
35
  });
36
36
  ```
37
37
 
38
- If you prefer to use your own implementation of a session storage mechanism that is compatible with the `@shopify/shopify-app-express` package, see the [implementing session storage guide](https://github.com/Shopify/shopify-app-js/blob/main/packages/shopify-app-session-storage/implementing-session-storage.md).
38
+ If you prefer to use your own implementation of a session storage mechanism that is compatible with the `@shopify/shopify-app-express` package, see the [implementing session storage guide](../shopify-app-session-storage/implementing-session-storage.md).
@@ -0,0 +1,33 @@
1
+ 'use strict';
2
+
3
+ var shopifyApi = require('@shopify/shopify-api');
4
+ var shopifyAppSessionStorage = require('@shopify/shopify-app-session-storage');
5
+
6
+ const migrationList = [
7
+ new shopifyAppSessionStorage.MigrationOperation(
8
+ // This migration name cannot be changed as it has already been released
9
+ 'migrateToVersion1_0_1', migrateAddShopKeyToTrackSessionsByShop),
10
+ ];
11
+ // need to add shop keys with list of associated session keys to support
12
+ // the new findSessionsByShop in v2.x.x
13
+ async function migrateAddShopKeyToTrackSessionsByShop(connection) {
14
+ const shopsAndSessions = {};
15
+ const keys = await connection.keys('*');
16
+ for (const key of keys) {
17
+ if (key.startsWith(connection.sessionStorageIdentifier)) {
18
+ const session = shopifyApi.Session.fromPropertyArray(JSON.parse((await connection.get(key, false))));
19
+ if (!shopsAndSessions[session.shop]) {
20
+ shopsAndSessions[session.shop] = [];
21
+ }
22
+ shopsAndSessions[session.shop].push(key);
23
+ }
24
+ }
25
+ // eslint-disable-next-line guard-for-in
26
+ for (const shop in shopsAndSessions) {
27
+ await connection.set(shop, JSON.stringify(shopsAndSessions[shop]));
28
+ }
29
+ }
30
+
31
+ exports.migrateAddShopKeyToTrackSessionsByShop = migrateAddShopKeyToTrackSessionsByShop;
32
+ exports.migrationList = migrationList;
33
+ //# sourceMappingURL=migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.js","sources":["../../../src/migrations.ts"],"sourcesContent":[null],"names":["MigrationOperation","Session"],"mappings":";;;;;AAKa,MAAA,aAAa,GAAG;AAC3B,IAAA,IAAIA,2CAAkB;;IAEpB,uBAAuB,EACvB,sCAAsC,CACvC;EACD;AAEF;AACA;AACO,eAAe,sCAAsC,CAC1D,UAA2B,EAAA;IAE3B,MAAM,gBAAgB,GAA6B,EAAE,CAAC;IACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxC,IAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;QACtB,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,wBAAwB,CAAC,EAAE;YACvD,MAAM,OAAO,GAAGC,kBAAO,CAAC,iBAAiB,CACvC,IAAI,CAAC,KAAK,EAAE,MAAM,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,EAAY,CACzD,CAAC;YACF,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACnC,gBAAA,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;aACrC;YACD,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAC1C;KACF;;AAED,IAAA,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE;AACnC,QAAA,MAAM,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACpE;AACH;;;;;"}
@@ -0,0 +1,51 @@
1
+ 'use strict';
2
+
3
+ var redis = require('redis');
4
+
5
+ class RedisConnection {
6
+ constructor(dbUrl, options, keyPrefix) {
7
+ this.eventHandler = (..._args) => { };
8
+ this.init(dbUrl, options);
9
+ this.sessionStorageIdentifier = keyPrefix;
10
+ }
11
+ query(_query, _params) {
12
+ throw new Error('Method not implemented. Use get(string, boolean) instead');
13
+ }
14
+ async connect() {
15
+ await this.client.connect();
16
+ }
17
+ async disconnect() {
18
+ await this.client.quit();
19
+ }
20
+ async keys(name) {
21
+ return this.client.keys(name);
22
+ }
23
+ async set(baseKey, value, addKeyPrefix = true) {
24
+ await this.client.set(this.buildKey(baseKey, addKeyPrefix), value);
25
+ }
26
+ async del(baseKey, addKeyPrefix = true) {
27
+ return this.client.del(this.buildKey(baseKey, addKeyPrefix));
28
+ }
29
+ async get(baseKey, addKeyPrefix = true) {
30
+ return this.client.get(this.buildKey(baseKey, addKeyPrefix));
31
+ }
32
+ generateFullKey(name) {
33
+ return `${this.sessionStorageIdentifier}_${name}`;
34
+ }
35
+ buildKey(baseKey, addKeyPrefix) {
36
+ return addKeyPrefix ? this.generateFullKey(baseKey) : baseKey;
37
+ }
38
+ init(dbUrl, options) {
39
+ this.client = redis.createClient({
40
+ ...options,
41
+ url: dbUrl,
42
+ });
43
+ this.client.on('error', this.eventHandler);
44
+ this.client.on('connect', this.eventHandler);
45
+ this.client.on('reconnecting', this.eventHandler);
46
+ this.client.on('ready', this.eventHandler);
47
+ }
48
+ }
49
+
50
+ exports.RedisConnection = RedisConnection;
51
+ //# sourceMappingURL=redis-connection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-connection.js","sources":["../../../src/redis-connection.ts"],"sourcesContent":[null],"names":["createClient"],"mappings":";;;;MAKa,eAAe,CAAA;AAI1B,IAAA,WAAA,CAAY,KAAa,EAAE,OAA2B,EAAE,SAAiB,EAAA;QAqDjE,IAAY,CAAA,YAAA,GAAG,CAAC,GAAG,KAAY,KAAI,GAAG,CAAC;AApD7C,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC1B,QAAA,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;KAC3C;IAED,KAAK,CAAC,MAAc,EAAE,OAAc,EAAA;AAClC,QAAA,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;KAC7E;AAED,IAAA,MAAM,OAAO,GAAA;AACX,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;KAC7B;AAED,IAAA,MAAM,UAAU,GAAA;AACd,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;KAC1B;IAED,MAAM,IAAI,CAAC,IAAY,EAAA;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAC/B;IAED,MAAM,GAAG,CAAC,OAAe,EAAE,KAAU,EAAE,YAAY,GAAG,IAAI,EAAA;AACxD,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC;KACpE;AAED,IAAA,MAAM,GAAG,CAAC,OAAe,EAAE,YAAY,GAAG,IAAI,EAAA;AAC5C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;KAC9D;AAED,IAAA,MAAM,GAAG,CAAC,OAAe,EAAE,YAAY,GAAG,IAAI,EAAA;AAC5C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;KAC9D;AAED,IAAA,eAAe,CAAC,IAAY,EAAA;AAC1B,QAAA,OAAO,GAAG,IAAI,CAAC,wBAAwB,CAAI,CAAA,EAAA,IAAI,EAAE,CAAC;KACnD;IAEO,QAAQ,CAAC,OAAe,EAAE,YAAqB,EAAA;AACrD,QAAA,OAAO,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;KAC/D;IAEO,IAAI,CAAC,KAAa,EAAE,OAA2B,EAAA;AACrD,QAAA,IAAI,CAAC,MAAM,GAAGA,kBAAY,CAAC;AACzB,YAAA,GAAG,OAAO;AACV,YAAA,GAAG,EAAE,KAAK;AACX,SAAA,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;KAC5C;AAGF;;;;"}
@@ -0,0 +1,37 @@
1
+ 'use strict';
2
+
3
+ var shopifyAppSessionStorage = require('@shopify/shopify-app-session-storage');
4
+
5
+ class RedisSessionStorageMigrator extends shopifyAppSessionStorage.AbstractMigrationEngine {
6
+ constructor(dbConnection, opts = {}, migrations) {
7
+ // The name has already been decided whith the last migration
8
+ opts.migrationDBIdentifier = 'migrations';
9
+ super(dbConnection, opts, migrations);
10
+ }
11
+ async initMigrationPersistence() {
12
+ // nothing to do here
13
+ return Promise.resolve();
14
+ }
15
+ async hasMigrationBeenApplied(migrationName) {
16
+ const migrations = await this.getMigrationRecords();
17
+ const found = migrations.get(migrationName) ?? false;
18
+ return Promise.resolve(found);
19
+ }
20
+ async saveAppliedMigration(migrationName) {
21
+ const migrations = await this.getMigrationRecords();
22
+ migrations.set(migrationName, true);
23
+ this.connection.set(this.options.migrationDBIdentifier, JSON.stringify(Object.fromEntries(migrations)));
24
+ return Promise.resolve();
25
+ }
26
+ async getMigrationRecords() {
27
+ const migrationsRecord = await this.connection.get(this.options.migrationDBIdentifier);
28
+ let migrations = new Map();
29
+ if (migrationsRecord) {
30
+ migrations = new Map(Object.entries(JSON.parse(migrationsRecord)));
31
+ }
32
+ return Promise.resolve(migrations);
33
+ }
34
+ }
35
+
36
+ exports.RedisSessionStorageMigrator = RedisSessionStorageMigrator;
37
+ //# sourceMappingURL=redis-migrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-migrator.js","sources":["../../../src/redis-migrator.ts"],"sourcesContent":[null],"names":["AbstractMigrationEngine"],"mappings":";;;;AAQM,MAAO,2BAA4B,SAAQA,gDAGhD,CAAA;AACC,IAAA,WAAA,CACE,YAA6B,EAC7B,IAA+C,GAAA,EAAE,EACjD,UAAgC,EAAA;;AAGhC,QAAA,IAAI,CAAC,qBAAqB,GAAG,YAAY,CAAC;AAC1C,QAAA,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;KACvC;AAED,IAAA,MAAM,wBAAwB,GAAA;;AAE5B,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;KAC1B;IAED,MAAM,uBAAuB,CAAC,aAAqB,EAAA;AACjD,QAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC;AAErD,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;KAC/B;IAED,MAAM,oBAAoB,CAAC,aAAqB,EAAA;AAC9C,QAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;AACpD,QAAA,UAAU,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAEpC,IAAI,CAAC,UAAU,CAAC,GAAG,CACjB,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAClC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAC/C,CAAC;AAEF,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;KAC1B;AAEO,IAAA,MAAM,mBAAmB,GAAA;AAC/B,QAAA,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAChD,IAAI,CAAC,OAAO,CAAC,qBAAqB,CACnC,CAAC;AACF,QAAA,IAAI,UAAU,GAAyB,IAAI,GAAG,EAAE,CAAC;QACjD,IAAI,gBAAgB,EAAE;AACpB,YAAA,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;SACpE;AAED,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;KACpC;AACF;;;;"}
@@ -0,0 +1,106 @@
1
+ 'use strict';
2
+
3
+ var shopifyApi = require('@shopify/shopify-api');
4
+ var migrations = require('./migrations.js');
5
+ var redisConnection = require('./redis-connection.js');
6
+ var redisMigrator = require('./redis-migrator.js');
7
+
8
+ const defaultRedisSessionStorageOptions = {
9
+ sessionKeyPrefix: 'shopify_sessions',
10
+ migratorOptions: {
11
+ migrationDBIdentifier: 'migrations',
12
+ },
13
+ };
14
+ class RedisSessionStorage {
15
+ static withCredentials(host, db, username, password, opts) {
16
+ return new RedisSessionStorage(new URL(`redis://${encodeURIComponent(username)}:${encodeURIComponent(password)}@${host}/${db}`), opts);
17
+ }
18
+ constructor(dbUrl, opts = {}) {
19
+ this.options = { ...defaultRedisSessionStorageOptions, ...opts };
20
+ this.internalInit = this.init(typeof dbUrl === 'string' ? dbUrl : dbUrl.toString());
21
+ this.migrator = new redisMigrator.RedisSessionStorageMigrator(this.client, this.options.migratorOptions, migrations.migrationList);
22
+ this.ready = this.migrator.applyMigrations(this.internalInit);
23
+ }
24
+ async storeSession(session) {
25
+ await this.ready;
26
+ await this.client.set(session.id, JSON.stringify(session.toPropertyArray()));
27
+ await this.addKeyToShopList(session);
28
+ return true;
29
+ }
30
+ async loadSession(id) {
31
+ await this.ready;
32
+ let rawResult = await this.client.get(id);
33
+ if (!rawResult)
34
+ return undefined;
35
+ rawResult = JSON.parse(rawResult);
36
+ return shopifyApi.Session.fromPropertyArray(rawResult);
37
+ }
38
+ async deleteSession(id) {
39
+ await this.ready;
40
+ const session = await this.loadSession(id);
41
+ if (session) {
42
+ await this.removeKeyFromShopList(session.shop, id);
43
+ await this.client.del(id);
44
+ }
45
+ return true;
46
+ }
47
+ async deleteSessions(ids) {
48
+ await this.ready;
49
+ await Promise.all(ids.map((id) => this.deleteSession(id)));
50
+ return true;
51
+ }
52
+ async findSessionsByShop(shop) {
53
+ await this.ready;
54
+ const idKeysArrayString = await this.client.get(shop);
55
+ if (!idKeysArrayString)
56
+ return [];
57
+ const idKeysArray = JSON.parse(idKeysArrayString);
58
+ const results = [];
59
+ for (const idKey of idKeysArray) {
60
+ const rawResult = await this.client.get(idKey, false);
61
+ if (!rawResult)
62
+ continue;
63
+ const session = shopifyApi.Session.fromPropertyArray(JSON.parse(rawResult));
64
+ results.push(session);
65
+ }
66
+ return results;
67
+ }
68
+ async disconnect() {
69
+ await this.client.disconnect();
70
+ }
71
+ async addKeyToShopList(session) {
72
+ const shopKey = session.shop;
73
+ const idKey = this.client.generateFullKey(session.id);
74
+ const idKeysArrayString = await this.client.get(shopKey);
75
+ if (idKeysArrayString) {
76
+ const idKeysArray = JSON.parse(idKeysArrayString);
77
+ if (!idKeysArray.includes(idKey)) {
78
+ idKeysArray.push(idKey);
79
+ await this.client.set(shopKey, JSON.stringify(idKeysArray));
80
+ }
81
+ }
82
+ else {
83
+ await this.client.set(shopKey, JSON.stringify([idKey]));
84
+ }
85
+ }
86
+ async removeKeyFromShopList(shop, id) {
87
+ const shopKey = shop;
88
+ const idKey = this.client.generateFullKey(id);
89
+ const idKeysArrayString = await this.client.get(shopKey);
90
+ if (idKeysArrayString) {
91
+ const idKeysArray = JSON.parse(idKeysArrayString);
92
+ const index = idKeysArray.indexOf(idKey);
93
+ if (index > -1) {
94
+ idKeysArray.splice(index, 1);
95
+ await this.client.set(shopKey, JSON.stringify(idKeysArray));
96
+ }
97
+ }
98
+ }
99
+ async init(dbUrl) {
100
+ this.client = new redisConnection.RedisConnection(dbUrl, this.options, this.options.sessionKeyPrefix);
101
+ await this.client.connect();
102
+ }
103
+ }
104
+
105
+ exports.RedisSessionStorage = RedisSessionStorage;
106
+ //# sourceMappingURL=redis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.js","sources":["../../../src/redis.ts"],"sourcesContent":[null],"names":["RedisSessionStorageMigrator","migrationList","Session","RedisConnection"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { Session } from '@shopify/shopify-api';
2
+ import { MigrationOperation } from '@shopify/shopify-app-session-storage';
3
+
4
+ const migrationList = [
5
+ new MigrationOperation(
6
+ // This migration name cannot be changed as it has already been released
7
+ 'migrateToVersion1_0_1', migrateAddShopKeyToTrackSessionsByShop),
8
+ ];
9
+ // need to add shop keys with list of associated session keys to support
10
+ // the new findSessionsByShop in v2.x.x
11
+ async function migrateAddShopKeyToTrackSessionsByShop(connection) {
12
+ const shopsAndSessions = {};
13
+ const keys = await connection.keys('*');
14
+ for (const key of keys) {
15
+ if (key.startsWith(connection.sessionStorageIdentifier)) {
16
+ const session = Session.fromPropertyArray(JSON.parse((await connection.get(key, false))));
17
+ if (!shopsAndSessions[session.shop]) {
18
+ shopsAndSessions[session.shop] = [];
19
+ }
20
+ shopsAndSessions[session.shop].push(key);
21
+ }
22
+ }
23
+ // eslint-disable-next-line guard-for-in
24
+ for (const shop in shopsAndSessions) {
25
+ await connection.set(shop, JSON.stringify(shopsAndSessions[shop]));
26
+ }
27
+ }
28
+
29
+ export { migrateAddShopKeyToTrackSessionsByShop, migrationList };
30
+ //# sourceMappingURL=migrations.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrations.mjs","sources":["../../../src/migrations.ts"],"sourcesContent":[null],"names":[],"mappings":";;;AAKa,MAAA,aAAa,GAAG;AAC3B,IAAA,IAAI,kBAAkB;;IAEpB,uBAAuB,EACvB,sCAAsC,CACvC;EACD;AAEF;AACA;AACO,eAAe,sCAAsC,CAC1D,UAA2B,EAAA;IAE3B,MAAM,gBAAgB,GAA6B,EAAE,CAAC;IACtD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACxC,IAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;QACtB,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,wBAAwB,CAAC,EAAE;YACvD,MAAM,OAAO,GAAG,OAAO,CAAC,iBAAiB,CACvC,IAAI,CAAC,KAAK,EAAE,MAAM,UAAU,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,EAAY,CACzD,CAAC;YACF,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACnC,gBAAA,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;aACrC;YACD,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAC1C;KACF;;AAED,IAAA,KAAK,MAAM,IAAI,IAAI,gBAAgB,EAAE;AACnC,QAAA,MAAM,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;KACpE;AACH;;;;"}
@@ -0,0 +1,49 @@
1
+ import { createClient } from 'redis';
2
+
3
+ class RedisConnection {
4
+ constructor(dbUrl, options, keyPrefix) {
5
+ this.eventHandler = (..._args) => { };
6
+ this.init(dbUrl, options);
7
+ this.sessionStorageIdentifier = keyPrefix;
8
+ }
9
+ query(_query, _params) {
10
+ throw new Error('Method not implemented. Use get(string, boolean) instead');
11
+ }
12
+ async connect() {
13
+ await this.client.connect();
14
+ }
15
+ async disconnect() {
16
+ await this.client.quit();
17
+ }
18
+ async keys(name) {
19
+ return this.client.keys(name);
20
+ }
21
+ async set(baseKey, value, addKeyPrefix = true) {
22
+ await this.client.set(this.buildKey(baseKey, addKeyPrefix), value);
23
+ }
24
+ async del(baseKey, addKeyPrefix = true) {
25
+ return this.client.del(this.buildKey(baseKey, addKeyPrefix));
26
+ }
27
+ async get(baseKey, addKeyPrefix = true) {
28
+ return this.client.get(this.buildKey(baseKey, addKeyPrefix));
29
+ }
30
+ generateFullKey(name) {
31
+ return `${this.sessionStorageIdentifier}_${name}`;
32
+ }
33
+ buildKey(baseKey, addKeyPrefix) {
34
+ return addKeyPrefix ? this.generateFullKey(baseKey) : baseKey;
35
+ }
36
+ init(dbUrl, options) {
37
+ this.client = createClient({
38
+ ...options,
39
+ url: dbUrl,
40
+ });
41
+ this.client.on('error', this.eventHandler);
42
+ this.client.on('connect', this.eventHandler);
43
+ this.client.on('reconnecting', this.eventHandler);
44
+ this.client.on('ready', this.eventHandler);
45
+ }
46
+ }
47
+
48
+ export { RedisConnection };
49
+ //# sourceMappingURL=redis-connection.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-connection.mjs","sources":["../../../src/redis-connection.ts"],"sourcesContent":[null],"names":[],"mappings":";;MAKa,eAAe,CAAA;AAI1B,IAAA,WAAA,CAAY,KAAa,EAAE,OAA2B,EAAE,SAAiB,EAAA;QAqDjE,IAAY,CAAA,YAAA,GAAG,CAAC,GAAG,KAAY,KAAI,GAAG,CAAC;AApD7C,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC1B,QAAA,IAAI,CAAC,wBAAwB,GAAG,SAAS,CAAC;KAC3C;IAED,KAAK,CAAC,MAAc,EAAE,OAAc,EAAA;AAClC,QAAA,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;KAC7E;AAED,IAAA,MAAM,OAAO,GAAA;AACX,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;KAC7B;AAED,IAAA,MAAM,UAAU,GAAA;AACd,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;KAC1B;IAED,MAAM,IAAI,CAAC,IAAY,EAAA;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAC/B;IAED,MAAM,GAAG,CAAC,OAAe,EAAE,KAAU,EAAE,YAAY,GAAG,IAAI,EAAA;AACxD,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC;KACpE;AAED,IAAA,MAAM,GAAG,CAAC,OAAe,EAAE,YAAY,GAAG,IAAI,EAAA;AAC5C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;KAC9D;AAED,IAAA,MAAM,GAAG,CAAC,OAAe,EAAE,YAAY,GAAG,IAAI,EAAA;AAC5C,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC;KAC9D;AAED,IAAA,eAAe,CAAC,IAAY,EAAA;AAC1B,QAAA,OAAO,GAAG,IAAI,CAAC,wBAAwB,CAAI,CAAA,EAAA,IAAI,EAAE,CAAC;KACnD;IAEO,QAAQ,CAAC,OAAe,EAAE,YAAqB,EAAA;AACrD,QAAA,OAAO,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;KAC/D;IAEO,IAAI,CAAC,KAAa,EAAE,OAA2B,EAAA;AACrD,QAAA,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC;AACzB,YAAA,GAAG,OAAO;AACV,YAAA,GAAG,EAAE,KAAK;AACX,SAAA,CAAC,CAAC;QAEH,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;QAClD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;KAC5C;AAGF;;;;"}
@@ -0,0 +1,35 @@
1
+ import { AbstractMigrationEngine } from '@shopify/shopify-app-session-storage';
2
+
3
+ class RedisSessionStorageMigrator extends AbstractMigrationEngine {
4
+ constructor(dbConnection, opts = {}, migrations) {
5
+ // The name has already been decided whith the last migration
6
+ opts.migrationDBIdentifier = 'migrations';
7
+ super(dbConnection, opts, migrations);
8
+ }
9
+ async initMigrationPersistence() {
10
+ // nothing to do here
11
+ return Promise.resolve();
12
+ }
13
+ async hasMigrationBeenApplied(migrationName) {
14
+ const migrations = await this.getMigrationRecords();
15
+ const found = migrations.get(migrationName) ?? false;
16
+ return Promise.resolve(found);
17
+ }
18
+ async saveAppliedMigration(migrationName) {
19
+ const migrations = await this.getMigrationRecords();
20
+ migrations.set(migrationName, true);
21
+ this.connection.set(this.options.migrationDBIdentifier, JSON.stringify(Object.fromEntries(migrations)));
22
+ return Promise.resolve();
23
+ }
24
+ async getMigrationRecords() {
25
+ const migrationsRecord = await this.connection.get(this.options.migrationDBIdentifier);
26
+ let migrations = new Map();
27
+ if (migrationsRecord) {
28
+ migrations = new Map(Object.entries(JSON.parse(migrationsRecord)));
29
+ }
30
+ return Promise.resolve(migrations);
31
+ }
32
+ }
33
+
34
+ export { RedisSessionStorageMigrator };
35
+ //# sourceMappingURL=redis-migrator.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis-migrator.mjs","sources":["../../../src/redis-migrator.ts"],"sourcesContent":[null],"names":[],"mappings":";;AAQM,MAAO,2BAA4B,SAAQ,uBAGhD,CAAA;AACC,IAAA,WAAA,CACE,YAA6B,EAC7B,IAA+C,GAAA,EAAE,EACjD,UAAgC,EAAA;;AAGhC,QAAA,IAAI,CAAC,qBAAqB,GAAG,YAAY,CAAC;AAC1C,QAAA,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;KACvC;AAED,IAAA,MAAM,wBAAwB,GAAA;;AAE5B,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;KAC1B;IAED,MAAM,uBAAuB,CAAC,aAAqB,EAAA;AACjD,QAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC;AAErD,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;KAC/B;IAED,MAAM,oBAAoB,CAAC,aAAqB,EAAA;AAC9C,QAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE,CAAC;AACpD,QAAA,UAAU,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;QAEpC,IAAI,CAAC,UAAU,CAAC,GAAG,CACjB,IAAI,CAAC,OAAO,CAAC,qBAAqB,EAClC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC,CAC/C,CAAC;AAEF,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;KAC1B;AAEO,IAAA,MAAM,mBAAmB,GAAA;AAC/B,QAAA,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAChD,IAAI,CAAC,OAAO,CAAC,qBAAqB,CACnC,CAAC;AACF,QAAA,IAAI,UAAU,GAAyB,IAAI,GAAG,EAAE,CAAC;QACjD,IAAI,gBAAgB,EAAE;AACpB,YAAA,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC;SACpE;AAED,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;KACpC;AACF;;;;"}
@@ -0,0 +1,104 @@
1
+ import { Session } from '@shopify/shopify-api';
2
+ import { migrationList } from './migrations.mjs';
3
+ import { RedisConnection } from './redis-connection.mjs';
4
+ import { RedisSessionStorageMigrator } from './redis-migrator.mjs';
5
+
6
+ const defaultRedisSessionStorageOptions = {
7
+ sessionKeyPrefix: 'shopify_sessions',
8
+ migratorOptions: {
9
+ migrationDBIdentifier: 'migrations',
10
+ },
11
+ };
12
+ class RedisSessionStorage {
13
+ static withCredentials(host, db, username, password, opts) {
14
+ return new RedisSessionStorage(new URL(`redis://${encodeURIComponent(username)}:${encodeURIComponent(password)}@${host}/${db}`), opts);
15
+ }
16
+ constructor(dbUrl, opts = {}) {
17
+ this.options = { ...defaultRedisSessionStorageOptions, ...opts };
18
+ this.internalInit = this.init(typeof dbUrl === 'string' ? dbUrl : dbUrl.toString());
19
+ this.migrator = new RedisSessionStorageMigrator(this.client, this.options.migratorOptions, migrationList);
20
+ this.ready = this.migrator.applyMigrations(this.internalInit);
21
+ }
22
+ async storeSession(session) {
23
+ await this.ready;
24
+ await this.client.set(session.id, JSON.stringify(session.toPropertyArray()));
25
+ await this.addKeyToShopList(session);
26
+ return true;
27
+ }
28
+ async loadSession(id) {
29
+ await this.ready;
30
+ let rawResult = await this.client.get(id);
31
+ if (!rawResult)
32
+ return undefined;
33
+ rawResult = JSON.parse(rawResult);
34
+ return Session.fromPropertyArray(rawResult);
35
+ }
36
+ async deleteSession(id) {
37
+ await this.ready;
38
+ const session = await this.loadSession(id);
39
+ if (session) {
40
+ await this.removeKeyFromShopList(session.shop, id);
41
+ await this.client.del(id);
42
+ }
43
+ return true;
44
+ }
45
+ async deleteSessions(ids) {
46
+ await this.ready;
47
+ await Promise.all(ids.map((id) => this.deleteSession(id)));
48
+ return true;
49
+ }
50
+ async findSessionsByShop(shop) {
51
+ await this.ready;
52
+ const idKeysArrayString = await this.client.get(shop);
53
+ if (!idKeysArrayString)
54
+ return [];
55
+ const idKeysArray = JSON.parse(idKeysArrayString);
56
+ const results = [];
57
+ for (const idKey of idKeysArray) {
58
+ const rawResult = await this.client.get(idKey, false);
59
+ if (!rawResult)
60
+ continue;
61
+ const session = Session.fromPropertyArray(JSON.parse(rawResult));
62
+ results.push(session);
63
+ }
64
+ return results;
65
+ }
66
+ async disconnect() {
67
+ await this.client.disconnect();
68
+ }
69
+ async addKeyToShopList(session) {
70
+ const shopKey = session.shop;
71
+ const idKey = this.client.generateFullKey(session.id);
72
+ const idKeysArrayString = await this.client.get(shopKey);
73
+ if (idKeysArrayString) {
74
+ const idKeysArray = JSON.parse(idKeysArrayString);
75
+ if (!idKeysArray.includes(idKey)) {
76
+ idKeysArray.push(idKey);
77
+ await this.client.set(shopKey, JSON.stringify(idKeysArray));
78
+ }
79
+ }
80
+ else {
81
+ await this.client.set(shopKey, JSON.stringify([idKey]));
82
+ }
83
+ }
84
+ async removeKeyFromShopList(shop, id) {
85
+ const shopKey = shop;
86
+ const idKey = this.client.generateFullKey(id);
87
+ const idKeysArrayString = await this.client.get(shopKey);
88
+ if (idKeysArrayString) {
89
+ const idKeysArray = JSON.parse(idKeysArrayString);
90
+ const index = idKeysArray.indexOf(idKey);
91
+ if (index > -1) {
92
+ idKeysArray.splice(index, 1);
93
+ await this.client.set(shopKey, JSON.stringify(idKeysArray));
94
+ }
95
+ }
96
+ }
97
+ async init(dbUrl) {
98
+ this.client = new RedisConnection(dbUrl, this.options, this.options.sessionKeyPrefix);
99
+ await this.client.connect();
100
+ }
101
+ }
102
+
103
+ export { RedisSessionStorage };
104
+ //# sourceMappingURL=redis.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"redis.mjs","sources":["../../../src/redis.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}