{"version":3,"sources":["../src/storage/lib/client.ts"],"sourcesContent":["/**\n * この実装はcross-storageほぼそのままです。\n */\nconst generateUUID = () => {\n  return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) {\n    const r = (Math.random() * 16) | 0,\n      v = c == \"x\" ? r : (r & 0x3) | 0x8;\n\n    return v.toString(16);\n  });\n};\nexport class StorageClient {\n  id: string;\n  frameId: string;\n  origin: string;\n  requests: Record<string, any>;\n  connected: boolean;\n  closed: boolean;\n  count: number;\n  timeout: number;\n  hub: null | Window;\n\n  constructor(url: string, opts?: { frameId?: string; timeout?: number }) {\n    opts = opts || {};\n\n    this.id = generateUUID();\n    this.frameId = opts.frameId || \"CrossStorageClient-\" + this.id;\n    this.origin = new URL(url).origin;\n    this.requests = {};\n    this.connected = false;\n    this.closed = false;\n    this.count = 0;\n    this.timeout = opts.timeout || 5000;\n\n    window.addEventListener(\"message\", this.listener.bind(this), false);\n\n    const frame = this.createFrame(url);\n    this.hub = frame.contentWindow;\n  }\n\n  onConnect() {\n    if (this.connected) {\n      return Promise.resolve();\n    } else if (this.closed) {\n      return Promise.reject(new Error(\"StorageClient has closed.\"));\n    }\n\n    if (!this.requests.connect) {\n      this.requests.connect = [];\n    }\n\n    return new Promise((resolve, reject) => {\n      const timeout = setTimeout(function () {\n        reject(new Error(\"StorageClient could not connect.\"));\n      }, this.timeout);\n\n      this.requests.connect.push((err: string) => {\n        clearTimeout(timeout);\n        if (err) return reject(err);\n\n        resolve(undefined);\n      });\n    });\n  }\n\n  set(key: string, value: string) {\n    return this.request(\"set\", {\n      key: key,\n      value: value,\n    });\n  }\n\n  get(...keys: string[]) {\n    return this.request(\"get\", { keys });\n  }\n\n  del(...keys: string[]) {\n    return this.request(\"del\", { keys });\n  }\n\n  clear() {\n    return this.request(\"clear\");\n  }\n\n  getKeys() {\n    this.request(\"getKeys\");\n  }\n\n  close() {\n    const frame = document.getElementById(this.frameId);\n    if (frame && frame.parentNode) {\n      frame.parentNode.removeChild(frame);\n    }\n\n    window.removeEventListener(\"message\", this.listener, false);\n\n    this.connected = false;\n    this.closed = true;\n  }\n\n  private listener(message: MessageEvent) {\n    let i, error, response;\n\n    if (this.closed || !message.data || typeof message.data !== \"string\") {\n      return;\n    }\n\n    const origin = message.origin;\n\n    if (origin !== this.origin) return;\n\n    if (message.data === \"cross-storage:unavailable\") {\n      if (!this.closed) this.close();\n      if (!this.requests.connect) return;\n\n      error = new Error(\n        \"Closing StorageClient. Could not access localStorage in StorageHub.\",\n      );\n      for (i = 0; i < this.requests.connect.length; i++) {\n        this.requests.connect[i](error);\n      }\n\n      return;\n    }\n\n    if (message.data.indexOf(\"cross-storage:\") !== -1 && !this.connected) {\n      this.connected = true;\n      if (!this.requests.connect) return;\n\n      for (i = 0; i < this.requests.connect.length; i++) {\n        this.requests.connect[i](error);\n      }\n      delete this.requests.connect;\n    }\n\n    if (message.data === \"cross-storage:ready\") return;\n\n    try {\n      response = JSON.parse(message.data);\n    } catch (e) {\n      return;\n    }\n\n    if (!response.id) return;\n\n    if (this.requests[response.id]) {\n      this.requests[response.id](response.error, response.result);\n    }\n  }\n\n  private createFrame(url: string) {\n    const frame = window.document.createElement(\"iframe\");\n    frame.id = this.frameId;\n\n    frame.style.display = \"none\";\n    frame.style.position = \"absolute\";\n    frame.style.top = \"-999px\";\n    frame.style.left = \"-999px\";\n\n    window.document.body.appendChild(frame);\n    frame.src = url;\n\n    return frame;\n  }\n\n  // eslint-disable-next-line @typescript-eslint/ban-types\n  private request(method: string, params?: {}) {\n    if (this.closed) {\n      return Promise.reject(new Error(\"StorageClient has closed.\"));\n    }\n\n    this.count++;\n\n    const req = {\n      id: this.id + \":\" + this.count,\n      method: \"cross-storage:\" + method,\n      params: params,\n    };\n\n    return new Promise((resolve, reject) => {\n      const timeout = window.setTimeout(() => {\n        if (!this.requests[req.id]) return;\n\n        delete this.requests[req.id];\n        reject(\n          new Error(\"Timeout: StorageClient could not perform \" + req.method),\n        );\n      }, this.timeout);\n\n      this.requests[req.id] = (err: string, result: string) => {\n        clearTimeout(timeout);\n        delete this.requests[req.id];\n        if (err) return reject(new Error(err));\n        resolve(result);\n      };\n\n      if (this.hub) {\n        this.hub.postMessage(JSON.stringify(req), this.origin);\n      } else {\n        reject(new Error(\"Not found StorageHub.\"));\n      }\n    });\n  }\n}\n"],"mappings":"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","names":[]}