@shopify/shopify-app-session-storage-dynamodb
Version:
Shopify App Session Storage for DynamoDB
1 lines • 6.37 kB
Source Map (JSON)
{"version":3,"file":"dynamodb.mjs","sources":["../../../src/dynamodb.ts"],"sourcesContent":["import {\n AttributeValue,\n DeleteItemCommand,\n DynamoDBClient,\n DynamoDBClientConfig,\n GetItemCommand,\n PutItemCommand,\n QueryCommand,\n} from '@aws-sdk/client-dynamodb';\nimport {marshall, unmarshall} from '@aws-sdk/util-dynamodb';\nimport {Session, SessionParams} from '@shopify/shopify-api';\nimport {SessionStorage} from '@shopify/shopify-app-session-storage';\n\nexport interface DynamoDBSessionStorageOptions {\n sessionTableName: string;\n shopIndexName: string;\n config?: DynamoDBClientConfig;\n}\n\nconst defaultDynamoDBSessionStorageOptions: DynamoDBSessionStorageOptions = {\n sessionTableName: 'shopify_sessions',\n shopIndexName: 'shop_index',\n};\n\nexport class DynamoDBSessionStorage implements SessionStorage {\n private client: DynamoDBClient;\n private options: DynamoDBSessionStorageOptions;\n\n constructor(opts?: DynamoDBSessionStorageOptions) {\n this.options = {...defaultDynamoDBSessionStorageOptions, ...opts};\n this.client = new DynamoDBClient({...this.options.config});\n }\n\n public async storeSession(session: Session): Promise<boolean> {\n await this.client.send(\n new PutItemCommand({\n TableName: this.options.sessionTableName,\n Item: this.serializeSession(session),\n }),\n );\n\n return true;\n }\n\n public async loadSession(id: string): Promise<Session | undefined> {\n if (!id) return undefined;\n\n const result = await this.client.send(\n new GetItemCommand({\n TableName: this.options.sessionTableName,\n Key: this.serializeId(id),\n }),\n );\n\n return result.Item ? this.deserializeSession(result.Item) : undefined;\n }\n\n public async deleteSession(id: string): Promise<boolean> {\n await this.client.send(\n new DeleteItemCommand({\n TableName: this.options.sessionTableName,\n Key: this.serializeId(id),\n }),\n );\n\n return true;\n }\n\n public async deleteSessions(ids: string[]): Promise<boolean> {\n await Promise.all(ids.map((id) => this.deleteSession(id)));\n return true;\n }\n\n public async findSessionsByShop(shop: string): Promise<Session[]> {\n const result = await this.client.send(\n new QueryCommand({\n TableName: this.options.sessionTableName,\n IndexName: this.options.shopIndexName,\n KeyConditionExpression: 'shop = :shop',\n ExpressionAttributeValues: marshall({\n ':shop': shop,\n }),\n ProjectionExpression: 'id, shop',\n }),\n );\n\n const sessions = await Promise.all(\n result.Items?.map((item) => this.loadSession(this.deserializeId(item))) ||\n [],\n );\n\n return sessions.filter(\n (session): session is Session => session !== undefined,\n );\n }\n\n private serializeId(id: string): Record<string, AttributeValue> {\n return marshall({id});\n }\n\n private deserializeId(id: Record<string, AttributeValue>): string {\n return unmarshall(id).id;\n }\n\n private serializeSession(session: Session): Record<string, AttributeValue> {\n // DynamoDB doesn't support Date objects, so we need to convert it to an ISO string\n const rawSession = {\n ...session.toObject(),\n expires: session.expires?.toISOString(),\n };\n\n return marshall(rawSession, {\n removeUndefinedValues: true,\n });\n }\n\n private deserializeSession(session: Record<string, AttributeValue>): Session {\n const rawSession = unmarshall(session) as SessionParams;\n\n // Convert the ISO string back to a Date object\n return new Session({\n ...rawSession,\n expires: rawSession.expires ? new Date(rawSession.expires) : undefined,\n });\n }\n}\n"],"names":[],"mappings":"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"}