m2m-components 0.0.0 → 0.1.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.
- package/LitMenuBaseElement.d.ts +11 -0
- package/LitMenuBaseElement.js +213 -0
- package/LitMenuBaseElement.js.map +1 -0
- package/domains.d.ts +7 -0
- package/domains.js +12 -0
- package/domains.js.map +1 -0
- package/endpoints/m2m-notifications.d.ts +5 -0
- package/endpoints/m2m-notifications.d.ts.map +1 -0
- package/endpoints/m2m-notifications.js +6 -0
- package/endpoints/m2m-notifications.js.map +1 -0
- package/endpoints/m2m-notifications.v1.d.ts +51 -0
- package/endpoints/m2m-notifications.v1.d.ts.map +1 -0
- package/endpoints/m2m-notifications.v1.js +141 -0
- package/endpoints/m2m-notifications.v1.js.map +1 -0
- package/index.d.ts +7 -0
- package/index.js +7 -0
- package/index.js.map +1 -0
- package/m2m-apps-menu.d.ts +10 -0
- package/m2m-apps-menu.js +91 -0
- package/m2m-apps-menu.js.map +1 -0
- package/m2m-user-menu.d.ts +11 -0
- package/m2m-user-menu.js +97 -0
- package/m2m-user-menu.js.map +1 -0
- package/notification/NotificationProvider.d.ts +15 -0
- package/notification/NotificationProvider.d.ts.map +1 -0
- package/notification/ServiceIdProvider.d.ts +7 -0
- package/notification/ServiceIdProvider.d.ts.map +1 -0
- package/notification/api.d.ts +5 -0
- package/notification/api.d.ts.map +1 -0
- package/notification/api.js +46 -0
- package/notification/api.js.map +1 -0
- package/notification/domain.d.ts +23 -0
- package/notification/domain.d.ts.map +1 -0
- package/notification/domain.js +2 -0
- package/notification/domain.js.map +1 -0
- package/notification/index.d.ts +5 -0
- package/notification/index.d.ts.map +1 -0
- package/notification/index.js +5 -0
- package/notification/index.js.map +1 -0
- package/package.json +1 -1
- package/storage/client.d.ts +18 -0
- package/storage/client.d.ts.map +1 -0
- package/storage/client.js +85 -0
- package/storage/client.js.map +1 -0
- package/storage/hub.d.ts +7 -0
- package/storage/hub.d.ts.map +1 -0
- package/storage/hub.js +13 -0
- package/storage/hub.js.map +1 -0
- package/storage/lib/client.d.ts +28 -0
- package/storage/lib/client.d.ts.map +1 -0
- package/storage/lib/client.js +194 -0
- package/storage/lib/client.js.map +1 -0
- package/storage/lib/hub.d.ts +15 -0
- package/storage/lib/hub.d.ts.map +1 -0
- package/storage/lib/hub.js +117 -0
- package/storage/lib/hub.js.map +1 -0
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* この実装はcross-storageほぼそのままです。
|
|
3
|
+
*/
|
|
4
|
+
const generateUUID = () => {
|
|
5
|
+
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, function (c) {
|
|
6
|
+
const r = Math.random() * 16 | 0,
|
|
7
|
+
v = c == "x" ? r : r & 0x3 | 0x8;
|
|
8
|
+
return v.toString(16);
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export class StorageClient {
|
|
13
|
+
constructor(url, opts) {
|
|
14
|
+
this.id = void 0;
|
|
15
|
+
this.frameId = void 0;
|
|
16
|
+
this.origin = void 0;
|
|
17
|
+
this.requests = void 0;
|
|
18
|
+
this.connected = void 0;
|
|
19
|
+
this.closed = void 0;
|
|
20
|
+
this.count = void 0;
|
|
21
|
+
this.timeout = void 0;
|
|
22
|
+
this.hub = void 0;
|
|
23
|
+
opts = opts || {};
|
|
24
|
+
this.id = generateUUID();
|
|
25
|
+
this.frameId = opts.frameId || "CrossStorageClient-" + this.id;
|
|
26
|
+
this.origin = new URL(url).origin;
|
|
27
|
+
this.requests = {};
|
|
28
|
+
this.connected = false;
|
|
29
|
+
this.closed = false;
|
|
30
|
+
this.count = 0;
|
|
31
|
+
this.timeout = opts.timeout || 5000;
|
|
32
|
+
window.addEventListener("message", this.listener.bind(this), false);
|
|
33
|
+
const frame = this.createFrame(url);
|
|
34
|
+
this.hub = frame.contentWindow;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
onConnect() {
|
|
38
|
+
if (this.connected) {
|
|
39
|
+
return Promise.resolve();
|
|
40
|
+
} else if (this.closed) {
|
|
41
|
+
return Promise.reject(new Error("StorageClient has closed."));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
if (!this.requests.connect) {
|
|
45
|
+
this.requests.connect = [];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
return new Promise((resolve, reject) => {
|
|
49
|
+
const timeout = setTimeout(function () {
|
|
50
|
+
reject(new Error("StorageClient could not connect."));
|
|
51
|
+
}, this.timeout);
|
|
52
|
+
this.requests.connect.push(err => {
|
|
53
|
+
clearTimeout(timeout);
|
|
54
|
+
if (err) return reject(err);
|
|
55
|
+
resolve(undefined);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
set(key, value) {
|
|
61
|
+
return this.request("set", {
|
|
62
|
+
key: key,
|
|
63
|
+
value: value
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
get(...keys) {
|
|
68
|
+
return this.request("get", {
|
|
69
|
+
keys
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
del(...keys) {
|
|
74
|
+
return this.request("del", {
|
|
75
|
+
keys
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
clear() {
|
|
80
|
+
return this.request("clear");
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
getKeys() {
|
|
84
|
+
this.request("getKeys");
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
close() {
|
|
88
|
+
const frame = document.getElementById(this.frameId);
|
|
89
|
+
|
|
90
|
+
if (frame && frame.parentNode) {
|
|
91
|
+
frame.parentNode.removeChild(frame);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
window.removeEventListener("message", this.listener, false);
|
|
95
|
+
this.connected = false;
|
|
96
|
+
this.closed = true;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
listener(message) {
|
|
100
|
+
let i, error, response;
|
|
101
|
+
|
|
102
|
+
if (this.closed || !message.data || typeof message.data !== "string") {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
const origin = message.origin;
|
|
107
|
+
if (origin !== this.origin) return;
|
|
108
|
+
|
|
109
|
+
if (message.data === "cross-storage:unavailable") {
|
|
110
|
+
if (!this.closed) this.close();
|
|
111
|
+
if (!this.requests.connect) return;
|
|
112
|
+
error = new Error("Closing StorageClient. Could not access localStorage in StorageHub.");
|
|
113
|
+
|
|
114
|
+
for (i = 0; i < this.requests.connect.length; i++) {
|
|
115
|
+
this.requests.connect[i](error);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
if (message.data.indexOf("cross-storage:") !== -1 && !this.connected) {
|
|
122
|
+
this.connected = true;
|
|
123
|
+
if (!this.requests.connect) return;
|
|
124
|
+
|
|
125
|
+
for (i = 0; i < this.requests.connect.length; i++) {
|
|
126
|
+
this.requests.connect[i](error);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
delete this.requests.connect;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (message.data === "cross-storage:ready") return;
|
|
133
|
+
|
|
134
|
+
try {
|
|
135
|
+
response = JSON.parse(message.data);
|
|
136
|
+
} catch (e) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (!response.id) return;
|
|
141
|
+
|
|
142
|
+
if (this.requests[response.id]) {
|
|
143
|
+
this.requests[response.id](response.error, response.result);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
createFrame(url) {
|
|
148
|
+
const frame = window.document.createElement("iframe");
|
|
149
|
+
frame.id = this.frameId;
|
|
150
|
+
frame.style.display = "none";
|
|
151
|
+
frame.style.position = "absolute";
|
|
152
|
+
frame.style.top = "-999px";
|
|
153
|
+
frame.style.left = "-999px";
|
|
154
|
+
window.document.body.appendChild(frame);
|
|
155
|
+
frame.src = url;
|
|
156
|
+
return frame;
|
|
157
|
+
} // eslint-disable-next-line @typescript-eslint/ban-types
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
request(method, params) {
|
|
161
|
+
if (this.closed) {
|
|
162
|
+
return Promise.reject(new Error("StorageClient has closed."));
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
this.count++;
|
|
166
|
+
const req = {
|
|
167
|
+
id: this.id + ":" + this.count,
|
|
168
|
+
method: "cross-storage:" + method,
|
|
169
|
+
params: params
|
|
170
|
+
};
|
|
171
|
+
return new Promise((resolve, reject) => {
|
|
172
|
+
const timeout = window.setTimeout(() => {
|
|
173
|
+
if (!this.requests[req.id]) return;
|
|
174
|
+
delete this.requests[req.id];
|
|
175
|
+
reject(new Error("Timeout: StorageClient could not perform " + req.method));
|
|
176
|
+
}, this.timeout);
|
|
177
|
+
|
|
178
|
+
this.requests[req.id] = (err, result) => {
|
|
179
|
+
clearTimeout(timeout);
|
|
180
|
+
delete this.requests[req.id];
|
|
181
|
+
if (err) return reject(new Error(err));
|
|
182
|
+
resolve(result);
|
|
183
|
+
};
|
|
184
|
+
|
|
185
|
+
if (this.hub) {
|
|
186
|
+
this.hub.postMessage(JSON.stringify(req), this.origin);
|
|
187
|
+
} else {
|
|
188
|
+
reject(new Error("Not found StorageHub."));
|
|
189
|
+
}
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
}
|
|
194
|
+
//# 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,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* この実装はcross-storageほぼそのままです。
|
|
3
|
+
*/
|
|
4
|
+
declare type Method = "get" | "set" | "del" | "getKeys" | "clear";
|
|
5
|
+
export interface Permission {
|
|
6
|
+
origin: RegExp;
|
|
7
|
+
allow: Method[];
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Do not use this directly. This specifications are subject to significant change.
|
|
11
|
+
* @internal
|
|
12
|
+
*/
|
|
13
|
+
export declare const init: (permissions: Permission[]) => void;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=hub.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub.d.ts","sourceRoot":"","sources":["../../src/storage/lib/hub.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,aAAK,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC;AAE1D,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAMD;;;GAGG;AACH,eAAO,MAAM,IAAI,gBAAiB,UAAU,EAAE,SAI7C,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* この実装はcross-storageほぼそのままです。
|
|
3
|
+
*/
|
|
4
|
+
const context = {};
|
|
5
|
+
/**
|
|
6
|
+
* Do not use this directly. This specifications are subject to significant change.
|
|
7
|
+
* @internal
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export const init = permissions => {
|
|
11
|
+
context.permissions = permissions;
|
|
12
|
+
window.addEventListener("message", listener, false);
|
|
13
|
+
window.parent.postMessage("cross-storage:ready", "*");
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
const permitted = (origin, method) => {
|
|
17
|
+
const available = ["get", "set", "del", "clear", "getKeys"];
|
|
18
|
+
|
|
19
|
+
if (!available.includes(method)) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if (context.permissions === undefined) {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
for (let i = 0; i < context.permissions.length; i++) {
|
|
28
|
+
const entry = context.permissions[i];
|
|
29
|
+
const match = entry.origin.test(origin);
|
|
30
|
+
|
|
31
|
+
if (match && entry.allow.includes(method)) {
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return false;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const methods = {
|
|
40
|
+
get: params => {
|
|
41
|
+
const storage = window.localStorage;
|
|
42
|
+
const result = [];
|
|
43
|
+
|
|
44
|
+
for (let i = 0; i < params.keys.length; i++) {
|
|
45
|
+
const value = storage.getItem(params.keys[i]) || null;
|
|
46
|
+
result.push(value);
|
|
47
|
+
} // Todo: このパターン好きじゃない
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
return result.length > 1 ? result : result[0];
|
|
51
|
+
},
|
|
52
|
+
set: params => {
|
|
53
|
+
window.localStorage.setItem(params.key, params.value);
|
|
54
|
+
},
|
|
55
|
+
del: params => {
|
|
56
|
+
// eslint-disable-next-line no-var
|
|
57
|
+
for (var i = 0; i < params.keys.length; i++) {
|
|
58
|
+
window.localStorage.removeItem(params.keys[i]);
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
getKeys: () => {
|
|
62
|
+
const keys = [];
|
|
63
|
+
const length = window.localStorage.length;
|
|
64
|
+
|
|
65
|
+
for (let i = 0; i < length; i++) {
|
|
66
|
+
keys.push(window.localStorage.key(i));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
return keys;
|
|
70
|
+
},
|
|
71
|
+
clear: () => {
|
|
72
|
+
window.localStorage.clear();
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
const listener = message => {
|
|
77
|
+
// postMessage returns the string "null" as the origin for "file://"
|
|
78
|
+
const origin = message.origin === "null" ? "file://" : message.origin; // Handle polling for a ready message
|
|
79
|
+
|
|
80
|
+
if (message.data === "cross-storage:poll") {
|
|
81
|
+
return window.parent.postMessage("cross-storage:ready", message.origin);
|
|
82
|
+
} // Ignore the ready message when viewing the hub directly
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
if (message.data === "cross-storage:ready") return;
|
|
86
|
+
const request = JSON.parse(message.data); // Check whether request.method is a string
|
|
87
|
+
|
|
88
|
+
if (!request || typeof request.method !== "string") {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const method = request.method.split("cross-storage:")[1];
|
|
93
|
+
let error = "";
|
|
94
|
+
let result = undefined;
|
|
95
|
+
|
|
96
|
+
if (!method) {
|
|
97
|
+
return;
|
|
98
|
+
} else if (!permitted(origin, method)) {
|
|
99
|
+
error = "Invalid permissions for " + method;
|
|
100
|
+
} else {
|
|
101
|
+
try {
|
|
102
|
+
result = methods[method](request.params);
|
|
103
|
+
} catch (err) {
|
|
104
|
+
error = err.message;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
const response = JSON.stringify({
|
|
109
|
+
id: request.id,
|
|
110
|
+
error: error,
|
|
111
|
+
result: result
|
|
112
|
+
}); // postMessage requires that the target origin be set to "*" for "file://"
|
|
113
|
+
|
|
114
|
+
const targetOrigin = origin === "file://" ? "*" : origin;
|
|
115
|
+
window.parent.postMessage(response, targetOrigin);
|
|
116
|
+
};
|
|
117
|
+
//# 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"}
|