@finos/legend-lego 1.2.1 → 1.2.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Copyright (c) 2020-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ export declare function downloadStream(): Promise<void>;
17
+ export declare function registerDownloadHelperServiceWorker(): void;
18
+ //# sourceMappingURL=MockedDownloadHelper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockedDownloadHelper.d.ts","sourceRoot":"","sources":["../../../src/download-helper/__test-utils__/MockedDownloadHelper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAAG;AACxD,wBAAgB,mCAAmC,IAAI,IAAI,CAAG"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Copyright (c) 2020-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ export async function downloadStream() { }
17
+ export function registerDownloadHelperServiceWorker() { }
18
+ //# sourceMappingURL=MockedDownloadHelper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MockedDownloadHelper.js","sourceRoot":"","sources":["../../../src/download-helper/__test-utils__/MockedDownloadHelper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,CAAC,KAAK,UAAU,cAAc,KAAmB,CAAC;AACxD,MAAM,UAAU,mCAAmC,KAAU,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Copyright (c) 2020-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ export declare function downloadStream(responseBody: ReadableStream, filename: string): Promise<void>;
17
+ export declare function registerDownloadHelperServiceWorker(): void;
18
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/download-helper/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAqGH,wBAAsB,cAAc,CAClC,YAAY,EAAE,cAAc,EAC5B,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,wBAAgB,mCAAmC,IAAI,IAAI,CAe1D"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Copyright (c) 2020-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ var DOWNLOAD_EVENTS;
17
+ (function (DOWNLOAD_EVENTS) {
18
+ DOWNLOAD_EVENTS["TAG_REQUEST"] = "download-request";
19
+ DOWNLOAD_EVENTS["TAG_RESPONSE"] = "download-response";
20
+ DOWNLOAD_EVENTS["STREAM_CLOSED"] = "#stream-closed";
21
+ DOWNLOAD_EVENTS["STREAM_ABORTED"] = "#stream-aborted";
22
+ })(DOWNLOAD_EVENTS || (DOWNLOAD_EVENTS = {}));
23
+ function createWritableStreamFromMessageChannel(channel) {
24
+ return new WritableStream({
25
+ write(chunk) {
26
+ channel.port1.postMessage(chunk);
27
+ },
28
+ close() {
29
+ channel.port1.postMessage(DOWNLOAD_EVENTS.STREAM_CLOSED);
30
+ },
31
+ abort() {
32
+ channel.port1.postMessage(DOWNLOAD_EVENTS.STREAM_ABORTED);
33
+ closeMessagePort(channel.port1);
34
+ closeMessagePort(channel.port2);
35
+ },
36
+ });
37
+ }
38
+ function closeMessagePort(port) {
39
+ port.onmessage = null;
40
+ port.close();
41
+ }
42
+ async function getServiceWorker() {
43
+ if (!('serviceWorker' in navigator)) {
44
+ return Promise.reject(new Error('Service worker is not available. Service Worker requires HTTPS protocol'));
45
+ }
46
+ return navigator.serviceWorker
47
+ .getRegistration()
48
+ .then((workerRegistration) => {
49
+ if (workerRegistration === undefined) {
50
+ return undefined;
51
+ }
52
+ const pending = workerRegistration.installing ?? workerRegistration.waiting;
53
+ return (workerRegistration.active ??
54
+ new Promise((resolve) => {
55
+ // if not activated, add listener to waiting or installing registration
56
+ const listener = () => {
57
+ if (pending?.state === 'activated') {
58
+ pending.removeEventListener('statechange', listener);
59
+ resolve(workerRegistration.active ?? undefined);
60
+ }
61
+ };
62
+ pending?.addEventListener('statechange', listener);
63
+ }));
64
+ });
65
+ }
66
+ function createDownloadRequest(filename) {
67
+ const PREFIX = 6;
68
+ const prefix = String(Math.random()).slice(-PREFIX);
69
+ const url = new URL(`${prefix}/${filename}`, window.location.href).toString();
70
+ return { tag: DOWNLOAD_EVENTS.TAG_REQUEST, filename, url };
71
+ }
72
+ function handleServiceWorkerDownloadResponse(event) {
73
+ const data = event.data;
74
+ if (data?.tag === DOWNLOAD_EVENTS.TAG_RESPONSE && data.downloadUrl.length) {
75
+ openInIframe(data.downloadUrl);
76
+ }
77
+ }
78
+ function openInIframe(src) {
79
+ const iframe = document.createElement('iframe');
80
+ iframe.hidden = true;
81
+ iframe.src = src;
82
+ document.body.appendChild(iframe);
83
+ return iframe;
84
+ }
85
+ export async function downloadStream(responseBody, filename) {
86
+ // creates communication channel with service worker with response handler
87
+ const channel = new MessageChannel();
88
+ channel.port1.onmessage = handleServiceWorkerDownloadResponse;
89
+ // grabs service worker and handles it download along with response channel port
90
+ const serviceWorker = await getServiceWorker();
91
+ if (!serviceWorker) {
92
+ return;
93
+ }
94
+ const downloadRequest = createDownloadRequest(filename);
95
+ serviceWorker.postMessage(downloadRequest, [channel.port2]);
96
+ // creates new data stream over communication channel and pipes given stream in it
97
+ responseBody
98
+ .pipeTo(createWritableStreamFromMessageChannel(channel))
99
+ .then(() => {
100
+ // TODO: trace success
101
+ })
102
+ .catch(() => {
103
+ // TODO: fail
104
+ });
105
+ }
106
+ export function registerDownloadHelperServiceWorker() {
107
+ if ('serviceWorker' in navigator) {
108
+ navigator.serviceWorker
109
+ .register('ServiceWorker.js')
110
+ .then((reg) => {
111
+ // TODO: add trace
112
+ // eslint-disable-next-line no-console
113
+ console.debug('register service worker success', reg);
114
+ })
115
+ .catch((error) => {
116
+ // TODO: add trace
117
+ // eslint-disable-next-line no-console
118
+ console.debug('register service worker error', error);
119
+ });
120
+ }
121
+ }
122
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/download-helper/index.ts"],"names":[],"mappings":"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"}
package/lib/index.css CHANGED
@@ -1,4 +1,4 @@
1
- /** @license @finos/legend-lego v1.2.1
1
+ /** @license @finos/legend-lego v1.2.2
2
2
  * Copyright (c) 2020-present, Goldman Sachs
3
3
  *
4
4
  * Licensed under the Apache License, Version 2.0 (the "License");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@finos/legend-lego",
3
- "version": "1.2.1",
3
+ "version": "1.2.2",
4
4
  "description": "Legend shared advanced application components and building blocks",
5
5
  "keywords": [
6
6
  "legend",
@@ -26,6 +26,8 @@
26
26
  "./code-editor/test/MockedMonacoEditor.js": "./lib/code-editor/__test-utils__/MockedMonacoEditor.js",
27
27
  "./data-grid": "./lib/data-grid/index.js",
28
28
  "./graph-editor": "./lib/graph-editor/index.js",
29
+ "./download-helper": "./lib/download-helper/index.js",
30
+ "./download-helper/test/MockedDownloadHelper.js": "./lib/download-helper/__test-utils__/MockedDownloadHelper.js",
29
31
  "./lib/index.css": "./lib/index.css"
30
32
  },
31
33
  "module": "lib/index.js",
@@ -63,10 +65,10 @@
63
65
  "@ag-grid-enterprise/server-side-row-model": "30.2.0",
64
66
  "@ag-grid-enterprise/side-bar": "30.2.0",
65
67
  "@ag-grid-enterprise/status-bar": "30.2.0",
66
- "@finos/legend-application": "15.0.65",
67
- "@finos/legend-art": "7.1.18",
68
- "@finos/legend-graph": "31.7.1",
69
- "@finos/legend-shared": "10.0.31",
68
+ "@finos/legend-application": "15.0.66",
69
+ "@finos/legend-art": "7.1.19",
70
+ "@finos/legend-graph": "31.7.2",
71
+ "@finos/legend-shared": "10.0.32",
70
72
  "@types/css-font-loading-module": "0.0.10",
71
73
  "@types/react": "18.2.31",
72
74
  "@types/react-dom": "18.2.14",
@@ -78,7 +80,7 @@
78
80
  "react-dom": "18.2.0"
79
81
  },
80
82
  "devDependencies": {
81
- "@finos/legend-dev-utils": "2.1.1",
83
+ "@finos/legend-dev-utils": "2.1.2",
82
84
  "@jest/globals": "29.7.0",
83
85
  "cross-env": "7.0.3",
84
86
  "eslint": "8.52.0",
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Copyright (c) 2020-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ export async function downloadStream(): Promise<void> {}
18
+ export function registerDownloadHelperServiceWorker(): void {}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * Copyright (c) 2020-present, Goldman Sachs
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ enum DOWNLOAD_EVENTS {
18
+ TAG_REQUEST = 'download-request',
19
+ TAG_RESPONSE = 'download-response',
20
+ STREAM_CLOSED = '#stream-closed',
21
+ STREAM_ABORTED = '#stream-aborted',
22
+ }
23
+
24
+ function createWritableStreamFromMessageChannel(
25
+ channel: MessageChannel,
26
+ ): WritableStream {
27
+ return new WritableStream({
28
+ write(chunk) {
29
+ channel.port1.postMessage(chunk);
30
+ },
31
+ close() {
32
+ channel.port1.postMessage(DOWNLOAD_EVENTS.STREAM_CLOSED);
33
+ },
34
+ abort() {
35
+ channel.port1.postMessage(DOWNLOAD_EVENTS.STREAM_ABORTED);
36
+ closeMessagePort(channel.port1);
37
+ closeMessagePort(channel.port2);
38
+ },
39
+ });
40
+ }
41
+
42
+ function closeMessagePort(port: MessagePort): void {
43
+ port.onmessage = null;
44
+ port.close();
45
+ }
46
+
47
+ interface LegendApplicationDownloadRequest {
48
+ tag: string;
49
+ filename: string;
50
+ url: string;
51
+ }
52
+
53
+ interface LegendApplicationTagResponse {
54
+ tag: string;
55
+ downloadUrl: string;
56
+ }
57
+
58
+ async function getServiceWorker(): Promise<ServiceWorker | undefined> {
59
+ if (!('serviceWorker' in navigator)) {
60
+ return Promise.reject(
61
+ new Error(
62
+ 'Service worker is not available. Service Worker requires HTTPS protocol',
63
+ ),
64
+ );
65
+ }
66
+ return navigator.serviceWorker
67
+ .getRegistration()
68
+ .then((workerRegistration) => {
69
+ if (workerRegistration === undefined) {
70
+ return undefined;
71
+ }
72
+ const pending =
73
+ workerRegistration.installing ?? workerRegistration.waiting;
74
+ return (
75
+ workerRegistration.active ??
76
+ new Promise((resolve) => {
77
+ // if not activated, add listener to waiting or installing registration
78
+ const listener = (): void => {
79
+ if (pending?.state === 'activated') {
80
+ pending.removeEventListener('statechange', listener);
81
+ resolve(workerRegistration.active ?? undefined);
82
+ }
83
+ };
84
+ pending?.addEventListener('statechange', listener);
85
+ })
86
+ );
87
+ });
88
+ }
89
+
90
+ function createDownloadRequest(
91
+ filename: string,
92
+ ): LegendApplicationDownloadRequest {
93
+ const PREFIX = 6;
94
+ const prefix = String(Math.random()).slice(-PREFIX);
95
+ const url = new URL(`${prefix}/${filename}`, window.location.href).toString();
96
+ return { tag: DOWNLOAD_EVENTS.TAG_REQUEST, filename, url };
97
+ }
98
+
99
+ function handleServiceWorkerDownloadResponse(
100
+ event: MessageEvent<LegendApplicationTagResponse | undefined>,
101
+ ): void {
102
+ const data = event.data;
103
+ if (data?.tag === DOWNLOAD_EVENTS.TAG_RESPONSE && data.downloadUrl.length) {
104
+ openInIframe(data.downloadUrl);
105
+ }
106
+ }
107
+
108
+ function openInIframe(src: string): HTMLIFrameElement {
109
+ const iframe = document.createElement('iframe');
110
+ iframe.hidden = true;
111
+ iframe.src = src;
112
+ document.body.appendChild(iframe);
113
+ return iframe;
114
+ }
115
+
116
+ export async function downloadStream(
117
+ responseBody: ReadableStream,
118
+ filename: string,
119
+ ): Promise<void> {
120
+ // creates communication channel with service worker with response handler
121
+ const channel = new MessageChannel();
122
+ channel.port1.onmessage = handleServiceWorkerDownloadResponse;
123
+
124
+ // grabs service worker and handles it download along with response channel port
125
+ const serviceWorker = await getServiceWorker();
126
+ if (!serviceWorker) {
127
+ return;
128
+ }
129
+ const downloadRequest = createDownloadRequest(filename);
130
+ serviceWorker.postMessage(downloadRequest, [channel.port2]);
131
+
132
+ // creates new data stream over communication channel and pipes given stream in it
133
+ responseBody
134
+ .pipeTo(createWritableStreamFromMessageChannel(channel))
135
+ .then(() => {
136
+ // TODO: trace success
137
+ })
138
+ .catch(() => {
139
+ // TODO: fail
140
+ });
141
+ }
142
+
143
+ export function registerDownloadHelperServiceWorker(): void {
144
+ if ('serviceWorker' in navigator) {
145
+ navigator.serviceWorker
146
+ .register('ServiceWorker.js')
147
+ .then((reg) => {
148
+ // TODO: add trace
149
+ // eslint-disable-next-line no-console
150
+ console.debug('register service worker success', reg);
151
+ })
152
+ .catch((error) => {
153
+ // TODO: add trace
154
+ // eslint-disable-next-line no-console
155
+ console.debug('register service worker error', error);
156
+ });
157
+ }
158
+ }
package/tsconfig.json CHANGED
@@ -39,6 +39,8 @@
39
39
  "./src/code-editor/__test-utils__/MockedMonacoEditor.ts",
40
40
  "./src/code-editor/themes/MonacoEditorThemeUtils.ts",
41
41
  "./src/data-grid/index.ts",
42
+ "./src/download-helper/index.ts",
43
+ "./src/download-helper/__test-utils__/MockedDownloadHelper.ts",
42
44
  "./src/graph-editor/index.ts",
43
45
  "./src/application/ActivityBar.tsx",
44
46
  "./src/application/DocumentationLink.tsx",