{"version":3,"sources":["jsdelivr-header.js","/npm/think-session-mysql@2.0.6/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACNA,MAAM,OAAS,QAAQ,UACjB,OAAS,QAAQ,gBACjB,MAAQ,QAAQ,eAChB,GAAK,QAAQ,YACb,gBAAkB,OAAO,4BAmB/B,MAAM,aACJ,WAAA,CAAY,EAAU,CAAC,EAAG,EAAK,GAC7B,OAAO,EAAQ,OAAQ,oBACvB,KAAK,QAAU,EACf,KAAK,cAAgB,EACrB,KAAK,MAAQ,MAAM,YAAY,OAAO,KAAK,EAAS,WACpD,KAAK,IAAM,EACX,KAAK,KAAO,CAAC,EACb,KAAK,WAAa,KAAK,QAAQ,QAAU,IAAM,UAC/C,KAAK,OAAS,EACd,KAAK,OAAS,KAAK,QAAQ,QAAU,EACrC,KAAK,OAAS,EACd,KAAK,OAAS,gBACd,GAAG,KAAM,KAAK,QAAQ,YAGtB,KAAK,IAAI,IAAI,KAAK,UAAU,KAC1B,KAAK,OAAO,GAEhB,CAEA,CAAC,mBACC,OAAI,KAAK,YACA,KAAK,YAEV,KAAK,QAAQ,QAA0B,IAAjB,KAAK,QAC7B,KAAK,YAAc,QAAQ,UACpB,KAAK,cAGd,KAAK,YAAc,KAAK,MAAM,MAAM,CAClC,IAAK,mBAAmB,KAAK,gCAC7B,OAAQ,CAAC,KAAK,QAAQ,UACrB,MAAK,IACN,GAAmB,IAAf,EAAI,OAAc,OAEtB,GAAI,EAAI,GAAG,OAAS,KAAK,MACvB,OAAO,KAAK,SAEd,MAAM,EAAU,EAAI,GAAG,KACvB,KAAK,KAAO,KAAK,MAAM,IAAY,CAAC,EAChC,EAAI,GAAG,SACT,KAAK,OAAS,EAAI,GAAG,QAEvB,KAAK,OAAS,EAAI,GAAG,OACrB,KAAK,YAAY,IAChB,OAAM,IACP,QAAQ,MAAM,EAAI,IAEb,KAAK,YACd,CACA,UAAA,GACE,GAAI,KAAK,QAAU,KAAK,OAAQ,EAChB,KAAK,OAAS,KAAK,OAAS,KAAK,OACpC,KAAK,cAAc,iBAC5B,KAAK,OAAS,EACd,KAAK,cAAc,OAAS,KAAK,OAEjC,KAAK,IAAI,OAAO,KAAK,cAAc,KAAM,KAAK,QAAQ,OAAQ,KAAK,eAEvE,CACF,CACA,GAAA,CAAI,GACF,OAAO,KAAK,mBAAmB,MAAK,KAC9B,KAAK,QAAQ,aACf,KAAK,OAAS,GAET,EAAO,KAAK,KAAK,GAAQ,KAAK,OAEzC,CAEA,GAAA,CAAI,EAAM,GACR,OAAO,KAAK,mBAAmB,MAAK,KAClC,KAAK,OAAS,EACA,OAAV,SACK,KAAK,KAAK,GAEjB,KAAK,KAAK,GAAQ,CACpB,GAEJ,CAEA,SAGE,OAFA,KAAK,QAAU,EACf,KAAK,KAAO,CAAC,EACN,QAAQ,SACjB,CAEA,KAAA,GACE,IAAqB,IAAjB,KAAK,OACP,KAAK,OAAS,EAEd,KAAK,MAAM,QAAQ,CACjB,IAAK,iBAAiB,KAAK,6BAC3B,OAAQ,CAAC,KAAK,QAAQ,eAEnB,GAAoB,IAAhB,KAAK,OAAc,CAC5B,KAAK,OAAS,EAEd,MAAM,EAAS,KAAK,MAAQ,KAAK,OAC3B,EAAS,CAAC,KAAK,QAAQ,OAAQ,KAAK,UAAU,KAAK,MAAO,EAAQ,KAAK,QAC7E,KAAK,MAAM,QAAQ,CACjB,IAAK,iBAAiB,KAAK,iIAE3B,OAAQ,IAAI,EAAQ,EAAO,GAAI,EAAO,GAAI,EAAO,KAErD,CACA,OAAO,QAAQ,SACjB,CAEA,EAAA,GACE,OAAO,KAAK,MAAM,QAAQ,CACxB,IAAK,iBAAiB,KAAK,8BAA8B,KAAK,SAElE,EAEF,OAAO,QAAU","file":"/npm/think-session-mysql@2.0.6/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/think-session-mysql@2.0.6/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","const assert = require('assert');\nconst helper = require('think-helper');\nconst mysql = require('think-mysql');\nconst gc = require('think-gc');\nconst initSessionData = Symbol('think-session-mysql-init');\n\n/*\nCREATE TABLE `think_session` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `cookie` varchar(255) NOT NULL DEFAULT '',\n  `data` text,\n  `expire` bigint(11) NOT NULL DEFAULT '0',\n  `maxage` int(11) NOT NULL DEFAULT '0',\n  PRIMARY KEY (`id`),\n  UNIQUE KEY `cookie` (`cookie`),\n  KEY `expire` (`expire`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8;\n */\n\n/**\n * use mysql to store session\n *\n */\nclass MysqlSession {\n  constructor(options = {}, ctx, cookieOptions) {\n    assert(options.cookie, '.cookie required');\n    this.options = options;\n    this.cookieOptions = cookieOptions;\n    this.mysql = mysql.getInstance(helper.omit(options, 'cookie'));\n    this.ctx = ctx;\n    this.data = {};\n    this.tableName = (this.options.prefix || '') + 'session';\n    this.status = 0;\n    this.maxAge = this.options.maxAge || 0;\n    this.expire = 0;\n    this.gcType = `session_mysql`;\n    gc(this, this.options.gcInterval);\n\n    // flush session when request finish\n    this.ctx.res.once('finish', () => {\n      this.flush();\n    });\n  }\n\n  [initSessionData]() {\n    if (this.initPromise) {\n      return this.initPromise;\n    }\n    if (this.options.fresh || this.status === -1) {\n      this.initPromise = Promise.resolve();\n      return this.initPromise;\n    }\n\n    this.initPromise = this.mysql.query({\n      sql: `SELECT * FROM \\`${this.tableName}\\` WHERE cookie = ? `,\n      values: [this.options.cookie]\n    }).then(row => {\n      if (row.length === 0) return;\n      // session data is expired\n      if (row[0].expire < Date.now()) {\n        return this.delete();\n      }\n      const content = row[0].data;\n      this.data = JSON.parse(content) || {};\n      if (row[0].maxAge) {\n        this.maxAge = row[0].maxAge;\n      }\n      this.expire = row[0].expire;\n      this.autoUpdate();\n    }).catch(err => {\n      console.error(err);\n    });\n    return this.initPromise;\n  }\n  autoUpdate() {\n    if (this.maxAge && this.expire) {\n      const rate = (this.expire - Date.now()) / this.maxAge;\n      if (rate < this.cookieOptions.autoUpdateRate) {\n        this.status = 1;\n        this.cookieOptions.maxAge = this.maxAge;\n        // update cookie maxAge\n        this.ctx.cookie(this.cookieOptions.name, this.options.cookie, this.cookieOptions);\n      }\n    }\n  }\n  get(name) {\n    return this[initSessionData]().then(() => {\n      if (this.options.autoUpdate) {\n        this.status = 1;\n      }\n      return name ? this.data[name] : this.data;\n    });\n  }\n\n  set(name, value) {\n    return this[initSessionData]().then(() => {\n      this.status = 1;\n      if (value === null) {\n        delete this.data[name];\n      } else {\n        this.data[name] = value;\n      }\n    });\n  }\n\n  'delete'() {\n    this.status = -1;\n    this.data = {};\n    return Promise.resolve();\n  }\n\n  flush() {\n    if (this.status === -1) {\n      this.status = 0;\n      // delete data\n      this.mysql.execute({\n        sql: `DELETE FROM \\`${this.tableName}\\` WHERE cookie=?`,\n        values: [this.options.cookie]\n      });\n    } else if (this.status === 1) {\n      this.status = 0;\n      // insert or update data\n      const expire = Date.now() + this.maxAge;\n      const fields = [this.options.cookie, JSON.stringify(this.data), expire, this.maxAge];\n      this.mysql.execute({\n        sql: `INSERT INTO \\`${this.tableName}\\` (cookie, data, expire, maxage) VALUES(?, ?, ?, ?) \n            ON DUPLICATE KEY UPDATE data=?, expire=?, maxage=?`,\n        values: [...fields, fields[1], fields[2], fields[3]]\n      });\n    }\n    return Promise.resolve();\n  }\n\n  gc() {\n    return this.mysql.execute({\n      sql: `DELETE FROM \\`${this.tableName}\\` WHERE expire < ${Date.now()}`\n    });\n  }\n}\nmodule.exports = MysqlSession;\n"]}