Skip to content

Connections

Guide: Connections

function context<TValue>(make: (ctx: Context) => TValue): Contextual<TValue>

Defined in: connections/utils.ts:262

Build the exposed value once per connection, from that connection’s context, rather than sharing one value across every realm that connects. It runs BEFORE the value is boxed and sent, which is what lets one server answer each realm differently:

expose(
context(({ origin }) => resolvers(idFor(origin))),
{ transport },
)

A wrapper rather than “pass a function”, because osra exposes functions as endpoints, so a bare typeof value === 'function' cannot tell a per-peer factory from a plain function value.

What the read side needs is not declared here: connection: sees the same context and derives its own.

TValue

(ctx: Context) => TValue

Contextual<TValue>


Guide: Low-level API

function relay(transportA: Transport, transportB: Transport, __namedParameters?: RelayOptions): void

Defined in: connections/relay.ts:22

Transport

Transport

RelayOptions = {}

void


function startConnections<T, TModules, TResult>(
value: Capable<TModules> | Contextual<Capable<TModules>>,
__namedParameters: StartConnectionsOptions<TModules>,
): Exposed<TResult>

Defined in: connections/index.ts:74

T = unknown

TModules extends readonly RevivableModule[] = readonly [__module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, { box: (value: number, context: RevivableContext<any>) => number | BoxedNonFiniteNumber; isType: (value: unknown) => value is number; revive: (value: BoxedNonFiniteNumber, _context: RevivableContext<any>) => number; type: "nonFiniteNumber"; }, { box: (value: undefined, context: RevivableContext<any>) => BoxedUndefined | undefined; isType: (value: unknown) => value is undefined; revive: (_value: BoxedUndefined, _context: RevivableContext<any>) => undefined; type: "undefined"; }, { box: (value: Clonable, _context: RevivableContext<any>) => Clonable; capableOnly: true; isType: (value: unknown) => value is Clonable; objectsOnly: true; revive: (value: BoxedClonable, _context: RevivableContext<any>) => Clonable; type: "clonable"; }, { box: (value: Transferable, _context: RevivableContext<any>) => Transferable; capableOnly: true; isType: (value: unknown) => value is Transferable; objectsOnly: true; revive: (value: BoxedTransferable, _context: RevivableContext<any>) => Transferable; type: "transferable"; }, { box: (value: Blob, context: RevivableContext<any>) => Blob; capableOnly: true; isType: (value: unknown) => value is Blob; objectsOnly: true; revive: (value: BoxedBlob, _context: RevivableContext<any>) => Blob; type: "blob"; }, __module, { box: (_value: never, _context: RevivableContext<any>) => BoxedUnclonable; isType: (value: unknown) => value is never; objectsOnly: true; revive: (_value: BoxedUnclonable, _context: RevivableContext<any>) => Record<string, never>; type: "unclonable"; }]

TResult = T

| Capable<TModules> | Contextual<Capable<TModules>>

StartConnectionsOptions<TModules>

Exposed<TResult>

type BidirectionalConnection<TModules> = {
remoteValue: Promise<Capable>
revivableContext: ConnectionRevivableContext<TModules>
}

Defined in: connections/bidirectional.ts:102

TModules extends readonly RevivableModule[] = DefaultRevivableModules

remoteValue: Promise<Capable>

Defined in: connections/bidirectional.ts:106

revivableContext: ConnectionRevivableContext<TModules>

Defined in: connections/bidirectional.ts:105


Guide: TypeScript

type Connected<TValue> = {
context: Context
value: TValue
}

Defined in: connections/utils.ts:122

An established connection: the value that realm exposed, and what this side knows about the realm it came from. context is whatever the transport observed, plus an abort that drops this one peer. Anything derived from it is the caller’s to compute, in the value factory or in connection:, rather than something to declare up front.

TValue

context: Context

Defined in: connections/utils.ts:124

value: TValue

Defined in: connections/utils.ts:123


type ConnectionContext<TModules> = BidirectionalConnectionContext<TModules>

