This is an automated email from the ASF dual-hosted git repository.
rusackas pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git
The following commit(s) were added to refs/heads/master by this push:
new ae6e58f918 feat(frontend/hooks): replace 3rd-party BroadcastChannel
with native Web API equivalence (#29584)
ae6e58f918 is described below
commit ae6e58f918247919244968cc3fa9d856a4e09dc2
Author: Đỗ Trọng Hải <[email protected]>
AuthorDate: Thu Jul 18 02:15:20 2024 +0700
feat(frontend/hooks): replace 3rd-party BroadcastChannel with native Web
API equivalence (#29584)
Signed-off-by: hainenber <[email protected]>
---
superset-frontend/package-lock.json | 109 ++++-----------------
superset-frontend/package.json | 1 -
.../src/hooks/strictBroadcastChannel.ts | 63 ++++++++++++
superset-frontend/src/hooks/useTabId.ts | 24 +++--
4 files changed, 92 insertions(+), 105 deletions(-)
diff --git a/superset-frontend/package-lock.json
b/superset-frontend/package-lock.json
index 5d573ac772..ee61ed7ca1 100644
--- a/superset-frontend/package-lock.json
+++ b/superset-frontend/package-lock.json
@@ -62,7 +62,6 @@
"babel-plugin-typescript-to-proptypes": "^2.0.0",
"bootstrap": "^3.4.1",
"brace": "^0.11.1",
- "broadcast-channel": "^4.10.0",
"chrono-node": "^2.7.5",
"classnames": "^2.2.5",
"core-js": "^3.37.1",
@@ -20724,6 +20723,7 @@
"version": "1.6.51",
"resolved":
"https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz",
"integrity":
"sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==",
+ "dev": true,
"engines": {
"node": ">=0.6"
}
@@ -21026,21 +21026,6 @@
"brfs": "bin/cmd.js"
}
},
- "node_modules/broadcast-channel": {
- "version": "4.10.0",
- "resolved":
"https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-4.10.0.tgz",
- "integrity":
"sha512-hOUh312XyHk6JTVyX9cyXaH1UYs+2gHVtnW16oQAu9FL7ALcXGXc/YoJWqlkV8vUn14URQPMmRi4A9q4UrwVEQ==",
- "dependencies": {
- "@babel/runtime": "^7.16.0",
- "detect-node": "^2.1.0",
- "microseconds": "0.2.0",
- "nano-time": "1.0.0",
- "oblivious-set": "1.0.0",
- "p-queue": "6.6.2",
- "rimraf": "3.0.2",
- "unload": "2.3.1"
- }
- },
"node_modules/browser-assert": {
"version": "1.2.1",
"resolved":
"https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz",
@@ -25352,7 +25337,8 @@
"node_modules/detect-node": {
"version": "2.1.0",
"resolved":
"https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
- "integrity":
"sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="
+ "integrity":
"sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+ "dev": true
},
"node_modules/detect-node-es": {
"version": "1.1.0",
@@ -27799,7 +27785,8 @@
"node_modules/eventemitter3": {
"version": "4.0.7",
"resolved":
"https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
- "integrity":
"sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
+ "integrity":
"sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true
},
"node_modules/events": {
"version": "3.3.0",
@@ -47730,11 +47717,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/microseconds": {
- "version": "0.2.0",
- "resolved":
"https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz",
- "integrity":
"sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA=="
- },
"node_modules/mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
@@ -48254,14 +48236,6 @@
"dev": true,
"optional": true
},
- "node_modules/nano-time": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz",
- "integrity": "sha1-sFVPaa2J4i0JB/ehKwmTpdlhN+8=",
- "dependencies": {
- "big-integer": "^1.6.16"
- }
- },
"node_modules/nanoid": {
"version": "5.0.7",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz",
@@ -50084,11 +50058,6 @@
"integrity":
"sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==",
"dev": true
},
- "node_modules/oblivious-set": {
- "version": "1.0.0",
- "resolved":
"https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz",
- "integrity":
"sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw=="
- },
"node_modules/obuf": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
@@ -50286,6 +50255,7 @@
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
"integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+ "dev": true,
"engines": {
"node": ">=4"
}
@@ -50366,6 +50336,7 @@
"version": "6.6.2",
"resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz",
"integrity":
"sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==",
+ "dev": true,
"dependencies": {
"eventemitter3": "^4.0.4",
"p-timeout": "^3.2.0"
@@ -50404,6 +50375,7 @@
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
"integrity":
"sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
+ "dev": true,
"dependencies": {
"p-finally": "^1.0.0"
},
@@ -60326,15 +60298,6 @@
"node": ">= 10.0.0"
}
},
- "node_modules/unload": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/unload/-/unload-2.3.1.tgz",
- "integrity":
"sha512-MUZEiDqvAN9AIDRbbBnVYVvfcR6DrjCqeU2YQMmliFZl9uaBUjTkhuDQkBiyAy8ad5bx1TXVbqZ3gg7namsWjA==",
- "dependencies": {
- "@babel/runtime": "^7.6.2",
- "detect-node": "2.1.0"
- }
- },
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -84800,7 +84763,8 @@
"big-integer": {
"version": "1.6.51",
"resolved":
"https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz",
- "integrity":
"sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg=="
+ "integrity":
"sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==",
+ "dev": true
},
"big.js": {
"version": "5.2.2",
@@ -85045,21 +85009,6 @@
"through2": "^2.0.0"
}
},
- "broadcast-channel": {
- "version": "4.10.0",
- "resolved":
"https://registry.npmjs.org/broadcast-channel/-/broadcast-channel-4.10.0.tgz",
- "integrity":
"sha512-hOUh312XyHk6JTVyX9cyXaH1UYs+2gHVtnW16oQAu9FL7ALcXGXc/YoJWqlkV8vUn14URQPMmRi4A9q4UrwVEQ==",
- "requires": {
- "@babel/runtime": "^7.16.0",
- "detect-node": "^2.1.0",
- "microseconds": "0.2.0",
- "nano-time": "1.0.0",
- "oblivious-set": "1.0.0",
- "p-queue": "6.6.2",
- "rimraf": "3.0.2",
- "unload": "2.3.1"
- }
- },
"browser-assert": {
"version": "1.2.1",
"resolved":
"https://registry.npmjs.org/browser-assert/-/browser-assert-1.2.1.tgz",
@@ -88336,7 +88285,8 @@
"detect-node": {
"version": "2.1.0",
"resolved":
"https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
- "integrity":
"sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g=="
+ "integrity":
"sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+ "dev": true
},
"detect-node-es": {
"version": "1.1.0",
@@ -90206,7 +90156,8 @@
"eventemitter3": {
"version": "4.0.7",
"resolved":
"https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
- "integrity":
"sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
+ "integrity":
"sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true
},
"events": {
"version": "3.3.0",
@@ -104156,11 +104107,6 @@
}
}
},
- "microseconds": {
- "version": "0.2.0",
- "resolved":
"https://registry.npmjs.org/microseconds/-/microseconds-0.2.0.tgz",
- "integrity":
"sha512-n7DHHMjR1avBbSpsTBj6fmMGh2AGrifVV4e+WYc3Q9lO+xnSZ3NyhcBND3vzzatt05LFhoKFRxrIyklmLlUtyA=="
- },
"mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
@@ -104562,14 +104508,6 @@
"dev": true,
"optional": true
},
- "nano-time": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/nano-time/-/nano-time-1.0.0.tgz",
- "integrity": "sha1-sFVPaa2J4i0JB/ehKwmTpdlhN+8=",
- "requires": {
- "big-integer": "^1.6.16"
- }
- },
"nanoid": {
"version": "5.0.7",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz",
@@ -105891,11 +105829,6 @@
"integrity":
"sha512-eJJDYkhJFFbBBAxeh8xW+weHlkI28n2ZdQV/J/DNfWfSKlGEf2xcfAbZTv3riEXHAhL9SVOTs2pRmXiSTf78xg==",
"dev": true
},
- "oblivious-set": {
- "version": "1.0.0",
- "resolved":
"https://registry.npmjs.org/oblivious-set/-/oblivious-set-1.0.0.tgz",
- "integrity":
"sha512-z+pI07qxo4c2CulUHCDf9lcqDlMSo72N/4rLUpRXf6fu+q8vjt8y0xS+Tlf8NTJDdTXHbdeO1n3MlbctwEoXZw=="
- },
"obuf": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
@@ -106051,7 +105984,8 @@
"p-finally": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
- "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4="
+ "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
+ "dev": true
},
"p-iteration": {
"version": "1.1.8",
@@ -106102,6 +106036,7 @@
"version": "6.6.2",
"resolved": "https://registry.npmjs.org/p-queue/-/p-queue-6.6.2.tgz",
"integrity":
"sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==",
+ "dev": true,
"requires": {
"eventemitter3": "^4.0.4",
"p-timeout": "^3.2.0"
@@ -106127,6 +106062,7 @@
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz",
"integrity":
"sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==",
+ "dev": true,
"requires": {
"p-finally": "^1.0.0"
}
@@ -113384,15 +113320,6 @@
"resolved":
"https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz",
"integrity":
"sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ=="
},
- "unload": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/unload/-/unload-2.3.1.tgz",
- "integrity":
"sha512-MUZEiDqvAN9AIDRbbBnVYVvfcR6DrjCqeU2YQMmliFZl9uaBUjTkhuDQkBiyAy8ad5bx1TXVbqZ3gg7namsWjA==",
- "requires": {
- "@babel/runtime": "^7.6.2",
- "detect-node": "2.1.0"
- }
- },
"unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
diff --git a/superset-frontend/package.json b/superset-frontend/package.json
index fb8b30fcfc..aec0ea6b80 100644
--- a/superset-frontend/package.json
+++ b/superset-frontend/package.json
@@ -127,7 +127,6 @@
"babel-plugin-typescript-to-proptypes": "^2.0.0",
"bootstrap": "^3.4.1",
"brace": "^0.11.1",
- "broadcast-channel": "^4.10.0",
"chrono-node": "^2.7.5",
"classnames": "^2.2.5",
"core-js": "^3.37.1",
diff --git a/superset-frontend/src/hooks/strictBroadcastChannel.ts
b/superset-frontend/src/hooks/strictBroadcastChannel.ts
new file mode 100644
index 0000000000..bffc6ca007
--- /dev/null
+++ b/superset-frontend/src/hooks/strictBroadcastChannel.ts
@@ -0,0 +1,63 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+// Credit to Eric Wong at https://stackoverflow.com/a/78491331
+interface StrictBroadcastChannelEventMap<T> {
+ message: MessageEvent<T>;
+ messageerror: MessageEvent<T>;
+}
+
+export interface StrictBroadcastChannel<T> extends EventTarget {
+ readonly name: string;
+ onmessage: ((this: BroadcastChannel, ev: MessageEvent<T>) => any) | null;
+ onmessageerror: ((this: BroadcastChannel, ev: MessageEvent<T>) => any) |
null;
+ close(): void;
+ postMessage(message: T): void;
+ addEventListener<K extends keyof StrictBroadcastChannelEventMap<T>>(
+ type: K,
+ listener: (
+ this: BroadcastChannel,
+ ev: StrictBroadcastChannelEventMap<T>[K],
+ ) => any,
+ options?: boolean | AddEventListenerOptions,
+ ): void;
+ addEventListener(
+ type: string,
+ listener: EventListenerOrEventListenerObject,
+ options?: boolean | AddEventListenerOptions,
+ ): void;
+ removeEventListener<K extends keyof StrictBroadcastChannelEventMap<T>>(
+ type: K,
+ listener: (
+ this: BroadcastChannel,
+ ev: StrictBroadcastChannelEventMap<T>[K],
+ ) => any,
+ options?: boolean | EventListenerOptions,
+ ): void;
+ removeEventListener(
+ type: string,
+ listener: EventListenerOrEventListenerObject,
+ options?: boolean | EventListenerOptions,
+ ): void;
+}
+
+export interface TabIdChannelMessage {
+ type: 'REQUESTING_TAB_ID' | 'TAB_ID_DENIED';
+ tabId: string;
+}
diff --git a/superset-frontend/src/hooks/useTabId.ts
b/superset-frontend/src/hooks/useTabId.ts
index 656b5a1d27..818d6d2e78 100644
--- a/superset-frontend/src/hooks/useTabId.ts
+++ b/superset-frontend/src/hooks/useTabId.ts
@@ -18,17 +18,15 @@
*/
import { useEffect, useState } from 'react';
import { nanoid } from 'nanoid';
-import { BroadcastChannel } from 'broadcast-channel';
+import {
+ StrictBroadcastChannel,
+ TabIdChannelMessage,
+} from './strictBroadcastChannel';
-interface TabIdChannelMessage {
- type: 'REQUESTING_TAB_ID' | 'TAB_ID_DENIED';
- tabId: string;
-}
+const TAB_ID_CHANNEL_NAME = 'tab_id_channel';
-// TODO: We are using broadcast-channel to support Safari.
-// The native BroadcastChannel API will be supported in Safari version 15.4.
-// After that, we should remove this dependency and use the native API.
-const channel = new BroadcastChannel<TabIdChannelMessage>('tab_id_channel');
+const channel: StrictBroadcastChannel<TabIdChannelMessage> =
+ new BroadcastChannel(TAB_ID_CHANNEL_NAME);
export function useTabId() {
const [tabId, setTabId] = useState<string>();
@@ -83,14 +81,14 @@ export function useTabId() {
}
channel.onmessage = messageEvent => {
- if (messageEvent.tabId === tabId) {
- if (messageEvent.type === 'REQUESTING_TAB_ID') {
+ if (messageEvent.data.tabId === tabId) {
+ if (messageEvent.data.type === 'REQUESTING_TAB_ID') {
const message: TabIdChannelMessage = {
type: 'TAB_ID_DENIED',
- tabId: messageEvent.tabId,
+ tabId: messageEvent.data.tabId,
};
channel.postMessage(message);
- } else if (messageEvent.type === 'TAB_ID_DENIED') {
+ } else if (messageEvent.data.type === 'TAB_ID_DENIED') {
updateTabId();
}
}