{"version":3,"sources":["../src/storage/lib/hub.ts"],"sourcesContent":["/**\n * この実装はcross-storageほぼそのままです。\n */\ntype Method = \"get\" | \"set\" | \"del\" | \"getKeys\" | \"clear\";\n\nexport interface Permission {\n  origin: RegExp;\n  allow: Method[];\n}\n\nconst context: {\n  permissions?: Permission[];\n} = {};\n\n/**\n * Do not use this directly. This specifications are subject to significant change.\n * @internal\n */\nexport const init = (permissions: Permission[]) => {\n  context.permissions = permissions;\n  window.addEventListener(\"message\", listener, false);\n  window.parent.postMessage(\"cross-storage:ready\", \"*\");\n};\n\nconst permitted = (origin: string, method: Method) => {\n  const available = [\"get\", \"set\", \"del\", \"clear\", \"getKeys\"];\n  if (!available.includes(method)) {\n    return false;\n  }\n\n  if (context.permissions === undefined) {\n    return false;\n  }\n\n  for (let i = 0; i < context.permissions.length; i++) {\n    const entry = context.permissions[i];\n    const match = entry.origin.test(origin);\n    if (match && entry.allow.includes(method)) {\n      return true;\n    }\n  }\n  return false;\n};\n\nconst methods: {\n  // eslint-disable-next-line @typescript-eslint/ban-types\n  [key in Method]: Function;\n} = {\n  get: (params: { keys: string[] }) => {\n    const storage = window.localStorage;\n    const result = [];\n    for (let i = 0; i < params.keys.length; i++) {\n      const value = storage.getItem(params.keys[i]) || null;\n      result.push(value);\n    }\n    // Todo: このパターン好きじゃない\n    return result.length > 1 ? result : result[0];\n  },\n  set: (params: { key: string; value: string }) => {\n    window.localStorage.setItem(params.key, params.value);\n  },\n  del: (params: { keys: string[] }) => {\n    for (var i = 0; i < params.keys.length; i++) {\n      window.localStorage.removeItem(params.keys[i]);\n    }\n  },\n  getKeys: () => {\n    const keys = [];\n    const length = window.localStorage.length;\n\n    for (let i = 0; i < length; i++) {\n      keys.push(window.localStorage.key(i));\n    }\n\n    return keys;\n  },\n  clear: () => {\n    window.localStorage.clear();\n  },\n};\n\ninterface Message {\n  origin: string;\n  data: string;\n}\n\nconst listener = (message: Message) => {\n  // Messages can be sent in various formats, so limit it to string\n  if (typeof message.data !== \"string\") {\n    return;\n  }\n  // postMessage returns the string \"null\" as the origin for \"file://\"\n  const origin = message.origin === \"null\" ? \"file://\" : message.origin;\n\n  // Handle polling for a ready message\n  if (message.data === \"cross-storage:poll\") {\n    return window.parent.postMessage(\"cross-storage:ready\", message.origin);\n  }\n\n  // Ignore the ready message when viewing the hub directly\n  if (message.data === \"cross-storage:ready\") return;\n\n  const request: {\n    id: string;\n    method?: string;\n    // eslint-disable-next-line @typescript-eslint/ban-types\n    params: Object;\n  } = JSON.parse(message.data);\n\n  // Check whether request.method is a string\n  if (!request || typeof request.method !== \"string\") {\n    return;\n  }\n\n  const method = request.method.split(\"cross-storage:\")[1] as Method;\n\n  let error = \"\";\n  let result: string | undefined = undefined;\n\n  if (!method) {\n    return;\n  } else if (!permitted(origin, method)) {\n    error = \"Invalid permissions for \" + method;\n  } else {\n    try {\n      result = methods[method](request.params);\n    } catch (err) {\n      error = (err as Error).message;\n    }\n  }\n\n  const response = JSON.stringify({\n    id: request.id,\n    error: error,\n    result: result,\n  });\n\n  // postMessage requires that the target origin be set to \"*\" for \"file://\"\n  const targetOrigin = origin === \"file://\" ? \"*\" : origin;\n\n  window.parent.postMessage(response, targetOrigin);\n};\n"],"mappings":";AAUA,IAAM,UAEF,CAAC;AAME,IAAM,OAAO,CAAC,gBAA8B;AACjD,UAAQ,cAAc;AACtB,SAAO,iBAAiB,WAAW,UAAU,KAAK;AAClD,SAAO,OAAO,YAAY,uBAAuB,GAAG;AACtD;AAEA,IAAM,YAAY,CAAC,QAAgB,WAAmB;AACpD,QAAM,YAAY,CAAC,OAAO,OAAO,OAAO,SAAS,SAAS;AAC1D,MAAI,CAAC,UAAU,SAAS,MAAM,GAAG;AAC/B,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,gBAAgB,QAAW;AACrC,WAAO;AAAA,EACT;AAEA,WAAS,IAAI,GAAG,IAAI,QAAQ,YAAY,QAAQ,KAAK;AACnD,UAAM,QAAQ,QAAQ,YAAY,CAAC;AACnC,UAAM,QAAQ,MAAM,OAAO,KAAK,MAAM;AACtC,QAAI,SAAS,MAAM,MAAM,SAAS,MAAM,GAAG;AACzC,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;AAEA,IAAM,UAGF;AAAA,EACF,KAAK,CAAC,WAA+B;AACnC,UAAM,UAAU,OAAO;AACvB,UAAM,SAAS,CAAC;AAChB,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK,QAAQ,KAAK;AAC3C,YAAM,QAAQ,QAAQ,QAAQ,OAAO,KAAK,CAAC,CAAC,KAAK;AACjD,aAAO,KAAK,KAAK;AAAA,IACnB;AAEA,WAAO,OAAO,SAAS,IAAI,SAAS,OAAO,CAAC;AAAA,EAC9C;AAAA,EACA,KAAK,CAAC,WAA2C;AAC/C,WAAO,aAAa,QAAQ,OAAO,KAAK,OAAO,KAAK;AAAA,EACtD;AAAA,EACA,KAAK,CAAC,WAA+B;AACnC,aAAS,IAAI,GAAG,IAAI,OAAO,KAAK,QAAQ,KAAK;AAC3C,aAAO,aAAa,WAAW,OAAO,KAAK,CAAC,CAAC;AAAA,IAC/C;AAAA,EACF;AAAA,EACA,SAAS,MAAM;AACb,UAAM,OAAO,CAAC;AACd,UAAM,SAAS,OAAO,aAAa;AAEnC,aAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,WAAK,KAAK,OAAO,aAAa,IAAI,CAAC,CAAC;AAAA,IACtC;AAEA,WAAO;AAAA,EACT;AAAA,EACA,OAAO,MAAM;AACX,WAAO,aAAa,MAAM;AAAA,EAC5B;AACF;AAOA,IAAM,WAAW,CAAC,YAAqB;AAErC,MAAI,OAAO,QAAQ,SAAS,UAAU;AACpC;AAAA,EACF;AAEA,QAAM,SAAS,QAAQ,WAAW,SAAS,YAAY,QAAQ;AAG/D,MAAI,QAAQ,SAAS,sBAAsB;AACzC,WAAO,OAAO,OAAO,YAAY,uBAAuB,QAAQ,MAAM;AAAA,EACxE;AAGA,MAAI,QAAQ,SAAS,sBAAuB;AAE5C,QAAM,UAKF,KAAK,MAAM,QAAQ,IAAI;AAG3B,MAAI,CAAC,WAAW,OAAO,QAAQ,WAAW,UAAU;AAClD;AAAA,EACF;AAEA,QAAM,SAAS,QAAQ,OAAO,MAAM,gBAAgB,EAAE,CAAC;AAEvD,MAAI,QAAQ;AACZ,MAAI,SAA6B;AAEjC,MAAI,CAAC,QAAQ;AACX;AAAA,EACF,WAAW,CAAC,UAAU,QAAQ,MAAM,GAAG;AACrC,YAAQ,6BAA6B;AAAA,EACvC,OAAO;AACL,QAAI;AACF,eAAS,QAAQ,MAAM,EAAE,QAAQ,MAAM;AAAA,IACzC,SAAS,KAAK;AACZ,cAAS,IAAc;AAAA,IACzB;AAAA,EACF;AAEA,QAAM,WAAW,KAAK,UAAU;AAAA,IAC9B,IAAI,QAAQ;AAAA,IACZ;AAAA,IACA;AAAA,EACF,CAAC;AAGD,QAAM,eAAe,WAAW,YAAY,MAAM;AAElD,SAAO,OAAO,YAAY,UAAU,YAAY;AAClD;","names":[]}