Defined in: connections/index.ts:69

TModules extends readonly RevivableModule[] = DefaultRevivableModules


type ConnectionMessage<TModules, T> = DefaultConnectionModule extends {
Messages: (modules: TModules, value: T) => infer R
}
? R
: never

Defined in: connections/index.ts:59

TModules extends readonly RevivableModule[] = DefaultRevivableModules

T extends Capable<TModules> = Capable<TModules>


type ConnectionModule<T> = {
init: (ctx: ProtocolContext<any>) => void
Messages?: T
type: string
}

Defined in: connections/index.ts:44

T

readonly init: (ctx: ProtocolContext<any>) => void;

Defined in: connections/index.ts:47

ProtocolContext<any>

void

readonly optional Messages?: T;

Defined in: connections/index.ts:48

readonly type: string;

Defined in: connections/index.ts:45


type ConnectionQueue<TRemote> = {
close: () => void
iterate: () => AsyncIterableIterator<Connected<TRemote>>
push: (connection: Connected<TRemote>) => void
}

Defined in: connections/utils.ts:134

TRemote

close: () => void;

Defined in: connections/utils.ts:136

void

iterate: () => AsyncIterableIterator<Connected<TRemote>>

Defined in: connections/utils.ts:137

AsyncIterableIterator<Connected<TRemote>>

push: (connection: Connected<TRemote>) => void;

Defined in: connections/utils.ts:135

Connected<TRemote>

void


type ConnectionRevivableContext<TModules> = {
eventTarget: MessageEventTarget<TModules>
remoteUuid: Uuid
revivableModules: TModules
sendMessage: (message: MessageFields & Record<string, unknown>) => void
transport: Transport
}

Defined in: connections/bidirectional.ts:44

TModules extends readonly RevivableModule[] = DefaultRevivableModules

eventTarget: MessageEventTarget<TModules>

Defined in: connections/bidirectional.ts:51

remoteUuid: Uuid

Defined in: connections/bidirectional.ts:48

revivableModules: TModules

Defined in: connections/bidirectional.ts:50

sendMessage: (message: MessageFields & Record<string, unknown>) => void;

Defined in: connections/bidirectional.ts:49

MessageFields & Record<string, unknown>

void

transport: Transport

Defined in: connections/bidirectional.ts:47


Guide: Connections

type Contextual<TValue> = {
[CONTEXT]: (ctx: Context) => TValue
}

Defined in: connections/utils.ts:245

TValue

[CONTEXT]: (ctx: Context) => TValue;

Defined in: connections/utils.ts:246

Context

TValue


type DefaultConnectionModule = DefaultConnectionModules[number]

Defined in: connections/index.ts:57


type DefaultConnectionModules = typeof connections

Defined in: connections/index.ts:56


Guide: TypeScript

type Exposed<TResult> = Promise<TResult> & AsyncIterable<TResult>

Defined in: connections/utils.ts:132

The result of expose. Awaiting it gives the first peer, iterating it gives every peer as it connects, and both hand back the same thing: one shape, read once or read repeatedly.

What that shape IS comes from the connection: option. Without one it is the peer’s value, which is what expose has always resolved to. With one it is whatever that function returns.

TResult


type InitMessage<TModules, T> = {
data: DeepReplaceWithBox<T, TModules[number]>
remoteUuid: Uuid
type: 'init'
}

Defined in: connections/bidirectional.ts:16

TModules extends readonly RevivableModule[] = DefaultRevivableModules

T extends Capable<TModules> = Capable<TModules>

data: DeepReplaceWithBox<T, TModules[number]>

Defined in: connections/bidirectional.ts:22

remoteUuid: Uuid

Defined in: connections/bidirectional.ts:21

type: 'init'

Defined in: connections/bidirectional.ts:20


type Messages = <TModules, T>(modules: TModules, value: T) => InitMessage<TModules, T>

Defined in: connections/bidirectional.ts:25

