From 40f5ef40857251683bd6f7244d3253ec1a6235e1 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Tue, 12 Mar 2024 22:56:01 +0100 Subject: [PATCH] Replace boundary structure to preserve embedded value separation --- packages/core/src/transport/protocol.ts | 20 +++++++-------- packages/core/src/transport/relay.ts | 33 +++++++++++++------------ 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/packages/core/src/transport/protocol.ts b/packages/core/src/transport/protocol.ts index f8caa53..0c927a7 100644 --- a/packages/core/src/transport/protocol.ts +++ b/packages/core/src/transport/protocol.ts @@ -2,22 +2,22 @@ /// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones import * as S from '../gen/sturdy.js'; -import { Decoder, DecoderState, Encoder, EncoderState, GenericEmbedded, neverEmbeddedType, EmbeddedType, Value, EmbeddedWriter } from '@preserves/core'; +import { Decoder, DecoderState, Encoder, EncoderState, GenericEmbedded, neverEmbeddedType, EmbeddedType, Value, Embedded, EmbeddedWriter } from '@preserves/core'; -export const wireRefEmbeddedType: EmbeddedType & EmbeddedWriter = { - decode(s: DecoderState): S.WireRef { - return S.asWireRef(new Decoder(s).next()); +export const wireRefEmbeddedType: EmbeddedType> & EmbeddedWriter> = { + decode(s: DecoderState): Embedded { + return new Embedded(S.asWireRef(new Decoder(s).next())); }, - encode(s: EncoderState, v: S.WireRef): void { - new Encoder(s, neverEmbeddedType).push(S.fromWireRef(v)); + encode(s: EncoderState, v: Embedded): void { + new Encoder(s, neverEmbeddedType).push(S.fromWireRef(v.value)); }, - fromValue(v: Value): S.WireRef { - return S.asWireRef(v as Value); + fromValue(v: Value): Embedded { + return new Embedded(S.asWireRef(v as Value)); }, - toValue(v: S.WireRef): Value { - return S.fromWireRef(v) as Value; + toValue(v: Embedded): Value { + return S.fromWireRef(v.value) as Value; } }; diff --git a/packages/core/src/transport/relay.ts b/packages/core/src/transport/relay.ts index 6c88310..6651d8e 100644 --- a/packages/core/src/transport/relay.ts +++ b/packages/core/src/transport/relay.ts @@ -2,7 +2,7 @@ /// SPDX-FileCopyrightText: Copyright © 2016-2024 Tony Garnock-Jones import { Actor, Assertion, Entity, Facet, Handle, Ref, Turn } from '../runtime/actor.js'; -import { BytesLike, Decoder, Dictionary, encode, IdentityMap, mapEmbeddeds, stringify, underlying, Value } from '@preserves/core'; +import { BytesLike, Decoder, Dictionary, encode, IdentityMap, mapEmbeddeds, Embedded, stringify, underlying, Value } from '@preserves/core'; import * as IO from '../gen/protocol.js'; import { wireRefEmbeddedType } from './protocol.js'; import { attenuate } from '../runtime/rewrite.js'; @@ -68,7 +68,7 @@ export class RelayEntity implements Entity { this.oid = oid; } - send(m: IO.Event): void { + send(m: IO.Event>): void { this.relay.send(this.oid, m); } @@ -156,7 +156,7 @@ export class Relay { readonly imported = new Membrane(); readonly peer: Ref | null; nextLocalOid: IO.Oid = 0; - pendingTurn: IO.Turn = []; + pendingTurn: IO.Turn> = []; debug: boolean; trustPeer: boolean; @@ -180,7 +180,7 @@ export class Relay { } this.peer = (options.initialOid !== void 0) - ? this.rewriteRefIn(WireRef.mine(options.initialOid), []) + ? this.rewriteRefIn(new Embedded(WireRef.mine(options.initialOid)), []) : null; if (options.nextLocalOid !== void 0) { @@ -188,9 +188,9 @@ export class Relay { } } - register(targetRemoteOid: IO.Oid, assertion: Assertion, handle: Handle): Value; - register(targetRemoteOid: null, assertion: Assertion, handle: null): Value; - register(targetRemoteOid: IO.Oid | null, assertion: Assertion, handle: Handle | null): Value { + register(targetRemoteOid: IO.Oid, assertion: Assertion, handle: Handle): Value>; + register(targetRemoteOid: null, assertion: Assertion, handle: null): Value>; + register(targetRemoteOid: IO.Oid | null, assertion: Assertion, handle: Handle | null): Value> { const transient = (handle === null); const pins: Array = []; const rewritten = mapEmbeddeds(assertion, r => this.rewriteRefOut(r, transient, pins)); @@ -223,18 +223,18 @@ export class Relay { return e.ref; } - rewriteRefOut(r: Ref, transient: boolean, pins: Array): WireRef { + rewriteRefOut(r: Ref, transient: boolean, pins: Array): Embedded { if (r.target instanceof RelayEntity && r.target.relay === this) { if (r.attenuation === void 0 || r.attenuation.length === 0) { // No extra conditions on this reference since it was sent to us. this.grabImportedOid(r.target.oid, pins); - return WireRef.yours({ oid: r.target.oid, attenuation: [] }); + return new Embedded(WireRef.yours({ oid: r.target.oid, attenuation: [] })); } else { // This reference has been attenuated since it was sent to us. // Do we trust the peer to enforce such attenuation on our behalf? if (this.trustPeer) { this.grabImportedOid(r.target.oid, pins); - return WireRef.yours({ oid: r.target.oid, attenuation: r.attenuation }); + return new Embedded(WireRef.yours({ oid: r.target.oid, attenuation: r.attenuation })); } else { // fall through: treat the attenuated ref as a local ref, and re-export it. } @@ -247,10 +247,11 @@ export class Relay { return new WireSymbol(this.exported, this.nextLocalOid++, r); }); pins.push(e); - return WireRef.mine(e.oid); + return new Embedded(WireRef.mine(e.oid)); } - rewriteRefIn(n: WireRef, pins: Array): Ref { + rewriteRefIn(nw: Embedded, pins: Array): Ref { + const n = nw.value; switch (n._variant) { case 'yours': { const e = this.exported.grab("byOid", n.oid, false, null); @@ -283,7 +284,7 @@ export class Relay { message(body: Assertion) { if (body === FLUSH) { - if (this.debug) console.log('OUT', stringify(IO.fromTurn(this.pendingTurn))); + if (this.debug) console.log('OUT', stringify(IO.fromTurn(this.pendingTurn)), this.pendingTurn); this.w(underlying(encode(IO.fromTurn(this.pendingTurn), { canonical: true, embeddedEncode: wireRefEmbeddedType, @@ -292,7 +293,7 @@ export class Relay { } } - send(remoteOid: IO.Oid, m: IO.Event): void { + send(remoteOid: IO.Oid, m: IO.Event>): void { if (this.pendingTurn.length === 0) { Turn.active.message(this.selfRef, FLUSH); } @@ -313,14 +314,14 @@ export class Relay { }); } - rewriteIn(a: Value): [Assertion, Array] + rewriteIn(a: Value>): [Assertion, Array] { const pins: Array = []; const rewritten = mapEmbeddeds(a, r => this.rewriteRefIn(r, pins)); return [rewritten, pins]; } - handle(localOid: IO.Oid, m: IO.Event) { + handle(localOid: IO.Oid, m: IO.Event>) { switch (m._variant) { case 'Assert': { const [a, pins] = this.rewriteIn(m.value.assertion);