Skip to content

Commit

Permalink
fix: node transferrables (#83)
Browse files Browse the repository at this point in the history
  • Loading branch information
levivilet committed Aug 25, 2024
1 parent 59f24a4 commit 1c5de22
Show file tree
Hide file tree
Showing 7 changed files with 42 additions and 17 deletions.
3 changes: 2 additions & 1 deletion src/parts/GetTransferrables/GetTransferrables.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import * as WalkValue from '../WalkValue/WalkValue.ts'
import * as IsTransferrable from '../IsTransferrable/IsTransferrable.ts'

export const getTransferrables = (value: unknown): any => {
const transferrables: Transferable[] = []
WalkValue.walkValue(value, transferrables)
WalkValue.walkValue(value, transferrables, IsTransferrable.isTransferrable)
return transferrables
}
9 changes: 9 additions & 0 deletions src/parts/GetTransferrablesNode/GetTransferrablesNode.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import * as GetTransferrables from '../GetTransferrables/GetTransferrables.ts'

export const getTransferrablesNode = (value: unknown): any => {
const transferrables = GetTransferrables.getTransferrables(value)
if (transferrables.length === 0) {
throw new Error(`no transferrables found`)
}
return transferrables[0]
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import * as GetTransferrablesNode from '../GetTransferrablesNode/GetTransferrablesNode.ts'
import { Ipc } from '../Ipc/Ipc.ts'
import type { NodeJsProcess } from '../NodeJsProcess/NodeJsProcess.ts'
import * as ReadyMessage from '../ReadyMessage/ReadyMessage.ts'
import * as GetTransferrables from '../GetTransferrables/GetTransferrables.ts'

export const listen = async () => {
if (!process.send) {
Expand Down Expand Up @@ -46,7 +46,7 @@ class IpcChildWithNodeForkedProcess extends Ipc<NodeJsProcess> {
}

override sendAndTransfer(message: any): void {
const transfer = GetTransferrables.getTransferrables(message)
const transfer = GetTransferrablesNode.getTransferrablesNode(message)
this._rawIpc.send(message, transfer)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ import * as Assert from '../Assert/Assert.ts'
import { ChildProcessError } from '../ChildProcessError/ChildProcessError.ts'
import * as FirstNodeWorkerEventType from '../FirstNodeWorkerEventType/FirstNodeWorkerEventType.ts'
import * as GetFirstNodeChildProcessEvent from '../GetFirstNodeChildProcessEvent/GetFirstNodeChildProcessEvent.ts'
import * as GetTransferrablesNode from '../GetTransferrablesNode/GetTransferrablesNode.ts'
import { Ipc } from '../Ipc/Ipc.ts'
import { VError } from '../VError/VError.ts'
import * as GetTransferrables from '../GetTransferrables/GetTransferrables.ts'

// @ts-ignore
export const create = async ({ path, argv = [], env, execArgv = [], stdio = 'inherit', name = 'child process' }) => {
Expand Down Expand Up @@ -52,7 +52,7 @@ class IpcParentWithNodeForkedProcess extends Ipc<ChildProcess> {
}

override sendAndTransfer(message: any): void {
const transfer = GetTransferrables.getTransferrables(message)
const transfer = GetTransferrablesNode.getTransferrablesNode(message)
this._rawIpc.send(message, transfer)
}

Expand Down
4 changes: 2 additions & 2 deletions src/parts/IpcParentWithNodeWorker/IpcParentWithNodeWorker.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import * as Assert from '../Assert/Assert.ts'
import * as FirstNodeWorkerEventType from '../FirstNodeWorkerEventType/FirstNodeWorkerEventType.ts'
import * as GetFirstNodeWorkerEvent from '../GetFirstNodeWorkerEvent/GetFirstNodeWorkerEvent.ts'
import * as GetTransferrablesNode from '../GetTransferrablesNode/GetTransferrablesNode.ts'
import { IpcError } from '../IpcError/IpcError.ts'
import * as ReadyMessage from '../ReadyMessage/ReadyMessage.ts'
import * as GetTransferrables from '../GetTransferrables/GetTransferrables.ts'

// @ts-ignore
export const create = async ({ path, argv = [], env = process.env, execArgv = [] }) => {
Expand Down Expand Up @@ -55,7 +55,7 @@ export const wrap = (worker) => {
},
// @ts-ignore
sendAndTransfer(message) {
const transfer = GetTransferrables.getTransferrables(message)
const transfer = GetTransferrablesNode.getTransferrablesNode(message)
this.worker.postMessage(message, transfer)
},
dispose() {
Expand Down
16 changes: 6 additions & 10 deletions src/parts/WalkValue/WalkValue.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,21 @@
import * as IsTransferrable from '../IsTransferrable/IsTransferrable.ts'

export const walkValue = (value: unknown, transferrables: unknown[]) => {
export const walkValue = (value: unknown, transferrables: unknown[], isTransferrable: (value: any) => boolean) => {
if (!value) {
return value
return
}
if (IsTransferrable.isTransferrable(value)) {
if (isTransferrable(value)) {
transferrables.push(value)
return
}
if (Array.isArray(value)) {
for (const item of value) {
walkValue(item, transferrables)
walkValue(item, transferrables, isTransferrable)
}
return
}
if (typeof value === 'object') {
const newObject = Object.create(null)
for (const property of Object.values(value)) {
walkValue(property, transferrables)
walkValue(property, transferrables, isTransferrable)
}
return newObject
return
}
return value
}
19 changes: 19 additions & 0 deletions test/GetTransferrablesNode.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { expect, test } from '@jest/globals'
import * as GetTransferrablesNode from '../src/parts/GetTransferrablesNode/GetTransferrablesNode.js'

test('socket inside object', () => {
class Socket {}
const socket = new Socket()
const message = {
jsonrpc: '2.0',
method: 'HandleWebSocket.handleWebSocket',
params: [socket],
id: 1,
}
expect(GetTransferrablesNode.getTransferrablesNode(message)).toBe(socket)
})

test('no transferrables', () => {
const value: any[] = []
expect(() => GetTransferrablesNode.getTransferrablesNode(value)).toThrow(new Error('no transferrables found'))
})

0 comments on commit 1c5de22

Please sign in to comment.