m2m-components 6.1.6-alpha-1744688789903-e8a0939.0 → 6.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,17 @@
1
+ import {
2
+ persistenceDatabase
3
+ } from "./chunk-E5KIJ5DQ.mjs";
4
+ import {
5
+ m2mAuthTokenApi
6
+ } from "./chunk-MERECGBH.mjs";
7
+
8
+ // src/storage/clearAuth.tsx
9
+ var clearAuth = async () => {
10
+ await persistenceDatabase.clear("auth");
11
+ await m2mAuthTokenApi.clear();
12
+ };
13
+
14
+ export {
15
+ clearAuth
16
+ };
17
+ //# sourceMappingURL=chunk-3ZM74LVQ.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/storage/clearAuth.tsx"],"sourcesContent":["import { m2mAuthTokenApi } from \"./client\";\nimport { persistenceDatabase } from \"./persistenceDatabase\";\n\nexport const clearAuth = async () => {\n await persistenceDatabase.clear(\"auth\");\n await m2mAuthTokenApi.clear();\n};\n"],"mappings":";;;;;;;;AAGO,IAAM,YAAY,YAAY;AACnC,QAAM,oBAAoB,MAAM,MAAM;AACtC,QAAM,gBAAgB,MAAM;AAC9B;","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-JG5QN6O7.mjs";
4
4
  import {
5
5
  persistenceDatabase
6
- } from "./chunk-GQCJ5QNH.mjs";
6
+ } from "./chunk-E5KIJ5DQ.mjs";
7
7
  import {
8
8
  requestGetToken
9
9
  } from "./chunk-47C2N2UF.mjs";
