m2m-components 0.0.0 → 0.1.2
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/jsx.d.ts +10 -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/NotificationProvider.js +79 -0
- package/notification/NotificationProvider.js.map +1 -0
- package/notification/ServiceIdProvider.d.ts +7 -0
- package/notification/ServiceIdProvider.d.ts.map +1 -0
- package/notification/ServiceIdProvider.js +23 -0
- package/notification/ServiceIdProvider.js.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 +4 -3
- 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,85 @@
|
|
|
1
|
+
import { StorageClient } from "./lib/client";
|
|
2
|
+
|
|
3
|
+
class M2mStorageClient extends StorageClient {}
|
|
4
|
+
|
|
5
|
+
const context = {};
|
|
6
|
+
/**
|
|
7
|
+
* Get the connected storage client.
|
|
8
|
+
* @param timeout
|
|
9
|
+
* @default 5000
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
const getStorage = (timeout = 5000) => {
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
const rejectTimer = window.setTimeout(function () {
|
|
15
|
+
reject(new Error("Timeout: M2mStorageClient could not connect. Please call m2mStorageClient.init() before using m2mStorageClient."));
|
|
16
|
+
}, timeout);
|
|
17
|
+
const storage = context.storage;
|
|
18
|
+
|
|
19
|
+
if (storage) {
|
|
20
|
+
window.clearTimeout(rejectTimer);
|
|
21
|
+
storage.onConnect().then(() => {
|
|
22
|
+
resolve(storage);
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const timer = window.setInterval(async () => {
|
|
27
|
+
const storage = context.storage;
|
|
28
|
+
|
|
29
|
+
if (storage) {
|
|
30
|
+
window.clearTimeout(rejectTimer);
|
|
31
|
+
await storage.onConnect();
|
|
32
|
+
window.clearInterval(timer);
|
|
33
|
+
resolve(storage);
|
|
34
|
+
}
|
|
35
|
+
}, 200);
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const M2M_STORAGE_HUB_URL = "https://hub.m2msystems.cloud/";
|
|
40
|
+
const M2M_STORAGE_HUB_URL_DEV = "https://m2m-components-storage-hub-dev.netlify.app/";
|
|
41
|
+
|
|
42
|
+
const initStorageClient = options => {
|
|
43
|
+
if (context.storage) {
|
|
44
|
+
throw new Error("M2mStorageClient already initialized. Do not call m2mStorageClient.init multiple times.");
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const storage = new M2mStorageClient(options?.env === "production" ? M2M_STORAGE_HUB_URL : M2M_STORAGE_HUB_URL_DEV);
|
|
48
|
+
context.storage = storage;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export const m2mStorageClient = {
|
|
52
|
+
init: initStorageClient,
|
|
53
|
+
getStorage: getStorage
|
|
54
|
+
};
|
|
55
|
+
export const M2M_AUTH_TOKEN_KEY = "M2M_APP_AUTH_TOKEN";
|
|
56
|
+
|
|
57
|
+
const getAuthTokenCache = () => {
|
|
58
|
+
return window.localStorage.getItem(M2M_AUTH_TOKEN_KEY);
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const getAuthToken = async () => {
|
|
62
|
+
const storage = await getStorage();
|
|
63
|
+
const autuToken = await storage.get(M2M_AUTH_TOKEN_KEY);
|
|
64
|
+
return autuToken || getAuthTokenCache();
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
const setAuthToken = async token => {
|
|
68
|
+
const storage = await getStorage();
|
|
69
|
+
window.localStorage.setItem(M2M_AUTH_TOKEN_KEY, token);
|
|
70
|
+
await storage.set(M2M_AUTH_TOKEN_KEY, token);
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
const clearAuthToken = async () => {
|
|
74
|
+
const storage = await getStorage();
|
|
75
|
+
window.localStorage.removeItem(M2M_AUTH_TOKEN_KEY);
|
|
76
|
+
await storage.del(M2M_AUTH_TOKEN_KEY);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export const m2mAuthTokenApi = {
|
|
80
|
+
get: getAuthToken,
|
|
81
|
+
getCache: getAuthTokenCache,
|
|
82
|
+
set: setAuthToken,
|
|
83
|
+
clear: clearAuthToken
|
|
84
|
+
};
|
|
85
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/storage/client.ts"],"names":["StorageClient","M2mStorageClient","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","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 const storage = await getStorage();\n const autuToken = (await storage.get(M2M_AUTH_TOKEN_KEY)) as string;\n return autuToken || getAuthTokenCache();\n};\n\nconst setAuthToken = async (token: string) => {\n const storage = await getStorage();\n window.localStorage.setItem(M2M_AUTH_TOKEN_KEY, token);\n await storage.set(M2M_AUTH_TOKEN_KEY, token);\n};\n\nconst clearAuthToken = async () => {\n const storage = await getStorage();\n window.localStorage.removeItem(M2M_AUTH_TOKEN_KEY);\n await storage.del(M2M_AUTH_TOKEN_KEY);\n};\n\nexport const m2mAuthTokenApi = {\n get: getAuthToken,\n getCache: getAuthTokenCache,\n set: setAuthToken,\n clear: clearAuthToken,\n};\n"],"file":"client.js"}
|
package/storage/hub.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hub.d.ts","sourceRoot":"","sources":["../src/storage/hub.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAG5C,MAAM,WAAW,oBAAqB,SAAQ,UAAU;CAAG;AAS3D,eAAO,MAAM,aAAa;wBAJc,oBAAoB,EAAE;CAM7D,CAAC"}
|
package/storage/hub.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/storage/hub.ts"],"names":["init","initM2mStorageHub","permissions","m2mStorageHub"],"mappings":"AAAA,SAASA,IAAT,QAAqB,WAArB;;AAMA;AACA;AACA;AACA,MAAMC,iBAAiB,GAAIC,WAAD,IAAyC;AACjEF,EAAAA,IAAI,CAACE,WAAD,CAAJ;AACD,CAFD;;AAIA,OAAO,MAAMC,aAAa,GAAG;AAC3BH,EAAAA,IAAI,EAAEC;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,28 @@
|
|
|
1
|
+
export declare class StorageClient {
|
|
2
|
+
id: string;
|
|
3
|
+
frameId: string;
|
|
4
|
+
origin: string;
|
|
5
|
+
requests: {
|
|
6
|
+
[key: string]: any;
|
|
7
|
+
};
|
|
8
|
+
connected: boolean;
|
|
9
|
+
closed: boolean;
|
|
10
|
+
count: number;
|
|
11
|
+
timeout: number;
|
|
12
|
+
hub: null | Window;
|
|
13
|
+
constructor(url: string, opts?: {
|
|
14
|
+
frameId?: string;
|
|
15
|
+
timeout?: number;
|
|
16
|
+
});
|
|
17
|
+
onConnect(): Promise<unknown>;
|
|
18
|
+
set(key: string, value: string): Promise<unknown>;
|
|
19
|
+
get(...keys: string[]): Promise<unknown>;
|
|
20
|
+
del(...keys: string[]): Promise<unknown>;
|
|
21
|
+
clear(): Promise<unknown>;
|
|
22
|
+
getKeys(): void;
|
|
23
|
+
close(): void;
|
|
24
|
+
private listener;
|
|
25
|
+
private createFrame;
|
|
26
|
+
private request;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/storage/lib/client.ts"],"names":[],"mappings":"AAWA,qBAAa,aAAa;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE;QACR,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;KACpB,CAAC;IACF,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,IAAI,GAAG,MAAM,CAAC;gBAEP,GAAG,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAkBtE,SAAS;IAyBT,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAO9B,GAAG,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE;IAIrB,GAAG,CAAC,GAAG,IAAI,EAAE,MAAM,EAAE;IAIrB,KAAK;IAIL,OAAO;IAIP,KAAK;IAYL,OAAO,CAAC,QAAQ;IAkDhB,OAAO,CAAC,WAAW;IAgBnB,OAAO,CAAC,OAAO;CAqChB"}
|
|
@@ -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"}
|