Skip to content

Commit fd50876

Browse files
committed
refactor(api/service-worker): wait for high priority service workers
1 parent 7c3f6d6 commit fd50876

File tree

7 files changed

+56
-52
lines changed

7 files changed

+56
-52
lines changed

api/ipc.js

Lines changed: 35 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -1772,43 +1772,33 @@ export function findIPCMessageTransfers (transfers, object) {
17721772
object[i] = findIPCMessageTransfers(transfers, object[i])
17731773
}
17741774
} else if (object && typeof object === 'object') {
1775-
if (
1776-
object instanceof MessagePort || (
1777-
typeof object.postMessage === 'function' &&
1778-
Object.getPrototypeOf(object).constructor.name === 'MessagePort'
1779-
)
1780-
) {
1781-
const port = IPCMessagePort.create(object)
1782-
object.addEventListener('message', function onMessage (event) {
1783-
if (port.closed === true) {
1784-
port.onmessage = null
1785-
event.preventDefault()
1786-
event.stopImmediatePropagation()
1787-
object.removeEventListener('message', onMessage)
1788-
return false
1789-
}
1790-
1791-
port.dispatchEvent(new MessageEvent('message', event))
1792-
})
1793-
1775+
if (object instanceof MessagePort) {
1776+
if (object instanceof IPCMessagePort) {
1777+
const port = IPCMessagePort.create(object)
1778+
ports.get(port.id).channel.onmessage = (event) => {
1779+
if (port.closed === true) {
1780+
port.onmessage = null
1781+
event.preventDefault()
1782+
event.stopImmediatePropagation()
1783+
return false
1784+
}
17941785

1795-
port.onmessage = (event) => {
1796-
if (port.closed === true) {
1797-
port.onmessage = null
1798-
event.preventDefault()
1799-
event.stopImmediatePropagation()
1800-
return false
1786+
if (port.started && event.data?.token !== port.token) {
1787+
console.log(event.data)
1788+
const transfers = new Set()
1789+
findIPCMessageTransfers(transfers, event.data)
1790+
object.postMessage(event.data, {
1791+
transfer: Array.from(transfers)
1792+
})
1793+
}
18011794
}
1802-
1803-
const transfers = new Set()
1804-
findIPCMessageTransfers(transfers, event.data)
1805-
object.postMessage(event.data, {
1806-
transfer: Array.from(transfers)
1807-
})
1795+
add(port)
1796+
return port
1797+
} else {
1798+
add(object)
1799+
return object
18081800
}
1809-
add(port)
1810-
return port
1811-
} else {
1801+
} else if (Object.getPrototypeOf(object) === Object.prototype) {
18121802
for (const key in object) {
18131803
object[key] = findIPCMessageTransfers(
18141804
transfers,
@@ -1841,13 +1831,15 @@ export class IPCMessagePort extends MessagePort {
18411831
static create (options = null) {
18421832
const id = String(options?.id ?? rand64())
18431833
const port = Object.create(this.prototype)
1844-
const token = String(rand64())
1845-
const channel = typeof options?.channel === 'string'
1846-
? new BroadcastChannel(options.channel)
1847-
: (
1848-
(options?.channel && new BroadcastChannel(options.channel.name, options.channel)) ??
1849-
new BroadcastChannel(id)
1850-
)
1834+
const token = ports.get(id)?.token || String(rand64())
1835+
const channel = ports.get(id)?.channel ||
1836+
(typeof options?.channel === 'string'
1837+
? new BroadcastChannel(options.channel)
1838+
: (
1839+
(options?.channel && new BroadcastChannel(options.channel.name, options.channel)) ??
1840+
new BroadcastChannel(id)
1841+
)
1842+
)
18511843

18521844
if (ports.has(id)) {
18531845
ports.get(id).closed = true
@@ -1868,8 +1860,8 @@ export class IPCMessagePort extends MessagePort {
18681860
eventTarget: { writable: true, value: ports.get(id)?.eventTarget || new EventTarget() }
18691861
}))
18701862

1871-
const state = ports.get(id)
18721863
channel.onmessage = function onMessage (event) {
1864+
const state = ports.get(id)
18731865
if (!state || state?.closed === true) {
18741866
event.preventDefault()
18751867
event.stopImmediatePropagation()
@@ -2051,10 +2043,9 @@ export class IPCMessagePort extends MessagePort {
20512043
}
20522044

20532045
[Symbol.for('socket.runtime.serialize')] () {
2054-
const channel = ports.get(this.id)?.channel
20552046
return {
20562047
__type__: 'IPCMessagePort',
2057-
channel: channel ? { name: channel.name, origin: channel.origin || location.origin } : null,
2048+
channel: ports.get(this.id)?.channel?.name ?? null,
20582049
id: this.id
20592050
}
20602051
}

api/process/signal.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
*/
44
import { signal as constants } from '../os/constants.js'
55
import { SignalEvent } from '../internal/events.js'
6-
import ipc from '../ipc.js'
76
import os from '../os.js'
87

98
/**

api/service-worker/context.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ export class Context {
7979
*/
8080
async client () {
8181
if (this.event.clientId) {
82-
console.log('REQUEST CLIENT', this.event.clientId)
8382
return await clients.get(this.event.clientId)
8483
}
8584

api/service-worker/init.js

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ export class ServiceWorkerInstance extends Worker {
7777
this.postMessage({ register: info })
7878
} else if (event.data.__service_worker_registered?.id === info.id) {
7979
this.postMessage({ install: info })
80+
info.promise.resolve()
8081
} else if (event.data?.message && event?.data.client?.id) {
8182
sharedWorker.port.postMessage({
8283
...event.data,
@@ -132,6 +133,9 @@ export class ServiceWorkerInfo {
132133
scope = null
133134
scriptURL = null
134135
serializedWorkerArgs = null
136+
priority = 'default'
137+
// @ts-ignore
138+
#promise = Promise.withResolvers()
135139

136140
constructor (data) {
137141
for (const key in data) {
@@ -149,6 +153,10 @@ export class ServiceWorkerInfo {
149153
get pathname () {
150154
return new URL(this.url).pathname
151155
}
156+
157+
get promise () {
158+
return this.#promise
159+
}
152160
}
153161

154162
export async function onRegister (event) {
@@ -158,6 +166,16 @@ export async function onRegister (event) {
158166
return
159167
}
160168

169+
for (const worker of workers.values()) {
170+
if (worker.priority === 'high' && /high|default|low/i.test(info.priority)) {
171+
await worker.ready
172+
} else if (worker.priority === 'default' && /default|low/i.test(info.priority)) {
173+
await worker.ready
174+
} else if (worker.priority === 'low' && /low/i.test(info.priority)) {
175+
await worker.ready
176+
}
177+
}
178+
161179
const worker = new ServiceWorkerInstance('./worker.js', {
162180
info
163181
})
@@ -198,7 +216,6 @@ export async function onActivate (event) {
198216
export async function onFetch (event) {
199217
const info = new ServiceWorkerInfo(event.detail)
200218
const exists = workers.has(info.hash)
201-
console.log(exists, event.detail)
202219

203220
// this may be an early fetch, just try waiting at most
204221
// 32*16 milliseconds for the worker to be available or
@@ -378,7 +395,7 @@ hooks.onReady(async () => {
378395
const result = await ipc.request('serviceWorker.getRegistrations')
379396
if (Array.isArray(result.data)) {
380397
for (const info of result.data) {
381-
//await navigator.serviceWorker.register(info.scriptURL, info)
398+
await navigator.serviceWorker.register(info.scriptURL, info)
382399
}
383400
}
384401
})

api/service-worker/instance.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ export function createServiceWorker (
7777
state: {
7878
configurable: true,
7979
enumerable: false,
80-
get: () => currentState === null ? state.serviceWorker.state : currentState,
80+
get: () => currentState === null ? state.serviceWorker.state : currentState
8181
},
8282

8383
[Symbol.for('socket.runtime.serviceWorker.state')]: {

api/service-worker/worker.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -410,7 +410,6 @@ export async function onMessage (event) {
410410
}
411411

412412
const url = new URL(data.fetch.request.url)
413-
console.log('FetchEvent: %s', url.href)
414413
const fetchEvent = new FetchEvent('fetch', {
415414
clientId: data.fetch.client.id,
416415
fetchId: data.fetch.request.id,

api/shared-worker/index.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,15 +147,14 @@ export async function getContextWindow () {
147147
}
148148

149149
const windows = await application.getWindows([], { max: false })
150-
let firstInit = true
151150

152151
for (const window of windows) {
153152
if (window.title === SHARED_WORKER_WINDOW_TITLE) {
154153
if (window.location) {
155154
const url = new URL(window.location.href, globalThis.location.origin)
156155
if (url.origin === globalThis.location.origin) {
157156
contextWindow = window
158-
firstInit = false
157+
break
159158
}
160159
}
161160
}

0 commit comments

Comments
 (0)