@@ -35,4 +35,4 @@ var refreshAuth = async () => {
35
35
  export {
36
36
  refreshAuth
37
37
  };
38
- //# sourceMappingURL=chunk-27D73AG2.mjs.map
38
+ //# sourceMappingURL=chunk-AJUMESCA.mjs.map
@@ -11,12 +11,16 @@ var get = async (key) => {
11
11
  var set = async (key, val) => {
12
12
  return (await dbPromise).put("persistence", val, key);
13
13
  };
14
+ var clear = async (key) => {
15
+ return (await dbPromise).delete("persistence", key);
16
+ };
14
17
  var persistenceDatabase = {
15
18
  get,
16
- set
19
+ set,
20
+ clear
17
21
  };
18
22
 
19
23
  export {
20
24
  persistenceDatabase
21
25
  };
22
- //# sourceMappingURL=chunk-GQCJ5QNH.mjs.map
26
+ //# sourceMappingURL=chunk-E5KIJ5DQ.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/storage/persistenceDatabase.ts"],"sourcesContent":["import { DBSchema, openDB } from \"idb\";\nimport { LoginResponse } from \"./api/login\";\n\ninterface PersistenceDatabase extends DBSchema {\n persistence: {\n value: LoginResponse;\n key: \"auth\";\n };\n}\n\nconst dbPromise = openDB<PersistenceDatabase>(\"persistence-store\", 1, {\n upgrade(db) {\n db.createObjectStore(\"persistence\");\n },\n});\n\nconst get = async (key: \"auth\") => {\n return (await dbPromise).get(\"persistence\", key);\n};\nconst set = async (key: \"auth\", val: LoginResponse) => {\n return (await dbPromise).put(\"persistence\", val, key);\n};\n\nexport const persistenceDatabase = {\n get,\n set,\n};\n"],"mappings":";AAAA,SAAmB,cAAc;AAUjC,IAAM,YAAY,OAA4B,qBAAqB,GAAG;AAAA,EACpE,QAAQ,IAAI;AACV,OAAG,kBAAkB,aAAa;AAAA,EACpC;AACF,CAAC;AAED,IAAM,MAAM,OAAO,QAAgB;AACjC,UAAQ,MAAM,WAAW,IAAI,eAAe,GAAG;AACjD;AACA,IAAM,MAAM,OAAO,KAAa,QAAuB;AACrD,UAAQ,MAAM,WAAW,IAAI,eAAe,KAAK,GAAG;AACtD;AAEO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/storage/persistenceDatabase.ts"],"sourcesContent":["import { DBSchema, openDB } from \"idb\";\nimport { LoginResponse } from \"./api/login\";\n\ninterface PersistenceDatabase extends DBSchema {\n persistence: {\n value: LoginResponse;\n key: \"auth\";\n };\n}\n\nconst dbPromise = openDB<PersistenceDatabase>(\"persistence-store\", 1, {\n upgrade(db) {\n db.createObjectStore(\"persistence\");\n },\n});\n\nconst get = async (key: \"auth\") => {\n return (await dbPromise).get(\"persistence\", key);\n};\nconst set = async (key: \"auth\", val: LoginResponse) => {\n return (await dbPromise).put(\"persistence\", val, key);\n};\nconst clear = async (key: \"auth\") => {\n return (await dbPromise).delete(\"persistence\", key);\n};\n\nexport const persistenceDatabase = {\n get,\n set,\n clear,\n};\n"],"mappings":";AAAA,SAAmB,cAAc;AAUjC,IAAM,YAAY,OAA4B,qBAAqB,GAAG;AAAA,EACpE,QAAQ,IAAI;AACV,OAAG,kBAAkB,aAAa;AAAA,EACpC;AACF,CAAC;AAED,IAAM,MAAM,OAAO,QAAgB;AACjC,UAAQ,MAAM,WAAW,IAAI,eAAe,GAAG;AACjD;AACA,IAAM,MAAM,OAAO,KAAa,QAAuB;AACrD,UAAQ,MAAM,WAAW,IAAI,eAAe,KAAK,GAAG;AACtD;AACA,IAAM,QAAQ,OAAO,QAAgB;AACnC,UAAQ,MAAM,WAAW,OAAO,eAAe,GAAG;AACpD;AAEO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "m2m-components",
3
- "version": "6.1.6-alpha-1744688789903-e8a0939.0",
3
+ "version": "6.2.0",
4
4
  "main": "index.js",
5
5
  "module": "index.mjs",
6
6
  "typings": "index.d.ts",
@@ -0,0 +1,3 @@
1
+ declare const clearAuth: () => Promise<void>;
2
+
3
+ export { clearAuth };
@@ -0,0 +1,3 @@
1
+ declare const clearAuth: () => Promise<void>;
2
+
3
+ export { clearAuth };
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/storage/clearAuth.tsx
21
+ var clearAuth_exports = {};
22
+ __export(clearAuth_exports, {
23
+ clearAuth: () => clearAuth
24
+ });
25
+ module.exports = __toCommonJS(clearAuth_exports);
26
+
27
+ // src/storage/client.ts
28
+ var getStorage = async (timeout = 5e3) => {
29
+ const storage = await new Promise((resolve, reject) => {
30
+ const rejectTimer = globalThis.setTimeout(function() {
31
+ reject(
32
+ new Error(
33
+ "Timeout: M2mStorageClient could not connect. Please call m2mStorageClient.init() before using m2mStorageClient."
34
+ )
35
+ );
36
+ }, timeout);
37
+ const storage2 = globalThis.M2M_STORAGE;
38
+ if (storage2) {
39
+ globalThis.clearTimeout(rejectTimer);
40
+ resolve(storage2);
41
+ }
42
+ const timer = globalThis.setInterval(() => {
43
+ const storage3 = globalThis.M2M_STORAGE;
44
+ if (storage3) {
45
+ globalThis.clearTimeout(rejectTimer);
46
+ globalThis.clearInterval(timer);
47
+ resolve(storage3);
48
+ }
49
+ }, 200);
50
+ });
51
+ await storage.onConnect();
52
+ return storage;
53
+ };
54
+ var M2M_AUTH_TOKEN_KEY = "M2M_APP_AUTH_TOKEN";
55
+ var getAuthTokenCache = () => {
56
+ return globalThis.localStorage.getItem(M2M_AUTH_TOKEN_KEY);
57
+ };
58
+ var getAuthToken = async () => {
59
+ try {
60
+ const storage = await getStorage();
61
+ const autuToken = await storage.get(M2M_AUTH_TOKEN_KEY);
62
+ return autuToken || getAuthTokenCache();
63
+ } catch (error) {
64
+ console.warn(error);
65
+ return getAuthTokenCache();
66
+ }
67
+ };
68
+ var setAuthToken = async (token) => {
69
+ globalThis.localStorage.setItem(M2M_AUTH_TOKEN_KEY, token);
70
+ try {
71
+ const storage = await getStorage();
72
+ await storage.set(M2M_AUTH_TOKEN_KEY, token);
73
+ } catch (error) {
74
+ console.warn(error);
75
+ }
76
+ };
77
+ var clearAuthToken = async () => {
78
+ globalThis.localStorage.removeItem(M2M_AUTH_TOKEN_KEY);
79
+ try {
80
+ const storage = await getStorage();
81
+ await storage.del(M2M_AUTH_TOKEN_KEY);
82
+ } catch (error) {
83
+ console.warn(error);
84
+ }
85
+ };
86
+ var m2mAuthTokenApi = {
87
+ get: getAuthToken,
88
+ getCache: getAuthTokenCache,
89
+ set: setAuthToken,
90
+ clear: clearAuthToken
91
+ };
92
+
93
+ // src/storage/persistenceDatabase.ts
94
+ var import_idb = require("idb");
95
+ var dbPromise = (0, import_idb.openDB)("persistence-store", 1, {
96
+ upgrade(db) {
97
+ db.createObjectStore("persistence");
98
+ }
99
+ });
100
+ var get = async (key) => {
101
+ return (await dbPromise).get("persistence", key);
102
+ };
103
+ var set = async (key, val) => {
104
+ return (await dbPromise).put("persistence", val, key);
105
+ };
106
+ var clear = async (key) => {
107
+ return (await dbPromise).delete("persistence", key);
108
+ };
109
+ var persistenceDatabase = {
110
+ get,
111
+ set,
112
+ clear
113
+ };
114
+
115
+ // src/storage/clearAuth.tsx
116
+ var clearAuth = async () => {
117
+ await persistenceDatabase.clear("auth");
118
+ await m2mAuthTokenApi.clear();
119
+ };
120
+ // Annotate the CommonJS export names for ESM import in node:
121
+ 0 && (module.exports = {
122
+ clearAuth
123
+ });
124
+ //# sourceMappingURL=clearAuth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/storage/clearAuth.tsx","../../src/storage/client.ts","../../src/storage/persistenceDatabase.ts"],"sourcesContent":["import { m2mAuthTokenApi } from \"./client\";\nimport { persistenceDatabase } from \"./persistenceDatabase\";\n\nexport const clearAuth = async () => {\n await persistenceDatabase.clear(\"auth\");\n await m2mAuthTokenApi.clear();\n};\n","import { StorageClient } from \"./lib/client\";\n\nclass M2mStorageClient extends StorageClient {}\n\nexport type { M2mStorageClient };\n\n/**\n * Get the connected storage client.\n * @param timeout\n * @default 5000\n */\nconst getStorage = async (timeout = 5000) => {\n const storage = await new Promise<M2mStorageClient>((resolve, reject) => {\n const rejectTimer = globalThis.setTimeout(function () {\n reject(\n new Error(\n \"Timeout: M2mStorageClient could not connect. Please call m2mStorageClient.init() before using m2mStorageClient.\",\n ),\n );\n }, timeout);\n\n const storage = globalThis.M2M_STORAGE;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n resolve(storage);\n }\n\n const timer = globalThis.setInterval(() => {\n const storage = globalThis.M2M_STORAGE;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n globalThis.clearInterval(timer);\n resolve(storage);\n }\n }, 200);\n });\n\n await storage.onConnect();\n\n return storage;\n};\n\nconst M2M_STORAGE_HUB_URL = \"https://hub.m2msystems.cloud/\";\n\nconst M2M_STORAGE_HUB_URL_DEV =\n \"https://m2m-components-storage-hub-dev.netlify.app/\";\n\nconst initStorageClient = (options?: {\n env?: \"development\" | \"production\";\n}) => {\n if (globalThis.M2M_STORAGE) {\n throw new Error(\n \"M2mStorageClient already initialized. Do not call m2mStorageClient.init multiple times.\",\n );\n }\n const storage = new M2mStorageClient(\n options?.env === \"production\"\n ? M2M_STORAGE_HUB_URL\n : M2M_STORAGE_HUB_URL_DEV,\n );\n globalThis.M2M_STORAGE = storage;\n};\n\nexport const m2mStorageClient = {\n init: initStorageClient,\n getStorage: getStorage,\n};\n\nexport const M2M_AUTH_TOKEN_KEY = \"M2M_APP_AUTH_TOKEN\";\n\nconst getAuthTokenCache = () => {\n return globalThis.localStorage.getItem(M2M_AUTH_TOKEN_KEY);\n};\n\nconst getAuthToken = async () => {\n try {\n const storage = await getStorage();\n const autuToken = (await storage.get(M2M_AUTH_TOKEN_KEY)) as string;\n return autuToken || getAuthTokenCache();\n } catch (error) {\n console.warn(error);\n return getAuthTokenCache();\n }\n};\n\nconst setAuthToken = async (token: string) => {\n globalThis.localStorage.setItem(M2M_AUTH_TOKEN_KEY, token);\n try {\n const storage = await getStorage();\n await storage.set(M2M_AUTH_TOKEN_KEY, token);\n } catch (error) {\n console.warn(error);\n }\n};\n\nconst clearAuthToken = async () => {\n globalThis.localStorage.removeItem(M2M_AUTH_TOKEN_KEY);\n try {\n const storage = await getStorage();\n await storage.del(M2M_AUTH_TOKEN_KEY);\n } catch (error) {\n console.warn(error);\n }\n};\n\nexport const m2mAuthTokenApi = {\n get: getAuthToken,\n getCache: getAuthTokenCache,\n set: setAuthToken,\n clear: clearAuthToken,\n};\n","import { DBSchema, openDB } from \"idb\";\nimport { LoginResponse } from \"./api/login\";\n\ninterface PersistenceDatabase extends DBSchema {\n persistence: {\n value: LoginResponse;\n key: \"auth\";\n };\n}\n\nconst dbPromise = openDB<PersistenceDatabase>(\"persistence-store\", 1, {\n upgrade(db) {\n db.createObjectStore(\"persistence\");\n },\n});\n\nconst get = async (key: \"auth\") => {\n return (await dbPromise).get(\"persistence\", key);\n};\nconst set = async (key: \"auth\", val: LoginResponse) => {\n return (await dbPromise).put(\"persistence\", val, key);\n};\nconst clear = async (key: \"auth\") => {\n return (await dbPromise).delete(\"persistence\", key);\n};\n\nexport const persistenceDatabase = {\n get,\n set,\n clear,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACWA,IAAM,aAAa,OAAO,UAAU,QAAS;AAC3C,QAAM,UAAU,MAAM,IAAI,QAA0B,CAAC,SAAS,WAAW;AACvE,UAAM,cAAc,WAAW,WAAW,WAAY;AACpD;AAAA,QACE,IAAI;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,GAAG,OAAO;AAEV,UAAMA,WAAU,WAAW;AAC3B,QAAIA,UAAS;AACX,iBAAW,aAAa,WAAW;AACnC,cAAQA,QAAO;AAAA,IACjB;AAEA,UAAM,QAAQ,WAAW,YAAY,MAAM;AACzC,YAAMA,WAAU,WAAW;AAC3B,UAAIA,UAAS;AACX,mBAAW,aAAa,WAAW;AACnC,mBAAW,cAAc,KAAK;AAC9B,gBAAQA,QAAO;AAAA,MACjB;AAAA,IACF,GAAG,GAAG;AAAA,EACR,CAAC;AAED,QAAM,QAAQ,UAAU;AAExB,SAAO;AACT;AA4BO,IAAM,qBAAqB;AAElC,IAAM,oBAAoB,MAAM;AAC9B,SAAO,WAAW,aAAa,QAAQ,kBAAkB;AAC3D;AAEA,IAAM,eAAe,YAAY;AAC/B,MAAI;AACF,UAAM,UAAU,MAAM,WAAW;AACjC,UAAM,YAAa,MAAM,QAAQ,IAAI,kBAAkB;AACvD,WAAO,aAAa,kBAAkB;AAAA,EACxC,SAAS,OAAO;AACd,YAAQ,KAAK,KAAK;AAClB,WAAO,kBAAkB;AAAA,EAC3B;AACF;AAEA,IAAM,eAAe,OAAO,UAAkB;AAC5C,aAAW,aAAa,QAAQ,oBAAoB,KAAK;AACzD,MAAI;AACF,UAAM,UAAU,MAAM,WAAW;AACjC,UAAM,QAAQ,IAAI,oBAAoB,KAAK;AAAA,EAC7C,SAAS,OAAO;AACd,YAAQ,KAAK,KAAK;AAAA,EACpB;AACF;AAEA,IAAM,iBAAiB,YAAY;AACjC,aAAW,aAAa,WAAW,kBAAkB;AACrD,MAAI;AACF,UAAM,UAAU,MAAM,WAAW;AACjC,UAAM,QAAQ,IAAI,kBAAkB;AAAA,EACtC,SAAS,OAAO;AACd,YAAQ,KAAK,KAAK;AAAA,EACpB;AACF;AAEO,IAAM,kBAAkB;AAAA,EAC7B,KAAK;AAAA,EACL,UAAU;AAAA,EACV,KAAK;AAAA,EACL,OAAO;AACT;;;AC9GA,iBAAiC;AAUjC,IAAM,gBAAY,mBAA4B,qBAAqB,GAAG;AAAA,EACpE,QAAQ,IAAI;AACV,OAAG,kBAAkB,aAAa;AAAA,EACpC;AACF,CAAC;AAED,IAAM,MAAM,OAAO,QAAgB;AACjC,UAAQ,MAAM,WAAW,IAAI,eAAe,GAAG;AACjD;AACA,IAAM,MAAM,OAAO,KAAa,QAAuB;AACrD,UAAQ,MAAM,WAAW,IAAI,eAAe,KAAK,GAAG;AACtD;AACA,IAAM,QAAQ,OAAO,QAAgB;AACnC,UAAQ,MAAM,WAAW,OAAO,eAAe,GAAG;AACpD;AAEO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF;;;AF3BO,IAAM,YAAY,YAAY;AACnC,QAAM,oBAAoB,MAAM,MAAM;AACtC,QAAM,gBAAgB,MAAM;AAC9B;","names":["storage"]}
@@ -0,0 +1,11 @@
1
+ import {
2
+ clearAuth
3
+ } from "../chunk-3ZM74LVQ.mjs";
4
+ import "../chunk-E5KIJ5DQ.mjs";
5
+ import "../chunk-MERECGBH.mjs";
6
+ import "../chunk-R73ITKF5.mjs";
7
+ import "../chunk-ZOXT4E27.mjs";
8
+ export {
9
+ clearAuth
10
+ };
11
+ //# sourceMappingURL=clearAuth.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -4,6 +4,7 @@ import 'matsuri-hooks';
4
4
  declare const persistenceDatabase: {
5
5
  get: (key: "auth") => Promise<LoginResponse | undefined>;
6
6
  set: (key: "auth", val: LoginResponse) => Promise<"auth">;
7
+ clear: (key: "auth") => Promise<void>;
7
8
  };
8
9
 
9
10
  export { persistenceDatabase };
@@ -4,6 +4,7 @@ import 'matsuri-hooks';
4
4
  declare const persistenceDatabase: {
5
5
  get: (key: "auth") => Promise<LoginResponse | undefined>;
6
6
  set: (key: "auth", val: LoginResponse) => Promise<"auth">;
7
+ clear: (key: "auth") => Promise<void>;
7
8
  };
8
9
 
9
10
  export { persistenceDatabase };
@@ -35,9 +35,13 @@ var get = async (key) => {
35
35
  var set = async (key, val) => {
36
36
  return (await dbPromise).put("persistence", val, key);
37
37
  };
38
+ var clear = async (key) => {
39
+ return (await dbPromise).delete("persistence", key);
40
+ };
38
41
  var persistenceDatabase = {
39
42
  get,
40
- set
43
+ set,
44
+ clear
41
45
  };
42
46
  // Annotate the CommonJS export names for ESM import in node:
43
47
  0 && (module.exports = {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/storage/persistenceDatabase.ts"],"sourcesContent":["import { DBSchema, openDB } from \"idb\";\nimport { LoginResponse } from \"./api/login\";\n\ninterface PersistenceDatabase extends DBSchema {\n persistence: {\n value: LoginResponse;\n key: \"auth\";\n };\n}\n\nconst dbPromise = openDB<PersistenceDatabase>(\"persistence-store\", 1, {\n upgrade(db) {\n db.createObjectStore(\"persistence\");\n },\n});\n\nconst get = async (key: \"auth\") => {\n return (await dbPromise).get(\"persistence\", key);\n};\nconst set = async (key: \"auth\", val: LoginResponse) => {\n return (await dbPromise).put(\"persistence\", val, key);\n};\n\nexport const persistenceDatabase = {\n get,\n set,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAiC;AAUjC,IAAM,gBAAY,mBAA4B,qBAAqB,GAAG;AAAA,EACpE,QAAQ,IAAI;AACV,OAAG,kBAAkB,aAAa;AAAA,EACpC;AACF,CAAC;AAED,IAAM,MAAM,OAAO,QAAgB;AACjC,UAAQ,MAAM,WAAW,IAAI,eAAe,GAAG;AACjD;AACA,IAAM,MAAM,OAAO,KAAa,QAAuB;AACrD,UAAQ,MAAM,WAAW,IAAI,eAAe,KAAK,GAAG;AACtD;AAEO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AACF;","names":[]}
1
+ {"version":3,"sources":["../../src/storage/persistenceDatabase.ts"],"sourcesContent":["import { DBSchema, openDB } from \"idb\";\nimport { LoginResponse } from \"./api/login\";\n\ninterface PersistenceDatabase extends DBSchema {\n persistence: {\n value: LoginResponse;\n key: \"auth\";\n };\n}\n\nconst dbPromise = openDB<PersistenceDatabase>(\"persistence-store\", 1, {\n upgrade(db) {\n db.createObjectStore(\"persistence\");\n },\n});\n\nconst get = async (key: \"auth\") => {\n return (await dbPromise).get(\"persistence\", key);\n};\nconst set = async (key: \"auth\", val: LoginResponse) => {\n return (await dbPromise).put(\"persistence\", val, key);\n};\nconst clear = async (key: \"auth\") => {\n return (await dbPromise).delete(\"persistence\", key);\n};\n\nexport const persistenceDatabase = {\n get,\n set,\n clear,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,iBAAiC;AAUjC,IAAM,gBAAY,mBAA4B,qBAAqB,GAAG;AAAA,EACpE,QAAQ,IAAI;AACV,OAAG,kBAAkB,aAAa;AAAA,EACpC;AACF,CAAC;AAED,IAAM,MAAM,OAAO,QAAgB;AACjC,UAAQ,MAAM,WAAW,IAAI,eAAe,GAAG;AACjD;AACA,IAAM,MAAM,OAAO,KAAa,QAAuB;AACrD,UAAQ,MAAM,WAAW,IAAI,eAAe,KAAK,GAAG;AACtD;AACA,IAAM,QAAQ,OAAO,QAAgB;AACnC,UAAQ,MAAM,WAAW,OAAO,eAAe,GAAG;AACpD;AAEO,IAAM,sBAAsB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AACF;","names":[]}
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  persistenceDatabase
3
- } from "../chunk-GQCJ5QNH.mjs";
3
+ } from "../chunk-E5KIJ5DQ.mjs";
4
4
  import "../chunk-ZOXT4E27.mjs";
5
5
  export {
6
6
  persistenceDatabase
@@ -130,9 +130,13 @@ var get = async (key) => {
130
130
  var set = async (key, val) => {
131
131
  return (await dbPromise).put("persistence", val, key);
132
132
  };
133
+ var clear = async (key) => {
134
+ return (await dbPromise).delete("persistence", key);
135
+ };
133
136
  var persistenceDatabase = {
134
137
  get,
135
- set
138
+ set,
139
+ clear
136
140
  };
137
141
 
138
142
  // src/storage/api/getToken.ts
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/storage/refreshAuth.tsx","../../src/storage/client.ts","../../src/storage/jwt.tsx","../../src/storage/persistenceDatabase.ts","../../src/storage/api/getToken.ts","../../src/endpoints/m2m-users.v1.ts"],"sourcesContent":["import { m2mAuthTokenApi } from \"./client\";\nimport { parseJwtPayload } from \"./jwt\";\nimport { persistenceDatabase } from \"./persistenceDatabase\";\nimport { requestGetToken } from \"./api/getToken\";\n\nexport const refreshAuth = async () => {\n const auth = await persistenceDatabase.get(\"auth\");\n if (!auth) return null;\n\n const payload = parseJwtPayload(auth.accessToken);\n if (!payload) {\n return null;\n }\n\n const { data: newAuth } = await requestGetToken({\n refreshToken: auth.refreshToken.refreshToken,\n userId: payload.userId,\n });\n\n if (newAuth) {\n const authToken = newAuth.accessToken;\n await m2mAuthTokenApi.set(authToken);\n await persistenceDatabase.set(\"auth\", newAuth);\n return authToken;\n }\n return null;\n};\n","import { StorageClient } from \"./lib/client\";\n\nclass M2mStorageClient extends StorageClient {}\n\nexport type { M2mStorageClient };\n\n/**\n * Get the connected storage client.\n * @param timeout\n * @default 5000\n */\nconst getStorage = async (timeout = 5000) => {\n const storage = await new Promise<M2mStorageClient>((resolve, reject) => {\n const rejectTimer = globalThis.setTimeout(function () {\n reject(\n new Error(\n \"Timeout: M2mStorageClient could not connect. Please call m2mStorageClient.init() before using m2mStorageClient.\",\n ),\n );\n }, timeout);\n\n const storage = globalThis.M2M_STORAGE;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n resolve(storage);\n }\n\n const timer = globalThis.setInterval(() => {\n const storage = globalThis.M2M_STORAGE;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n globalThis.clearInterval(timer);\n resolve(storage);\n }\n }, 200);\n });\n\n await storage.onConnect();\n\n return storage;\n};\n\nconst M2M_STORAGE_HUB_URL = \"https://hub.m2msystems.cloud/\";\n\nconst M2M_STORAGE_HUB_URL_DEV =\n \"https://m2m-components-storage-hub-dev.netlify.app/\";\n\nconst initStorageClient = (options?: {\n env?: \"development\" | \"production\";\n}) => {\n if (globalThis.M2M_STORAGE) {\n throw new Error(\n \"M2mStorageClient already initialized. Do not call m2mStorageClient.init multiple times.\",\n );\n }\n const storage = new M2mStorageClient(\n options?.env === \"production\"\n ? M2M_STORAGE_HUB_URL\n : M2M_STORAGE_HUB_URL_DEV,\n );\n globalThis.M2M_STORAGE = storage;\n};\n\nexport const m2mStorageClient = {\n init: initStorageClient,\n getStorage: getStorage,\n};\n\nexport const M2M_AUTH_TOKEN_KEY = \"M2M_APP_AUTH_TOKEN\";\n\nconst getAuthTokenCache = () => {\n return globalThis.localStorage.getItem(M2M_AUTH_TOKEN_KEY);\n};\n\nconst getAuthToken = async () => {\n try {\n const storage = await getStorage();\n const autuToken = (await storage.get(M2M_AUTH_TOKEN_KEY)) as string;\n return autuToken || getAuthTokenCache();\n } catch (error) {\n console.warn(error);\n return getAuthTokenCache();\n }\n};\n\nconst setAuthToken = async (token: string) => {\n globalThis.localStorage.setItem(M2M_AUTH_TOKEN_KEY, token);\n try {\n const storage = await getStorage();\n await storage.set(M2M_AUTH_TOKEN_KEY, token);\n } catch (error) {\n console.warn(error);\n }\n};\n\nconst clearAuthToken = async () => {\n globalThis.localStorage.removeItem(M2M_AUTH_TOKEN_KEY);\n try {\n const storage = await getStorage();\n await storage.del(M2M_AUTH_TOKEN_KEY);\n } catch (error) {\n console.warn(error);\n }\n};\n\nexport const m2mAuthTokenApi = {\n get: getAuthToken,\n getCache: getAuthTokenCache,\n set: setAuthToken,\n clear: clearAuthToken,\n};\n","interface JwtPayload {\n aud: string;\n authority: string;\n companyId: string;\n exp: number;\n iss: string;\n loginType: string;\n scope: Record<string, string>;\n userId: string;\n}\n\nconst isObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null;\n};\n/**\n * 利用するパラメータが存在するかどうかを確認する\n */\nconst validateJwtPayload = (payload: unknown): JwtPayload => {\n if (isObject(payload) === false) {\n throw new Error(\"JWT payload is not an object\");\n }\n\n if (typeof payload?.exp !== \"number\" || typeof payload?.userId !== \"string\") {\n throw new Error(\"JWT payload is missing required fields\");\n }\n\n return payload as unknown as JwtPayload;\n};\n\nexport const parseJwtPayload = (jwt: string): JwtPayload | null => {\n try {\n const splitted = jwt.split(\".\");\n if (splitted.length !== 3) {\n throw new Error(\"Invalid JWT\");\n }\n const [, payload] = splitted;\n return validateJwtPayload(JSON.parse(atob(payload)));\n } catch (error: unknown) {\n console.error(error);\n return null;\n }\n};\n\nexport const checkJwtExpiration = (jwt: string): boolean => {\n const payload = parseJwtPayload(jwt);\n if (!payload) {\n return false;\n }\n return new Date() < new Date(payload.exp * 1000);\n};\n","import { DBSchema, openDB } from \"idb\";\nimport { LoginResponse } from \"./api/login\";\n\ninterface PersistenceDatabase extends DBSchema {\n persistence: {\n value: LoginResponse;\n key: \"auth\";\n };\n}\n\nconst dbPromise = openDB<PersistenceDatabase>(\"persistence-store\", 1, {\n upgrade(db) {\n db.createObjectStore(\"persistence\");\n },\n});\n\nconst get = async (key: \"auth\") => {\n return (await dbPromise).get(\"persistence\", key);\n};\nconst set = async (key: \"auth\", val: LoginResponse) => {\n return (await dbPromise).put(\"persistence\", val, key);\n};\n\nexport const persistenceDatabase = {\n get,\n set,\n};\n","import { LoginResponse } from \"./login\";\nimport { fetcher } from \"matsuri-hooks\";\nimport { getToken as m2mUsers_v1_getToken } from \"../../endpoints/m2m-users.v1\";\n\n// @see https://github.com/matsuri-tech/m2m-users/blob/master/web/request/login.go#L10-L13\ninterface GetTokenInput {\n userId: string;\n refreshToken: string;\n}\ntype GetTokenResponse = LoginResponse;\nexport const requestGetToken = async (input: GetTokenInput) => {\n return await fetcher<GetTokenResponse>(m2mUsers_v1_getToken(), {\n method: \"POST\",\n body: JSON.stringify(input),\n });\n};\n","/* eslint-disable */\n/**\n * A function that returns the URL part common to the endpoints.\n */\nexport const root = () => {\n let __root = \"\";\n\n if (globalThis.M2M_COMPONENTS_ENV === \"local\") {\n __root = \"http://localhost:8080\";\n }\n\n if (globalThis.M2M_COMPONENTS_ENV === \"localDev\") {\n __root = \"https://api-users.dev.m2msystems.cloud\";\n }\n\n if (globalThis.M2M_COMPONENTS_ENV === \"development\") {\n __root = \"https://api-users.dev.m2msystems.cloud\";\n }\n\n if (globalThis.M2M_COMPONENTS_ENV === \"production\") {\n __root = \"https://api.m2msystems.cloud\";\n }\n\n return __root;\n};\n/**\n * ヘルスチェック\n *\n */\nexport const healthCheck = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`health_check`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社を作成する\n *\n */\nexport const createCompany = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社情報を取得する\n *\n */\nexport const getCompany = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社情報を更新する\n *\n */\nexport const updateCompany = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社情報を更新する\n *\n */\nexport const updateCompanyPatch = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * idを指定して複数の会社情報を取得する\n * @param {string} company_ids a,b,c\n */\nexport const findCompaniesByIds = ({\n company_ids,\n}: {\n company_ids?: string;\n}) => {\n const __root = root();\n const __queries = Object.entries({ company_ids })\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/find_by_ids`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを作成する\n *\n */\nexport const createUser = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを取得する\n *\n */\nexport const findUserById = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを更新する\n *\n */\nexport const updateUser = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを更新する\n *\n */\nexport const updateUserPatch = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを強制的に有効化する\n *\n */\nexport const activateUserByAdmin = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}/admin_activate`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを無効化する\n *\n */\nexport const deactivateUser = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}/deactivate`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * パスワードリセットのメールを送信する\n *\n */\nexport const sendResetPasswordEmail = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/reset_password_email`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * パスワードをリセットする\n *\n */\nexport const resetPassword = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/reset_password`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * アクティベーションメールを送信する\n *\n */\nexport const sendActivationEmail = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/activation_email`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを有効化する\n *\n */\nexport const activateUser = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/activate`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 認可スコープを設定する\n *\n */\nexport const setAuthorityScope = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/scope`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * メールを指定してユーザーを取得する\n *\n */\nexport const findUserByEmail = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/find_by_email`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーの権限を更新する\n *\n */\nexport const updateAuthority = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/authority/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * companyIdからユーザーを取得する\n * @param {string} statuses BeforeVerification,Active,Deactivated\n */\nexport const findUsersByCompanyId = ({ statuses }: { statuses?: string }) => {\n const __root = root();\n const __queries = Object.entries({ statuses })\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/find_by_company_id`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザー情報をAdminが変更する\n *\n */\nexport const updateUserByAdmin = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}/admin_update`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーの会社を移動する\n *\n */\nexport const transferUserCompany = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/transfer_company`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ログインする\n *\n */\nexport const login = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ログインする\n *\n */\nexport const loginWithSlash = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * JWKを取得する\n *\n */\nexport const getJwks = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/jwks`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 公開鍵を取得する\n *\n */\nexport const getPublicKeys = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/public_keys`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * MFAのコードを発行する\n *\n */\nexport const publishMFACode = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/publish_mfa_code`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * MFAを使ってログインする\n *\n */\nexport const loginWithMFA = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/mfa_login`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * トークンを取得する\n *\n */\nexport const getToken = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/token`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * usersに存在しないアカウントのトークンを作成する(deprecated)\n *\n */\nexport const generateToken = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`guest/token`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * usersに存在しないアカウントのトークンを作成する\n *\n */\nexport const generateUserToken = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`generate/token`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\nexport const m2mUsers_v1 = {\n healthCheck,\n createCompany,\n getCompany,\n updateCompany,\n updateCompanyPatch,\n findCompaniesByIds,\n createUser,\n findUserById,\n updateUser,\n updateUserPatch,\n activateUserByAdmin,\n deactivateUser,\n sendResetPasswordEmail,\n resetPassword,\n sendActivationEmail,\n activateUser,\n setAuthorityScope,\n findUserByEmail,\n updateAuthority,\n findUsersByCompanyId,\n updateUserByAdmin,\n transferUserCompany,\n login,\n loginWithSlash,\n getJwks,\n getPublicKeys,\n publishMFACode,\n loginWithMFA,\n getToken,\n generateToken,\n generateUserToken,\n};\n"],"mappings":"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","names":["storage"]}
1
+ {"version":3,"sources":["../../src/storage/refreshAuth.tsx","../../src/storage/client.ts","../../src/storage/jwt.tsx","../../src/storage/persistenceDatabase.ts","../../src/storage/api/getToken.ts","../../src/endpoints/m2m-users.v1.ts"],"sourcesContent":["import { m2mAuthTokenApi } from \"./client\";\nimport { parseJwtPayload } from \"./jwt\";\nimport { persistenceDatabase } from \"./persistenceDatabase\";\nimport { requestGetToken } from \"./api/getToken\";\n\nexport const refreshAuth = async () => {\n const auth = await persistenceDatabase.get(\"auth\");\n if (!auth) return null;\n\n const payload = parseJwtPayload(auth.accessToken);\n if (!payload) {\n return null;\n }\n\n const { data: newAuth } = await requestGetToken({\n refreshToken: auth.refreshToken.refreshToken,\n userId: payload.userId,\n });\n\n if (newAuth) {\n const authToken = newAuth.accessToken;\n await m2mAuthTokenApi.set(authToken);\n await persistenceDatabase.set(\"auth\", newAuth);\n return authToken;\n }\n return null;\n};\n","import { StorageClient } from \"./lib/client\";\n\nclass M2mStorageClient extends StorageClient {}\n\nexport type { M2mStorageClient };\n\n/**\n * Get the connected storage client.\n * @param timeout\n * @default 5000\n */\nconst getStorage = async (timeout = 5000) => {\n const storage = await new Promise<M2mStorageClient>((resolve, reject) => {\n const rejectTimer = globalThis.setTimeout(function () {\n reject(\n new Error(\n \"Timeout: M2mStorageClient could not connect. Please call m2mStorageClient.init() before using m2mStorageClient.\",\n ),\n );\n }, timeout);\n\n const storage = globalThis.M2M_STORAGE;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n resolve(storage);\n }\n\n const timer = globalThis.setInterval(() => {\n const storage = globalThis.M2M_STORAGE;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n globalThis.clearInterval(timer);\n resolve(storage);\n }\n }, 200);\n });\n\n await storage.onConnect();\n\n return storage;\n};\n\nconst M2M_STORAGE_HUB_URL = \"https://hub.m2msystems.cloud/\";\n\nconst M2M_STORAGE_HUB_URL_DEV =\n \"https://m2m-components-storage-hub-dev.netlify.app/\";\n\nconst initStorageClient = (options?: {\n env?: \"development\" | \"production\";\n}) => {\n if (globalThis.M2M_STORAGE) {\n throw new Error(\n \"M2mStorageClient already initialized. Do not call m2mStorageClient.init multiple times.\",\n );\n }\n const storage = new M2mStorageClient(\n options?.env === \"production\"\n ? M2M_STORAGE_HUB_URL\n : M2M_STORAGE_HUB_URL_DEV,\n );\n globalThis.M2M_STORAGE = storage;\n};\n\nexport const m2mStorageClient = {\n init: initStorageClient,\n getStorage: getStorage,\n};\n\nexport const M2M_AUTH_TOKEN_KEY = \"M2M_APP_AUTH_TOKEN\";\n\nconst getAuthTokenCache = () => {\n return globalThis.localStorage.getItem(M2M_AUTH_TOKEN_KEY);\n};\n\nconst getAuthToken = async () => {\n try {\n const storage = await getStorage();\n const autuToken = (await storage.get(M2M_AUTH_TOKEN_KEY)) as string;\n return autuToken || getAuthTokenCache();\n } catch (error) {\n console.warn(error);\n return getAuthTokenCache();\n }\n};\n\nconst setAuthToken = async (token: string) => {\n globalThis.localStorage.setItem(M2M_AUTH_TOKEN_KEY, token);\n try {\n const storage = await getStorage();\n await storage.set(M2M_AUTH_TOKEN_KEY, token);\n } catch (error) {\n console.warn(error);\n }\n};\n\nconst clearAuthToken = async () => {\n globalThis.localStorage.removeItem(M2M_AUTH_TOKEN_KEY);\n try {\n const storage = await getStorage();\n await storage.del(M2M_AUTH_TOKEN_KEY);\n } catch (error) {\n console.warn(error);\n }\n};\n\nexport const m2mAuthTokenApi = {\n get: getAuthToken,\n getCache: getAuthTokenCache,\n set: setAuthToken,\n clear: clearAuthToken,\n};\n","interface JwtPayload {\n aud: string;\n authority: string;\n companyId: string;\n exp: number;\n iss: string;\n loginType: string;\n scope: Record<string, string>;\n userId: string;\n}\n\nconst isObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null;\n};\n/**\n * 利用するパラメータが存在するかどうかを確認する\n */\nconst validateJwtPayload = (payload: unknown): JwtPayload => {\n if (isObject(payload) === false) {\n throw new Error(\"JWT payload is not an object\");\n }\n\n if (typeof payload?.exp !== \"number\" || typeof payload?.userId !== \"string\") {\n throw new Error(\"JWT payload is missing required fields\");\n }\n\n return payload as unknown as JwtPayload;\n};\n\nexport const parseJwtPayload = (jwt: string): JwtPayload | null => {\n try {\n const splitted = jwt.split(\".\");\n if (splitted.length !== 3) {\n throw new Error(\"Invalid JWT\");\n }\n const [, payload] = splitted;\n return validateJwtPayload(JSON.parse(atob(payload)));\n } catch (error: unknown) {\n console.error(error);\n return null;\n }\n};\n\nexport const checkJwtExpiration = (jwt: string): boolean => {\n const payload = parseJwtPayload(jwt);\n if (!payload) {\n return false;\n }\n return new Date() < new Date(payload.exp * 1000);\n};\n","import { DBSchema, openDB } from \"idb\";\nimport { LoginResponse } from \"./api/login\";\n\ninterface PersistenceDatabase extends DBSchema {\n persistence: {\n value: LoginResponse;\n key: \"auth\";\n };\n}\n\nconst dbPromise = openDB<PersistenceDatabase>(\"persistence-store\", 1, {\n upgrade(db) {\n db.createObjectStore(\"persistence\");\n },\n});\n\nconst get = async (key: \"auth\") => {\n return (await dbPromise).get(\"persistence\", key);\n};\nconst set = async (key: \"auth\", val: LoginResponse) => {\n return (await dbPromise).put(\"persistence\", val, key);\n};\nconst clear = async (key: \"auth\") => {\n return (await dbPromise).delete(\"persistence\", key);\n};\n\nexport const persistenceDatabase = {\n get,\n set,\n clear,\n};\n","import { LoginResponse } from \"./login\";\nimport { fetcher } from \"matsuri-hooks\";\nimport { getToken as m2mUsers_v1_getToken } from \"../../endpoints/m2m-users.v1\";\n\n// @see https://github.com/matsuri-tech/m2m-users/blob/master/web/request/login.go#L10-L13\ninterface GetTokenInput {\n userId: string;\n refreshToken: string;\n}\ntype GetTokenResponse = LoginResponse;\nexport const requestGetToken = async (input: GetTokenInput) => {\n return await fetcher<GetTokenResponse>(m2mUsers_v1_getToken(), {\n method: \"POST\",\n body: JSON.stringify(input),\n });\n};\n","/* eslint-disable */\n/**\n * A function that returns the URL part common to the endpoints.\n */\nexport const root = () => {\n let __root = \"\";\n\n if (globalThis.M2M_COMPONENTS_ENV === \"local\") {\n __root = \"http://localhost:8080\";\n }\n\n if (globalThis.M2M_COMPONENTS_ENV === \"localDev\") {\n __root = \"https://api-users.dev.m2msystems.cloud\";\n }\n\n if (globalThis.M2M_COMPONENTS_ENV === \"development\") {\n __root = \"https://api-users.dev.m2msystems.cloud\";\n }\n\n if (globalThis.M2M_COMPONENTS_ENV === \"production\") {\n __root = \"https://api.m2msystems.cloud\";\n }\n\n return __root;\n};\n/**\n * ヘルスチェック\n *\n */\nexport const healthCheck = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`health_check`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社を作成する\n *\n */\nexport const createCompany = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社情報を取得する\n *\n */\nexport const getCompany = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社情報を更新する\n *\n */\nexport const updateCompany = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社情報を更新する\n *\n */\nexport const updateCompanyPatch = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * idを指定して複数の会社情報を取得する\n * @param {string} company_ids a,b,c\n */\nexport const findCompaniesByIds = ({\n company_ids,\n}: {\n company_ids?: string;\n}) => {\n const __root = root();\n const __queries = Object.entries({ company_ids })\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/find_by_ids`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを作成する\n *\n */\nexport const createUser = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを取得する\n *\n */\nexport const findUserById = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを更新する\n *\n */\nexport const updateUser = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを更新する\n *\n */\nexport const updateUserPatch = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを強制的に有効化する\n *\n */\nexport const activateUserByAdmin = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}/admin_activate`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを無効化する\n *\n */\nexport const deactivateUser = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}/deactivate`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * パスワードリセットのメールを送信する\n *\n */\nexport const sendResetPasswordEmail = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/reset_password_email`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * パスワードをリセットする\n *\n */\nexport const resetPassword = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/reset_password`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * アクティベーションメールを送信する\n *\n */\nexport const sendActivationEmail = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/activation_email`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを有効化する\n *\n */\nexport const activateUser = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/activate`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 認可スコープを設定する\n *\n */\nexport const setAuthorityScope = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/scope`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * メールを指定してユーザーを取得する\n *\n */\nexport const findUserByEmail = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/find_by_email`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーの権限を更新する\n *\n */\nexport const updateAuthority = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/authority/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * companyIdからユーザーを取得する\n * @param {string} statuses BeforeVerification,Active,Deactivated\n */\nexport const findUsersByCompanyId = ({ statuses }: { statuses?: string }) => {\n const __root = root();\n const __queries = Object.entries({ statuses })\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/find_by_company_id`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザー情報をAdminが変更する\n *\n */\nexport const updateUserByAdmin = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}/admin_update`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーの会社を移動する\n *\n */\nexport const transferUserCompany = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/transfer_company`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ログインする\n *\n */\nexport const login = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ログインする\n *\n */\nexport const loginWithSlash = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * JWKを取得する\n *\n */\nexport const getJwks = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/jwks`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 公開鍵を取得する\n *\n */\nexport const getPublicKeys = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/public_keys`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * MFAのコードを発行する\n *\n */\nexport const publishMFACode = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/publish_mfa_code`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * MFAを使ってログインする\n *\n */\nexport const loginWithMFA = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/mfa_login`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * トークンを取得する\n *\n */\nexport const getToken = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/token`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * usersに存在しないアカウントのトークンを作成する(deprecated)\n *\n */\nexport const generateToken = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`guest/token`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * usersに存在しないアカウントのトークンを作成する\n *\n */\nexport const generateUserToken = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`generate/token`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\nexport const m2mUsers_v1 = {\n healthCheck,\n createCompany,\n getCompany,\n updateCompany,\n updateCompanyPatch,\n findCompaniesByIds,\n createUser,\n findUserById,\n updateUser,\n updateUserPatch,\n activateUserByAdmin,\n deactivateUser,\n sendResetPasswordEmail,\n resetPassword,\n sendActivationEmail,\n activateUser,\n setAuthorityScope,\n findUserByEmail,\n updateAuthority,\n findUsersByCompanyId,\n updateUserByAdmin,\n transferUserCompany,\n login,\n loginWithSlash,\n getJwks,\n getPublicKeys,\n publishMFACode,\n loginWithMFA,\n getToken,\n generateToken,\n generateUserToken,\n};\n"],"mappings":"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","names":["storage"]}
@@ -1,8 +1,8 @@
1
1
  import {
2
2
  refreshAuth
3
- } from "../chunk-27D73AG2.mjs";
3
+ } from "../chunk-AJUMESCA.mjs";
4
4
  import "../chunk-JG5QN6O7.mjs";
5
- import "../chunk-GQCJ5QNH.mjs";
5
+ import "../chunk-E5KIJ5DQ.mjs";
6
6
  import "../chunk-47C2N2UF.mjs";
7
7
  import "../chunk-E2ELQNMR.mjs";
8
8
  import "../chunk-MERECGBH.mjs";
@@ -187,9 +187,19 @@ var get = async (key) => {
187
187
  var set = async (key, val) => {
188
188
  return (await dbPromise).put("persistence", val, key);
189
189
  };
190
+ var clear = async (key) => {
191
+ return (await dbPromise).delete("persistence", key);
192
+ };
190
193
  var persistenceDatabase = {
191
194
  get,
192
- set
195
+ set,
196
+ clear
197
+ };
198
+
199
+ // src/storage/clearAuth.tsx
200
+ var clearAuth = async () => {
201
+ await persistenceDatabase.clear("auth");
202
+ await m2mAuthTokenApi.clear();
193
203
  };
194
204
 
195
205
  // src/storage/api/getToken.ts
@@ -273,8 +283,8 @@ var M2mAuthenticationProvider = ({
273
283
  const timer = setInterval(callback, 3 * 60 * 60 * 1e3);
274
284
  return () => clearInterval(timer);
275
285
  }, []);
276
- const logout = (0, import_react.useCallback)(() => {
277
- void m2mAuthTokenApi.clear();
286
+ const logout = (0, import_react.useCallback)(async () => {
287
+ await clearAuth();
278
288
  window.location.reload();
279
289
  }, []);
280
290
  const updateToken = (0, import_react.useCallback)(async (token2) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/storage/useM2mAuth.tsx","../../src/storage/api/login.ts","../../src/endpoints/m2m-users.v1.ts","../../src/storage/jwt.tsx","../../src/storage/client.ts","../../src/storage/persistenceDatabase.ts","../../src/storage/api/getToken.ts","../../src/storage/refreshAuth.tsx"],"sourcesContent":["import { LoginInput, requestLogin } from \"./api/login\";\nimport { checkJwtExpiration } from \"./jwt\";\nimport { m2mAuthTokenApi } from \"./client\";\nimport { persistenceDatabase } from \"./persistenceDatabase\";\nimport { refreshAuth } from \"./refreshAuth\";\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\n\ninterface AuthenticationState {\n token: string;\n authenticated: boolean;\n login: (input: LoginInput) => Promise<{ token?: string; error?: Error }>;\n logout: () => void;\n updateToken: (token: string) => Promise<{ error?: Error }>;\n revalidating: boolean;\n isLoginRequired: boolean;\n}\n\nconst AuthenticationContext = createContext<AuthenticationState | undefined>(\n undefined,\n);\n\nexport const M2mAuthenticationProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n const [token, setToken] = useState(m2mAuthTokenApi.getCache() ?? \"\");\n\n const authenticated = useMemo(() => !!token, [token]);\n\n const tryCheckAuth = useCallback(async () => {\n const authToken = await m2mAuthTokenApi.get();\n if (!(authToken !== null && checkJwtExpiration(authToken))) {\n void m2mAuthTokenApi.clear();\n setToken(\"\");\n } else {\n void m2mAuthTokenApi.set(authToken);\n setToken(authToken);\n }\n }, []);\n\n useEffect(() => {\n void tryCheckAuth();\n }, [tryCheckAuth]);\n\n const login = useCallback(async (input: LoginInput) => {\n const { data: auth, error } = await requestLogin(input);\n if (auth) {\n const authToken = auth.accessToken;\n\n setToken(authToken);\n await m2mAuthTokenApi.set(authToken);\n await persistenceDatabase.set(\"auth\", auth);\n }\n return {\n error,\n token: auth ? auth.accessToken : undefined,\n };\n }, []);\n\n const [revalidating, setRevalidating] = useState(true);\n\n useEffect(() => {\n const callback = async () => {\n const authToken = await refreshAuth();\n if (authToken !== null) {\n setToken(authToken);\n }\n setRevalidating(false);\n };\n void callback();\n // Update auth every 3 hours\n const timer = setInterval(callback, 3 * 60 * 60 * 1000);\n return () => clearInterval(timer);\n }, []);\n\n const logout = useCallback(() => {\n void m2mAuthTokenApi.clear();\n window.location.reload();\n }, []);\n\n const updateToken = useCallback(async (token: string) => {\n if (checkJwtExpiration(token)) {\n return {\n error: new Error(\"M2MAuthToken is expired\"),\n };\n }\n await m2mAuthTokenApi.set(token);\n setToken(token);\n return { error: undefined };\n }, []);\n\n const state = useMemo(() => {\n return {\n login,\n logout,\n token,\n authenticated,\n updateToken,\n revalidating,\n isLoginRequired: authenticated === false && revalidating === false,\n } satisfies AuthenticationState;\n }, [authenticated, login, logout, revalidating, token, updateToken]);\n return (\n <AuthenticationContext.Provider value={state}>\n {children}\n </AuthenticationContext.Provider>\n );\n};\n\nexport const useAuth = () => {\n const ctx = useContext(AuthenticationContext);\n if (!ctx) {\n throw new Error(\"AuthenticationProvider is not found\");\n }\n return ctx;\n};\n","import { fetcher } from \"matsuri-hooks\";\nimport { login as m2mUsers_v1_login } from \"../../endpoints/m2m-users.v1\";\n\nexport interface LoginInput {\n email: string;\n password: string;\n}\n// @see https://github.com/matsuri-tech/m2m-users/blob/master/domain/model/common/accessToken.go#L7\nexport interface LoginResponse {\n accessToken: string;\n expiresAt: number;\n refreshToken: {\n refreshToken: string;\n refreshTokenExpiresAt: number;\n };\n}\nexport const requestLogin = async (input: LoginInput) => {\n return await fetcher<LoginResponse>(m2mUsers_v1_login(), {\n method: \"POST\",\n body: JSON.stringify(input),\n });\n};\n","/* eslint-disable */\n/**\n * A function that returns the URL part common to the endpoints.\n */\nexport const root = () => {\n let __root = \"\";\n\n if (globalThis.M2M_COMPONENTS_ENV === \"local\") {\n __root = \"http://localhost:8080\";\n }\n\n if (globalThis.M2M_COMPONENTS_ENV === \"localDev\") {\n __root = \"https://api-users.dev.m2msystems.cloud\";\n }\n\n if (globalThis.M2M_COMPONENTS_ENV === \"development\") {\n __root = \"https://api-users.dev.m2msystems.cloud\";\n }\n\n if (globalThis.M2M_COMPONENTS_ENV === \"production\") {\n __root = \"https://api.m2msystems.cloud\";\n }\n\n return __root;\n};\n/**\n * ヘルスチェック\n *\n */\nexport const healthCheck = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`health_check`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社を作成する\n *\n */\nexport const createCompany = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社情報を取得する\n *\n */\nexport const getCompany = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社情報を更新する\n *\n */\nexport const updateCompany = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社情報を更新する\n *\n */\nexport const updateCompanyPatch = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * idを指定して複数の会社情報を取得する\n * @param {string} company_ids a,b,c\n */\nexport const findCompaniesByIds = ({\n company_ids,\n}: {\n company_ids?: string;\n}) => {\n const __root = root();\n const __queries = Object.entries({ company_ids })\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/find_by_ids`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを作成する\n *\n */\nexport const createUser = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを取得する\n *\n */\nexport const findUserById = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを更新する\n *\n */\nexport const updateUser = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを更新する\n *\n */\nexport const updateUserPatch = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを強制的に有効化する\n *\n */\nexport const activateUserByAdmin = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}/admin_activate`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを無効化する\n *\n */\nexport const deactivateUser = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}/deactivate`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * パスワードリセットのメールを送信する\n *\n */\nexport const sendResetPasswordEmail = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/reset_password_email`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * パスワードをリセットする\n *\n */\nexport const resetPassword = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/reset_password`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * アクティベーションメールを送信する\n *\n */\nexport const sendActivationEmail = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/activation_email`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを有効化する\n *\n */\nexport const activateUser = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/activate`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 認可スコープを設定する\n *\n */\nexport const setAuthorityScope = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/scope`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * メールを指定してユーザーを取得する\n *\n */\nexport const findUserByEmail = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/find_by_email`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーの権限を更新する\n *\n */\nexport const updateAuthority = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/authority/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * companyIdからユーザーを取得する\n * @param {string} statuses BeforeVerification,Active,Deactivated\n */\nexport const findUsersByCompanyId = ({ statuses }: { statuses?: string }) => {\n const __root = root();\n const __queries = Object.entries({ statuses })\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/find_by_company_id`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザー情報をAdminが変更する\n *\n */\nexport const updateUserByAdmin = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}/admin_update`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーの会社を移動する\n *\n */\nexport const transferUserCompany = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/transfer_company`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ログインする\n *\n */\nexport const login = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ログインする\n *\n */\nexport const loginWithSlash = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * JWKを取得する\n *\n */\nexport const getJwks = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/jwks`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 公開鍵を取得する\n *\n */\nexport const getPublicKeys = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/public_keys`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * MFAのコードを発行する\n *\n */\nexport const publishMFACode = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/publish_mfa_code`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * MFAを使ってログインする\n *\n */\nexport const loginWithMFA = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/mfa_login`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * トークンを取得する\n *\n */\nexport const getToken = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/token`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * usersに存在しないアカウントのトークンを作成する(deprecated)\n *\n */\nexport const generateToken = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`guest/token`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * usersに存在しないアカウントのトークンを作成する\n *\n */\nexport const generateUserToken = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`generate/token`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\nexport const m2mUsers_v1 = {\n healthCheck,\n createCompany,\n getCompany,\n updateCompany,\n updateCompanyPatch,\n findCompaniesByIds,\n createUser,\n findUserById,\n updateUser,\n updateUserPatch,\n activateUserByAdmin,\n deactivateUser,\n sendResetPasswordEmail,\n resetPassword,\n sendActivationEmail,\n activateUser,\n setAuthorityScope,\n findUserByEmail,\n updateAuthority,\n findUsersByCompanyId,\n updateUserByAdmin,\n transferUserCompany,\n login,\n loginWithSlash,\n getJwks,\n getPublicKeys,\n publishMFACode,\n loginWithMFA,\n getToken,\n generateToken,\n generateUserToken,\n};\n","interface JwtPayload {\n aud: string;\n authority: string;\n companyId: string;\n exp: number;\n iss: string;\n loginType: string;\n scope: Record<string, string>;\n userId: string;\n}\n\nconst isObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null;\n};\n/**\n * 利用するパラメータが存在するかどうかを確認する\n */\nconst validateJwtPayload = (payload: unknown): JwtPayload => {\n if (isObject(payload) === false) {\n throw new Error(\"JWT payload is not an object\");\n }\n\n if (typeof payload?.exp !== \"number\" || typeof payload?.userId !== \"string\") {\n throw new Error(\"JWT payload is missing required fields\");\n }\n\n return payload as unknown as JwtPayload;\n};\n\nexport const parseJwtPayload = (jwt: string): JwtPayload | null => {\n try {\n const splitted = jwt.split(\".\");\n if (splitted.length !== 3) {\n throw new Error(\"Invalid JWT\");\n }\n const [, payload] = splitted;\n return validateJwtPayload(JSON.parse(atob(payload)));\n } catch (error: unknown) {\n console.error(error);\n return null;\n }\n};\n\nexport const checkJwtExpiration = (jwt: string): boolean => {\n const payload = parseJwtPayload(jwt);\n if (!payload) {\n return false;\n }\n return new Date() < new Date(payload.exp * 1000);\n};\n","import { StorageClient } from \"./lib/client\";\n\nclass M2mStorageClient extends StorageClient {}\n\nexport type { M2mStorageClient };\n\n/**\n * Get the connected storage client.\n * @param timeout\n * @default 5000\n */\nconst getStorage = async (timeout = 5000) => {\n const storage = await new Promise<M2mStorageClient>((resolve, reject) => {\n const rejectTimer = globalThis.setTimeout(function () {\n reject(\n new Error(\n \"Timeout: M2mStorageClient could not connect. Please call m2mStorageClient.init() before using m2mStorageClient.\",\n ),\n );\n }, timeout);\n\n const storage = globalThis.M2M_STORAGE;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n resolve(storage);\n }\n\n const timer = globalThis.setInterval(() => {\n const storage = globalThis.M2M_STORAGE;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n globalThis.clearInterval(timer);\n resolve(storage);\n }\n }, 200);\n });\n\n await storage.onConnect();\n\n return storage;\n};\n\nconst M2M_STORAGE_HUB_URL = \"https://hub.m2msystems.cloud/\";\n\nconst M2M_STORAGE_HUB_URL_DEV =\n \"https://m2m-components-storage-hub-dev.netlify.app/\";\n\nconst initStorageClient = (options?: {\n env?: \"development\" | \"production\";\n}) => {\n if (globalThis.M2M_STORAGE) {\n throw new Error(\n \"M2mStorageClient already initialized. Do not call m2mStorageClient.init multiple times.\",\n );\n }\n const storage = new M2mStorageClient(\n options?.env === \"production\"\n ? M2M_STORAGE_HUB_URL\n : M2M_STORAGE_HUB_URL_DEV,\n );\n globalThis.M2M_STORAGE = storage;\n};\n\nexport const m2mStorageClient = {\n init: initStorageClient,\n getStorage: getStorage,\n};\n\nexport const M2M_AUTH_TOKEN_KEY = \"M2M_APP_AUTH_TOKEN\";\n\nconst getAuthTokenCache = () => {\n return globalThis.localStorage.getItem(M2M_AUTH_TOKEN_KEY);\n};\n\nconst getAuthToken = async () => {\n try {\n const storage = await getStorage();\n const autuToken = (await storage.get(M2M_AUTH_TOKEN_KEY)) as string;\n return autuToken || getAuthTokenCache();\n } catch (error) {\n console.warn(error);\n return getAuthTokenCache();\n }\n};\n\nconst setAuthToken = async (token: string) => {\n globalThis.localStorage.setItem(M2M_AUTH_TOKEN_KEY, token);\n try {\n const storage = await getStorage();\n await storage.set(M2M_AUTH_TOKEN_KEY, token);\n } catch (error) {\n console.warn(error);\n }\n};\n\nconst clearAuthToken = async () => {\n globalThis.localStorage.removeItem(M2M_AUTH_TOKEN_KEY);\n try {\n const storage = await getStorage();\n await storage.del(M2M_AUTH_TOKEN_KEY);\n } catch (error) {\n console.warn(error);\n }\n};\n\nexport const m2mAuthTokenApi = {\n get: getAuthToken,\n getCache: getAuthTokenCache,\n set: setAuthToken,\n clear: clearAuthToken,\n};\n","import { DBSchema, openDB } from \"idb\";\nimport { LoginResponse } from \"./api/login\";\n\ninterface PersistenceDatabase extends DBSchema {\n persistence: {\n value: LoginResponse;\n key: \"auth\";\n };\n}\n\nconst dbPromise = openDB<PersistenceDatabase>(\"persistence-store\", 1, {\n upgrade(db) {\n db.createObjectStore(\"persistence\");\n },\n});\n\nconst get = async (key: \"auth\") => {\n return (await dbPromise).get(\"persistence\", key);\n};\nconst set = async (key: \"auth\", val: LoginResponse) => {\n return (await dbPromise).put(\"persistence\", val, key);\n};\n\nexport const persistenceDatabase = {\n get,\n set,\n};\n","import { LoginResponse } from \"./login\";\nimport { fetcher } from \"matsuri-hooks\";\nimport { getToken as m2mUsers_v1_getToken } from \"../../endpoints/m2m-users.v1\";\n\n// @see https://github.com/matsuri-tech/m2m-users/blob/master/web/request/login.go#L10-L13\ninterface GetTokenInput {\n userId: string;\n refreshToken: string;\n}\ntype GetTokenResponse = LoginResponse;\nexport const requestGetToken = async (input: GetTokenInput) => {\n return await fetcher<GetTokenResponse>(m2mUsers_v1_getToken(), {\n method: \"POST\",\n body: JSON.stringify(input),\n });\n};\n","import { m2mAuthTokenApi } from \"./client\";\nimport { parseJwtPayload } from \"./jwt\";\nimport { persistenceDatabase } from \"./persistenceDatabase\";\nimport { requestGetToken } from \"./api/getToken\";\n\nexport const refreshAuth = async () => {\n const auth = await persistenceDatabase.get(\"auth\");\n if (!auth) return null;\n\n const payload = parseJwtPayload(auth.accessToken);\n if (!payload) {\n return null;\n }\n\n const { data: newAuth } = await requestGetToken({\n refreshToken: auth.refreshToken.refreshToken,\n userId: payload.userId,\n });\n\n if (newAuth) {\n const authToken = newAuth.accessToken;\n await m2mAuthTokenApi.set(authToken);\n await persistenceDatabase.set(\"auth\", newAuth);\n return authToken;\n }\n return null;\n};\n"],"mappings":"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","names":["storage","import_matsuri_hooks","login","token"]}
1
+ {"version":3,"sources":["../../src/storage/useM2mAuth.tsx","../../src/storage/api/login.ts","../../src/endpoints/m2m-users.v1.ts","../../src/storage/jwt.tsx","../../src/storage/client.ts","../../src/storage/persistenceDatabase.ts","../../src/storage/clearAuth.tsx","../../src/storage/api/getToken.ts","../../src/storage/refreshAuth.tsx"],"sourcesContent":["import { LoginInput, requestLogin } from \"./api/login\";\nimport { checkJwtExpiration } from \"./jwt\";\nimport { clearAuth } from \"./clearAuth\";\nimport { m2mAuthTokenApi } from \"./client\";\nimport { persistenceDatabase } from \"./persistenceDatabase\";\nimport { refreshAuth } from \"./refreshAuth\";\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\n\ninterface AuthenticationState {\n token: string;\n authenticated: boolean;\n login: (input: LoginInput) => Promise<{ token?: string; error?: Error }>;\n logout: () => void;\n updateToken: (token: string) => Promise<{ error?: Error }>;\n revalidating: boolean;\n isLoginRequired: boolean;\n}\n\nconst AuthenticationContext = createContext<AuthenticationState | undefined>(\n undefined,\n);\n\nexport const M2mAuthenticationProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n const [token, setToken] = useState(m2mAuthTokenApi.getCache() ?? \"\");\n\n const authenticated = useMemo(() => !!token, [token]);\n\n const tryCheckAuth = useCallback(async () => {\n const authToken = await m2mAuthTokenApi.get();\n if (!(authToken !== null && checkJwtExpiration(authToken))) {\n void m2mAuthTokenApi.clear();\n setToken(\"\");\n } else {\n void m2mAuthTokenApi.set(authToken);\n setToken(authToken);\n }\n }, []);\n\n useEffect(() => {\n void tryCheckAuth();\n }, [tryCheckAuth]);\n\n const login = useCallback(async (input: LoginInput) => {\n const { data: auth, error } = await requestLogin(input);\n if (auth) {\n const authToken = auth.accessToken;\n\n setToken(authToken);\n await m2mAuthTokenApi.set(authToken);\n await persistenceDatabase.set(\"auth\", auth);\n }\n return {\n error,\n token: auth ? auth.accessToken : undefined,\n };\n }, []);\n\n const [revalidating, setRevalidating] = useState(true);\n\n useEffect(() => {\n const callback = async () => {\n const authToken = await refreshAuth();\n if (authToken !== null) {\n setToken(authToken);\n }\n setRevalidating(false);\n };\n void callback();\n // Update auth every 3 hours\n const timer = setInterval(callback, 3 * 60 * 60 * 1000);\n return () => clearInterval(timer);\n }, []);\n\n const logout = useCallback(async () => {\n await clearAuth();\n window.location.reload();\n }, []);\n\n const updateToken = useCallback(async (token: string) => {\n if (checkJwtExpiration(token)) {\n return {\n error: new Error(\"M2MAuthToken is expired\"),\n };\n }\n await m2mAuthTokenApi.set(token);\n setToken(token);\n return { error: undefined };\n }, []);\n\n const state = useMemo(() => {\n return {\n login,\n logout,\n token,\n authenticated,\n updateToken,\n revalidating,\n isLoginRequired: authenticated === false && revalidating === false,\n } satisfies AuthenticationState;\n }, [authenticated, login, logout, revalidating, token, updateToken]);\n return (\n <AuthenticationContext.Provider value={state}>\n {children}\n </AuthenticationContext.Provider>\n );\n};\n\nexport const useAuth = () => {\n const ctx = useContext(AuthenticationContext);\n if (!ctx) {\n throw new Error(\"AuthenticationProvider is not found\");\n }\n return ctx;\n};\n","import { fetcher } from \"matsuri-hooks\";\nimport { login as m2mUsers_v1_login } from \"../../endpoints/m2m-users.v1\";\n\nexport interface LoginInput {\n email: string;\n password: string;\n}\n// @see https://github.com/matsuri-tech/m2m-users/blob/master/domain/model/common/accessToken.go#L7\nexport interface LoginResponse {\n accessToken: string;\n expiresAt: number;\n refreshToken: {\n refreshToken: string;\n refreshTokenExpiresAt: number;\n };\n}\nexport const requestLogin = async (input: LoginInput) => {\n return await fetcher<LoginResponse>(m2mUsers_v1_login(), {\n method: \"POST\",\n body: JSON.stringify(input),\n });\n};\n","/* eslint-disable */\n/**\n * A function that returns the URL part common to the endpoints.\n */\nexport const root = () => {\n let __root = \"\";\n\n if (globalThis.M2M_COMPONENTS_ENV === \"local\") {\n __root = \"http://localhost:8080\";\n }\n\n if (globalThis.M2M_COMPONENTS_ENV === \"localDev\") {\n __root = \"https://api-users.dev.m2msystems.cloud\";\n }\n\n if (globalThis.M2M_COMPONENTS_ENV === \"development\") {\n __root = \"https://api-users.dev.m2msystems.cloud\";\n }\n\n if (globalThis.M2M_COMPONENTS_ENV === \"production\") {\n __root = \"https://api.m2msystems.cloud\";\n }\n\n return __root;\n};\n/**\n * ヘルスチェック\n *\n */\nexport const healthCheck = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`health_check`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社を作成する\n *\n */\nexport const createCompany = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社情報を取得する\n *\n */\nexport const getCompany = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社情報を更新する\n *\n */\nexport const updateCompany = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 会社情報を更新する\n *\n */\nexport const updateCompanyPatch = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * idを指定して複数の会社情報を取得する\n * @param {string} company_ids a,b,c\n */\nexport const findCompaniesByIds = ({\n company_ids,\n}: {\n company_ids?: string;\n}) => {\n const __root = root();\n const __queries = Object.entries({ company_ids })\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`companies/find_by_ids`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを作成する\n *\n */\nexport const createUser = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを取得する\n *\n */\nexport const findUserById = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを更新する\n *\n */\nexport const updateUser = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを更新する\n *\n */\nexport const updateUserPatch = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを強制的に有効化する\n *\n */\nexport const activateUserByAdmin = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}/admin_activate`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを無効化する\n *\n */\nexport const deactivateUser = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}/deactivate`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * パスワードリセットのメールを送信する\n *\n */\nexport const sendResetPasswordEmail = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/reset_password_email`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * パスワードをリセットする\n *\n */\nexport const resetPassword = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/reset_password`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * アクティベーションメールを送信する\n *\n */\nexport const sendActivationEmail = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/activation_email`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーを有効化する\n *\n */\nexport const activateUser = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/activate`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 認可スコープを設定する\n *\n */\nexport const setAuthorityScope = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/scope`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * メールを指定してユーザーを取得する\n *\n */\nexport const findUserByEmail = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/find_by_email`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーの権限を更新する\n *\n */\nexport const updateAuthority = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/authority/${id}`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * companyIdからユーザーを取得する\n * @param {string} statuses BeforeVerification,Active,Deactivated\n */\nexport const findUsersByCompanyId = ({ statuses }: { statuses?: string }) => {\n const __root = root();\n const __queries = Object.entries({ statuses })\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/find_by_company_id`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザー情報をAdminが変更する\n *\n */\nexport const updateUserByAdmin = ({ id }: { id: string }) => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/${id}/admin_update`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ユーザーの会社を移動する\n *\n */\nexport const transferUserCompany = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`users/transfer_company`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ログインする\n *\n */\nexport const login = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * ログインする\n *\n */\nexport const loginWithSlash = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * JWKを取得する\n *\n */\nexport const getJwks = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/jwks`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * 公開鍵を取得する\n *\n */\nexport const getPublicKeys = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/public_keys`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * MFAのコードを発行する\n *\n */\nexport const publishMFACode = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/publish_mfa_code`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * MFAを使ってログインする\n *\n */\nexport const loginWithMFA = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/mfa_login`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * トークンを取得する\n *\n */\nexport const getToken = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`login/token`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * usersに存在しないアカウントのトークンを作成する(deprecated)\n *\n */\nexport const generateToken = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`guest/token`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\n/**\n * usersに存在しないアカウントのトークンを作成する\n *\n */\nexport const generateUserToken = () => {\n const __root = root();\n const __queries = Object.entries({})\n .filter(([_, value]) => {\n return value !== undefined;\n })\n .map(([key, value]) => {\n return `${key}=${value}`;\n })\n .join(\"&\");\n const __path = `${__root}/${`generate/token`}`;\n return __queries ? `${__path}?${__queries}` : __path;\n};\nexport const m2mUsers_v1 = {\n healthCheck,\n createCompany,\n getCompany,\n updateCompany,\n updateCompanyPatch,\n findCompaniesByIds,\n createUser,\n findUserById,\n updateUser,\n updateUserPatch,\n activateUserByAdmin,\n deactivateUser,\n sendResetPasswordEmail,\n resetPassword,\n sendActivationEmail,\n activateUser,\n setAuthorityScope,\n findUserByEmail,\n updateAuthority,\n findUsersByCompanyId,\n updateUserByAdmin,\n transferUserCompany,\n login,\n loginWithSlash,\n getJwks,\n getPublicKeys,\n publishMFACode,\n loginWithMFA,\n getToken,\n generateToken,\n generateUserToken,\n};\n","interface JwtPayload {\n aud: string;\n authority: string;\n companyId: string;\n exp: number;\n iss: string;\n loginType: string;\n scope: Record<string, string>;\n userId: string;\n}\n\nconst isObject = (value: unknown): value is Record<string, unknown> => {\n return typeof value === \"object\" && value !== null;\n};\n/**\n * 利用するパラメータが存在するかどうかを確認する\n */\nconst validateJwtPayload = (payload: unknown): JwtPayload => {\n if (isObject(payload) === false) {\n throw new Error(\"JWT payload is not an object\");\n }\n\n if (typeof payload?.exp !== \"number\" || typeof payload?.userId !== \"string\") {\n throw new Error(\"JWT payload is missing required fields\");\n }\n\n return payload as unknown as JwtPayload;\n};\n\nexport const parseJwtPayload = (jwt: string): JwtPayload | null => {\n try {\n const splitted = jwt.split(\".\");\n if (splitted.length !== 3) {\n throw new Error(\"Invalid JWT\");\n }\n const [, payload] = splitted;\n return validateJwtPayload(JSON.parse(atob(payload)));\n } catch (error: unknown) {\n console.error(error);\n return null;\n }\n};\n\nexport const checkJwtExpiration = (jwt: string): boolean => {\n const payload = parseJwtPayload(jwt);\n if (!payload) {\n return false;\n }\n return new Date() < new Date(payload.exp * 1000);\n};\n","import { StorageClient } from \"./lib/client\";\n\nclass M2mStorageClient extends StorageClient {}\n\nexport type { M2mStorageClient };\n\n/**\n * Get the connected storage client.\n * @param timeout\n * @default 5000\n */\nconst getStorage = async (timeout = 5000) => {\n const storage = await new Promise<M2mStorageClient>((resolve, reject) => {\n const rejectTimer = globalThis.setTimeout(function () {\n reject(\n new Error(\n \"Timeout: M2mStorageClient could not connect. Please call m2mStorageClient.init() before using m2mStorageClient.\",\n ),\n );\n }, timeout);\n\n const storage = globalThis.M2M_STORAGE;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n resolve(storage);\n }\n\n const timer = globalThis.setInterval(() => {\n const storage = globalThis.M2M_STORAGE;\n if (storage) {\n globalThis.clearTimeout(rejectTimer);\n globalThis.clearInterval(timer);\n resolve(storage);\n }\n }, 200);\n });\n\n await storage.onConnect();\n\n return storage;\n};\n\nconst M2M_STORAGE_HUB_URL = \"https://hub.m2msystems.cloud/\";\n\nconst M2M_STORAGE_HUB_URL_DEV =\n \"https://m2m-components-storage-hub-dev.netlify.app/\";\n\nconst initStorageClient = (options?: {\n env?: \"development\" | \"production\";\n}) => {\n if (globalThis.M2M_STORAGE) {\n throw new Error(\n \"M2mStorageClient already initialized. Do not call m2mStorageClient.init multiple times.\",\n );\n }\n const storage = new M2mStorageClient(\n options?.env === \"production\"\n ? M2M_STORAGE_HUB_URL\n : M2M_STORAGE_HUB_URL_DEV,\n );\n globalThis.M2M_STORAGE = storage;\n};\n\nexport const m2mStorageClient = {\n init: initStorageClient,\n getStorage: getStorage,\n};\n\nexport const M2M_AUTH_TOKEN_KEY = \"M2M_APP_AUTH_TOKEN\";\n\nconst getAuthTokenCache = () => {\n return globalThis.localStorage.getItem(M2M_AUTH_TOKEN_KEY);\n};\n\nconst getAuthToken = async () => {\n try {\n const storage = await getStorage();\n const autuToken = (await storage.get(M2M_AUTH_TOKEN_KEY)) as string;\n return autuToken || getAuthTokenCache();\n } catch (error) {\n console.warn(error);\n return getAuthTokenCache();\n }\n};\n\nconst setAuthToken = async (token: string) => {\n globalThis.localStorage.setItem(M2M_AUTH_TOKEN_KEY, token);\n try {\n const storage = await getStorage();\n await storage.set(M2M_AUTH_TOKEN_KEY, token);\n } catch (error) {\n console.warn(error);\n }\n};\n\nconst clearAuthToken = async () => {\n globalThis.localStorage.removeItem(M2M_AUTH_TOKEN_KEY);\n try {\n const storage = await getStorage();\n await storage.del(M2M_AUTH_TOKEN_KEY);\n } catch (error) {\n console.warn(error);\n }\n};\n\nexport const m2mAuthTokenApi = {\n get: getAuthToken,\n getCache: getAuthTokenCache,\n set: setAuthToken,\n clear: clearAuthToken,\n};\n","import { DBSchema, openDB } from \"idb\";\nimport { LoginResponse } from \"./api/login\";\n\ninterface PersistenceDatabase extends DBSchema {\n persistence: {\n value: LoginResponse;\n key: \"auth\";\n };\n}\n\nconst dbPromise = openDB<PersistenceDatabase>(\"persistence-store\", 1, {\n upgrade(db) {\n db.createObjectStore(\"persistence\");\n },\n});\n\nconst get = async (key: \"auth\") => {\n return (await dbPromise).get(\"persistence\", key);\n};\nconst set = async (key: \"auth\", val: LoginResponse) => {\n return (await dbPromise).put(\"persistence\", val, key);\n};\nconst clear = async (key: \"auth\") => {\n return (await dbPromise).delete(\"persistence\", key);\n};\n\nexport const persistenceDatabase = {\n get,\n set,\n clear,\n};\n","import { m2mAuthTokenApi } from \"./client\";\nimport { persistenceDatabase } from \"./persistenceDatabase\";\n\nexport const clearAuth = async () => {\n await persistenceDatabase.clear(\"auth\");\n await m2mAuthTokenApi.clear();\n};\n","import { LoginResponse } from \"./login\";\nimport { fetcher } from \"matsuri-hooks\";\nimport { getToken as m2mUsers_v1_getToken } from \"../../endpoints/m2m-users.v1\";\n\n// @see https://github.com/matsuri-tech/m2m-users/blob/master/web/request/login.go#L10-L13\ninterface GetTokenInput {\n userId: string;\n refreshToken: string;\n}\ntype GetTokenResponse = LoginResponse;\nexport const requestGetToken = async (input: GetTokenInput) => {\n return await fetcher<GetTokenResponse>(m2mUsers_v1_getToken(), {\n method: \"POST\",\n body: JSON.stringify(input),\n });\n};\n","import { m2mAuthTokenApi } from \"./client\";\nimport { parseJwtPayload } from \"./jwt\";\nimport { persistenceDatabase } from \"./persistenceDatabase\";\nimport { requestGetToken } from \"./api/getToken\";\n\nexport const refreshAuth = async () => {\n const auth = await persistenceDatabase.get(\"auth\");\n if (!auth) return null;\n\n const payload = parseJwtPayload(auth.accessToken);\n if (!payload) {\n return null;\n }\n\n const { data: newAuth } = await requestGetToken({\n refreshToken: auth.refreshToken.refreshToken,\n userId: payload.userId,\n });\n\n if (newAuth) {\n const authToken = newAuth.accessToken;\n await m2mAuthTokenApi.set(authToken);\n await persistenceDatabase.set(\"auth\", newAuth);\n return authToken;\n }\n return null;\n};\n"],"mappings":"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","names":["storage","import_matsuri_hooks","login","token"]}
@@ -1,16 +1,19 @@
1
+ import {
2
+ requestLogin
3
+ } from "../chunk-77SFV5XL.mjs";
4
+ import {
5
+ clearAuth
6
+ } from "../chunk-3ZM74LVQ.mjs";
1
7
  import {
2
8
  refreshAuth
3
- } from "../chunk-27D73AG2.mjs";
9
+ } from "../chunk-AJUMESCA.mjs";
4
10
  import {
5
11
  checkJwtExpiration
6
12
  } from "../chunk-JG5QN6O7.mjs";
7
13
  import {
8
14
  persistenceDatabase
9
- } from "../chunk-GQCJ5QNH.mjs";
15
+ } from "../chunk-E5KIJ5DQ.mjs";
10
16
  import "../chunk-47C2N2UF.mjs";
11
- import {
12
- requestLogin
13
- } from "../chunk-77SFV5XL.mjs";
14
17
  import "../chunk-E2ELQNMR.mjs";
15
18
  import {
16
19
  m2mAuthTokenApi
@@ -76,8 +79,8 @@ var M2mAuthenticationProvider = ({
76
79
  const timer = setInterval(callback, 3 * 60 * 60 * 1e3);
77
80
  return () => clearInterval(timer);
78
81
  }, []);
79
- const logout = useCallback(() => {
80
- void m2mAuthTokenApi.clear();
82
+ const logout = useCallback(async () => {
83
+ await clearAuth();
81
84
  window.location.reload();
82
85
  }, []);
83
86
  const updateToken = useCallback(async (token2) => {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/storage/useM2mAuth.tsx"],"sourcesContent":["import { LoginInput, requestLogin } from \"./api/login\";\nimport { checkJwtExpiration } from \"./jwt\";\nimport { m2mAuthTokenApi } from \"./client\";\nimport { persistenceDatabase } from \"./persistenceDatabase\";\nimport { refreshAuth } from \"./refreshAuth\";\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\n\ninterface AuthenticationState {\n token: string;\n authenticated: boolean;\n login: (input: LoginInput) => Promise<{ token?: string; error?: Error }>;\n logout: () => void;\n updateToken: (token: string) => Promise<{ error?: Error }>;\n revalidating: boolean;\n isLoginRequired: boolean;\n}\n\nconst AuthenticationContext = createContext<AuthenticationState | undefined>(\n undefined,\n);\n\nexport const M2mAuthenticationProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n const [token, setToken] = useState(m2mAuthTokenApi.getCache() ?? \"\");\n\n const authenticated = useMemo(() => !!token, [token]);\n\n const tryCheckAuth = useCallback(async () => {\n const authToken = await m2mAuthTokenApi.get();\n if (!(authToken !== null && checkJwtExpiration(authToken))) {\n void m2mAuthTokenApi.clear();\n setToken(\"\");\n } else {\n void m2mAuthTokenApi.set(authToken);\n setToken(authToken);\n }\n }, []);\n\n useEffect(() => {\n void tryCheckAuth();\n }, [tryCheckAuth]);\n\n const login = useCallback(async (input: LoginInput) => {\n const { data: auth, error } = await requestLogin(input);\n if (auth) {\n const authToken = auth.accessToken;\n\n setToken(authToken);\n await m2mAuthTokenApi.set(authToken);\n await persistenceDatabase.set(\"auth\", auth);\n }\n return {\n error,\n token: auth ? auth.accessToken : undefined,\n };\n }, []);\n\n const [revalidating, setRevalidating] = useState(true);\n\n useEffect(() => {\n const callback = async () => {\n const authToken = await refreshAuth();\n if (authToken !== null) {\n setToken(authToken);\n }\n setRevalidating(false);\n };\n void callback();\n // Update auth every 3 hours\n const timer = setInterval(callback, 3 * 60 * 60 * 1000);\n return () => clearInterval(timer);\n }, []);\n\n const logout = useCallback(() => {\n void m2mAuthTokenApi.clear();\n window.location.reload();\n }, []);\n\n const updateToken = useCallback(async (token: string) => {\n if (checkJwtExpiration(token)) {\n return {\n error: new Error(\"M2MAuthToken is expired\"),\n };\n }\n await m2mAuthTokenApi.set(token);\n setToken(token);\n return { error: undefined };\n }, []);\n\n const state = useMemo(() => {\n return {\n login,\n logout,\n token,\n authenticated,\n updateToken,\n revalidating,\n isLoginRequired: authenticated === false && revalidating === false,\n } satisfies AuthenticationState;\n }, [authenticated, login, logout, revalidating, token, updateToken]);\n return (\n <AuthenticationContext.Provider value={state}>\n {children}\n </AuthenticationContext.Provider>\n );\n};\n\nexport const useAuth = () => {\n const ctx = useContext(AuthenticationContext);\n if (!ctx) {\n throw new Error(\"AuthenticationProvider is not found\");\n }\n return ctx;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAKA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAmGH;AAvFJ,IAAM,wBAAwB;AAAA,EAC5B;AACF;AAEO,IAAM,4BAA4B,CAAC;AAAA,EACxC;AACF,MAEM;AAhCN;AAiCE,QAAM,CAAC,OAAO,QAAQ,IAAI,UAAS,qBAAgB,SAAS,MAAzB,YAA8B,EAAE;AAEnE,QAAM,gBAAgB,QAAQ,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;AAEpD,QAAM,eAAe,YAAY,YAAY;AAC3C,UAAM,YAAY,MAAM,gBAAgB,IAAI;AAC5C,QAAI,EAAE,cAAc,QAAQ,mBAAmB,SAAS,IAAI;AAC1D,WAAK,gBAAgB,MAAM;AAC3B,eAAS,EAAE;AAAA,IACb,OAAO;AACL,WAAK,gBAAgB,IAAI,SAAS;AAClC,eAAS,SAAS;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,SAAK,aAAa;AAAA,EACpB,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,QAAQ,YAAY,OAAO,UAAsB;AACrD,UAAM,EAAE,MAAM,MAAM,MAAM,IAAI,MAAM,aAAa,KAAK;AACtD,QAAI,MAAM;AACR,YAAM,YAAY,KAAK;AAEvB,eAAS,SAAS;AAClB,YAAM,gBAAgB,IAAI,SAAS;AACnC,YAAM,oBAAoB,IAAI,QAAQ,IAAI;AAAA,IAC5C;AACA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,OAAO,KAAK,cAAc;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,IAAI;AAErD,YAAU,MAAM;AACd,UAAM,WAAW,YAAY;AAC3B,YAAM,YAAY,MAAM,YAAY;AACpC,UAAI,cAAc,MAAM;AACtB,iBAAS,SAAS;AAAA,MACpB;AACA,sBAAgB,KAAK;AAAA,IACvB;AACA,SAAK,SAAS;AAEd,UAAM,QAAQ,YAAY,UAAU,IAAI,KAAK,KAAK,GAAI;AACtD,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC,GAAG,CAAC,CAAC;AAEL,QAAM,SAAS,YAAY,MAAM;AAC/B,SAAK,gBAAgB,MAAM;AAC3B,WAAO,SAAS,OAAO;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,YAAY,OAAOA,WAAkB;AACvD,QAAI,mBAAmBA,MAAK,GAAG;AAC7B,aAAO;AAAA,QACL,OAAO,IAAI,MAAM,yBAAyB;AAAA,MAC5C;AAAA,IACF;AACA,UAAM,gBAAgB,IAAIA,MAAK;AAC/B,aAASA,MAAK;AACd,WAAO,EAAE,OAAO,OAAU;AAAA,EAC5B,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ,QAAQ,MAAM;AAC1B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB,kBAAkB,SAAS,iBAAiB;AAAA,IAC/D;AAAA,EACF,GAAG,CAAC,eAAe,OAAO,QAAQ,cAAc,OAAO,WAAW,CAAC;AACnE,SACE,oBAAC,sBAAsB,UAAtB,EAA+B,OAAO,OACpC,UACH;AAEJ;AAEO,IAAM,UAAU,MAAM;AAC3B,QAAM,MAAM,WAAW,qBAAqB;AAC5C,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACvD;AACA,SAAO;AACT;","names":["token"]}
1
+ {"version":3,"sources":["../../src/storage/useM2mAuth.tsx"],"sourcesContent":["import { LoginInput, requestLogin } from \"./api/login\";\nimport { checkJwtExpiration } from \"./jwt\";\nimport { clearAuth } from \"./clearAuth\";\nimport { m2mAuthTokenApi } from \"./client\";\nimport { persistenceDatabase } from \"./persistenceDatabase\";\nimport { refreshAuth } from \"./refreshAuth\";\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\n\ninterface AuthenticationState {\n token: string;\n authenticated: boolean;\n login: (input: LoginInput) => Promise<{ token?: string; error?: Error }>;\n logout: () => void;\n updateToken: (token: string) => Promise<{ error?: Error }>;\n revalidating: boolean;\n isLoginRequired: boolean;\n}\n\nconst AuthenticationContext = createContext<AuthenticationState | undefined>(\n undefined,\n);\n\nexport const M2mAuthenticationProvider = ({\n children,\n}: {\n children: React.ReactNode;\n}) => {\n const [token, setToken] = useState(m2mAuthTokenApi.getCache() ?? \"\");\n\n const authenticated = useMemo(() => !!token, [token]);\n\n const tryCheckAuth = useCallback(async () => {\n const authToken = await m2mAuthTokenApi.get();\n if (!(authToken !== null && checkJwtExpiration(authToken))) {\n void m2mAuthTokenApi.clear();\n setToken(\"\");\n } else {\n void m2mAuthTokenApi.set(authToken);\n setToken(authToken);\n }\n }, []);\n\n useEffect(() => {\n void tryCheckAuth();\n }, [tryCheckAuth]);\n\n const login = useCallback(async (input: LoginInput) => {\n const { data: auth, error } = await requestLogin(input);\n if (auth) {\n const authToken = auth.accessToken;\n\n setToken(authToken);\n await m2mAuthTokenApi.set(authToken);\n await persistenceDatabase.set(\"auth\", auth);\n }\n return {\n error,\n token: auth ? auth.accessToken : undefined,\n };\n }, []);\n\n const [revalidating, setRevalidating] = useState(true);\n\n useEffect(() => {\n const callback = async () => {\n const authToken = await refreshAuth();\n if (authToken !== null) {\n setToken(authToken);\n }\n setRevalidating(false);\n };\n void callback();\n // Update auth every 3 hours\n const timer = setInterval(callback, 3 * 60 * 60 * 1000);\n return () => clearInterval(timer);\n }, []);\n\n const logout = useCallback(async () => {\n await clearAuth();\n window.location.reload();\n }, []);\n\n const updateToken = useCallback(async (token: string) => {\n if (checkJwtExpiration(token)) {\n return {\n error: new Error(\"M2MAuthToken is expired\"),\n };\n }\n await m2mAuthTokenApi.set(token);\n setToken(token);\n return { error: undefined };\n }, []);\n\n const state = useMemo(() => {\n return {\n login,\n logout,\n token,\n authenticated,\n updateToken,\n revalidating,\n isLoginRequired: authenticated === false && revalidating === false,\n } satisfies AuthenticationState;\n }, [authenticated, login, logout, revalidating, token, updateToken]);\n return (\n <AuthenticationContext.Provider value={state}>\n {children}\n </AuthenticationContext.Provider>\n );\n};\n\nexport const useAuth = () => {\n const ctx = useContext(AuthenticationContext);\n if (!ctx) {\n throw new Error(\"AuthenticationProvider is not found\");\n }\n return ctx;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAMA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAmGH;AAvFJ,IAAM,wBAAwB;AAAA,EAC5B;AACF;AAEO,IAAM,4BAA4B,CAAC;AAAA,EACxC;AACF,MAEM;AAjCN;AAkCE,QAAM,CAAC,OAAO,QAAQ,IAAI,UAAS,qBAAgB,SAAS,MAAzB,YAA8B,EAAE;AAEnE,QAAM,gBAAgB,QAAQ,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;AAEpD,QAAM,eAAe,YAAY,YAAY;AAC3C,UAAM,YAAY,MAAM,gBAAgB,IAAI;AAC5C,QAAI,EAAE,cAAc,QAAQ,mBAAmB,SAAS,IAAI;AAC1D,WAAK,gBAAgB,MAAM;AAC3B,eAAS,EAAE;AAAA,IACb,OAAO;AACL,WAAK,gBAAgB,IAAI,SAAS;AAClC,eAAS,SAAS;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,YAAU,MAAM;AACd,SAAK,aAAa;AAAA,EACpB,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,QAAQ,YAAY,OAAO,UAAsB;AACrD,UAAM,EAAE,MAAM,MAAM,MAAM,IAAI,MAAM,aAAa,KAAK;AACtD,QAAI,MAAM;AACR,YAAM,YAAY,KAAK;AAEvB,eAAS,SAAS;AAClB,YAAM,gBAAgB,IAAI,SAAS;AACnC,YAAM,oBAAoB,IAAI,QAAQ,IAAI;AAAA,IAC5C;AACA,WAAO;AAAA,MACL;AAAA,MACA,OAAO,OAAO,KAAK,cAAc;AAAA,IACnC;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,CAAC,cAAc,eAAe,IAAI,SAAS,IAAI;AAErD,YAAU,MAAM;AACd,UAAM,WAAW,YAAY;AAC3B,YAAM,YAAY,MAAM,YAAY;AACpC,UAAI,cAAc,MAAM;AACtB,iBAAS,SAAS;AAAA,MACpB;AACA,sBAAgB,KAAK;AAAA,IACvB;AACA,SAAK,SAAS;AAEd,UAAM,QAAQ,YAAY,UAAU,IAAI,KAAK,KAAK,GAAI;AACtD,WAAO,MAAM,cAAc,KAAK;AAAA,EAClC,GAAG,CAAC,CAAC;AAEL,QAAM,SAAS,YAAY,YAAY;AACrC,UAAM,UAAU;AAChB,WAAO,SAAS,OAAO;AAAA,EACzB,GAAG,CAAC,CAAC;AAEL,QAAM,cAAc,YAAY,OAAOA,WAAkB;AACvD,QAAI,mBAAmBA,MAAK,GAAG;AAC7B,aAAO;AAAA,QACL,OAAO,IAAI,MAAM,yBAAyB;AAAA,MAC5C;AAAA,IACF;AACA,UAAM,gBAAgB,IAAIA,MAAK;AAC/B,aAASA,MAAK;AACd,WAAO,EAAE,OAAO,OAAU;AAAA,EAC5B,GAAG,CAAC,CAAC;AAEL,QAAM,QAAQ,QAAQ,MAAM;AAC1B,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB,kBAAkB,SAAS,iBAAiB;AAAA,IAC/D;AAAA,EACF,GAAG,CAAC,eAAe,OAAO,QAAQ,cAAc,OAAO,WAAW,CAAC;AACnE,SACE,oBAAC,sBAAsB,UAAtB,EAA+B,OAAO,OACpC,UACH;AAEJ;AAEO,IAAM,UAAU,MAAM;AAC3B,QAAM,MAAM,WAAW,qBAAqB;AAC5C,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACvD;AACA,SAAO;AACT;","names":["token"]}