@shopify/shopify-app-session-storage-redis 4.2.11 → 4.2.13

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.
@@ -1 +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;;AAGH;AACA;AACO,eAAe,sCAAsC,CAC1D,UAA2B,EAAA;IAE3B,MAAM,gBAAgB,GAA6B,EAAE;IACrD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;AACvC,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;YACD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACnC,gBAAA,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;;YAErC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;;;;AAI5C,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;;AAEtE;;;;;"}
1
+ {"version":3,"file":"migrations.js","sources":["../../../src/migrations.ts"],"sourcesContent":["import {Session} from '@shopify/shopify-api';\nimport {MigrationOperation} from '@shopify/shopify-app-session-storage';\n\nimport {RedisConnection} from './redis-connection';\n\nexport const migrationList = [\n new MigrationOperation(\n // This migration name cannot be changed as it has already been released\n 'migrateToVersion1_0_1',\n migrateAddShopKeyToTrackSessionsByShop,\n ),\n];\n\n// need to add shop keys with list of associated session keys to support\n// the new findSessionsByShop in v2.x.x\nexport async function migrateAddShopKeyToTrackSessionsByShop(\n connection: RedisConnection,\n): Promise<void> {\n const shopsAndSessions: Record<string, string[]> = {};\n const keys = await connection.keys('*');\n for (const key of keys) {\n if (key.startsWith(connection.sessionStorageIdentifier)) {\n const session = Session.fromPropertyArray(\n JSON.parse((await connection.get(key, false)) as string),\n );\n if (!shopsAndSessions[session.shop]) {\n shopsAndSessions[session.shop] = [];\n }\n shopsAndSessions[session.shop].push(key);\n }\n }\n // eslint-disable-next-line guard-for-in\n for (const shop in shopsAndSessions) {\n await connection.set(shop, JSON.stringify(shopsAndSessions[shop]));\n }\n}\n"],"names":["MigrationOperation","Session"],"mappings":";;;;;AAKO,MAAM,aAAa,GAAG;AAC3B,IAAA,IAAIA,2CAAkB;;IAEpB,uBAAuB,EACvB,sCAAsC,CACvC;;AAGH;AACA;AACO,eAAe,sCAAsC,CAC1D,UAA2B,EAAA;IAE3B,MAAM,gBAAgB,GAA6B,EAAE;IACrD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;AACvC,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;YACD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACnC,gBAAA,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;YACrC;YACA,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1C;IACF;;AAEA,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;IACpE;AACF;;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"redis-connection.js","sources":["../../../src/redis-connection.ts"],"sourcesContent":[null],"names":["createClient"],"mappings":";;;;MAKa,eAAe,CAAA;AAC1B,IAAA,wBAAwB;AAChB,IAAA,MAAM;AAEd,IAAA,WAAA,CACE,WAAuC,EACvC,OAA2B,EAC3B,SAAiB,EAAA;AAEjB,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC;AAC/B,QAAA,IAAI,CAAC,wBAAwB,GAAG,SAAS;;IAG3C,KAAK,CAAC,MAAc,EAAE,OAAc,EAAA;AAClC,QAAA,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC;;AAG7E,IAAA,MAAM,OAAO,GAAA;AACX,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;AACxB,YAAA,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;;;AAI/B,IAAA,MAAM,UAAU,GAAA;AACd,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;;IAG1B,MAAM,IAAI,CAAC,IAAY,EAAA;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;;IAG/B,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;;AAGpE,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;;AAG9D,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;;AAG9D,IAAA,eAAe,CAAC,IAAY,EAAA;AAC1B,QAAA,OAAO,GAAG,IAAI,CAAC,wBAAwB,CAAI,CAAA,EAAA,IAAI,EAAE;;IAG3C,QAAQ,CAAC,OAAe,EAAE,YAAqB,EAAA;AACrD,QAAA,OAAO,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,OAAO;;IAGvD,IAAI,CACV,WAAuC,EACvC,OAA2B,EAAA;QAE3B,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,YAAY,GAAG,EAAE;AACjE,YAAA,IAAI,CAAC,MAAM,GAAGA,kBAAY,CAAC,EAAC,GAAG,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,QAAQ,EAAE,EAAC,CAAC;YACrE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC;;aACrC;AACL,YAAA,IAAI,CAAC,MAAM,GAAG,WAAW;;;IAIrB,YAAY,GAAG,CAAC,GAAG,KAAY,KAAI,GAAG;AAC/C;;;;"}
1
+ {"version":3,"file":"redis-connection.js","sources":["../../../src/redis-connection.ts"],"sourcesContent":["import {createClient, RedisClientOptions} from 'redis';\nimport {DBConnection} from '@shopify/shopify-app-session-storage';\n\ntype RedisClient = ReturnType<typeof createClient>;\n\nexport class RedisConnection implements DBConnection {\n sessionStorageIdentifier: string;\n private client: RedisClient;\n\n constructor(\n urlOrClient: string | URL | RedisClient,\n options: RedisClientOptions,\n keyPrefix: string,\n ) {\n this.init(urlOrClient, options);\n this.sessionStorageIdentifier = keyPrefix;\n }\n\n query(_query: string, _params: any[]): Promise<any[]> {\n throw new Error('Method not implemented. Use get(string, boolean) instead');\n }\n\n async connect(): Promise<void> {\n if (!this.client.isReady) {\n await this.client.connect();\n }\n }\n\n async disconnect(): Promise<void> {\n await this.client.quit();\n }\n\n async keys(name: string): Promise<any> {\n return this.client.keys(name);\n }\n\n async set(baseKey: string, value: any, addKeyPrefix = true) {\n await this.client.set(this.buildKey(baseKey, addKeyPrefix), value);\n }\n\n async del(baseKey: string, addKeyPrefix = true): Promise<any> {\n return this.client.del(this.buildKey(baseKey, addKeyPrefix));\n }\n\n async get(baseKey: string, addKeyPrefix = true): Promise<any> {\n return this.client.get(this.buildKey(baseKey, addKeyPrefix));\n }\n\n generateFullKey(name: string): string {\n return `${this.sessionStorageIdentifier}_${name}`;\n }\n\n private buildKey(baseKey: string, addKeyPrefix: boolean): string {\n return addKeyPrefix ? this.generateFullKey(baseKey) : baseKey;\n }\n\n private init(\n urlOrClient: string | URL | RedisClient,\n options: RedisClientOptions,\n ) {\n if (typeof urlOrClient === 'string' || urlOrClient instanceof URL) {\n this.client = createClient({...options, url: urlOrClient.toString()});\n this.client.on('error', this.eventHandler);\n this.client.on('connect', this.eventHandler);\n this.client.on('reconnecting', this.eventHandler);\n this.client.on('ready', this.eventHandler);\n } else {\n this.client = urlOrClient;\n }\n }\n\n private eventHandler = (..._args: any[]) => {};\n}\n"],"names":["createClient"],"mappings":";;;;MAKa,eAAe,CAAA;AAC1B,IAAA,wBAAwB;AAChB,IAAA,MAAM;AAEd,IAAA,WAAA,CACE,WAAuC,EACvC,OAA2B,EAC3B,SAAiB,EAAA;AAEjB,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC;AAC/B,QAAA,IAAI,CAAC,wBAAwB,GAAG,SAAS;IAC3C;IAEA,KAAK,CAAC,MAAc,EAAE,OAAc,EAAA;AAClC,QAAA,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC;IAC7E;AAEA,IAAA,MAAM,OAAO,GAAA;AACX,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;AACxB,YAAA,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;QAC7B;IACF;AAEA,IAAA,MAAM,UAAU,GAAA;AACd,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IAC1B;IAEA,MAAM,IAAI,CAAC,IAAY,EAAA;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;IAC/B;IAEA,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;IACpE;AAEA,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;IAC9D;AAEA,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;IAC9D;AAEA,IAAA,eAAe,CAAC,IAAY,EAAA;AAC1B,QAAA,OAAO,GAAG,IAAI,CAAC,wBAAwB,CAAA,CAAA,EAAI,IAAI,EAAE;IACnD;IAEQ,QAAQ,CAAC,OAAe,EAAE,YAAqB,EAAA;AACrD,QAAA,OAAO,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,OAAO;IAC/D;IAEQ,IAAI,CACV,WAAuC,EACvC,OAA2B,EAAA;QAE3B,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,YAAY,GAAG,EAAE;AACjE,YAAA,IAAI,CAAC,MAAM,GAAGA,kBAAY,CAAC,EAAC,GAAG,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,QAAQ,EAAE,EAAC,CAAC;YACrE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC;QAC5C;aAAO;AACL,YAAA,IAAI,CAAC,MAAM,GAAG,WAAW;QAC3B;IACF;IAEQ,YAAY,GAAG,CAAC,GAAG,KAAY,KAAI,EAAE,CAAC;AAC/C;;;;"}
@@ -1 +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;AACzC,QAAA,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,CAAC;;AAGvC,IAAA,MAAM,wBAAwB,GAAA;;AAE5B,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE;;IAG1B,MAAM,uBAAuB,CAAC,aAAqB,EAAA;AACjD,QAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE;QACnD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,KAAK;AAEpD,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;;IAG/B,MAAM,oBAAoB,CAAC,aAAqB,EAAA;AAC9C,QAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE;AACnD,QAAA,UAAU,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC;QAEnC,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;AAED,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE;;AAGlB,IAAA,MAAM,mBAAmB,GAAA;AAC/B,QAAA,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAChD,IAAI,CAAC,OAAO,CAAC,qBAAqB,CACnC;AACD,QAAA,IAAI,UAAU,GAAyB,IAAI,GAAG,EAAE;QAChD,IAAI,gBAAgB,EAAE;AACpB,YAAA,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;;AAGpE,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;;AAErC;;;;"}
1
+ {"version":3,"file":"redis-migrator.js","sources":["../../../src/redis-migrator.ts"],"sourcesContent":["import {\n AbstractMigrationEngine,\n SessionStorageMigratorOptions,\n MigrationOperation,\n} from '@shopify/shopify-app-session-storage';\n\nimport {RedisConnection} from './redis-connection';\n\nexport class RedisSessionStorageMigrator extends AbstractMigrationEngine<\n RedisConnection,\n SessionStorageMigratorOptions\n> {\n constructor(\n dbConnection: RedisConnection,\n opts: Partial<SessionStorageMigratorOptions> = {},\n migrations: MigrationOperation[],\n ) {\n // The name has already been decided whith the last migration\n opts.migrationDBIdentifier = 'migrations';\n super(dbConnection, opts, migrations);\n }\n\n async initMigrationPersistence(): Promise<void> {\n // nothing to do here\n return Promise.resolve();\n }\n\n async hasMigrationBeenApplied(migrationName: string): Promise<boolean> {\n const migrations = await this.getMigrationRecords();\n const found = migrations.get(migrationName) ?? false;\n\n return Promise.resolve(found);\n }\n\n async saveAppliedMigration(migrationName: string): Promise<void> {\n const migrations = await this.getMigrationRecords();\n migrations.set(migrationName, true);\n\n this.connection.set(\n this.options.migrationDBIdentifier,\n JSON.stringify(Object.fromEntries(migrations)),\n );\n\n return Promise.resolve();\n }\n\n private async getMigrationRecords(): Promise<Map<string, boolean>> {\n const migrationsRecord = await this.connection.get(\n this.options.migrationDBIdentifier,\n );\n let migrations: Map<string, boolean> = new Map();\n if (migrationsRecord) {\n migrations = new Map(Object.entries(JSON.parse(migrationsRecord)));\n }\n\n return Promise.resolve(migrations);\n }\n}\n"],"names":["AbstractMigrationEngine"],"mappings":";;;;AAQM,MAAO,2BAA4B,SAAQA,gDAGhD,CAAA;AACC,IAAA,WAAA,CACE,YAA6B,EAC7B,IAAA,GAA+C,EAAE,EACjD,UAAgC,EAAA;;AAGhC,QAAA,IAAI,CAAC,qBAAqB,GAAG,YAAY;AACzC,QAAA,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,CAAC;IACvC;AAEA,IAAA,MAAM,wBAAwB,GAAA;;AAE5B,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE;IAC1B;IAEA,MAAM,uBAAuB,CAAC,aAAqB,EAAA;AACjD,QAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE;QACnD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,KAAK;AAEpD,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;IAC/B;IAEA,MAAM,oBAAoB,CAAC,aAAqB,EAAA;AAC9C,QAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE;AACnD,QAAA,UAAU,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC;QAEnC,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;AAED,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE;IAC1B;AAEQ,IAAA,MAAM,mBAAmB,GAAA;AAC/B,QAAA,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAChD,IAAI,CAAC,OAAO,CAAC,qBAAqB,CACnC;AACD,QAAA,IAAI,UAAU,GAAyB,IAAI,GAAG,EAAE;QAChD,IAAI,gBAAgB,EAAE;AACpB,YAAA,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACpE;AAEA,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;IACpC;AACD;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"redis.js","sources":["../../../src/redis.ts"],"sourcesContent":[null],"names":["RedisSessionStorageMigrator","migrationList","Session","RedisConnection"],"mappings":"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"}
1
+ {"version":3,"file":"redis.js","sources":["../../../src/redis.ts"],"sourcesContent":["import {RedisClientOptions, createClient} from 'redis';\nimport {Session} from '@shopify/shopify-api';\nimport {\n SessionStorage,\n SessionStorageMigratorOptions,\n SessionStorageMigrator,\n} from '@shopify/shopify-app-session-storage';\n\nimport {migrationList} from './migrations';\nimport {RedisConnection} from './redis-connection';\nimport {RedisSessionStorageMigrator} from './redis-migrator';\n\ntype RedisClient = ReturnType<typeof createClient>;\n\n/* eslint-disable @shopify/typescript/prefer-pascal-case-enums */\nenum ShopifyStorageOption {\n sessionKeyPrefix = 'sessionKeyPrefix',\n migratorOptions = 'migratorOptions',\n onError = 'onError',\n}\n/* eslint-enable @shopify/typescript/prefer-pascal-case-enums */\n\nexport interface RedisSessionStorageOptions extends RedisClientOptions {\n [ShopifyStorageOption.sessionKeyPrefix]: string;\n [ShopifyStorageOption.migratorOptions]?: SessionStorageMigratorOptions;\n [ShopifyStorageOption.onError]?: (...args: any[]) => void;\n}\n\nconst defaultRedisSessionStorageOptions: RedisSessionStorageOptions = {\n sessionKeyPrefix: 'shopify_sessions',\n migratorOptions: {\n migrationDBIdentifier: 'migrations',\n },\n};\n\nexport class RedisSessionStorage implements SessionStorage {\n static withCredentials(\n host: string,\n db: number,\n username: string,\n password: string,\n opts: Partial<RedisSessionStorageOptions>,\n ) {\n return new RedisSessionStorage(\n new URL(\n `redis://${encodeURIComponent(username)}:${encodeURIComponent(\n password,\n )}@${host}/${db}`,\n ),\n opts,\n );\n }\n\n public readonly ready: Promise<void>;\n private internalInit: Promise<void>;\n private options: RedisSessionStorageOptions;\n private client: RedisConnection;\n private migrator: SessionStorageMigrator;\n\n constructor(\n urlOrClient: URL | string | RedisClient,\n opts: Partial<RedisSessionStorageOptions> = {},\n ) {\n const allowedClientKeys = Object.keys(ShopifyStorageOption);\n const disallowedClientKeys = Object.keys(opts).filter(\n (key) => !allowedClientKeys.includes(key),\n );\n\n if (\n typeof urlOrClient !== 'string' &&\n !(urlOrClient instanceof URL) &&\n disallowedClientKeys.length > 0\n ) {\n throw new Error(\n 'Passing a RedisClient instance is not supported with options. Set the options when creating the client ' +\n 'instead.',\n );\n }\n\n this.options = {...defaultRedisSessionStorageOptions, ...opts};\n this.internalInit = this.init(urlOrClient);\n this.migrator = new RedisSessionStorageMigrator(\n this.client,\n this.options.migratorOptions,\n migrationList,\n );\n this.ready = this.migrator.applyMigrations(this.internalInit);\n }\n\n public async storeSession(session: Session): Promise<boolean> {\n await this.ready;\n\n await this.client.set(\n session.id,\n JSON.stringify(session.toPropertyArray(true)),\n );\n await this.addKeyToShopList(session);\n return true;\n }\n\n public async loadSession(id: string): Promise<Session | undefined> {\n await this.ready;\n\n let rawResult: any = await this.client.get(id);\n\n if (!rawResult) return undefined;\n rawResult = JSON.parse(rawResult);\n\n return Session.fromPropertyArray(rawResult, true);\n }\n\n public async deleteSession(id: string): Promise<boolean> {\n await this.ready;\n const session = await this.loadSession(id);\n if (session) {\n await this.removeKeyFromShopList(session.shop, id);\n await this.client.del(id);\n }\n return true;\n }\n\n public async deleteSessions(ids: string[]): Promise<boolean> {\n await this.ready;\n await Promise.all(ids.map((id) => this.deleteSession(id)));\n return true;\n }\n\n public async findSessionsByShop(shop: string): Promise<Session[]> {\n await this.ready;\n\n const idKeysArrayString = await this.client.get(shop);\n if (!idKeysArrayString) return [];\n\n const idKeysArray = JSON.parse(idKeysArrayString);\n const results: Session[] = [];\n for (const idKey of idKeysArray) {\n const rawResult = await this.client.get(idKey, false);\n if (!rawResult) continue;\n\n const session = Session.fromPropertyArray(JSON.parse(rawResult), true);\n results.push(session);\n }\n\n return results;\n }\n\n public async disconnect(): Promise<void> {\n await this.client.disconnect();\n }\n\n private async addKeyToShopList(session: Session) {\n const shopKey = session.shop;\n const idKey = this.client.generateFullKey(session.id);\n const idKeysArrayString = await this.client.get(shopKey);\n\n if (idKeysArrayString) {\n const idKeysArray = JSON.parse(idKeysArrayString);\n\n if (!idKeysArray.includes(idKey)) {\n idKeysArray.push(idKey);\n await this.client.set(shopKey, JSON.stringify(idKeysArray));\n }\n } else {\n await this.client.set(shopKey, JSON.stringify([idKey]));\n }\n }\n\n private async removeKeyFromShopList(shop: string, id: string) {\n const shopKey = shop;\n const idKey = this.client.generateFullKey(id);\n const idKeysArrayString = await this.client.get(shopKey);\n\n if (idKeysArrayString) {\n const idKeysArray = JSON.parse(idKeysArrayString);\n const index = idKeysArray.indexOf(idKey);\n\n if (index > -1) {\n idKeysArray.splice(index, 1);\n await this.client.set(shopKey, JSON.stringify(idKeysArray));\n }\n }\n }\n\n private async init(urlOrClient: URL | string | RedisClient) {\n this.client = new RedisConnection(\n urlOrClient,\n this.options,\n this.options.sessionKeyPrefix,\n );\n await this.client.connect();\n }\n}\n"],"names":["RedisSessionStorageMigrator","migrationList","Session","RedisConnection"],"mappings":";;;;;;;AAcA;AACA,IAAK,oBAIJ;AAJD,CAAA,UAAK,oBAAoB,EAAA;AACvB,IAAA,oBAAA,CAAA,kBAAA,CAAA,GAAA,kBAAqC;AACrC,IAAA,oBAAA,CAAA,iBAAA,CAAA,GAAA,iBAAmC;AACnC,IAAA,oBAAA,CAAA,SAAA,CAAA,GAAA,SAAmB;AACrB,CAAC,EAJI,oBAAoB,KAApB,oBAAoB,GAAA,EAAA,CAAA,CAAA;AAazB,MAAM,iCAAiC,GAA+B;AACpE,IAAA,gBAAgB,EAAE,kBAAkB;AACpC,IAAA,eAAe,EAAE;AACf,QAAA,qBAAqB,EAAE,YAAY;AACpC,KAAA;CACF;MAEY,mBAAmB,CAAA;IAC9B,OAAO,eAAe,CACpB,IAAY,EACZ,EAAU,EACV,QAAgB,EAChB,QAAgB,EAChB,IAAyC,EAAA;QAEzC,OAAO,IAAI,mBAAmB,CAC5B,IAAI,GAAG,CACL,CAAA,QAAA,EAAW,kBAAkB,CAAC,QAAQ,CAAC,CAAA,CAAA,EAAI,kBAAkB,CAC3D,QAAQ,CACT,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,CAClB,EACD,IAAI,CACL;IACH;AAEgB,IAAA,KAAK;AACb,IAAA,YAAY;AACZ,IAAA,OAAO;AACP,IAAA,MAAM;AACN,IAAA,QAAQ;IAEhB,WAAA,CACE,WAAuC,EACvC,IAAA,GAA4C,EAAE,EAAA;QAE9C,MAAM,iBAAiB,GAAG,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC;QAC3D,MAAM,oBAAoB,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CACnD,CAAC,GAAG,KAAK,CAAC,iBAAiB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAC1C;QAED,IACE,OAAO,WAAW,KAAK,QAAQ;AAC/B,YAAA,EAAE,WAAW,YAAY,GAAG,CAAC;AAC7B,YAAA,oBAAoB,CAAC,MAAM,GAAG,CAAC,EAC/B;YACA,MAAM,IAAI,KAAK,CACb,yGAAyG;AACvG,gBAAA,UAAU,CACb;QACH;QAEA,IAAI,CAAC,OAAO,GAAG,EAAC,GAAG,iCAAiC,EAAE,GAAG,IAAI,EAAC;QAC9D,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC;AAC1C,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAIA,yCAA2B,CAC7C,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,OAAO,CAAC,eAAe,EAC5BC,wBAAa,CACd;AACD,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC;IAC/D;IAEO,MAAM,YAAY,CAAC,OAAgB,EAAA;QACxC,MAAM,IAAI,CAAC,KAAK;QAEhB,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACnB,OAAO,CAAC,EAAE,EACV,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAC9C;AACD,QAAA,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;AACpC,QAAA,OAAO,IAAI;IACb;IAEO,MAAM,WAAW,CAAC,EAAU,EAAA;QACjC,MAAM,IAAI,CAAC,KAAK;QAEhB,IAAI,SAAS,GAAQ,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AAE9C,QAAA,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,SAAS;AAChC,QAAA,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;QAEjC,OAAOC,kBAAO,CAAC,iBAAiB,CAAC,SAAS,EAAE,IAAI,CAAC;IACnD;IAEO,MAAM,aAAa,CAAC,EAAU,EAAA;QACnC,MAAM,IAAI,CAAC,KAAK;QAChB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QAC1C,IAAI,OAAO,EAAE;YACX,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YAClD,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3B;AACA,QAAA,OAAO,IAAI;IACb;IAEO,MAAM,cAAc,CAAC,GAAa,EAAA;QACvC,MAAM,IAAI,CAAC,KAAK;QAChB,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC;AAC1D,QAAA,OAAO,IAAI;IACb;IAEO,MAAM,kBAAkB,CAAC,IAAY,EAAA;QAC1C,MAAM,IAAI,CAAC,KAAK;QAEhB,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC;AACrD,QAAA,IAAI,CAAC,iBAAiB;AAAE,YAAA,OAAO,EAAE;QAEjC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC;QACjD,MAAM,OAAO,GAAc,EAAE;AAC7B,QAAA,KAAK,MAAM,KAAK,IAAI,WAAW,EAAE;AAC/B,YAAA,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC;AACrD,YAAA,IAAI,CAAC,SAAS;gBAAE;AAEhB,YAAA,MAAM,OAAO,GAAGA,kBAAO,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC;AACtE,YAAA,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QACvB;AAEA,QAAA,OAAO,OAAO;IAChB;AAEO,IAAA,MAAM,UAAU,GAAA;AACrB,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;IAChC;IAEQ,MAAM,gBAAgB,CAAC,OAAgB,EAAA;AAC7C,QAAA,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI;AAC5B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAExD,IAAI,iBAAiB,EAAE;YACrB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC;YAEjD,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;AAChC,gBAAA,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;AACvB,gBAAA,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC7D;QACF;aAAO;AACL,YAAA,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACzD;IACF;AAEQ,IAAA,MAAM,qBAAqB,CAAC,IAAY,EAAE,EAAU,EAAA;QAC1D,MAAM,OAAO,GAAG,IAAI;QACpB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;QAC7C,MAAM,iBAAiB,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC;QAExD,IAAI,iBAAiB,EAAE;YACrB,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC;YACjD,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;AAExC,YAAA,IAAI,KAAK,GAAG,EAAE,EAAE;AACd,gBAAA,WAAW,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;AAC5B,gBAAA,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAC7D;QACF;IACF;IAEQ,MAAM,IAAI,CAAC,WAAuC,EAAA;AACxD,QAAA,IAAI,CAAC,MAAM,GAAG,IAAIC,+BAAe,CAC/B,WAAW,EACX,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAC9B;AACD,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;IAC7B;AACD;;;;"}
@@ -1 +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;;AAGH;AACA;AACO,eAAe,sCAAsC,CAC1D,UAA2B,EAAA;IAE3B,MAAM,gBAAgB,GAA6B,EAAE;IACrD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;AACvC,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;YACD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACnC,gBAAA,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;;YAErC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;;;;AAI5C,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;;AAEtE;;;;"}
1
+ {"version":3,"file":"migrations.mjs","sources":["../../../src/migrations.ts"],"sourcesContent":["import {Session} from '@shopify/shopify-api';\nimport {MigrationOperation} from '@shopify/shopify-app-session-storage';\n\nimport {RedisConnection} from './redis-connection';\n\nexport const migrationList = [\n new MigrationOperation(\n // This migration name cannot be changed as it has already been released\n 'migrateToVersion1_0_1',\n migrateAddShopKeyToTrackSessionsByShop,\n ),\n];\n\n// need to add shop keys with list of associated session keys to support\n// the new findSessionsByShop in v2.x.x\nexport async function migrateAddShopKeyToTrackSessionsByShop(\n connection: RedisConnection,\n): Promise<void> {\n const shopsAndSessions: Record<string, string[]> = {};\n const keys = await connection.keys('*');\n for (const key of keys) {\n if (key.startsWith(connection.sessionStorageIdentifier)) {\n const session = Session.fromPropertyArray(\n JSON.parse((await connection.get(key, false)) as string),\n );\n if (!shopsAndSessions[session.shop]) {\n shopsAndSessions[session.shop] = [];\n }\n shopsAndSessions[session.shop].push(key);\n }\n }\n // eslint-disable-next-line guard-for-in\n for (const shop in shopsAndSessions) {\n await connection.set(shop, JSON.stringify(shopsAndSessions[shop]));\n }\n}\n"],"names":[],"mappings":";;;AAKO,MAAM,aAAa,GAAG;AAC3B,IAAA,IAAI,kBAAkB;;IAEpB,uBAAuB,EACvB,sCAAsC,CACvC;;AAGH;AACA;AACO,eAAe,sCAAsC,CAC1D,UAA2B,EAAA;IAE3B,MAAM,gBAAgB,GAA6B,EAAE;IACrD,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;AACvC,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;YACD,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AACnC,gBAAA,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;YACrC;YACA,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1C;IACF;;AAEA,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;IACpE;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"redis-connection.mjs","sources":["../../../src/redis-connection.ts"],"sourcesContent":[null],"names":[],"mappings":";;MAKa,eAAe,CAAA;AAC1B,IAAA,wBAAwB;AAChB,IAAA,MAAM;AAEd,IAAA,WAAA,CACE,WAAuC,EACvC,OAA2B,EAC3B,SAAiB,EAAA;AAEjB,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC;AAC/B,QAAA,IAAI,CAAC,wBAAwB,GAAG,SAAS;;IAG3C,KAAK,CAAC,MAAc,EAAE,OAAc,EAAA;AAClC,QAAA,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC;;AAG7E,IAAA,MAAM,OAAO,GAAA;AACX,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;AACxB,YAAA,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;;;AAI/B,IAAA,MAAM,UAAU,GAAA;AACd,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;;IAG1B,MAAM,IAAI,CAAC,IAAY,EAAA;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;;IAG/B,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;;AAGpE,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;;AAG9D,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;;AAG9D,IAAA,eAAe,CAAC,IAAY,EAAA;AAC1B,QAAA,OAAO,GAAG,IAAI,CAAC,wBAAwB,CAAI,CAAA,EAAA,IAAI,EAAE;;IAG3C,QAAQ,CAAC,OAAe,EAAE,YAAqB,EAAA;AACrD,QAAA,OAAO,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,OAAO;;IAGvD,IAAI,CACV,WAAuC,EACvC,OAA2B,EAAA;QAE3B,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,YAAY,GAAG,EAAE;AACjE,YAAA,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,EAAC,GAAG,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,QAAQ,EAAE,EAAC,CAAC;YACrE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC;;aACrC;AACL,YAAA,IAAI,CAAC,MAAM,GAAG,WAAW;;;IAIrB,YAAY,GAAG,CAAC,GAAG,KAAY,KAAI,GAAG;AAC/C;;;;"}
1
+ {"version":3,"file":"redis-connection.mjs","sources":["../../../src/redis-connection.ts"],"sourcesContent":["import {createClient, RedisClientOptions} from 'redis';\nimport {DBConnection} from '@shopify/shopify-app-session-storage';\n\ntype RedisClient = ReturnType<typeof createClient>;\n\nexport class RedisConnection implements DBConnection {\n sessionStorageIdentifier: string;\n private client: RedisClient;\n\n constructor(\n urlOrClient: string | URL | RedisClient,\n options: RedisClientOptions,\n keyPrefix: string,\n ) {\n this.init(urlOrClient, options);\n this.sessionStorageIdentifier = keyPrefix;\n }\n\n query(_query: string, _params: any[]): Promise<any[]> {\n throw new Error('Method not implemented. Use get(string, boolean) instead');\n }\n\n async connect(): Promise<void> {\n if (!this.client.isReady) {\n await this.client.connect();\n }\n }\n\n async disconnect(): Promise<void> {\n await this.client.quit();\n }\n\n async keys(name: string): Promise<any> {\n return this.client.keys(name);\n }\n\n async set(baseKey: string, value: any, addKeyPrefix = true) {\n await this.client.set(this.buildKey(baseKey, addKeyPrefix), value);\n }\n\n async del(baseKey: string, addKeyPrefix = true): Promise<any> {\n return this.client.del(this.buildKey(baseKey, addKeyPrefix));\n }\n\n async get(baseKey: string, addKeyPrefix = true): Promise<any> {\n return this.client.get(this.buildKey(baseKey, addKeyPrefix));\n }\n\n generateFullKey(name: string): string {\n return `${this.sessionStorageIdentifier}_${name}`;\n }\n\n private buildKey(baseKey: string, addKeyPrefix: boolean): string {\n return addKeyPrefix ? this.generateFullKey(baseKey) : baseKey;\n }\n\n private init(\n urlOrClient: string | URL | RedisClient,\n options: RedisClientOptions,\n ) {\n if (typeof urlOrClient === 'string' || urlOrClient instanceof URL) {\n this.client = createClient({...options, url: urlOrClient.toString()});\n this.client.on('error', this.eventHandler);\n this.client.on('connect', this.eventHandler);\n this.client.on('reconnecting', this.eventHandler);\n this.client.on('ready', this.eventHandler);\n } else {\n this.client = urlOrClient;\n }\n }\n\n private eventHandler = (..._args: any[]) => {};\n}\n"],"names":[],"mappings":";;MAKa,eAAe,CAAA;AAC1B,IAAA,wBAAwB;AAChB,IAAA,MAAM;AAEd,IAAA,WAAA,CACE,WAAuC,EACvC,OAA2B,EAC3B,SAAiB,EAAA;AAEjB,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC;AAC/B,QAAA,IAAI,CAAC,wBAAwB,GAAG,SAAS;IAC3C;IAEA,KAAK,CAAC,MAAc,EAAE,OAAc,EAAA;AAClC,QAAA,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC;IAC7E;AAEA,IAAA,MAAM,OAAO,GAAA;AACX,QAAA,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;AACxB,YAAA,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE;QAC7B;IACF;AAEA,IAAA,MAAM,UAAU,GAAA;AACd,QAAA,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;IAC1B;IAEA,MAAM,IAAI,CAAC,IAAY,EAAA;QACrB,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;IAC/B;IAEA,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;IACpE;AAEA,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;IAC9D;AAEA,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;IAC9D;AAEA,IAAA,eAAe,CAAC,IAAY,EAAA;AAC1B,QAAA,OAAO,GAAG,IAAI,CAAC,wBAAwB,CAAA,CAAA,EAAI,IAAI,EAAE;IACnD;IAEQ,QAAQ,CAAC,OAAe,EAAE,YAAqB,EAAA;AACrD,QAAA,OAAO,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,OAAO;IAC/D;IAEQ,IAAI,CACV,WAAuC,EACvC,OAA2B,EAAA;QAE3B,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,YAAY,GAAG,EAAE;AACjE,YAAA,IAAI,CAAC,MAAM,GAAG,YAAY,CAAC,EAAC,GAAG,OAAO,EAAE,GAAG,EAAE,WAAW,CAAC,QAAQ,EAAE,EAAC,CAAC;YACrE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC;YAC1C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC;QAC5C;aAAO;AACL,YAAA,IAAI,CAAC,MAAM,GAAG,WAAW;QAC3B;IACF;IAEQ,YAAY,GAAG,CAAC,GAAG,KAAY,KAAI,EAAE,CAAC;AAC/C;;;;"}
@@ -1 +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;AACzC,QAAA,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,CAAC;;AAGvC,IAAA,MAAM,wBAAwB,GAAA;;AAE5B,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE;;IAG1B,MAAM,uBAAuB,CAAC,aAAqB,EAAA;AACjD,QAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE;QACnD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,KAAK;AAEpD,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;;IAG/B,MAAM,oBAAoB,CAAC,aAAqB,EAAA;AAC9C,QAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE;AACnD,QAAA,UAAU,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC;QAEnC,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;AAED,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE;;AAGlB,IAAA,MAAM,mBAAmB,GAAA;AAC/B,QAAA,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAChD,IAAI,CAAC,OAAO,CAAC,qBAAqB,CACnC;AACD,QAAA,IAAI,UAAU,GAAyB,IAAI,GAAG,EAAE;QAChD,IAAI,gBAAgB,EAAE;AACpB,YAAA,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;;AAGpE,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;;AAErC;;;;"}
1
+ {"version":3,"file":"redis-migrator.mjs","sources":["../../../src/redis-migrator.ts"],"sourcesContent":["import {\n AbstractMigrationEngine,\n SessionStorageMigratorOptions,\n MigrationOperation,\n} from '@shopify/shopify-app-session-storage';\n\nimport {RedisConnection} from './redis-connection';\n\nexport class RedisSessionStorageMigrator extends AbstractMigrationEngine<\n RedisConnection,\n SessionStorageMigratorOptions\n> {\n constructor(\n dbConnection: RedisConnection,\n opts: Partial<SessionStorageMigratorOptions> = {},\n migrations: MigrationOperation[],\n ) {\n // The name has already been decided whith the last migration\n opts.migrationDBIdentifier = 'migrations';\n super(dbConnection, opts, migrations);\n }\n\n async initMigrationPersistence(): Promise<void> {\n // nothing to do here\n return Promise.resolve();\n }\n\n async hasMigrationBeenApplied(migrationName: string): Promise<boolean> {\n const migrations = await this.getMigrationRecords();\n const found = migrations.get(migrationName) ?? false;\n\n return Promise.resolve(found);\n }\n\n async saveAppliedMigration(migrationName: string): Promise<void> {\n const migrations = await this.getMigrationRecords();\n migrations.set(migrationName, true);\n\n this.connection.set(\n this.options.migrationDBIdentifier,\n JSON.stringify(Object.fromEntries(migrations)),\n );\n\n return Promise.resolve();\n }\n\n private async getMigrationRecords(): Promise<Map<string, boolean>> {\n const migrationsRecord = await this.connection.get(\n this.options.migrationDBIdentifier,\n );\n let migrations: Map<string, boolean> = new Map();\n if (migrationsRecord) {\n migrations = new Map(Object.entries(JSON.parse(migrationsRecord)));\n }\n\n return Promise.resolve(migrations);\n }\n}\n"],"names":[],"mappings":";;AAQM,MAAO,2BAA4B,SAAQ,uBAGhD,CAAA;AACC,IAAA,WAAA,CACE,YAA6B,EAC7B,IAAA,GAA+C,EAAE,EACjD,UAAgC,EAAA;;AAGhC,QAAA,IAAI,CAAC,qBAAqB,GAAG,YAAY;AACzC,QAAA,KAAK,CAAC,YAAY,EAAE,IAAI,EAAE,UAAU,CAAC;IACvC;AAEA,IAAA,MAAM,wBAAwB,GAAA;;AAE5B,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE;IAC1B;IAEA,MAAM,uBAAuB,CAAC,aAAqB,EAAA;AACjD,QAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE;QACnD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,KAAK;AAEpD,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC;IAC/B;IAEA,MAAM,oBAAoB,CAAC,aAAqB,EAAA;AAC9C,QAAA,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,mBAAmB,EAAE;AACnD,QAAA,UAAU,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC;QAEnC,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;AAED,QAAA,OAAO,OAAO,CAAC,OAAO,EAAE;IAC1B;AAEQ,IAAA,MAAM,mBAAmB,GAAA;AAC/B,QAAA,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAChD,IAAI,CAAC,OAAO,CAAC,qBAAqB,CACnC;AACD,QAAA,IAAI,UAAU,GAAyB,IAAI,GAAG,EAAE;QAChD,IAAI,gBAAgB,EAAE;AACpB,YAAA,UAAU,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;QACpE;AAEA,QAAA,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;IACpC;AACD;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"redis.mjs","sources":["../../../src/redis.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"redis.mjs","sources":["../../../src/redis.ts"],"sourcesContent":["import {RedisClientOptions, createClient} from 'redis';\nimport {Session} from '@shopify/shopify-api';\nimport {\n SessionStorage,\n SessionStorageMigratorOptions,\n SessionStorageMigrator,\n} from '@shopify/shopify-app-session-storage';\n\nimport {migrationList} from './migrations';\nimport {RedisConnection} from './redis-connection';\nimport {RedisSessionStorageMigrator} from './redis-migrator';\n\ntype RedisClient = ReturnType<typeof createClient>;\n\n/* eslint-disable @shopify/typescript/prefer-pascal-case-enums */\nenum ShopifyStorageOption {\n sessionKeyPrefix = 'sessionKeyPrefix',\n migratorOptions = 'migratorOptions',\n onError = 'onError',\n}\n/* eslint-enable @shopify/typescript/prefer-pascal-case-enums */\n\nexport interface RedisSessionStorageOptions extends RedisClientOptions {\n [ShopifyStorageOption.sessionKeyPrefix]: string;\n [ShopifyStorageOption.migratorOptions]?: SessionStorageMigratorOptions;\n [ShopifyStorageOption.onError]?: (...args: any[]) => void;\n}\n\nconst defaultRedisSessionStorageOptions: RedisSessionStorageOptions = {\n sessionKeyPrefix: 'shopify_sessions',\n migratorOptions: {\n migrationDBIdentifier: 'migrations',\n },\n};\n\nexport class RedisSessionStorage implements SessionStorage {\n static withCredentials(\n host: string,\n db: number,\n username: string,\n password: string,\n opts: Partial<RedisSessionStorageOptions>,\n ) {\n return new RedisSessionStorage(\n new URL(\n `redis://${encodeURIComponent(username)}:${encodeURIComponent(\n password,\n )}@${host}/${db}`,\n ),\n opts,\n );\n }\n\n public readonly ready: Promise<void>;\n private internalInit: Promise<void>;\n private options: RedisSessionStorageOptions;\n private client: RedisConnection;\n private migrator: SessionStorageMigrator;\n\n constructor(\n urlOrClient: URL | string | RedisClient,\n opts: Partial<RedisSessionStorageOptions> = {},\n ) {\n const allowedClientKeys = Object.keys(ShopifyStorageOption);\n const disallowedClientKeys = Object.keys(opts).filter(\n (key) => !allowedClientKeys.includes(key),\n );\n\n if (\n typeof urlOrClient !== 'string' &&\n !(urlOrClient instanceof URL) &&\n disallowedClientKeys.length > 0\n ) {\n throw new Error(\n 'Passing a RedisClient instance is not supported with options. Set the options when creating the client ' +\n 'instead.',\n );\n }\n\n this.options = {...defaultRedisSessionStorageOptions, ...opts};\n this.internalInit = this.init(urlOrClient);\n this.migrator = new RedisSessionStorageMigrator(\n this.client,\n this.options.migratorOptions,\n migrationList,\n );\n this.ready = this.migrator.applyMigrations(this.internalInit);\n }\n\n public async storeSession(session: Session): Promise<boolean> {\n await this.ready;\n\n await this.client.set(\n session.id,\n JSON.stringify(session.toPropertyArray(true)),\n );\n await this.addKeyToShopList(session);\n return true;\n }\n\n public async loadSession(id: string): Promise<Session | undefined> {\n await this.ready;\n\n let rawResult: any = await this.client.get(id);\n\n if (!rawResult) return undefined;\n rawResult = JSON.parse(rawResult);\n\n return Session.fromPropertyArray(rawResult, true);\n }\n\n public async deleteSession(id: string): Promise<boolean> {\n await this.ready;\n const session = await this.loadSession(id);\n if (session) {\n await this.removeKeyFromShopList(session.shop, id);\n await this.client.del(id);\n }\n return true;\n }\n\n public async deleteSessions(ids: string[]): Promise<boolean> {\n await this.ready;\n await Promise.all(ids.map((id) => this.deleteSession(id)));\n return true;\n }\n\n public async findSessionsByShop(shop: string): Promise<Session[]> {\n await this.ready;\n\n const idKeysArrayString = await this.client.get(shop);\n if (!idKeysArrayString) return [];\n\n const idKeysArray = JSON.parse(idKeysArrayString);\n const results: Session[] = [];\n for (const idKey of idKeysArray) {\n const rawResult = await this.client.get(idKey, false);\n if (!rawResult) continue;\n\n const session = Session.fromPropertyArray(JSON.parse(rawResult), true);\n results.push(session);\n }\n\n return results;\n }\n\n public async disconnect(): Promise<void> {\n await this.client.disconnect();\n }\n\n private async addKeyToShopList(session: Session) {\n const shopKey = session.shop;\n const idKey = this.client.generateFullKey(session.id);\n const idKeysArrayString = await this.client.get(shopKey);\n\n if (idKeysArrayString) {\n const idKeysArray = JSON.parse(idKeysArrayString);\n\n if (!idKeysArray.includes(idKey)) {\n idKeysArray.push(idKey);\n await this.client.set(shopKey, JSON.stringify(idKeysArray));\n }\n } else {\n await this.client.set(shopKey, JSON.stringify([idKey]));\n }\n }\n\n private async removeKeyFromShopList(shop: string, id: string) {\n const shopKey = shop;\n const idKey = this.client.generateFullKey(id);\n const idKeysArrayString = await this.client.get(shopKey);\n\n if (idKeysArrayString) {\n const idKeysArray = JSON.parse(idKeysArrayString);\n const index = idKeysArray.indexOf(idKey);\n\n if (index > -1) {\n idKeysArray.splice(index, 1);\n await this.client.set(shopKey, JSON.stringify(idKeysArray));\n }\n }\n }\n\n private async init(urlOrClient: URL | string | RedisClient) {\n this.client = new RedisConnection(\n urlOrClient,\n this.options,\n this.options.sessionKeyPrefix,\n );\n await this.client.connect();\n }\n}\n"],"names":[],"mappings":"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"}