m2m-components 0.1.2 → 0.3.1

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.
Files changed (78) hide show
  1. package/LitMenuBaseElement.js +11 -91
  2. package/LitMenuBaseElement.js.map +1 -1
  3. package/cjs/LitMenuBaseElement.js +225 -0
  4. package/cjs/LitMenuBaseElement.js.map +1 -0
  5. package/cjs/domains.js +19 -0
  6. package/cjs/domains.js.map +1 -0
  7. package/cjs/endpoints/m2m-notifications.js +19 -0
  8. package/cjs/endpoints/m2m-notifications.js.map +1 -0
  9. package/cjs/endpoints/m2m-notifications.v1.js +169 -0
  10. package/cjs/endpoints/m2m-notifications.v1.js.map +1 -0
  11. package/cjs/endpoints/m2m-users.js +19 -0
  12. package/cjs/endpoints/m2m-users.js.map +1 -0
  13. package/cjs/endpoints/m2m-users.v1.js +672 -0
  14. package/cjs/endpoints/m2m-users.v1.js.map +1 -0
  15. package/cjs/index.js +14 -0
  16. package/cjs/index.js.map +1 -0
  17. package/cjs/m2m-apps-menu.js +105 -0
  18. package/cjs/m2m-apps-menu.js.map +1 -0
  19. package/cjs/m2m-user-menu.js +113 -0
  20. package/cjs/m2m-user-menu.js.map +1 -0
  21. package/cjs/notification/NotificationProvider.js +100 -0
  22. package/cjs/notification/NotificationProvider.js.map +1 -0
  23. package/cjs/notification/ServiceIdProvider.js +41 -0
  24. package/cjs/notification/ServiceIdProvider.js.map +1 -0
  25. package/cjs/notification/api.js +63 -0
  26. package/cjs/notification/api.js.map +1 -0
  27. package/cjs/notification/domain.js +6 -0
  28. package/cjs/notification/domain.js.map +1 -0
  29. package/cjs/notification/index.js +58 -0
  30. package/cjs/notification/index.js.map +1 -0
  31. package/cjs/storage/client.js +110 -0
  32. package/cjs/storage/client.js.map +1 -0
  33. package/cjs/storage/hub.js +21 -0
  34. package/cjs/storage/hub.js.map +1 -0
  35. package/cjs/storage/lib/client.js +203 -0
  36. package/cjs/storage/lib/client.js.map +1 -0
  37. package/cjs/storage/lib/hub.js +126 -0
  38. package/cjs/storage/lib/hub.js.map +1 -0
  39. package/cjs/storage/useM2mAuth.js +101 -0
  40. package/cjs/storage/useM2mAuth.js.map +1 -0
  41. package/domains.js +1 -1
  42. package/domains.js.map +1 -1
  43. package/endpoints/m2m-notifications.js +1 -1
  44. package/endpoints/m2m-notifications.js.map +1 -1
  45. package/endpoints/m2m-notifications.v1.js +71 -49
  46. package/endpoints/m2m-notifications.v1.js.map +1 -1
  47. package/endpoints/m2m-users.d.ts +5 -0
  48. package/endpoints/m2m-users.d.ts.map +1 -0
  49. package/endpoints/m2m-users.js +6 -0
  50. package/endpoints/m2m-users.js.map +1 -0
  51. package/endpoints/m2m-users.v1.d.ts +221 -0
  52. package/endpoints/m2m-users.v1.d.ts.map +1 -0
  53. package/endpoints/m2m-users.v1.js +682 -0
  54. package/endpoints/m2m-users.v1.js.map +1 -0
  55. package/m2m-apps-menu.js +11 -39
  56. package/m2m-apps-menu.js.map +1 -1
  57. package/m2m-user-menu.js +11 -33
  58. package/m2m-user-menu.js.map +1 -1
  59. package/notification/NotificationProvider.js +29 -26
  60. package/notification/NotificationProvider.js.map +1 -1
  61. package/notification/ServiceIdProvider.js +12 -11
  62. package/notification/ServiceIdProvider.js.map +1 -1
  63. package/notification/api.js +66 -38
  64. package/notification/api.js.map +1 -1
  65. package/package.json +30 -6
  66. package/storage/client.d.ts.map +1 -1
  67. package/storage/client.js +69 -31
  68. package/storage/client.js.map +1 -1
  69. package/storage/hub.js +2 -2
  70. package/storage/hub.js.map +1 -1
  71. package/storage/lib/client.js +21 -13
  72. package/storage/lib/client.js.map +1 -1
  73. package/storage/lib/hub.js +23 -23
  74. package/storage/lib/hub.js.map +1 -1
  75. package/storage/useM2mAuth.d.ts +19 -0
  76. package/storage/useM2mAuth.d.ts.map +1 -0
  77. package/storage/useM2mAuth.js +94 -0
  78. package/storage/useM2mAuth.js.map +1 -0
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+
7
+ var _domain = require("./domain");
8
+
9
+ Object.keys(_domain).forEach(function (key) {
10
+ if (key === "default" || key === "__esModule") return;
11
+ if (key in exports && exports[key] === _domain[key]) return;
12
+ Object.defineProperty(exports, key, {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _domain[key];
16
+ }
17
+ });
18
+ });
19
+
20
+ var _api = require("./api");
21
+
22
+ Object.keys(_api).forEach(function (key) {
23
+ if (key === "default" || key === "__esModule") return;
24
+ if (key in exports && exports[key] === _api[key]) return;
25
+ Object.defineProperty(exports, key, {
26
+ enumerable: true,
27
+ get: function () {
28
+ return _api[key];
29
+ }
30
+ });
31
+ });
32
+
33
+ var _ServiceIdProvider = require("./ServiceIdProvider");
34
+
35
+ Object.keys(_ServiceIdProvider).forEach(function (key) {
36
+ if (key === "default" || key === "__esModule") return;
37
+ if (key in exports && exports[key] === _ServiceIdProvider[key]) return;
38
+ Object.defineProperty(exports, key, {
39
+ enumerable: true,
40
+ get: function () {
41
+ return _ServiceIdProvider[key];
42
+ }
43
+ });
44
+ });
45
+
46
+ var _NotificationProvider = require("./NotificationProvider");
47
+
48
+ Object.keys(_NotificationProvider).forEach(function (key) {
49
+ if (key === "default" || key === "__esModule") return;
50
+ if (key in exports && exports[key] === _NotificationProvider[key]) return;
51
+ Object.defineProperty(exports, key, {
52
+ enumerable: true,
53
+ get: function () {
54
+ return _NotificationProvider[key];
55
+ }
56
+ });
57
+ });
58
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/notification/index.ts"],"names":[],"mappings":";;;;;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AACA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA","sourcesContent":["export * from \"./domain\";\nexport * from \"./api\";\nexport * from \"./ServiceIdProvider\";\nexport * from \"./NotificationProvider\";\n"],"file":"index.js"}
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.m2mStorageClient = exports.m2mAuthTokenApi = exports.M2M_AUTH_TOKEN_KEY = void 0;
7
+
8
+ var _client = require("./lib/client");
9
+
10
+ class M2mStorageClient extends _client.StorageClient {}
11
+
12
+ const context = {};
13
+ /**
14
+ * Get the connected storage client.
15
+ * @param timeout
16
+ * @default 5000
17
+ */
18
+
19
+ const getStorage = (timeout = 5000) => {
20
+ return new Promise((resolve, reject) => {
21
+ const rejectTimer = window.setTimeout(function () {
22
+ reject(new Error("Timeout: M2mStorageClient could not connect. Please call m2mStorageClient.init() before using m2mStorageClient."));
23
+ }, timeout);
24
+ const storage = context.storage;
25
+
26
+ if (storage) {
27
+ window.clearTimeout(rejectTimer);
28
+ storage.onConnect().then(() => {
29
+ resolve(storage);
30
+ });
31
+ }
32
+
33
+ const timer = window.setInterval(async () => {
34
+ const storage = context.storage;
35
+
36
+ if (storage) {
37
+ window.clearTimeout(rejectTimer);
38
+ await storage.onConnect();
39
+ window.clearInterval(timer);
40
+ resolve(storage);
41
+ }
42
+ }, 200);
43
+ });
44
+ };
45
+
46
+ const M2M_STORAGE_HUB_URL = "https://hub.m2msystems.cloud/";
47
+ const M2M_STORAGE_HUB_URL_DEV = "https://m2m-components-storage-hub-dev.netlify.app/";
48
+
49
+ const initStorageClient = options => {
50
+ if (context.storage) {
51
+ throw new Error("M2mStorageClient already initialized. Do not call m2mStorageClient.init multiple times.");
52
+ }
53
+
54
+ const storage = new M2mStorageClient(options?.env === "production" ? M2M_STORAGE_HUB_URL : M2M_STORAGE_HUB_URL_DEV);
55
+ context.storage = storage;
56
+ };
57
+
58
+ const m2mStorageClient = {
59
+ init: initStorageClient,
60
+ getStorage: getStorage
61
+ };
62
+ exports.m2mStorageClient = m2mStorageClient;
63
+ const M2M_AUTH_TOKEN_KEY = "M2M_APP_AUTH_TOKEN";
64
+ exports.M2M_AUTH_TOKEN_KEY = M2M_AUTH_TOKEN_KEY;
65
+
66
+ const getAuthTokenCache = () => {
67
+ return window.localStorage.getItem(M2M_AUTH_TOKEN_KEY);
68
+ };
69
+
70
+ const getAuthToken = async () => {
71
+ try {
72
+ const storage = await getStorage();
73
+ const autuToken = await storage.get(M2M_AUTH_TOKEN_KEY);
74
+ return autuToken || getAuthTokenCache();
75
+ } catch (error) {
76
+ console.warn(error);
77
+ return getAuthTokenCache();
78
+ }
79
+ };
80
+
81
+ const setAuthToken = async token => {
82
+ window.localStorage.setItem(M2M_AUTH_TOKEN_KEY, token);
83
+
84
+ try {
85
+ const storage = await getStorage();
86
+ await storage.set(M2M_AUTH_TOKEN_KEY, token);
87
+ } catch (error) {
88
+ console.warn(error);
89
+ }
90
+ };
91
+
92
+ const clearAuthToken = async () => {
93
+ window.localStorage.removeItem(M2M_AUTH_TOKEN_KEY);
94
+
95
+ try {
96
+ const storage = await getStorage();
97
+ await storage.del(M2M_AUTH_TOKEN_KEY);
98
+ } catch (error) {
99
+ console.warn(error);
100
+ }
101
+ };
102
+
103
+ const m2mAuthTokenApi = {
104
+ get: getAuthToken,
105
+ getCache: getAuthTokenCache,
106
+ set: setAuthToken,
107
+ clear: clearAuthToken
108
+ };
109
+ exports.m2mAuthTokenApi = m2mAuthTokenApi;
110
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/storage/client.ts"],"names":["M2mStorageClient","StorageClient","context","getStorage","timeout","Promise","resolve","reject","rejectTimer","window","setTimeout","Error","storage","clearTimeout","onConnect","then","timer","setInterval","clearInterval","M2M_STORAGE_HUB_URL","M2M_STORAGE_HUB_URL_DEV","initStorageClient","options","env","m2mStorageClient","init","M2M_AUTH_TOKEN_KEY","getAuthTokenCache","localStorage","getItem","getAuthToken","autuToken","get","error","console","warn","setAuthToken","token","setItem","set","clearAuthToken","removeItem","del","m2mAuthTokenApi","getCache","clear"],"mappings":"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","sourcesContent":["import { StorageClient } from \"./lib/client\";\n\nclass M2mStorageClient extends StorageClient {}\n\nexport type { M2mStorageClient };\n\nconst context: {\n storage?: M2mStorageClient;\n} = {};\n\n/**\n * Get the connected storage client.\n * @param timeout\n * @default 5000\n */\nconst getStorage = (timeout = 5000) => {\n return new Promise<M2mStorageClient>((resolve, reject) => {\n const rejectTimer = window.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 = context.storage;\n if (storage) {\n window.clearTimeout(rejectTimer);\n storage.onConnect().then(() => {\n resolve(storage);\n });\n }\n\n const timer = window.setInterval(async () => {\n const storage = context.storage;\n if (storage) {\n window.clearTimeout(rejectTimer);\n await storage.onConnect();\n window.clearInterval(timer);\n resolve(storage);\n }\n }, 200);\n });\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 (context.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 context.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 window.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 window.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 window.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"],"file":"client.js"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.m2mStorageHub = void 0;
7
+
8
+ var _hub = require("./lib/hub");
9
+
10
+ /**
11
+ * Init the hub.
12
+ */
13
+ const initM2mStorageHub = permissions => {
14
+ (0, _hub.init)(permissions);
15
+ };
16
+
17
+ const m2mStorageHub = {
18
+ init: initM2mStorageHub
19
+ };
20
+ exports.m2mStorageHub = m2mStorageHub;
21
+ //# sourceMappingURL=hub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/storage/hub.ts"],"names":["initM2mStorageHub","permissions","m2mStorageHub","init"],"mappings":";;;;;;;AAAA;;AAMA;AACA;AACA;AACA,MAAMA,iBAAiB,GAAIC,WAAD,IAAyC;AACjE,iBAAKA,WAAL;AACD,CAFD;;AAIO,MAAMC,aAAa,GAAG;AAC3BC,EAAAA,IAAI,EAAEH;AADqB,CAAtB","sourcesContent":["import { init } from \"./lib/hub\";\nimport type { Permission } from \"./lib/hub\";\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface M2mStoragePermission extends Permission {}\n\n/**\n * Init the hub.\n */\nconst initM2mStorageHub = (permissions: M2mStoragePermission[]) => {\n init(permissions);\n};\n\nexport const m2mStorageHub = {\n init: initM2mStorageHub,\n};\n"],"file":"hub.js"}
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.StorageClient = void 0;
7
+
8
+ /**
9
+ * この実装はcross-storageほぼそのままです。
10
+ */
11
+ const generateUUID = () => {
12
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) {
13
+ const r = Math.random() * 16 | 0,
14
+ v = c == "x" ? r : r & 0x3 | 0x8;
15
+ return v.toString(16);
16
+ });
17
+ };
18
+
19
+ class StorageClient {
20
+ constructor(url, opts) {
21
+ this.id = void 0;
22
+ this.frameId = void 0;
23
+ this.origin = void 0;
24
+ this.requests = void 0;
25
+ this.connected = void 0;
26
+ this.closed = void 0;
27
+ this.count = void 0;
28
+ this.timeout = void 0;
29
+ this.hub = void 0;
30
+ opts = opts || {};
31
+ this.id = generateUUID();
32
+ this.frameId = opts.frameId || "CrossStorageClient-" + this.id;
33
+ this.origin = new URL(url).origin;
34
+ this.requests = {};
35
+ this.connected = false;
36
+ this.closed = false;
37
+ this.count = 0;
38
+ this.timeout = opts.timeout || 5000;
39
+ window.addEventListener("message", this.listener.bind(this), false);
40
+ const frame = this.createFrame(url);
41
+ this.hub = frame.contentWindow;
42
+ }
43
+
44
+ onConnect() {
45
+ if (this.connected) {
46
+ return Promise.resolve();
47
+ } else if (this.closed) {
48
+ return Promise.reject(new Error("StorageClient has closed."));
49
+ }
50
+
51
+ if (!this.requests.connect) {
52
+ this.requests.connect = [];
53
+ }
54
+
55
+ return new Promise((resolve, reject) => {
56
+ const timeout = setTimeout(function () {
57
+ reject(new Error("StorageClient could not connect."));
58
+ }, this.timeout);
59
+ this.requests.connect.push(err => {
60
+ clearTimeout(timeout);
61
+ if (err) return reject(err);
62
+ resolve(undefined);
63
+ });
64
+ });
65
+ }
66
+
67
+ set(key, value) {
68
+ return this.request("set", {
69
+ key: key,
70
+ value: value
71
+ });
72
+ }
73
+
74
+ get(...keys) {
75
+ return this.request("get", {
76
+ keys
77
+ });
78
+ }
79
+
80
+ del(...keys) {
81
+ return this.request("del", {
82
+ keys
83
+ });
84
+ }
85
+
86
+ clear() {
87
+ return this.request("clear");
88
+ }
89
+
90
+ getKeys() {
91
+ this.request("getKeys");
92
+ }
93
+
94
+ close() {
95
+ const frame = document.getElementById(this.frameId);
96
+
97
+ if (frame && frame.parentNode) {
98
+ frame.parentNode.removeChild(frame);
99
+ }
100
+
101
+ window.removeEventListener("message", this.listener, false);
102
+ this.connected = false;
103
+ this.closed = true;
104
+ }
105
+
106
+ listener(message) {
107
+ let i, error, response;
108
+
109
+ if (this.closed || !message.data || typeof message.data !== "string") {
110
+ return;
111
+ }
112
+
113
+ const origin = message.origin;
114
+ if (origin !== this.origin) return;
115
+
116
+ if (message.data === "cross-storage:unavailable") {
117
+ if (!this.closed) this.close();
118
+ if (!this.requests.connect) return;
119
+ error = new Error("Closing StorageClient. Could not access localStorage in StorageHub.");
120
+
121
+ for (i = 0; i < this.requests.connect.length; i++) {
122
+ this.requests.connect[i](error);
123
+ }
124
+
125
+ return;
126
+ }
127
+
128
+ if (message.data.indexOf("cross-storage:") !== -1 && !this.connected) {
129
+ this.connected = true;
130
+ if (!this.requests.connect) return;
131
+
132
+ for (i = 0; i < this.requests.connect.length; i++) {
133
+ this.requests.connect[i](error);
134
+ }
135
+
136
+ delete this.requests.connect;
137
+ }
138
+
139
+ if (message.data === "cross-storage:ready") return;
140
+
141
+ try {
142
+ response = JSON.parse(message.data);
143
+ } catch (e) {
144
+ return;
145
+ }
146
+
147
+ if (!response.id) return;
148
+
149
+ if (this.requests[response.id]) {
150
+ this.requests[response.id](response.error, response.result);
151
+ }
152
+ }
153
+
154
+ createFrame(url) {
155
+ const frame = window.document.createElement("iframe");
156
+ frame.id = this.frameId;
157
+ frame.style.display = "none";
158
+ frame.style.position = "absolute";
159
+ frame.style.top = "-999px";
160
+ frame.style.left = "-999px";
161
+ window.document.body.appendChild(frame);
162
+ frame.src = url;
163
+ return frame;
164
+ } // eslint-disable-next-line @typescript-eslint/ban-types
165
+
166
+
167
+ request(method, params) {
168
+ if (this.closed) {
169
+ return Promise.reject(new Error("StorageClient has closed."));
170
+ }
171
+
172
+ this.count++;
173
+ const req = {
174
+ id: this.id + ":" + this.count,
175
+ method: "cross-storage:" + method,
176
+ params: params
177
+ };
178
+ return new Promise((resolve, reject) => {
179
+ const timeout = window.setTimeout(() => {
180
+ if (!this.requests[req.id]) return;
181
+ delete this.requests[req.id];
182
+ reject(new Error("Timeout: StorageClient could not perform " + req.method));
183
+ }, this.timeout);
184
+
185
+ this.requests[req.id] = (err, result) => {
186
+ clearTimeout(timeout);
187
+ delete this.requests[req.id];
188
+ if (err) return reject(new Error(err));
189
+ resolve(result);
190
+ };
191
+
192
+ if (this.hub) {
193
+ this.hub.postMessage(JSON.stringify(req), this.origin);
194
+ } else {
195
+ reject(new Error("Not found StorageHub."));
196
+ }
197
+ });
198
+ }
199
+
200
+ }
201
+
202
+ exports.StorageClient = StorageClient;
203
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/storage/lib/client.ts"],"names":["generateUUID","replace","c","r","Math","random","v","toString","StorageClient","constructor","url","opts","id","frameId","origin","requests","connected","closed","count","timeout","hub","URL","window","addEventListener","listener","bind","frame","createFrame","contentWindow","onConnect","Promise","resolve","reject","Error","connect","setTimeout","push","err","clearTimeout","undefined","set","key","value","request","get","keys","del","clear","getKeys","close","document","getElementById","parentNode","removeChild","removeEventListener","message","i","error","response","data","length","indexOf","JSON","parse","e","result","createElement","style","display","position","top","left","body","appendChild","src","method","params","req","postMessage","stringify"],"mappings":"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","sourcesContent":["/**\n * この実装はcross-storageほぼそのままです。\n */\nconst generateUUID = () => {\n return \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g, function (c) {\n const r = (Math.random() * 16) | 0,\n v = c == \"x\" ? r : (r & 0x3) | 0x8;\n\n return v.toString(16);\n });\n};\nexport class StorageClient {\n id: string;\n frameId: string;\n origin: string;\n requests: {\n [key: string]: any;\n };\n connected: boolean;\n closed: boolean;\n count: number;\n timeout: number;\n hub: null | Window;\n\n constructor(url: string, opts?: { frameId?: string; timeout?: number }) {\n opts = opts || {};\n\n this.id = generateUUID();\n this.frameId = opts.frameId || \"CrossStorageClient-\" + this.id;\n this.origin = new URL(url).origin;\n this.requests = {};\n this.connected = false;\n this.closed = false;\n this.count = 0;\n this.timeout = opts.timeout || 5000;\n\n window.addEventListener(\"message\", this.listener.bind(this), false);\n\n const frame = this.createFrame(url);\n this.hub = frame.contentWindow;\n }\n\n onConnect() {\n if (this.connected) {\n return Promise.resolve();\n } else if (this.closed) {\n return Promise.reject(new Error(\"StorageClient has closed.\"));\n }\n\n if (!this.requests.connect) {\n this.requests.connect = [];\n }\n\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(function () {\n reject(new Error(\"StorageClient could not connect.\"));\n }, this.timeout);\n\n this.requests.connect.push((err: string) => {\n clearTimeout(timeout);\n if (err) return reject(err);\n\n resolve(undefined);\n });\n });\n }\n\n set(key: string, value: string) {\n return this.request(\"set\", {\n key: key,\n value: value,\n });\n }\n\n get(...keys: string[]) {\n return this.request(\"get\", { keys });\n }\n\n del(...keys: string[]) {\n return this.request(\"del\", { keys });\n }\n\n clear() {\n return this.request(\"clear\");\n }\n\n getKeys() {\n this.request(\"getKeys\");\n }\n\n close() {\n const frame = document.getElementById(this.frameId);\n if (frame && frame.parentNode) {\n frame.parentNode.removeChild(frame);\n }\n\n window.removeEventListener(\"message\", this.listener, false);\n\n this.connected = false;\n this.closed = true;\n }\n\n private listener(message: MessageEvent) {\n let i, error, response;\n\n if (this.closed || !message.data || typeof message.data !== \"string\") {\n return;\n }\n\n const origin = message.origin;\n\n if (origin !== this.origin) return;\n\n if (message.data === \"cross-storage:unavailable\") {\n if (!this.closed) this.close();\n if (!this.requests.connect) return;\n\n error = new Error(\n \"Closing StorageClient. Could not access localStorage in StorageHub.\"\n );\n for (i = 0; i < this.requests.connect.length; i++) {\n this.requests.connect[i](error);\n }\n\n return;\n }\n\n if (message.data.indexOf(\"cross-storage:\") !== -1 && !this.connected) {\n this.connected = true;\n if (!this.requests.connect) return;\n\n for (i = 0; i < this.requests.connect.length; i++) {\n this.requests.connect[i](error);\n }\n delete this.requests.connect;\n }\n\n if (message.data === \"cross-storage:ready\") return;\n\n try {\n response = JSON.parse(message.data);\n } catch (e) {\n return;\n }\n\n if (!response.id) return;\n\n if (this.requests[response.id]) {\n this.requests[response.id](response.error, response.result);\n }\n }\n\n private createFrame(url: string) {\n const frame = window.document.createElement(\"iframe\");\n frame.id = this.frameId;\n\n frame.style.display = \"none\";\n frame.style.position = \"absolute\";\n frame.style.top = \"-999px\";\n frame.style.left = \"-999px\";\n\n window.document.body.appendChild(frame);\n frame.src = url;\n\n return frame;\n }\n\n // eslint-disable-next-line @typescript-eslint/ban-types\n private request(method: string, params?: {}) {\n if (this.closed) {\n return Promise.reject(new Error(\"StorageClient has closed.\"));\n }\n\n this.count++;\n\n const req = {\n id: this.id + \":\" + this.count,\n method: \"cross-storage:\" + method,\n params: params,\n };\n\n return new Promise((resolve, reject) => {\n const timeout = window.setTimeout(() => {\n if (!this.requests[req.id]) return;\n\n delete this.requests[req.id];\n reject(\n new Error(\"Timeout: StorageClient could not perform \" + req.method)\n );\n }, this.timeout);\n\n this.requests[req.id] = (err: string, result: string) => {\n clearTimeout(timeout);\n delete this.requests[req.id];\n if (err) return reject(new Error(err));\n resolve(result);\n };\n\n if (this.hub) {\n this.hub.postMessage(JSON.stringify(req), this.origin);\n } else {\n reject(new Error(\"Not found StorageHub.\"));\n }\n });\n }\n}\n"],"file":"client.js"}
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.init = void 0;
7
+
8
+ /**
9
+ * この実装はcross-storageほぼそのままです。
10
+ */
11
+ const context = {};
12
+ /**
13
+ * Do not use this directly. This specifications are subject to significant change.
14
+ * @internal
15
+ */
16
+
17
+ const init = permissions => {
18
+ context.permissions = permissions;
19
+ window.addEventListener("message", listener, false);
20
+ window.parent.postMessage("cross-storage:ready", "*");
21
+ };
22
+
23
+ exports.init = init;
24
+
25
+ const permitted = (origin, method) => {
26
+ const available = ["get", "set", "del", "clear", "getKeys"];
27
+
28
+ if (!available.includes(method)) {
29
+ return false;
30
+ }
31
+
32
+ if (context.permissions === undefined) {
33
+ return false;
34
+ }
35
+
36
+ for (let i = 0; i < context.permissions.length; i++) {
37
+ const entry = context.permissions[i];
38
+ const match = entry.origin.test(origin);
39
+
40
+ if (match && entry.allow.includes(method)) {
41
+ return true;
42
+ }
43
+ }
44
+
45
+ return false;
46
+ };
47
+
48
+ const methods = {
49
+ get: params => {
50
+ const storage = window.localStorage;
51
+ const result = [];
52
+
53
+ for (let i = 0; i < params.keys.length; i++) {
54
+ const value = storage.getItem(params.keys[i]) || null;
55
+ result.push(value);
56
+ } // Todo: このパターン好きじゃない
57
+
58
+
59
+ return result.length > 1 ? result : result[0];
60
+ },
61
+ set: params => {
62
+ window.localStorage.setItem(params.key, params.value);
63
+ },
64
+ del: params => {
65
+ // eslint-disable-next-line no-var
66
+ for (var i = 0; i < params.keys.length; i++) {
67
+ window.localStorage.removeItem(params.keys[i]);
68
+ }
69
+ },
70
+ getKeys: () => {
71
+ const keys = [];
72
+ const length = window.localStorage.length;
73
+
74
+ for (let i = 0; i < length; i++) {
75
+ keys.push(window.localStorage.key(i));
76
+ }
77
+
78
+ return keys;
79
+ },
80
+ clear: () => {
81
+ window.localStorage.clear();
82
+ }
83
+ };
84
+
85
+ const listener = message => {
86
+ // postMessage returns the string "null" as the origin for "file://"
87
+ const origin = message.origin === "null" ? "file://" : message.origin; // Handle polling for a ready message
88
+
89
+ if (message.data === "cross-storage:poll") {
90
+ return window.parent.postMessage("cross-storage:ready", message.origin);
91
+ } // Ignore the ready message when viewing the hub directly
92
+
93
+
94
+ if (message.data === "cross-storage:ready") return;
95
+ const request = JSON.parse(message.data); // Check whether request.method is a string
96
+
97
+ if (!request || typeof request.method !== "string") {
98
+ return;
99
+ }
100
+
101
+ const method = request.method.split("cross-storage:")[1];
102
+ let error = "";
103
+ let result = undefined;
104
+
105
+ if (!method) {
106
+ return;
107
+ } else if (!permitted(origin, method)) {
108
+ error = "Invalid permissions for " + method;
109
+ } else {
110
+ try {
111
+ result = methods[method](request.params);
112
+ } catch (err) {
113
+ error = err.message;
114
+ }
115
+ }
116
+
117
+ const response = JSON.stringify({
118
+ id: request.id,
119
+ error: error,
120
+ result: result
121
+ }); // postMessage requires that the target origin be set to "*" for "file://"
122
+
123
+ const targetOrigin = origin === "file://" ? "*" : origin;
124
+ window.parent.postMessage(response, targetOrigin);
125
+ };
126
+ //# sourceMappingURL=hub.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/storage/lib/hub.ts"],"names":["context","init","permissions","window","addEventListener","listener","parent","postMessage","permitted","origin","method","available","includes","undefined","i","length","entry","match","test","allow","methods","get","params","storage","localStorage","result","keys","value","getItem","push","set","setItem","key","del","removeItem","getKeys","clear","message","data","request","JSON","parse","split","error","err","response","stringify","id","targetOrigin"],"mappings":"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","sourcesContent":["/**\n * この実装はcross-storageほぼそのままです。\n */\ntype Method = \"get\" | \"set\" | \"del\" | \"getKeys\" | \"clear\";\n\nexport interface Permission {\n origin: RegExp;\n allow: Method[];\n}\n\nconst context: {\n permissions?: Permission[];\n} = {};\n\n/**\n * Do not use this directly. This specifications are subject to significant change.\n * @internal\n */\nexport const init = (permissions: Permission[]) => {\n context.permissions = permissions;\n window.addEventListener(\"message\", listener, false);\n window.parent.postMessage(\"cross-storage:ready\", \"*\");\n};\n\nconst permitted = (origin: string, method: Method) => {\n const available = [\"get\", \"set\", \"del\", \"clear\", \"getKeys\"];\n if (!available.includes(method)) {\n return false;\n }\n\n if (context.permissions === undefined) {\n return false;\n }\n\n for (let i = 0; i < context.permissions.length; i++) {\n const entry = context.permissions[i];\n const match = entry.origin.test(origin);\n if (match && entry.allow.includes(method)) {\n return true;\n }\n }\n return false;\n};\n\nconst methods: {\n // eslint-disable-next-line @typescript-eslint/ban-types\n [key in Method]: Function;\n} = {\n get: (params: { keys: string[] }) => {\n const storage = window.localStorage;\n const result = [];\n for (let i = 0; i < params.keys.length; i++) {\n const value = storage.getItem(params.keys[i]) || null;\n result.push(value);\n }\n // Todo: このパターン好きじゃない\n return result.length > 1 ? result : result[0];\n },\n set: (params: { key: string; value: string }) => {\n window.localStorage.setItem(params.key, params.value);\n },\n del: (params: { keys: string[] }) => {\n // eslint-disable-next-line no-var\n for (var i = 0; i < params.keys.length; i++) {\n window.localStorage.removeItem(params.keys[i]);\n }\n },\n getKeys: () => {\n const keys = [];\n const length = window.localStorage.length;\n\n for (let i = 0; i < length; i++) {\n keys.push(window.localStorage.key(i));\n }\n\n return keys;\n },\n clear: () => {\n window.localStorage.clear();\n },\n};\n\ninterface Message {\n origin: string;\n data: string;\n}\n\nconst listener = (message: Message) => {\n // postMessage returns the string \"null\" as the origin for \"file://\"\n const origin = message.origin === \"null\" ? \"file://\" : message.origin;\n\n // Handle polling for a ready message\n if (message.data === \"cross-storage:poll\") {\n return window.parent.postMessage(\"cross-storage:ready\", message.origin);\n }\n\n // Ignore the ready message when viewing the hub directly\n if (message.data === \"cross-storage:ready\") return;\n\n const request: {\n id: string;\n method?: string;\n // eslint-disable-next-line @typescript-eslint/ban-types\n params: Object;\n } = JSON.parse(message.data);\n\n // Check whether request.method is a string\n if (!request || typeof request.method !== \"string\") {\n return;\n }\n\n const method = request.method.split(\"cross-storage:\")[1] as Method;\n\n let error = \"\";\n let result: string | undefined = undefined;\n\n if (!method) {\n return;\n } else if (!permitted(origin, method)) {\n error = \"Invalid permissions for \" + method;\n } else {\n try {\n result = methods[method](request.params);\n } catch (err) {\n error = (err as unknown as Error).message;\n }\n }\n\n const response = JSON.stringify({\n id: request.id,\n error: error,\n result: result,\n });\n\n // postMessage requires that the target origin be set to \"*\" for \"file://\"\n const targetOrigin = origin === \"file://\" ? \"*\" : origin;\n\n window.parent.postMessage(response, targetOrigin);\n};\n"],"file":"hub.js"}