Skip to content

Commit 38fb6ae

Browse files
authored
fix: don't use worker timers in worker and add web worker tests (#1755)
1 parent f696f57 commit 38fb6ae

File tree

5 files changed

+45
-3
lines changed

5 files changed

+45
-3
lines changed

src/lib/PingTimer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { clearTimeout as clearT, setTimeout as setT } from 'worker-timers'
2-
import isBrowser from './is-browser'
2+
import isBrowser, { isWebWorker } from './is-browser'
33

44
export default class PingTimer {
55
private keepalive: number

src/lib/is-browser.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,6 @@ const isReactNativeEnv = () =>
1515
const isBrowser =
1616
isStandardBrowserEnv() || isWebWorkerEnv() || isReactNativeEnv()
1717

18+
export const isWebWorker = isWebWorkerEnv()
19+
1820
export default isBrowser

test/browser/test.js

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,23 @@ import mqtt from '../../'; // this will resolve to mqtt/dist/mqtt.esm.js
66
const mqtt2 = window.mqtt
77

88
// get browser name
9-
const browser = navigator.userAgent.toLowerCase().replace(/ /g, '_').replace(/\//g, '_')
9+
const userAgent = navigator.userAgent.toLowerCase().replace(/ /g, '_').replace(/\//g, '_')
10+
11+
let browser = 'unknown'
12+
13+
console.log('userAgent:', userAgent)
14+
15+
if (userAgent.includes('chrome')) {
16+
browser = 'chrome'
17+
} else if (userAgent.includes('firefox')) {
18+
browser = 'firefox'
19+
} else if (userAgent.includes('safari')) {
20+
browser = 'safari'
21+
}
1022

1123
const browserTopic = `test/${browser}`
1224

25+
console.log('browser:', browser)
1326

1427
function run(proto, port, cb) {
1528

@@ -71,5 +84,22 @@ it('should work with non-ESM version', () => {
7184

7285

7386
run('ws', window.wsPort, () => {
74-
run('wss', window.wssPort)
87+
run('wss', window.wssPort, () => {
88+
describe('MQTT.js browser test with web worker', () => {
89+
it('should work with web worker', async () => {
90+
const worker = new Worker('test/browser/worker.js')
91+
const ready = new Promise((resolve, reject) => {
92+
worker.onmessage = (e) => {
93+
if (e.data === 'worker ready') {
94+
resolve()
95+
} else {
96+
reject(e.data)
97+
}
98+
}
99+
})
100+
await ready
101+
})
102+
})
103+
})
75104
})
105+

test/browser/worker.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
// test mqttjs in worker
2+
3+
importScripts('/dist/mqtt.js');
4+
5+
/** @type { import('../../src').MqttClient }*/
6+
const MQTT = mqtt;
7+
8+
postMessage(typeof MQTT?.connect === 'function' ? 'worker ready' : 'worker error');

web-test-runner.config.mjs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ export default {
5656
`<html>
5757
<body>
5858
<script src="dist/mqtt.js"></script>
59+
<!-- web worker code -->
60+
<link rel="modulepreload" href="test/browser/worker.js">
5961
<script>
6062
window.wsPort = ${wsPort};
6163
window.wssPort = ${wssPort};

0 commit comments

Comments
 (0)