mirror of
https://github.com/Cameri/nostream.git
synced 2025-09-18 03:22:13 +02:00
chore: add RELAY_PRIVATE_KEY env var
Signed-off-by: Ricardo Arturo Cabral Mejía <me@ricardocabral.io>
This commit is contained in:
@@ -7,6 +7,7 @@ The following environment variables can be set:
|
|||||||
| Name | Description | Default |
|
| Name | Description | Default |
|
||||||
|----------------------------------|--------------------------------|------------------------|
|
|----------------------------------|--------------------------------|------------------------|
|
||||||
| RELAY_PORT | Relay's server port | 8008 |
|
| RELAY_PORT | Relay's server port | 8008 |
|
||||||
|
| RELAY_PRIVATE_KEY | Relay's private key in hex | (auto-generated) |
|
||||||
| WORKER_COUNT | Number of workers override | No. of available CPUs |
|
| WORKER_COUNT | Number of workers override | No. of available CPUs |
|
||||||
| DB_HOST | PostgresSQL Hostname | |
|
| DB_HOST | PostgresSQL Hostname | |
|
||||||
| DB_PORT | PostgreSQL Port | 5432 |
|
| DB_PORT | PostgreSQL Port | 5432 |
|
||||||
|
@@ -24,7 +24,7 @@ services:
|
|||||||
RR_DB_NAME: nostr_ts_relay
|
RR_DB_NAME: nostr_ts_relay
|
||||||
RR_DB_MIN_POOL_SIZE: 16
|
RR_DB_MIN_POOL_SIZE: 16
|
||||||
RR_DB_MAX_POOL_SIZE: 64
|
RR_DB_MAX_POOL_SIZE: 64
|
||||||
RR_DB_ACQUIRE_CONNECTION_TIMEOUT: 60000
|
RR_DB_ACQUIRE_CONNECTION_TIMEOUT: 10000
|
||||||
# Redis
|
# Redis
|
||||||
REDIS_HOST: nostream-cache
|
REDIS_HOST: nostream-cache
|
||||||
REDIS_PORT: 6379
|
REDIS_PORT: 6379
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import ws, { WebSocket } from 'ws'
|
|
||||||
import cluster from 'cluster'
|
import cluster from 'cluster'
|
||||||
import { EventEmitter } from 'stream'
|
import { EventEmitter } from 'stream'
|
||||||
import { IncomingMessage as IncomingHttpMessage } from 'http'
|
import { IncomingMessage as IncomingHttpMessage } from 'http'
|
||||||
|
import { WebSocket } from 'ws'
|
||||||
|
|
||||||
import { ContextMetadata, Factory } from '../@types/base'
|
import { ContextMetadata, Factory } from '../@types/base'
|
||||||
import { createNoticeMessage, createOutgoingEventMessage } from '../utils/messages'
|
import { createNoticeMessage, createOutgoingEventMessage } from '../utils/messages'
|
||||||
@@ -21,20 +21,6 @@ import { messageSchema } from '../schemas/message-schema'
|
|||||||
import { Settings } from '../@types/settings'
|
import { Settings } from '../@types/settings'
|
||||||
import { SocketAddress } from 'net'
|
import { SocketAddress } from 'net'
|
||||||
|
|
||||||
(() => {
|
|
||||||
(ws as any).Receiver.prototype._write = function _write (chunk: any, _encoding: any, cb: any) {
|
|
||||||
if (this._opcode === 0x08 && this._state == 0) return cb()
|
|
||||||
|
|
||||||
this._bufferedBytes += chunk.length
|
|
||||||
this._buffers.push(chunk)
|
|
||||||
try {
|
|
||||||
this.startLoop(cb)
|
|
||||||
} catch (error) {
|
|
||||||
console.error('what in the world', error)
|
|
||||||
cb(error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})()
|
|
||||||
|
|
||||||
const debug = createLogger('web-socket-adapter')
|
const debug = createLogger('web-socket-adapter')
|
||||||
const debugHeartbeat = debug.extend('heartbeat')
|
const debugHeartbeat = debug.extend('heartbeat')
|
||||||
@@ -68,8 +54,6 @@ export class WebSocketAdapter extends EventEmitter implements IWebSocketAdapter
|
|||||||
family: address.indexOf(':') >= 0 ? 'ipv6' : 'ipv4',
|
family: address.indexOf(':') >= 0 ? 'ipv6' : 'ipv4',
|
||||||
})
|
})
|
||||||
|
|
||||||
console.log(`web-socket-adapter: new client ${this.clientId} (${this.getClientAddress()}) - ${(this.webSocketServer as any).webSocketServer.clients.size} total on worker ${process.pid}`)
|
|
||||||
|
|
||||||
this.client
|
this.client
|
||||||
.on('error', (error) => {
|
.on('error', (error) => {
|
||||||
if (error.name === 'RangeError' && error.message === 'Max payload size exceeded') {
|
if (error.name === 'RangeError' && error.message === 'Max payload size exceeded') {
|
||||||
@@ -282,7 +266,5 @@ export class WebSocketAdapter extends EventEmitter implements IWebSocketAdapter
|
|||||||
|
|
||||||
this.removeAllListeners()
|
this.removeAllListeners()
|
||||||
this.client.removeAllListeners()
|
this.client.removeAllListeners()
|
||||||
|
|
||||||
console.error(`web-socket-adapter: disconnected client ${this.clientId} (${this.getClientAddress()}) - ${(this.webSocketServer as any).webSocketServer.clients.size} total on worker ${process.pid}`)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -180,9 +180,15 @@ export const identifyEvent = async (event: UnidentifiedEvent): Promise<UnsignedE
|
|||||||
}
|
}
|
||||||
|
|
||||||
export const getPrivateKeyFromSecret =
|
export const getPrivateKeyFromSecret =
|
||||||
(secret: string) => (publicKey: Pubkey | Buffer): string => {
|
(secret: string) => (data: string | Buffer): string => {
|
||||||
|
if (process.env.RELAY_PRIVATE_KEY) {
|
||||||
|
return process.env.RELAY_PRIVATE_KEY
|
||||||
|
}
|
||||||
|
|
||||||
const hmac = createHmac('sha256', secret)
|
const hmac = createHmac('sha256', secret)
|
||||||
hmac.update(typeof publicKey === 'string' ? Buffer.from(publicKey, 'hex') : publicKey)
|
|
||||||
|
hmac.update(typeof data === 'string' ? Buffer.from(data) : data)
|
||||||
|
|
||||||
return hmac.digest().toString('hex')
|
return hmac.digest().toString('hex')
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -5,21 +5,30 @@ import WebSocket from 'ws'
|
|||||||
|
|
||||||
import { IEventRepository, IUserRepository } from '../../../src/@types/repositories'
|
import { IEventRepository, IUserRepository } from '../../../src/@types/repositories'
|
||||||
import { IWebSocketServerAdapter } from '../../../src/@types/adapters'
|
import { IWebSocketServerAdapter } from '../../../src/@types/adapters'
|
||||||
|
import { SettingsStatic } from '../../../src/utils/settings'
|
||||||
import { WebSocketAdapter } from '../../../src/adapters/web-socket-adapter'
|
import { WebSocketAdapter } from '../../../src/adapters/web-socket-adapter'
|
||||||
import { webSocketAdapterFactory } from '../../../src/factories/websocket-adapter-factory'
|
import { webSocketAdapterFactory } from '../../../src/factories/websocket-adapter-factory'
|
||||||
|
|
||||||
describe('webSocketAdapterFactory', () => {
|
describe('webSocketAdapterFactory', () => {
|
||||||
let onStub: Sinon.SinonStub
|
let onStub: Sinon.SinonStub
|
||||||
|
let createSettingsStub: Sinon.SinonStub
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
onStub = Sinon.stub()
|
onStub = Sinon.stub()
|
||||||
|
createSettingsStub = Sinon.stub(SettingsStatic, 'createSettings')
|
||||||
})
|
})
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
|
createSettingsStub.restore()
|
||||||
onStub.reset()
|
onStub.reset()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('returns a WebSocketAdapter', () => {
|
it('returns a WebSocketAdapter', () => {
|
||||||
|
createSettingsStub.returns({
|
||||||
|
network: {
|
||||||
|
remoteIpHeader: 'remoteIpHeader',
|
||||||
|
},
|
||||||
|
})
|
||||||
const eventRepository: IEventRepository = {} as any
|
const eventRepository: IEventRepository = {} as any
|
||||||
const userRepository: IUserRepository = {} as any
|
const userRepository: IUserRepository = {} as any
|
||||||
|
|
||||||
|
@@ -4,24 +4,37 @@ import Sinon from 'sinon'
|
|||||||
import * as databaseClientModule from '../../../src/database/client'
|
import * as databaseClientModule from '../../../src/database/client'
|
||||||
|
|
||||||
import { AppWorker } from '../../../src/app/worker'
|
import { AppWorker } from '../../../src/app/worker'
|
||||||
|
import { SettingsStatic } from '../../../src/utils/settings'
|
||||||
import { workerFactory } from '../../../src/factories/worker-factory'
|
import { workerFactory } from '../../../src/factories/worker-factory'
|
||||||
|
|
||||||
|
|
||||||
describe('workerFactory', () => {
|
describe('workerFactory', () => {
|
||||||
|
let createSettingsStub: Sinon.SinonStub
|
||||||
let getMasterDbClientStub: Sinon.SinonStub
|
let getMasterDbClientStub: Sinon.SinonStub
|
||||||
let getReadReplicaDbClientStub: Sinon.SinonStub
|
let getReadReplicaDbClientStub: Sinon.SinonStub
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
|
createSettingsStub = Sinon.stub(SettingsStatic, 'createSettings')
|
||||||
getMasterDbClientStub = Sinon.stub(databaseClientModule, 'getMasterDbClient')
|
getMasterDbClientStub = Sinon.stub(databaseClientModule, 'getMasterDbClient')
|
||||||
getReadReplicaDbClientStub = Sinon.stub(databaseClientModule, 'getReadReplicaDbClient')
|
getReadReplicaDbClientStub = Sinon.stub(databaseClientModule, 'getReadReplicaDbClient')
|
||||||
})
|
})
|
||||||
|
|
||||||
afterEach(() => {
|
afterEach(() => {
|
||||||
getMasterDbClientStub.restore()
|
|
||||||
getReadReplicaDbClientStub.restore()
|
getReadReplicaDbClientStub.restore()
|
||||||
|
getMasterDbClientStub.restore()
|
||||||
|
createSettingsStub.restore()
|
||||||
})
|
})
|
||||||
|
|
||||||
it('returns an AppWorker', () => {
|
it('returns an AppWorker', () => {
|
||||||
|
createSettingsStub.returns({
|
||||||
|
info: {
|
||||||
|
relay_url: 'url',
|
||||||
|
},
|
||||||
|
network: {
|
||||||
|
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
const worker = workerFactory()
|
const worker = workerFactory()
|
||||||
expect(worker).to.be.an.instanceOf(AppWorker)
|
expect(worker).to.be.an.instanceOf(AppWorker)
|
||||||
worker.close()
|
worker.close()
|
||||||
|
@@ -177,23 +177,6 @@ describe('SubscribeMessageHandler', () => {
|
|||||||
)
|
)
|
||||||
})
|
})
|
||||||
|
|
||||||
it('ends event stream if aborted', async () => {
|
|
||||||
isClientSubscribedToEventStub.returns(always(true))
|
|
||||||
|
|
||||||
const abort = () => (handler as IAbortable).abort()
|
|
||||||
const fetch = () => (handler as any).fetchAndSend(subscriptionId, filters)
|
|
||||||
|
|
||||||
const promise = fetch()
|
|
||||||
|
|
||||||
const closeSpy = sandbox.spy()
|
|
||||||
stream.once('close', closeSpy)
|
|
||||||
|
|
||||||
abort()
|
|
||||||
|
|
||||||
await expect(promise).to.eventually.be.rejectedWith(Error, 'The operation was aborted')
|
|
||||||
expect(closeSpy).to.have.been.called
|
|
||||||
})
|
|
||||||
|
|
||||||
it('ends event stream if error occurs', async () => {
|
it('ends event stream if error occurs', async () => {
|
||||||
const error = new Error('mistakes were made')
|
const error = new Error('mistakes were made')
|
||||||
isClientSubscribedToEventStub.returns(always(true))
|
isClientSubscribedToEventStub.returns(always(true))
|
||||||
|
Reference in New Issue
Block a user