Skip to content

Commit

Permalink
feature: add messageport ipc
Browse files Browse the repository at this point in the history
  • Loading branch information
levivilet committed Jun 16, 2024
1 parent abe4fe7 commit a2ad981
Show file tree
Hide file tree
Showing 2 changed files with 110 additions and 0 deletions.
46 changes: 46 additions & 0 deletions src/parts/IpcChildWithMessagePort/IpcChildWithMessagePort.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
import * as GetData from '../GetData/GetData.ts'
import { Ipc } from '../Ipc/Ipc.ts'
import * as ReadyMessage from '../ReadyMessage/ReadyMessage.ts'

export const listen = ({ port }: { port: MessagePort }) => {
return port
}

export const signal = (port: MessagePort) => {
port.postMessage(ReadyMessage.readyMessage)
}

class IpcChildWithMessagePort extends Ipc<MessagePort> {
constructor(port: MessagePort) {
super(port)
}

override getData(event: any) {
return GetData.getData(event)
}

override send(message: any): void {
this._rawIpc.postMessage(message)
}

override sendAndTransfer(message: any, transfer: any): void {
this._rawIpc.postMessage(message, transfer)
}

override dispose(): void {
// ignore
}

override onClose(callback: any) {
// ignore
}

override onMessage(callback: any) {
this._rawIpc.addEventListener('message', callback)
this._rawIpc.start()
}
}

export const wrap = (port: MessagePort) => {
return new IpcChildWithMessagePort(port)
}
64 changes: 64 additions & 0 deletions test/IpcChildWithMessagePort.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
import { expect, test } from '@jest/globals'
import * as IpcChildWithMessagePort from '../src/parts/IpcChildWithMessagePort/IpcChildWithMessagePort.ts'

test('listen - return port', async () => {
const { port1, port2 } = new MessageChannel()
expect(IpcChildWithMessagePort.listen({ port: port1 })).toBe(port1)
port1.close()
port2.close()
})

test('signal', async () => {
const { port1, port2 } = new MessageChannel()
const promise = new Promise((resolve) => {
port2.onmessage = resolve
})
IpcChildWithMessagePort.signal(port1)
const event = await promise
// @ts-ignore
expect(event.data).toBe('ready')
port1.close()
port2.close()
})

test('wrap - send', async () => {
const { port1, port2 } = new MessageChannel()
const ipc = IpcChildWithMessagePort.wrap(port1)
const promise = new Promise((resolve) => {
port2.onmessage = resolve
})
ipc.send('test')
const event = await promise
// @ts-ignore
expect(event.data).toBe('test')
port1.close()
port2.close()
})

test('wrap - sendAndTransfer', async () => {
const { port1, port2 } = new MessageChannel()
const ipc = IpcChildWithMessagePort.wrap(port1)
const promise = new Promise((resolve) => {
port2.onmessage = resolve
})
ipc.sendAndTransfer('test', [])
const event = await promise
// @ts-ignore
expect(event.data).toBe('test')
port1.close()
port2.close()
})

test('wrap - onMessage', async () => {
const { port1, port2 } = new MessageChannel()
const ipc = IpcChildWithMessagePort.wrap(port1)
const promise = new Promise((resolve) => {
ipc.onMessage(resolve)
})
port2.postMessage('test')
const event = await promise
// @ts-ignore
expect(event.data).toBe('test')
port1.close()
port2.close()
})

0 comments on commit a2ad981

Please sign in to comment.