{"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 them to ISO strings\n    const rawSession = {\n      ...session.toObject(),\n      expires: session.expires?.toISOString(),\n      refreshTokenExpires: session.refreshTokenExpires?.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 ISO strings back to Date objects\n    return new Session({\n      ...rawSession,\n      expires: rawSession.expires ? new Date(rawSession.expires) : undefined,\n      refreshTokenExpires: rawSession.refreshTokenExpires\n        ? new Date(rawSession.refreshTokenExpires as unknown as string)\n        : undefined,\n    });\n  }\n}\n"],"names":[],"mappings":"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"}