Skip to content

Commit d31d1c1

Browse files
committed
nodejs workers for validation
1 parent 46a9c6f commit d31d1c1

File tree

3 files changed

+37
-9
lines changed

3 files changed

+37
-9
lines changed

packages/sdk/src/signature/ServerSignatureValidation.ts

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,28 @@
1-
/**
2-
* Node.js implementation of signature validation.
3-
* Runs on the main thread (worker threads can be added later if needed).
4-
*/
1+
import * as Comlink from 'comlink'
2+
import nodeEndpoint from 'comlink/dist/umd/node-adapter'
3+
import { Worker } from "worker_threads"
54
import { StreamMessage } from '../protocol/StreamMessage'
65
import { SignatureValidationContext } from './SignatureValidationContext'
7-
import { SignatureValidationResult, validateSignatureData } from './signatureValidation'
6+
import { SignatureValidationWorkerApi } from './SignatureValidationWorker'
7+
import { SignatureValidationResult } from './signatureValidation'
8+
import { join } from 'path'
89

910
export default class ServerSignatureValidation implements SignatureValidationContext {
1011

11-
// eslint-disable-next-line class-methods-use-this
12+
private readonly worker: Worker
13+
private readonly workerApi: Comlink.Remote<SignatureValidationWorkerApi>
14+
constructor() {
15+
const isRunningFromDist = __dirname.includes('/dist/')
16+
const workerPath = isRunningFromDist
17+
? join(__dirname, 'SignatureValidationWorker.js')
18+
: join(__dirname, '../../dist/src/signature/SignatureValidationWorker.js')
19+
this.worker = new Worker(workerPath)
20+
this.workerApi = Comlink.wrap<SignatureValidationWorkerApi>(nodeEndpoint(this.worker))
21+
}
22+
1223
async validateSignature(message: StreamMessage): Promise<SignatureValidationResult> {
13-
return validateSignatureData(message)
24+
console.log('validateSignature', message)
25+
return this.workerApi.validateSignature(message)
1426
}
1527

1628
// eslint-disable-next-line class-methods-use-this

packages/sdk/src/signature/SignatureValidationWorker.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,15 @@ const workerApi = {
1010

1111
export type SignatureValidationWorkerApi = typeof workerApi
1212

13-
Comlink.expose(workerApi)
13+
// Detect environment and expose accordingly
14+
if (typeof self !== 'undefined') {
15+
// Browser Web Worker
16+
Comlink.expose(workerApi)
17+
} else {
18+
// Node.js Worker Thread
19+
// eslint-disable-next-line @typescript-eslint/no-require-imports
20+
const { parentPort } = require('worker_threads')
21+
// eslint-disable-next-line @typescript-eslint/no-require-imports
22+
const nodeEndpoint = require('comlink/dist/umd/node-adapter')
23+
Comlink.expose(workerApi, nodeEndpoint(parentPort))
24+
}

packages/sdk/test/unit/SignatureValidator.test.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ describe('SignatureValidator', () => {
2424

2525
describe('SECP256K1', () => {
2626

27-
it('unencrypted message passes signature validation', async () => {
27+
it.only('unencrypted message passes signature validation', async () => {
2828
const message = new StreamMessage({
2929
messageId: new MessageID(
3030
toStreamID('streamr.eth/foo/bar'),
@@ -43,6 +43,11 @@ describe('SignatureValidator', () => {
4343
signature: hexToBinary('e53045adef4e01f7fe11d4b3073c6053688912e4db0ee780c189cd0d128c923457e1f6cbc1e47d9cd57e115afa9eb8524288887777c1056d638b193cae112dda1b'),
4444
signatureType: SignatureType.ECDSA_SECP256K1_EVM
4545
})
46+
try {
47+
await signatureValidator.assertSignatureIsValid(message)
48+
} catch (error) {
49+
console.log(error)
50+
}
4651
await expect(signatureValidator.assertSignatureIsValid(message)).toResolve()
4752
})
4853

0 commit comments

Comments
 (0)