From e14082795c138ed9a430aff229e2ecf879b6dbb8 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Thu, 4 Mar 2021 11:29:37 +0100 Subject: [PATCH] Client/server! --- src/sandbox.ts | 34 ++++++++++++++++++++++++++++++++++ src/server.ts | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 src/sandbox.ts create mode 100644 src/server.ts diff --git a/src/sandbox.ts b/src/sandbox.ts new file mode 100644 index 0000000..756a4b0 --- /dev/null +++ b/src/sandbox.ts @@ -0,0 +1,34 @@ +import { Actor, Ref, Turn } from "./actor.js"; +import { Relay, spawnRelay } from "./relay.js"; + +import * as net from 'net'; + +const [ moduleName ] = process.argv.slice(2); + +const socket = net.createConnection({ port: 5999, host: 'localhost' }, () => { + Turn.for(new Actor(), t => { + let shutdownRef: Ref; + spawnRelay(t, { + packetWriter: bs => socket.write(bs), + setup(t: Turn, r: Relay) { + socket.on('error', err => t.freshen(t => + ((err as any).code === 'ECONNRESET') ? t.quit() : t.crash(err))); + socket.on('close', () => t.freshen(t => t.quit())); + socket.on('end', () => t.freshen(t => t.quit())); + socket.on('data', data => r.accept(data)); + t.actor.atExit(() => { + console.log('closing socket'); + socket.destroy(); + }); + shutdownRef = t.ref({ + retract(t) { t.quit(); } + }); + }, + initialOid: 0, + // debug: true, + }).then(ds => import(moduleName).then(m => t.freshen(t => { + t.assert(shutdownRef, true); + m.default(t, ds); + }))); + }); +}); diff --git a/src/server.ts b/src/server.ts new file mode 100644 index 0000000..0531096 --- /dev/null +++ b/src/server.ts @@ -0,0 +1,38 @@ +import { Actor, Turn } from './actor.js'; +import { Dataspace } from './dataspace.js'; +import { Relay, spawnRelay } from './relay.js'; +import * as net from 'net'; + +Turn.for(new Actor(), t => { + const ds = t.ref(new Dataspace()); + + function spawnConnection(t: Turn, socket: net.Socket) { + console.log('connection', socket.remoteAddress, socket.remotePort); + spawnRelay(t, { + packetWriter: bs => socket.write(bs), + setup(t: Turn, r: Relay) { + socket.on('error', err => t.freshen(t => + ((err as any).code === 'ECONNRESET') ? t.quit() : t.crash(err))); + socket.on('close', () => t.freshen(t => t.quit())); + socket.on('end', () => t.freshen(t => t.quit())); + socket.on('data', data => r.accept(data)); + t.actor.atExit(() => socket.destroy()); + }, + initialRef: ds, + // debug: true, + }); + } + + t.spawn(t => { + const server = net.createServer(socket => t.freshen(t => spawnConnection(t, socket))); + server.on('error', err => t.freshen(t => t.crash(err))); + server.listen(5999, '0.0.0.0', 512); + t.actor.atExit(() => { + try { + server.close(); + } catch (e) { + console.error(e); + } + }); + }); +});