Skip to content

Commit 44fe5ff

Browse files
committed
refactor(api/{mime,service-worker}): improve mime query input support, use 'BroadcastChannel' in serviceworkers
1 parent 47faadc commit 44fe5ff

File tree

10 files changed

+142
-339
lines changed

10 files changed

+142
-339
lines changed

api/internal/geolocation.js

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ function createGeolocationPosition (data) {
6464
altitude: {
6565
configurable: false,
6666
writable: false,
67-
value: data.coords.altitude
67+
value: data.coords.altitude ?? null
6868
},
6969

7070
accuracy: {
@@ -95,12 +95,34 @@ function createGeolocationPosition (data) {
9595
configurable: false,
9696
writable: false,
9797
value: data.coords.speed <= 0 ? null : data.coords.speed
98+
},
99+
100+
toJSON: {
101+
configurable: false,
102+
writable: true,
103+
value: () => ({
104+
accuracy: data.coords.accuracy,
105+
latitude: data.coords.latitude,
106+
longitude: data.coords.longitude,
107+
altitude: data.coords.altitude ?? null,
108+
altitudeAccuracy: data.coords.altitudeAccuracy ?? null,
109+
heading: data.coords.heading ?? null,
110+
speed: data.coords.speed ?? null
111+
})
98112
}
99113
})
100114

101115
return Object.create(GeolocationPosition.prototype, {
102116
coords: { configurable: false, writable: false, value: coords },
103-
timestamp: { configurable: false, writable: false, value: Date.now() }
117+
timestamp: { configurable: false, writable: false, value: Date.now() },
118+
toJSON: {
119+
configurable: false,
120+
writable: true,
121+
value: () => ({
122+
coords: coords.toJSON(),
123+
timestamp: Date.now()
124+
})
125+
}
104126
})
105127
}
106128

@@ -176,7 +198,8 @@ export async function getCurrentPosition (
176198
timer = setTimeout(() => {
177199
didTimeout = true
178200
const error = Object.create(GeolocationPositionError.prototype, {
179-
code: { value: GeolocationPositionError.TIMEOUT }
201+
code: { value: GeolocationPositionError.TIMEOUT },
202+
message: { value: 'Position acquisition timed out' }
180203
})
181204

182205
if (typeof onError === 'function') {

api/ipc.js

Lines changed: 42 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1772,39 +1772,51 @@ export function findIPCMessageTransfers (transfers, object) {
17721772
object[i] = findIPCMessageTransfers(transfers, object[i])
17731773
}
17741774
} else if (object && typeof object === 'object') {
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-
}
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+
}
17851790

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-
}
1791+
port.dispatchEvent(new MessageEvent('message', event))
1792+
})
1793+
1794+
port.onmessage = (event) => {
1795+
if (port.closed === true) {
1796+
port.onmessage = null
1797+
event.preventDefault()
1798+
event.stopImmediatePropagation()
1799+
return false
17941800
}
1795-
add(port)
1796-
return port
1797-
} else {
1798-
add(object)
1799-
return object
1800-
}
1801-
} else if (Object.getPrototypeOf(object) === Object.prototype) {
1802-
for (const key in object) {
1803-
object[key] = findIPCMessageTransfers(
1804-
transfers,
1805-
object[key]
1806-
)
1801+
1802+
const transfers = new Set()
1803+
findIPCMessageTransfers(transfers, event.data)
1804+
object.postMessage(event.data, {
1805+
transfer: Array.from(transfers)
1806+
})
18071807
}
1808+
add(port)
1809+
return port
1810+
} else {
1811+
add(object)
1812+
return object
1813+
}
1814+
} else if (Object.getPrototypeOf(object) === Object.prototype) {
1815+
for (const key in object) {
1816+
object[key] = findIPCMessageTransfers(
1817+
transfers,
1818+
object[key]
1819+
)
18081820
}
18091821
}
18101822

