PORTS: One promise, one resolver (test) (#1022)

This commit is contained in:
Snarling 2024-01-14 16:05:57 -05:00 committed by GitHub
parent 87c4cbbc57
commit 44f0a77c4e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -21,7 +21,14 @@ export function getPort(n: PortNumber) {
export class Port {
data: PortData[] = [];
resolvers: Resolver[] = [];
resolver: Resolver | null = null;
promise: Promise<void> | null = null;
resolve() {
if (!this.resolver) return;
this.resolver();
this.resolver = null;
this.promise = null;
}
}
export function portHandle(n: PortNumber): NetscriptPort {
return {
@ -42,9 +49,9 @@ export function writePort(n: PortNumber, value: unknown): PortData | null {
`port.write: Tried to write type ${typeof value}. Only string and number types may be written to ports.`,
);
}
const { data, resolvers } = getPort(n);
const { data, resolve } = getPort(n);
data.push(value);
for (const res of resolvers.splice(0, resolvers.length)) res();
resolve();
if (data.length > Settings.MaxPortCapacity) return data.shift() as PortData;
return null;
}
@ -55,10 +62,10 @@ export function tryWritePort(n: PortNumber, value: unknown): boolean {
`port.write: Tried to write type ${typeof value}. Only string and number types may be written to ports.`,
);
}
const { data, resolvers } = getPort(n);
const { data, resolve } = getPort(n);
if (data.length >= Settings.MaxPortCapacity) return false;
data.push(value);
for (const res of resolvers.splice(0, resolvers.length)) res();
resolve();
return true;
}
@ -66,7 +73,7 @@ export function readPort(n: PortNumber): PortData {
const port = NetscriptPorts.get(n);
if (!port || !port.data.length) return emptyPortData;
const returnVal = port.data.shift() as PortData;
if (!port.data.length && !port.resolvers.length) NetscriptPorts.delete(n);
if (!port.data.length && !port.resolver) NetscriptPorts.delete(n);
return returnVal;
}
@ -77,8 +84,10 @@ export function peekPort(n: PortNumber): PortData {
}
function nextWritePort(n: PortNumber) {
const { resolvers } = getPort(n);
return new Promise<void>((res) => resolvers.push(res as Resolver));
const port = getPort(n);
if (port.promise) return port.promise;
port.promise = new Promise<void>((res) => (port.resolver = res));
return port.promise;
}
function isFullPort(n: PortNumber) {
@ -96,6 +105,6 @@ function isEmptyPort(n: PortNumber) {
export function clearPort(n: PortNumber) {
const port = NetscriptPorts.get(n);
if (!port) return;
if (!port.resolvers.length) NetscriptPorts.delete(n);
if (!port.resolver) NetscriptPorts.delete(n);
port.data.length = 0;
}