TModules extends readonly RevivableModule[] = readonly [__module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, __module, { box: (value: number, context: RevivableContext<any>) => number | BoxedNonFiniteNumber; isType: (value: unknown) => value is number; revive: (value: BoxedNonFiniteNumber, _context: RevivableContext<any>) => number; type: "nonFiniteNumber"; }, { box: (value: undefined, context: RevivableContext<any>) => BoxedUndefined | undefined; isType: (value: unknown) => value is undefined; revive: (_value: BoxedUndefined, _context: RevivableContext<any>) => undefined; type: "undefined"; }, { box: (value: Clonable, _context: RevivableContext<any>) => Clonable; capableOnly: true; isType: (value: unknown) => value is Clonable; objectsOnly: true; revive: (value: BoxedClonable, _context: RevivableContext<any>) => Clonable; type: "clonable"; }, { box: (value: Transferable, _context: RevivableContext<any>) => Transferable; capableOnly: true; isType: (value: unknown) => value is Transferable; objectsOnly: true; revive: (value: BoxedTransferable, _context: RevivableContext<any>) => Transferable; type: "transferable"; }, { box: (value: Blob, context: RevivableContext<any>) => Blob; capableOnly: true; isType: (value: unknown) => value is Blob; objectsOnly: true; revive: (value: BoxedBlob, _context: RevivableContext<any>) => Blob; type: "blob"; }, __module, { box: (_value: never, _context: RevivableContext<any>) => BoxedUnclonable; isType: (value: unknown) => value is never; objectsOnly: true; revive: (_value: BoxedUnclonable, _context: RevivableContext<any>) => Record<string, never>; type: "unclonable"; }]

T extends any = Capable<TModules>

TModules

T

InitMessage<TModules, T>


type Messages<TModules, T> = ReturnType<typeof Messages>

Defined in: connections/bidirectional.ts:25

TModules extends readonly RevivableModule[] = DefaultRevivableModules

T extends Capable<TModules> = Capable<TModules>


type ProtocolContext<TModules> = {
abortConnection: (remoteUuid: Uuid) => void
addConnection: (ctx: Context, value: Capable<TModules>) => void
claimPendingAbort: (remoteUuid: Uuid) => boolean
connectionContexts: Map<string, ConnectionContext<TModules>>
createConnectionEventTarget: () => TypedEventTarget<MessageEventMap<TModules>>
getUuid: () => Uuid
presetRemoteUuid?: Uuid
protocolEventTarget: ProtocolEventTarget<TModules>
rejectRemoteValue: (error: unknown) => void
revivableModules: TModules
sendMessage: (message: MessageVariant, targetOrigin?: string) => void
transport: Transport
unregisterSignal?: AbortSignal
valueFor: (peer: Context) => Capable<TModules>
}

Defined in: connections/utils.ts:54

TModules extends readonly RevivableModule[] = DefaultRevivableModules

abortConnection: (remoteUuid: Uuid) => void;

Defined in: connections/utils.ts:74

tears down one connection: close to the peer, teardown locally, drop it from tracking

Uuid

void

addConnection: (ctx: Context, value: Capable<TModules>) => void;

Defined in: connections/utils.ts:72

reports an established connection: settles the first-connection promise and feeds iteration, so a caller sees every realm rather than only the one that happened to connect first

Context

Capable<TModules>

void

claimPendingAbort: (remoteUuid: Uuid) => boolean

Defined in: connections/utils.ts:76

true when this uuid was aborted before it was registered, which means refuse the registration

Uuid

boolean

connectionContexts: Map<string, ConnectionContext<TModules>>

Defined in: connections/utils.ts:62

createConnectionEventTarget: () => TypedEventTarget<MessageEventMap<TModules>>

Defined in: connections/utils.ts:77

TypedEventTarget<MessageEventMap<TModules>>

getUuid: () => Uuid

Defined in: connections/utils.ts:63

Uuid

optional presetRemoteUuid?: Uuid;

Defined in: connections/utils.ts:64

protocolEventTarget: ProtocolEventTarget<TModules>

Defined in: connections/utils.ts:68