api/mime/index.js

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,16 @@ export class Database {
157157
query (query) {
158158
query = query.toLowerCase()
159159

160-
const queryParts = query.split('+')
160+
if (query.startsWith('.')) {
161+
query = query.slice(1)
162+
}
163+
161164
const results = []
165+
const queryParts = query
166+
.split('+')
167+
.map((query) => query.trim())
168+
.map((query) => query.startsWith('.') ? query.slice(1) : query)
169+
.filter(Boolean)
162170

163171
for (const [key, value] of this.map.entries()) {
164172
const name = key.toLowerCase()

api/service-worker/container.js

Lines changed: 44 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
/* global EventTarget */
22
import { ServiceWorkerRegistration } from './registration.js'
3-
import { createServiceWorker, SHARED_WORKER_URL } from './instance.js'
4-
import { SharedWorker } from '../shared-worker/index.js'
3+
import { createServiceWorker } from './instance.js'
54
import { Deferred } from '../async.js'
65
import application from '../application.js'
76
import location from '../location.js'
@@ -23,8 +22,7 @@ class ServiceWorkerContainerInternalStateMap extends Map {
2322
class ServiceWorkerContainerInternalState {
2423
currentWindow = null
2524
controller = null
26-
sharedWorker = null
27-
channel = new BroadcastChannel('socket.runtime.ServiceWorkerContainer')
25+
channel = new BroadcastChannel('socket.runtime.serviceWorker')
2826
ready = new Deferred()
2927
init = new Deferred()
3028

@@ -487,65 +485,61 @@ export class ServiceWorkerContainer extends EventTarget {
487485
return globalThis.top.navigator.serviceWorker.startMessages()
488486
}
489487

490-
if (!internal.get(this).sharedWorker && globalThis.RUNTIME_WORKER_LOCATION !== SHARED_WORKER_URL) {
491-
internal.get(this).sharedWorker = new SharedWorker(SHARED_WORKER_URL)
492-
internal.get(this).sharedWorker.port.start()
493-
internal.get(this).sharedWorker.port.onmessage = async (event) => {
494-
if (
495-
event.data?.from === 'realm' &&
496-
event.data?.registration?.id &&
497-
event.data?.client?.id === globalThis.__args.client.id &&
498-
event.data?.client?.type === globalThis.__args.client.type &&
499-
event.data?.client?.frameType === globalThis.__args.client.frameType
500-
) {
501-
const registrations = await this.getRegistrations()
502-
for (const registration of registrations) {
503-
const info = registration[Symbol.for('socket.runtime.ServiceWorkerRegistration.info')]
504-
if (info?.id === event.data.registration.id) {
505-
const serviceWorker = createServiceWorker(state.serviceWorker.state, {
506-
subscribe: false,
507-
scriptURL: info.scriptURL,
508-
id: info.id
509-
})
510-
511-
const messageEvent = new MessageEvent('message', {
512-
origin: new URL(info.scriptURL, location.origin).origin,
513-
data: event.data.message
514-
})
515-
516-
Object.defineProperty(messageEvent, 'source', {
517-
configurable: false,
518-
enumerable: false,
519-
writable: false,
520-
value: serviceWorker
521-
})
522-
523-
this.dispatchEvent(messageEvent)
524-
break
525-
}
526-
}
527-
} else if (
528-
event.data?.from === 'instance' &&
529-
event.data?.registration?.id &&
530-
event.data?.client?.id &&
531-
event.data?.client?.id !== globalThis.__args.client.id
532-
) {
533-
if (globalThis.isWorkerScope && globalThis.serviceWorker) {
488+
internal.get(this).channel.onmessage = async (event) => {
489+
if (
490+
event.data?.from === 'realm' &&
491+
event.data?.registration?.id &&
492+
event.data?.client?.id === globalThis.__args.client.id &&
493+
event.data?.client?.type === globalThis.__args.client.type &&
494+
event.data?.client?.frameType === globalThis.__args.client.frameType
495+
) {
496+
const registrations = await this.getRegistrations()
497+
for (const registration of registrations) {
498+
const info = registration[Symbol.for('socket.runtime.ServiceWorkerRegistration.info')]
499+
if (info?.id === event.data.registration.id) {
500+
const serviceWorker = createServiceWorker(state.serviceWorker.state, {
501+
subscribe: false,
502+
scriptURL: info.scriptURL,
503+
id: info.id
504+
})
505+
534506
const messageEvent = new MessageEvent('message', {
535-
origin: event.data.client.origin.origin,
507+
origin: new URL(info.scriptURL, location.origin).origin,
536508
data: event.data.message
537509
})
538510

539511
Object.defineProperty(messageEvent, 'source', {
540512
configurable: false,
541513
enumerable: false,
542514
writable: false,
543-
value: await globalThis.clients.get(event.data.client.id)
515+
value: serviceWorker
544516
})
545517

546518
this.dispatchEvent(messageEvent)
519+
break
547520
}
548521
}
522+
} else if (
523+
event.data?.from === 'instance' &&
524+
event.data?.registration?.id &&
525+
event.data?.client?.id &&
526+
event.data?.client?.id !== globalThis.__args.client.id
527+
) {
528+
if (globalThis.isWorkerScope && globalThis.serviceWorker) {
529+
const messageEvent = new MessageEvent('message', {
530+
origin: event.data.client.origin.origin,
531+
data: event.data.message
532+
})
533+
534+
Object.defineProperty(messageEvent, 'source', {
535+
configurable: false,
536+
enumerable: false,
537+
writable: false,
538+
value: await globalThis.clients.get(event.data.client.id)
539+
})
540+
541+
this.dispatchEvent(messageEvent)
542+
}
549543
}
550544
}
551545
}

0 commit comments

Comments
 (0)