From fa21f71ab5eaf43b1dfface1cf020c6b33383fc7 Mon Sep 17 00:00:00 2001 From: Egge <80262989+Egge7@users.noreply.github.com> Date: Fri, 12 May 2023 23:20:03 +0200 Subject: [PATCH 1/4] added queue classes --- utils.ts | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) diff --git a/utils.ts b/utils.ts index c50c7e1..5763281 100644 --- a/utils.ts +++ b/utils.ts @@ -109,3 +109,79 @@ export function insertEventIntoAscendingList( return sortedArray } + +export class MessageNode { + private _value: string; + private _next: MessageNode|null; + + public get value(): string { + return this._value; + } + public set value(message: string) { + this._value = message; + } + public get next(): MessageNode|null { + return this._next; + } + public set next(node: MessageNode|null) { + this._next = node; + } + + constructor(message: string) { + this._value = message; + this._next = null; + } +} + +export class MessageQueue { + private _first: MessageNode|null; + private _last: MessageNode|null; + + public get first(): MessageNode|null { + return this._first; + } + public set first(messageNode: MessageNode|null) { + this._first = messageNode; + } + public get last(): MessageNode|null { + return this._last; + } + public set last(messageNode: MessageNode|null) { + this._last = messageNode; + } + private _size: number; + public get size(): number { + return this._size; + } + public set size(v: number) { + this._size = v; + } + + constructor() { + this._first = null; + this._last = null; + this._size = 0; + } + enqueue(message: string): boolean { + const newNode = new MessageNode(message); + if (this._size == 0 || !this._last) { + this._first = newNode; + this._last = newNode; + } else { + this._last.next = newNode; + this._last = newNode; + } + this._size++; + return true; + } + dequeue(): string|null { + if (this._size == 0 || !this._first) return null; + + let prev = this._first; + this._first = prev.next; + prev.next = null; + + this._size--; + return prev.value; + } +} \ No newline at end of file From 97287cad74e6f24c51709eb5bb092e28da79dbe1 Mon Sep 17 00:00:00 2001 From: Egge <80262989+Egge7@users.noreply.github.com> Date: Sat, 13 May 2023 09:44:41 +0200 Subject: [PATCH 2/4] comply with eslint config --- utils.ts | 86 ++++++++++++++++++++++++++++---------------------------- 1 file changed, 43 insertions(+), 43 deletions(-) diff --git a/utils.ts b/utils.ts index 5763281..86e9eb2 100644 --- a/utils.ts +++ b/utils.ts @@ -111,77 +111,77 @@ export function insertEventIntoAscendingList( } export class MessageNode { - private _value: string; - private _next: MessageNode|null; + private _value: string + private _next: MessageNode | null public get value(): string { - return this._value; + return this._value } public set value(message: string) { - this._value = message; + this._value = message } - public get next(): MessageNode|null { - return this._next; + public get next(): MessageNode | null { + return this._next } - public set next(node: MessageNode|null) { - this._next = node; + public set next(node: MessageNode | null) { + this._next = node } constructor(message: string) { - this._value = message; - this._next = null; + this._value = message + this._next = null } } export class MessageQueue { - private _first: MessageNode|null; - private _last: MessageNode|null; + private _first: MessageNode | null + private _last: MessageNode | null - public get first(): MessageNode|null { - return this._first; + public get first(): MessageNode | null { + return this._first } - public set first(messageNode: MessageNode|null) { - this._first = messageNode; + public set first(messageNode: MessageNode | null) { + this._first = messageNode } - public get last(): MessageNode|null { - return this._last; + public get last(): MessageNode | null { + return this._last } - public set last(messageNode: MessageNode|null) { - this._last = messageNode; + public set last(messageNode: MessageNode | null) { + this._last = messageNode } - private _size: number; + private _size: number public get size(): number { - return this._size; + return this._size } public set size(v: number) { - this._size = v; + this._size = v } constructor() { - this._first = null; - this._last = null; - this._size = 0; + this._first = null + this._last = null + this._size = 0 } enqueue(message: string): boolean { - const newNode = new MessageNode(message); - if (this._size == 0 || !this._last) { - this._first = newNode; - this._last = newNode; + const newNode = new MessageNode(message) + if (this._size === 0 || !this._last) { + this._first = newNode + this._last = newNode } else { - this._last.next = newNode; - this._last = newNode; + this._last.next = newNode + this._last = newNode } - this._size++; - return true; + this._size++ + return true } - dequeue(): string|null { - if (this._size == 0 || !this._first) return null; + dequeue(): string | null { + if (this._size === 0 || !this._first) return null - let prev = this._first; - this._first = prev.next; - prev.next = null; + let prev = this._first + this._first = prev.next + prev.next = null - this._size--; - return prev.value; - } -} \ No newline at end of file + this._size-- + return prev.value + } +} From 4184609a009a805834c9349fb192ce41b9fefcb9 Mon Sep 17 00:00:00 2001 From: Egge <80262989+Egge7@users.noreply.github.com> Date: Sat, 13 May 2023 09:44:52 +0200 Subject: [PATCH 3/4] added test cases for MessageQueue --- utils.test.ts | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/utils.test.ts b/utils.test.ts index e1ff199..7ad3d3b 100644 --- a/utils.test.ts +++ b/utils.test.ts @@ -1,5 +1,6 @@ import {buildEvent} from './test-helpers.ts' import { + MessageQueue, insertEventIntoAscendingList, insertEventIntoDescendingList, } from './utils.ts' @@ -191,3 +192,48 @@ describe('inserting into a asc sorted list of events', () => { expect(list1).toHaveLength(3) }) }) + +describe('enque a message into MessageQueue', () => { + test('enque into an empty queue', () => { + const queue = new MessageQueue() + queue.enqueue('node1') + expect(queue.first!.value).toBe('node1') + }) + test('enque into a non-empty queue', () => { + const queue = new MessageQueue() + queue.enqueue('node1') + queue.enqueue('node3') + queue.enqueue('node2') + expect(queue.first!.value).toBe('node1') + expect(queue.last!.value).toBe('node2') + expect(queue.size).toBe(3) + }) + test('dequeue from an empty queue', () => { + const queue = new MessageQueue() + const item1 = queue.dequeue() + expect(item1).toBe(null) + expect(queue.size).toBe(0) + }) + test('dequeue from a non-empty queue', () => { + const queue = new MessageQueue() + queue.enqueue('node1') + queue.enqueue('node3') + queue.enqueue('node2') + const item1 = queue.dequeue() + expect(item1).toBe('node1') + const item2 = queue.dequeue() + expect(item2).toBe('node3') + }) + test('dequeue more than in queue', () => { + const queue = new MessageQueue() + queue.enqueue('node1') + queue.enqueue('node3') + const item1 = queue.dequeue() + expect(item1).toBe('node1') + const item2 = queue.dequeue() + expect(item2).toBe('node3') + expect(queue.size).toBe(0) + const item3 = queue.dequeue() + expect(item3).toBe(null) + }) +}) From 5b15237b9541d9ca2a3347ef86cd22e9933fa69b Mon Sep 17 00:00:00 2001 From: Egge <80262989+Egge7@users.noreply.github.com> Date: Tue, 16 May 2023 17:16:38 +0200 Subject: [PATCH 4/4] replace ArrayList with Queue --- relay.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/relay.ts b/relay.ts index 3b91bd7..cd7b39e 100644 --- a/relay.ts +++ b/relay.ts @@ -3,6 +3,7 @@ import {verifySignature, validateEvent, type Event} from './event.ts' import {matchFilters, type Filter} from './filter.ts' import {getHex64, getSubscriptionId} from './fakejson.ts' +import { MessageQueue } from './utils.ts' type RelayEvent = { connect: () => void | Promise @@ -122,24 +123,24 @@ export function relayInit( listeners.disconnect.forEach(cb => cb()) } - let incomingMessageQueue: string[] = [] + let incomingMessageQueue: MessageQueue = new MessageQueue() let handleNextInterval: any ws.onmessage = e => { - incomingMessageQueue.push(e.data) + incomingMessageQueue.enqueue(e.data) if (!handleNextInterval) { handleNextInterval = setInterval(handleNext, 0) } } function handleNext() { - if (incomingMessageQueue.length === 0) { + if (incomingMessageQueue.size === 0) { clearInterval(handleNextInterval) handleNextInterval = null return } - var json = incomingMessageQueue.shift() + var json = incomingMessageQueue.dequeue() if (!json) return let subid = getSubscriptionId(json)