{"version":3,"file":"sqlite.mjs","sources":["../../../src/sqlite.ts"],"sourcesContent":["import {Session} from '@shopify/shopify-api';\nimport {\n  SessionStorage,\n  RdbmsSessionStorageOptions,\n} from '@shopify/shopify-app-session-storage';\nimport sqlite3 from 'sqlite3';\n\nimport {SqliteConnection} from './sqlite-connection';\nimport {migrationList} from './migrations';\nimport {SqliteSessionStorageMigrator} from './sqlite-migrator';\n\nexport interface SQLiteSessionStorageOptions extends RdbmsSessionStorageOptions {}\n\nconst defaultSQLiteSessionStorageOptions: SQLiteSessionStorageOptions = {\n  sessionTableName: 'shopify_sessions',\n  migratorOptions: {\n    migrationDBIdentifier: 'shopify_sessions_migrations',\n    migrationNameColumnName: 'migration_name',\n  },\n};\n\nexport class SQLiteSessionStorage implements SessionStorage {\n  public readonly ready: Promise<void>;\n  private options: SQLiteSessionStorageOptions;\n  private db: SqliteConnection;\n  private internalInit: Promise<void>;\n  private migrator: SqliteSessionStorageMigrator;\n\n  constructor(\n    database: string | sqlite3.Database,\n    opts: Partial<SQLiteSessionStorageOptions> = {},\n  ) {\n    this.options = {...defaultSQLiteSessionStorageOptions, ...opts};\n    this.db = new SqliteConnection(database, this.options.sessionTableName);\n    this.internalInit = this.init();\n    this.migrator = new SqliteSessionStorageMigrator(\n      this.db,\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    // Note milliseconds to seconds conversion for `expires` property\n    const entries = session\n      .toPropertyArray(true)\n      .map(([key, value]) =>\n        key === 'expires' || key === 'refreshTokenExpires'\n          ? [key, Math.floor((value as number) / 1000)]\n          : [key, value],\n      );\n\n    const query = `\n      INSERT OR REPLACE INTO ${this.options.sessionTableName}\n      (${entries.map(([key]) => key).join(', ')})\n      VALUES (${entries\n        .map(() => `${this.db.getArgumentPlaceholder()}`)\n        .join(', ')});\n    `;\n\n    await this.db.query(\n      query,\n      entries.map(([_key, value]) => value),\n    );\n    return true;\n  }\n\n  public async loadSession(id: string): Promise<Session | undefined> {\n    await this.ready;\n    const query = `\n      SELECT * FROM ${this.options.sessionTableName}\n      WHERE id = ${this.db.getArgumentPlaceholder()};\n    `;\n    const rows = await this.db.query(query, [id]);\n    if (!Array.isArray(rows) || rows?.length !== 1) return undefined;\n    const rawResult = rows[0] as any;\n    return this.databaseRowToSession(rawResult);\n  }\n\n  public async deleteSession(id: string): Promise<boolean> {\n    await this.ready;\n    const query = `\n      DELETE FROM ${this.options.sessionTableName}\n      WHERE id = ${this.db.getArgumentPlaceholder()};\n    `;\n    await this.db.query(query, [id]);\n    return true;\n  }\n\n  public async deleteSessions(ids: string[]): Promise<boolean> {\n    await this.ready;\n    const query = `\n      DELETE FROM ${this.options.sessionTableName}\n      WHERE id IN (${ids\n        .map(() => `${this.db.getArgumentPlaceholder()}`)\n        .join(',')});\n    `;\n    await this.db.query(query, ids);\n    return true;\n  }\n\n  public async findSessionsByShop(shop: string): Promise<Session[]> {\n    await this.ready;\n    const query = `\n      SELECT * FROM ${this.options.sessionTableName}\n      WHERE shop = ${this.db.getArgumentPlaceholder()};\n    `;\n    const rows = await this.db.query(query, [shop]);\n    if (!Array.isArray(rows) || rows?.length === 0) return [];\n\n    const results: Session[] = rows.map((row: any) => {\n      return this.databaseRowToSession(row);\n    });\n    return results;\n  }\n\n  private async init() {\n    const hasSessionTable = await this.db.hasTable(\n      this.options.sessionTableName,\n    );\n    if (!hasSessionTable) {\n      const query = `\n        CREATE TABLE ${this.options.sessionTableName} (\n          id varchar(255) NOT NULL PRIMARY KEY,\n          shop varchar(255) NOT NULL,\n          state varchar(255) NOT NULL,\n          isOnline integer NOT NULL,\n          expires integer,\n          scope varchar(1024),\n          accessToken varchar(255),\n          userId integer,\n          firstName varchar(255),\n          lastName varchar(255),\n          email varchar(255),\n          accountOwner integer,\n          locale varchar(255),\n          collaborator integer,\n          emailVerified integer,\n          refreshToken varchar(255),\n          refreshTokenExpires integer\n        );\n      `;\n      await this.db.query(query);\n    }\n  }\n\n  private databaseRowToSession(row: any): Session {\n    // convert seconds to milliseconds prior to creating Session object\n    if (row.expires) row.expires *= 1000;\n    if (row.refreshTokenExpires) row.refreshTokenExpires *= 1000;\n    return Session.fromPropertyArray(Object.entries(row), true);\n  }\n}\n"],"names":[],"mappings":"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"}