rejectRemoteValue: (error: unknown) => void;

Defined in: connections/utils.ts:69

unknown

void

revivableModules: TModules

Defined in: connections/utils.ts:61

sendMessage: (message: MessageVariant, targetOrigin?: string) => void;

Defined in: connections/utils.ts:67

targetOrigin overrides the configured origin for this one send - only the unsolicited announce beacon broadcasts with ‘*’.

MessageVariant

string

void

transport: Transport

Defined in: connections/utils.ts:57

optional unregisterSignal?: AbortSignal;

Defined in: connections/utils.ts:78

valueFor: (peer: Context) => Capable<TModules>

Defined in: connections/utils.ts:60

The exposed value for ONE peer. A factory rather than a value so a server can answer each realm differently (scoped resolvers per origin) instead of sharing one object across every connection.

Context

Capable<TModules>


type ProtocolEventMap<TModules> = {
message: CustomEvent<{
message: Message<TModules>
peer: () => Context
}>
}

Defined in: connections/utils.ts:43

TModules extends readonly RevivableModule[] = DefaultRevivableModules

message: CustomEvent<{
message: Message<TModules>
peer: () => Context
}>

Defined in: connections/utils.ts:47


type ProtocolEventTarget<TModules> = TypedEventTarget<ProtocolEventMap<TModules>>

Defined in: connections/utils.ts:50

TModules extends readonly RevivableModule[] = DefaultRevivableModules


Guide: Low-level API

type RelayOptions = {
key?: string
nameA?: string
nameB?: string
origin?: string
originA?: string
originB?: string
unregisterSignal?: AbortSignal
}

Defined in: connections/relay.ts:12

optional key?: string;

Defined in: connections/relay.ts:13

optional nameA?: string;

Defined in: connections/relay.ts:17

optional nameB?: string;

Defined in: connections/relay.ts:18

optional origin?: string;

Defined in: connections/relay.ts:14

optional originA?: string;

Defined in: connections/relay.ts:15

optional originB?: string;

Defined in: connections/relay.ts:16

optional unregisterSignal?: AbortSignal;

Defined in: connections/relay.ts:19


type StartConnectionsOptions<TModules> = {
connection?: (connected: Connected<unknown>) => unknown
key?: string
name?: string
origin?: string
remoteName?: string
remoteUuid?: Uuid
revivableModules?: (defaults: DefaultRevivableModules) => TModules
transport: Transport
unregisterSignal?: AbortSignal
uuid?: Uuid
}

Defined in: connections/utils.ts:81

TModules extends readonly RevivableModule[] = DefaultRevivableModules

optional connection?: (connected: Connected<unknown>) => unknown;

Defined in: connections/utils.ts:115

Decides what one connection resolves to, for the await and for iteration alike. Omit it and that is the peer’s value, which is what expose has always given back:

const remote = await expose(api, { transport })
const { value, context } = await expose(api, {
transport,
connection: ({ value, context }) => ({ value, context }),
})
for await (const origin of expose(api, {
transport,
connection: ({ context }) => context.origin,
})) {
}

It runs per connection, on this side, after the handshake. It cannot change what is sent, and nothing it returns crosses the wire.

Connected<unknown>

unknown

optional key?: string;

Defined in: connections/utils.ts:87

optional name?: string;

Defined in: connections/utils.ts:85

optional origin?: string;

Defined in: connections/utils.ts:88

optional remoteName?: string;

Defined in: connections/utils.ts:86

optional remoteUuid?: Uuid;

Defined in: connections/utils.ts:95

optional revivableModules?: (defaults: DefaultRevivableModules) => TModules;

Defined in: connections/utils.ts:93

Configure the revivable module list. Receives the defaults and returns the final ordered list - add modules, drop defaults, reorder, or override per-type as needed.

DefaultRevivableModules

TModules

transport: Transport

Defined in: connections/utils.ts:84

optional unregisterSignal?: AbortSignal;

Defined in: connections/utils.ts:89

optional uuid?: Uuid;

Defined in: connections/utils.ts:94