@xyo-network/dapp-kit-port 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/README.md +23 -0
  2. package/dist/browser/applicationPortClient.d.ts +6 -0
  3. package/dist/browser/applicationPortClient.d.ts.map +1 -0
  4. package/dist/browser/applicationPortHost.d.ts +10 -0
  5. package/dist/browser/applicationPortHost.d.ts.map +1 -0
  6. package/dist/browser/applicationPortModel.d.ts +154 -0
  7. package/dist/browser/applicationPortModel.d.ts.map +1 -0
  8. package/dist/browser/applicationPortWire.d.ts +327 -0
  9. package/dist/browser/applicationPortWire.d.ts.map +1 -0
  10. package/dist/browser/index.d.ts +6 -0
  11. package/dist/browser/index.d.ts.map +1 -0
  12. package/dist/browser/index.mjs +1180 -0
  13. package/dist/browser/index.mjs.map +7 -0
  14. package/dist/browser/webSocketApplicationPortClient.d.ts +46 -0
  15. package/dist/browser/webSocketApplicationPortClient.d.ts.map +1 -0
  16. package/dist/node/applicationPortClient.d.ts +6 -0
  17. package/dist/node/applicationPortClient.d.ts.map +1 -0
  18. package/dist/node/applicationPortHost.d.ts +10 -0
  19. package/dist/node/applicationPortHost.d.ts.map +1 -0
  20. package/dist/node/applicationPortModel.d.ts +154 -0
  21. package/dist/node/applicationPortModel.d.ts.map +1 -0
  22. package/dist/node/applicationPortWire.d.ts +327 -0
  23. package/dist/node/applicationPortWire.d.ts.map +1 -0
  24. package/dist/node/index.d.ts +6 -0
  25. package/dist/node/index.d.ts.map +1 -0
  26. package/dist/node/index.mjs +1180 -0
  27. package/dist/node/index.mjs.map +7 -0
  28. package/dist/node/webSocketApplicationPortClient.d.ts +46 -0
  29. package/dist/node/webSocketApplicationPortClient.d.ts.map +1 -0
  30. package/package.json +74 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/applicationPortClient.ts", "../../src/applicationPortModel.ts", "../../src/applicationPortHost.ts", "../../src/applicationPortWire.ts", "../../src/webSocketApplicationPortClient.ts"],
4
+ "sourcesContent": ["import type {\n PortFrame,\n PortOperationGrant,\n} from '@xyo-network/dapp-kit'\nimport {\n canonicalizeIJson,\n PortAttachmentGrantZod,\n validatePortFrame,\n} from '@xyo-network/dapp-kit'\n\nimport type {\n ApplicationPortClient,\n ApplicationPortPeerOptions,\n ApplicationPortRequestOptions,\n ApplicationPortStream,\n ApplicationPortStreamRequestOptions,\n ApplicationPortStreamResumeOptions,\n ApplicationPortStreamValue,\n ApplicationPortUnaryResult,\n} from './applicationPortModel.ts'\nimport {\n ApplicationPortCancelledError,\n applicationPortFrameBase,\n applicationPortOperationGrant,\n ApplicationPortProxyError,\n ApplicationPortProxyErrorCode,\n ApplicationPortRemoteError,\n parseApplicationPortFrame,\n} from './applicationPortModel.ts'\n\nexport interface CreateApplicationPortClientOptions extends ApplicationPortPeerOptions {\n readonly nextRequestId: () => string\n}\n\ninterface ClientRequestBase {\n readonly frame: PortFrame\n readonly grant: PortOperationGrant\n isTerminal: boolean\n reasonCode?: string\n readonly removeAbortListener?: () => void\n}\n\ninterface ClientUnaryState extends ClientRequestBase {\n readonly kind: 'unary'\n readonly promise: PromiseWithResolvers<ApplicationPortUnaryResult>\n}\n\ninterface StreamWaiter {\n readonly promise: PromiseWithResolvers<IteratorResult<ApplicationPortStreamValue>>\n}\n\ninterface ClientStreamState extends ClientRequestBase {\n availableCredit: number\n readonly initialCredit: number\n isOpen: boolean\n readonly kind: 'stream'\n lastAcceptedSequence: number\n readonly opened: PromiseWithResolvers<ApplicationPortStream>\n readonly queue: ApplicationPortStreamValue[]\n resumeCursor?: string\n readonly seen: Map<number, string>\n streamId?: string\n terminalError?: Error\n readonly waiters: StreamWaiter[]\n}\n\ntype ClientRequestState = ClientStreamState | ClientUnaryState\ntype StreamOpenFrame = Extract<PortFrame, { frameKind: 'stream-open' }>\ntype StreamItemFrame = Extract<PortFrame, { frameKind: 'stream-item' }>\ntype StreamTerminalFrame = Extract<PortFrame, { frameKind: 'stream-close' | 'stream-error' }>\n\nclass ApplicationPortStreamInstance implements ApplicationPortStream {\n readonly requestId: string\n readonly streamId: string\n private readonly client: ApplicationPortClientInstance\n private readonly state: ClientStreamState\n\n constructor(client: ApplicationPortClientInstance, state: ClientStreamState, streamId: string) {\n this.client = client\n this.requestId = state.frame.requestId\n this.state = state\n this.streamId = streamId\n }\n\n [Symbol.asyncIterator](): ApplicationPortStream {\n return this\n }\n\n cancel(reasonCode = 'client-cancelled'): void {\n this.client.cancel(this.state, reasonCode)\n }\n\n credit(value: number): void {\n this.client.credit(this.state, value)\n }\n\n async next(): Promise<IteratorResult<ApplicationPortStreamValue>> {\n const value = this.state.queue.shift()\n if (value !== undefined) return { done: false, value }\n if (this.state.terminalError !== undefined) throw this.state.terminalError\n if (this.state.isTerminal) return { done: true, value: undefined }\n const waiter: StreamWaiter = { promise: Promise.withResolvers() }\n this.state.waiters.push(waiter)\n return await waiter.promise.promise\n }\n}\n\nclass ApplicationPortClientInstance implements ApplicationPortClient {\n private isClosed = false\n private readonly listener: (message: unknown) => void\n private readonly options: CreateApplicationPortClientOptions\n private readonly requests = new Map<string, ClientRequestState>()\n\n constructor(options: CreateApplicationPortClientOptions) {\n this.options = { ...options, grant: PortAttachmentGrantZod.parse(options.grant) }\n this.listener = message => this.receive(message)\n options.endpoint.addMessageListener(this.listener)\n options.endpoint.start?.()\n }\n\n cancel(state: ClientRequestState, reasonCode: string): void {\n if (state.isTerminal || state.reasonCode !== undefined || this.isClosed) return\n state.reasonCode = reasonCode\n this.post(parseApplicationPortFrame({\n ...applicationPortFrameBase(this.options.grant, state.frame),\n frameKind: 'cancel',\n reasonCode,\n }))\n }\n\n close(): void {\n if (this.isClosed) return\n this.isClosed = true\n this.options.endpoint.removeMessageListener(this.listener)\n const error = new ApplicationPortProxyError(\n ApplicationPortProxyErrorCode.detached,\n 'Application-port client detached before the request completed',\n )\n for (const state of this.requests.values()) this.fail(state, error)\n this.requests.clear()\n }\n\n credit(state: ClientStreamState, value: number): void {\n if (!state.isOpen || state.isTerminal || state.streamId === undefined) {\n throw new ApplicationPortProxyError(\n ApplicationPortProxyErrorCode.streamStateInvalid,\n 'Credit requires an open stream',\n )\n }\n const grant = state.grant as Extract<PortOperationGrant, { streaming: true }>\n this.verifyCredit(value, state.availableCredit, grant)\n state.availableCredit += value\n this.post(parseApplicationPortFrame({\n ...applicationPortFrameBase(this.options.grant, state.frame),\n frameKind: 'stream-credit',\n streamId: state.streamId,\n credit: value,\n }))\n }\n\n request(options: ApplicationPortRequestOptions): Promise<ApplicationPortUnaryResult> {\n if (options.signal?.aborted === true) return Promise.reject(new ApplicationPortCancelledError('client-abort'))\n const grant = this.requireGrant(options.portId, options.operationId, false)\n const frame = this.requestFrame(options)\n const promise = Promise.withResolvers<ApplicationPortUnaryResult>()\n const state: ClientUnaryState = {\n frame, grant, isTerminal: false, kind: 'unary', promise,\n }\n this.requests.set(frame.requestId, state)\n this.setAbortBinding(state, options.signal)\n this.post(frame)\n return promise.promise\n }\n\n resumeStream(options: ApplicationPortStreamResumeOptions): Promise<ApplicationPortStream> {\n if (options.signal?.aborted === true) return Promise.reject(new ApplicationPortCancelledError('client-abort'))\n const grant = this.requireGrant(options.portId, options.operationId, true)\n if (!grant.resumable) {\n throw new ApplicationPortProxyError(\n ApplicationPortProxyErrorCode.operationKindMismatch,\n 'Application-port stream does not permit resume',\n )\n }\n this.verifyCredit(options.credit, 0, grant)\n const frame = parseApplicationPortFrame({\n ...this.newFrameBase(options),\n frameKind: 'stream-resume',\n streamId: options.streamId,\n lastAcceptedSequence: options.lastAcceptedSequence,\n resumeCursor: options.resumeCursor,\n credit: options.credit,\n })\n const state = this.streamState(frame, grant, options.credit)\n state.availableCredit = options.credit\n state.lastAcceptedSequence = options.lastAcceptedSequence\n state.resumeCursor = options.resumeCursor\n state.streamId = options.streamId\n this.requests.set(frame.requestId, state)\n this.setAbortBinding(state, options.signal)\n this.post(frame)\n return state.opened.promise\n }\n\n stream(options: ApplicationPortStreamRequestOptions): Promise<ApplicationPortStream> {\n if (options.signal?.aborted === true) return Promise.reject(new ApplicationPortCancelledError('client-abort'))\n const grant = this.requireGrant(options.portId, options.operationId, true)\n this.verifyCredit(options.initialCredit, 0, grant)\n const frame = this.requestFrame(options)\n const state = this.streamState(frame, grant, options.initialCredit)\n this.requests.set(frame.requestId, state)\n this.setAbortBinding(state, options.signal)\n this.post(frame)\n return state.opened.promise\n }\n\n private completeStream(state: ClientStreamState): void {\n state.isTerminal = true\n state.removeAbortListener?.()\n for (const waiter of state.waiters.splice(0)) {\n if (state.terminalError === undefined) waiter.promise.resolve({ done: true, value: undefined })\n else waiter.promise.reject(state.terminalError)\n }\n this.requests.delete(state.frame.requestId)\n }\n\n private fail(state: ClientRequestState, error: Error): void {\n state.isTerminal = true\n state.removeAbortListener?.()\n if (state.kind === 'unary') state.promise.reject(error)\n else {\n state.terminalError = error\n state.opened.reject(error)\n this.completeStream(state)\n }\n }\n\n private handleStreamFrame(state: ClientStreamState, frame: PortFrame): void {\n if (frame.frameKind === 'error') {\n this.fail(state, new ApplicationPortRemoteError(frame.error))\n return\n }\n if (frame.frameKind === 'cancel-ack') {\n this.fail(state, new ApplicationPortCancelledError(state.reasonCode ?? 'remote-cancelled'))\n return\n }\n if (frame.frameKind === 'stream-open') {\n this.openStream(state, frame)\n return\n }\n if (!state.isOpen || !('streamId' in frame) || frame.streamId !== state.streamId) {\n this.fail(state, new ApplicationPortProxyError(\n ApplicationPortProxyErrorCode.streamStateInvalid,\n 'Stream frame arrived before a matching open',\n ))\n return\n }\n if (frame.frameKind === 'stream-item') this.receiveStreamItem(state, frame)\n else if (frame.frameKind === 'stream-error' || frame.frameKind === 'stream-close') {\n this.terminateStream(state, frame)\n } else {\n this.report(ApplicationPortProxyErrorCode.directionInvalid, 'Client received a client-to-host stream frame', frame)\n }\n }\n\n private newFrameBase(\n options: Pick<ApplicationPortRequestOptions, 'deadlineUnixMs' | 'operationId' | 'portId'>,\n ) {\n if (this.isClosed) {\n throw new ApplicationPortProxyError(ApplicationPortProxyErrorCode.detached, 'Application-port client is closed')\n }\n return applicationPortFrameBase(this.options.grant, {\n ...options,\n requestId: this.options.nextRequestId(),\n })\n }\n\n private openStream(state: ClientStreamState, frame: StreamOpenFrame): void {\n const grant = state.grant as Extract<PortOperationGrant, { streaming: true }>\n const resumeMismatch = state.lastAcceptedSequence > 0 && frame.nextSequence !== state.lastAcceptedSequence + 1\n if (state.isOpen || frame.resumable !== grant.resumable\n || (state.streamId !== undefined && state.streamId !== frame.streamId)\n || resumeMismatch) {\n this.fail(state, new ApplicationPortProxyError(\n ApplicationPortProxyErrorCode.streamStateInvalid,\n 'Stream open conflicts with the pending request',\n ))\n return\n }\n state.isOpen = true\n state.streamId = frame.streamId\n state.lastAcceptedSequence = frame.nextSequence - 1\n state.resumeCursor = frame.resumeCursor\n state.opened.resolve(new ApplicationPortStreamInstance(this, state, frame.streamId))\n if (state.frame.frameKind === 'request') this.credit(state, state.initialCredit)\n }\n\n private post(frame: PortFrame): void {\n if (this.isClosed) {\n throw new ApplicationPortProxyError(ApplicationPortProxyErrorCode.detached, 'Application-port client is closed')\n }\n this.options.endpoint.send(frame)\n }\n\n private receive(value: unknown): void {\n if (this.isClosed) return\n const result = validatePortFrame(value, {\n authenticatedPrincipalId: this.options.authenticatedPrincipalId,\n grant: this.options.grant,\n now: this.options.now(),\n })\n if (!result.success) {\n this.options.onProtocolError({\n cause: new ApplicationPortProxyError(\n ApplicationPortProxyErrorCode.directionInvalid,\n 'Application-port frame failed attachment validation',\n result.issues,\n ),\n value,\n })\n return\n }\n this.receiveValid(result.value)\n }\n\n private receiveStreamItem(state: ClientStreamState, frame: StreamItemFrame): void {\n if (state.availableCredit <= 0) {\n this.fail(state, new ApplicationPortProxyError(\n ApplicationPortProxyErrorCode.streamStateInvalid,\n 'Stream item exceeded receiver credit',\n ))\n return\n }\n state.availableCredit -= 1\n const canonical = canonicalizeIJson({\n body: frame.body,\n consistency: frame.consistency,\n resumeCursor: frame.resumeCursor ?? null,\n })\n const prior = state.seen.get(frame.sequence)\n if (prior !== undefined) {\n if (prior !== canonical) {\n this.fail(state, new ApplicationPortProxyError(\n ApplicationPortProxyErrorCode.streamStateInvalid,\n 'Redelivered stream sequence changed content',\n ))\n }\n return\n }\n if (frame.sequence !== state.lastAcceptedSequence + 1) {\n this.fail(state, new ApplicationPortProxyError(\n ApplicationPortProxyErrorCode.streamStateInvalid,\n 'Stream item sequence is not contiguous',\n ))\n return\n }\n state.seen.set(frame.sequence, canonical)\n state.lastAcceptedSequence = frame.sequence\n state.resumeCursor = frame.resumeCursor\n const value = this.streamValue(frame)\n const waiter = state.waiters.shift()\n if (waiter === undefined) state.queue.push(value)\n else waiter.promise.resolve({ done: false, value })\n }\n\n private receiveUnary(state: ClientUnaryState, frame: PortFrame): void {\n if (frame.frameKind === 'response') {\n state.isTerminal = true\n state.removeAbortListener?.()\n state.promise.resolve({ body: frame.body, consistency: frame.consistency })\n this.requests.delete(frame.requestId)\n return\n }\n if (frame.frameKind === 'error') this.fail(state, new ApplicationPortRemoteError(frame.error))\n else if (frame.frameKind === 'cancel-ack') {\n this.fail(state, new ApplicationPortCancelledError(state.reasonCode ?? 'remote-cancelled'))\n } else this.report(ApplicationPortProxyErrorCode.directionInvalid, 'Client received a client-to-host frame', frame)\n }\n\n private receiveValid(frame: PortFrame): void {\n const state = this.requests.get(frame.requestId)\n if (state === undefined) {\n this.report(ApplicationPortProxyErrorCode.requestUnknown, 'Response targets an unknown request', frame)\n return\n }\n if (frame.portId !== state.frame.portId || frame.operationId !== state.frame.operationId) {\n this.fail(state, new ApplicationPortProxyError(\n ApplicationPortProxyErrorCode.streamStateInvalid,\n 'Response operation does not match its request',\n ))\n return\n }\n if (state.kind === 'stream') {\n this.handleStreamFrame(state, frame)\n return\n }\n this.receiveUnary(state, frame)\n }\n\n private report(code: ApplicationPortProxyErrorCode, message: string, value: unknown): void {\n this.options.onProtocolError({ cause: new ApplicationPortProxyError(code, message), value })\n }\n\n private requestFrame(options: ApplicationPortRequestOptions): Extract<PortFrame, { frameKind: 'request' }> {\n return parseApplicationPortFrame({\n ...this.newFrameBase(options),\n frameKind: 'request',\n body: options.body,\n }) as Extract<PortFrame, { frameKind: 'request' }>\n }\n\n private requireGrant(\n portId: string,\n operationId: string,\n streaming: false,\n ): Extract<PortOperationGrant, { streaming: false }>\n private requireGrant(\n portId: string,\n operationId: string,\n streaming: true,\n ): Extract<PortOperationGrant, { streaming: true }>\n private requireGrant(portId: string, operationId: string, streaming: boolean): PortOperationGrant {\n const grant = applicationPortOperationGrant(this.options.grant, portId, operationId)\n if (grant?.streaming !== streaming) {\n throw new ApplicationPortProxyError(\n ApplicationPortProxyErrorCode.operationKindMismatch,\n `Attachment does not grant ${streaming ? 'stream' : 'unary'} operation ${portId}.${operationId}`,\n )\n }\n return grant\n }\n\n private setAbortBinding(state: ClientRequestState, signal?: AbortSignal): void {\n if (signal === undefined) return\n const listener = () => this.cancel(state, 'client-abort')\n signal.addEventListener('abort', listener, { once: true })\n Object.assign(state, { removeAbortListener: () => signal.removeEventListener('abort', listener) })\n }\n\n private streamState(\n frame: PortFrame,\n grant: Extract<PortOperationGrant, { streaming: true }>,\n initialCredit: number,\n ): ClientStreamState {\n return {\n availableCredit: 0,\n frame,\n grant,\n initialCredit,\n isOpen: false,\n isTerminal: false,\n kind: 'stream',\n lastAcceptedSequence: 0,\n opened: Promise.withResolvers(),\n queue: [],\n seen: new Map(),\n waiters: [],\n }\n }\n\n private streamValue(frame: StreamItemFrame): ApplicationPortStreamValue {\n return {\n body: frame.body,\n consistency: frame.consistency,\n ...(frame.resumeCursor === undefined ? {} : { resumeCursor: frame.resumeCursor }),\n sequence: frame.sequence,\n }\n }\n\n private terminateStream(state: ClientStreamState, frame: StreamTerminalFrame): void {\n if (frame.lastSequence !== Math.max(0, state.lastAcceptedSequence)) {\n this.fail(state, new ApplicationPortProxyError(\n ApplicationPortProxyErrorCode.streamStateInvalid,\n 'Stream terminal sequence does not match accepted items',\n ))\n return\n }\n state.resumeCursor = frame.resumeCursor\n if (frame.frameKind === 'stream-error') state.terminalError = new ApplicationPortRemoteError(frame.error)\n this.completeStream(state)\n }\n\n private verifyCredit(\n value: number,\n availableCredit: number,\n grant: Extract<PortOperationGrant, { streaming: true }>,\n ): void {\n if (!Number.isSafeInteger(value) || value <= 0 || availableCredit + value > grant.maximumCredit) {\n throw new ApplicationPortProxyError(\n ApplicationPortProxyErrorCode.streamStateInvalid,\n 'Outstanding credit exceeds the stream grant',\n )\n }\n }\n}\n\nexport function createApplicationPortClient(options: CreateApplicationPortClientOptions): ApplicationPortClient {\n return new ApplicationPortClientInstance(options)\n}\n", "import type {\n JsonValue,\n PortAttachmentGrant,\n PortConsistencyEvidence,\n PortFrame,\n PortFrameIssue,\n PortOperationGrant,\n} from '@xyo-network/dapp-kit'\nimport { PortFrameZod } from '@xyo-network/dapp-kit'\n\nexport interface ApplicationPortMessageEndpoint {\n addMessageListener(listener: (message: unknown) => void): void\n removeMessageListener(listener: (message: unknown) => void): void\n send(message: unknown): void\n start?(): void\n}\n\nexport const ApplicationPortProxyErrorCode = {\n cancelled: 'port.cancelled',\n detached: 'port.detached',\n directionInvalid: 'port.direction-invalid',\n duplicateRequest: 'port.duplicate-request',\n hostFailure: 'port.host-failure',\n operationKindMismatch: 'port.operation-kind-mismatch',\n operationUnavailable: 'port.operation-unavailable',\n requestUnknown: 'port.request-unknown',\n streamStateInvalid: 'port.stream-state-invalid',\n} as const\n\nexport type ApplicationPortProxyErrorCode\n = typeof ApplicationPortProxyErrorCode[keyof typeof ApplicationPortProxyErrorCode]\n\nexport interface ApplicationPortErrorData {\n readonly code: string\n readonly details?: JsonValue\n readonly retriable: boolean\n}\n\nexport class ApplicationPortProxyError extends Error {\n readonly code: ApplicationPortProxyErrorCode\n readonly issues?: readonly PortFrameIssue[]\n\n constructor(\n code: ApplicationPortProxyErrorCode,\n message: string,\n issues?: readonly PortFrameIssue[],\n ) {\n super(message)\n this.name = 'ApplicationPortProxyError'\n this.code = code\n this.issues = issues\n }\n}\n\nexport class ApplicationPortRemoteError extends Error {\n readonly code: string\n readonly details?: JsonValue\n readonly retriable: boolean\n\n constructor(error: ApplicationPortErrorData) {\n super(`Remote application-port operation failed: ${error.code}`)\n this.name = 'ApplicationPortRemoteError'\n this.code = error.code\n this.details = error.details\n this.retriable = error.retriable\n }\n}\n\nexport class ApplicationPortCancelledError extends Error {\n readonly code = ApplicationPortProxyErrorCode.cancelled\n readonly reasonCode: string\n\n constructor(reasonCode: string) {\n super(`Application-port request was cancelled: ${reasonCode}`)\n this.name = 'ApplicationPortCancelledError'\n this.reasonCode = reasonCode\n }\n}\n\nexport interface ApplicationPortProtocolErrorContext {\n readonly cause: ApplicationPortProxyError\n readonly value: unknown\n}\n\nexport interface ApplicationPortPeerOptions {\n readonly authenticatedPrincipalId: string\n readonly endpoint: ApplicationPortMessageEndpoint\n readonly grant: PortAttachmentGrant\n readonly now: () => number\n readonly onProtocolError: (context: ApplicationPortProtocolErrorContext) => void\n}\n\nexport interface ApplicationPortRequestContext {\n readonly body: JsonValue\n readonly grant: PortAttachmentGrant\n readonly requestId: string\n readonly signal: AbortSignal\n}\n\nexport interface ApplicationPortUnaryResult {\n readonly body: JsonValue\n readonly consistency: PortConsistencyEvidence\n}\n\nexport interface ApplicationPortUnaryOperation {\n readonly operationId: string\n readonly portId: string\n readonly streaming: false\n handle(context: ApplicationPortRequestContext): Promise<ApplicationPortUnaryResult>\n}\n\nexport interface ApplicationPortStreamItem {\n readonly body: JsonValue\n readonly consistency: PortConsistencyEvidence\n readonly resumeCursor?: string\n}\n\nexport type ApplicationPortStreamRead\n = | { readonly done: false; readonly value: ApplicationPortStreamItem }\n | { readonly done: true; readonly resumeCursor?: string }\n\nexport interface ApplicationPortStreamSource {\n readonly nextSequence: number\n readonly resumable: boolean\n readonly resumeCursor?: string\n readonly streamId: string\n cancel?(reasonCode: string): Promise<void>\n next(signal: AbortSignal): Promise<ApplicationPortStreamRead>\n}\n\nexport interface ApplicationPortStreamResumeContext extends ApplicationPortRequestContext {\n readonly lastAcceptedSequence: number\n readonly resumeCursor: string\n readonly streamId: string\n}\n\nexport interface ApplicationPortStreamOperation {\n readonly operationId: string\n readonly portId: string\n readonly streaming: true\n open(context: ApplicationPortRequestContext): Promise<ApplicationPortStreamSource>\n resume?(context: ApplicationPortStreamResumeContext): Promise<ApplicationPortStreamSource>\n}\n\nexport type ApplicationPortOperation = ApplicationPortStreamOperation | ApplicationPortUnaryOperation\n\nexport interface ApplicationPortRequestOptions {\n readonly body: JsonValue\n readonly deadlineUnixMs: number\n readonly operationId: string\n readonly portId: string\n readonly signal?: AbortSignal\n}\n\nexport interface ApplicationPortStreamRequestOptions extends ApplicationPortRequestOptions {\n readonly initialCredit: number\n}\n\nexport interface ApplicationPortStreamResumeOptions {\n readonly credit: number\n readonly deadlineUnixMs: number\n readonly lastAcceptedSequence: number\n readonly operationId: string\n readonly portId: string\n readonly resumeCursor: string\n readonly signal?: AbortSignal\n readonly streamId: string\n}\n\nexport interface ApplicationPortStreamValue extends ApplicationPortStreamItem {\n readonly sequence: number\n}\n\nexport interface ApplicationPortStream extends AsyncIterableIterator<ApplicationPortStreamValue> {\n readonly requestId: string\n readonly streamId: string\n cancel(reasonCode?: string): void\n credit(value: number): void\n}\n\nexport interface ApplicationPortClient {\n close(): void\n request(options: ApplicationPortRequestOptions): Promise<ApplicationPortUnaryResult>\n resumeStream(options: ApplicationPortStreamResumeOptions): Promise<ApplicationPortStream>\n stream(options: ApplicationPortStreamRequestOptions): Promise<ApplicationPortStream>\n}\n\nexport function applicationPortOperationKey(portId: string, operationId: string): string {\n return `${portId}\\u0000${operationId}`\n}\n\nexport function applicationPortOperationGrant(\n grant: PortAttachmentGrant,\n portId: string,\n operationId: string,\n): PortOperationGrant | undefined {\n return grant.operations.find(operation => operation.portId === portId && operation.operationId === operationId)\n}\n\nexport function applicationPortFrameBase(\n grant: PortAttachmentGrant,\n frame: Pick<PortFrame, 'deadlineUnixMs' | 'operationId' | 'portId' | 'requestId'>,\n) {\n return {\n schema: 'network.xyo.dapp.port.frame' as const,\n schemaVersion: 1 as const,\n dappId: grant.dappId,\n protocolVersion: grant.protocolVersion,\n planId: grant.planId,\n systemInstanceId: grant.systemInstanceId,\n hostSessionId: grant.hostSessionId,\n attachmentId: grant.attachmentId,\n requestId: frame.requestId,\n deadlineUnixMs: frame.deadlineUnixMs,\n portId: frame.portId,\n operationId: frame.operationId,\n }\n}\n\nexport function parseApplicationPortFrame(value: unknown): PortFrame {\n return PortFrameZod.parse(value)\n}\n\nexport function applicationPortErrorFrame(\n grant: PortAttachmentGrant,\n frame: PortFrame,\n error: ApplicationPortErrorData,\n): PortFrame {\n return parseApplicationPortFrame({\n ...applicationPortFrameBase(grant, frame),\n frameKind: 'error',\n error,\n })\n}\n", "import type {\n PortFrame,\n PortFrameIssue,\n PortOperationGrant,\n} from '@xyo-network/dapp-kit'\nimport {\n PortAttachmentGrantZod,\n validatePortFrame,\n} from '@xyo-network/dapp-kit'\n\nimport type {\n ApplicationPortErrorData,\n ApplicationPortOperation,\n ApplicationPortPeerOptions,\n ApplicationPortStreamOperation,\n ApplicationPortStreamSource,\n ApplicationPortUnaryOperation,\n} from './applicationPortModel.ts'\nimport {\n applicationPortErrorFrame,\n applicationPortFrameBase,\n applicationPortOperationGrant,\n applicationPortOperationKey,\n ApplicationPortProxyError,\n ApplicationPortProxyErrorCode,\n parseApplicationPortFrame,\n} from './applicationPortModel.ts'\n\nexport interface CreateApplicationPortHostOptions extends ApplicationPortPeerOptions {\n readonly mapError: (error: unknown) => ApplicationPortErrorData\n readonly operations: readonly ApplicationPortOperation[]\n}\n\nexport interface ApplicationPortHost {\n close(): Promise<void>\n}\n\ninterface HostRequestStateBase {\n readonly controller: AbortController\n readonly frame: PortFrame\n isCancelled: boolean\n isTerminal: boolean\n}\n\ninterface HostUnaryState extends HostRequestStateBase {\n completion?: Promise<void>\n readonly kind: 'unary'\n}\n\ninterface HostStreamState extends HostRequestStateBase {\n availableCredit: number\n readonly grant: Extract<PortOperationGrant, { streaming: true }>\n readonly kind: 'stream'\n lastSequence: number\n openPromise?: Promise<void>\n pumpPromise?: Promise<void>\n resumeCursor?: string\n source?: ApplicationPortStreamSource\n}\n\ntype HostRequestState = HostStreamState | HostUnaryState\ntype RequestFrame = Extract<PortFrame, { frameKind: 'request' }>\ntype StreamStartFrame = Extract<PortFrame, { frameKind: 'request' | 'stream-resume' }>\n\nfunction registeredOperations(options: CreateApplicationPortHostOptions): ReadonlyMap<string, ApplicationPortOperation> {\n const operations = new Map<string, ApplicationPortOperation>()\n for (const operation of options.operations) {\n const key = applicationPortOperationKey(operation.portId, operation.operationId)\n const grant = applicationPortOperationGrant(options.grant, operation.portId, operation.operationId)\n if (operations.has(key)) {\n throw new ApplicationPortProxyError(\n ApplicationPortProxyErrorCode.duplicateRequest,\n `Application-port operation is registered more than once: ${operation.portId}.${operation.operationId}`,\n )\n }\n if (grant?.streaming !== operation.streaming) {\n throw new ApplicationPortProxyError(\n ApplicationPortProxyErrorCode.operationKindMismatch,\n `Registered operation conflicts with attachment grant: ${operation.portId}.${operation.operationId}`,\n )\n }\n operations.set(key, operation)\n }\n return operations\n}\n\nclass ApplicationPortHostInstance implements ApplicationPortHost {\n private isClosed = false\n private readonly listener: (message: unknown) => void\n private readonly operations: ReadonlyMap<string, ApplicationPortOperation>\n private readonly options: CreateApplicationPortHostOptions\n private readonly requests = new Map<string, HostRequestState>()\n\n constructor(options: CreateApplicationPortHostOptions) {\n this.options = { ...options, grant: PortAttachmentGrantZod.parse(options.grant) }\n this.operations = registeredOperations(this.options)\n this.listener = message => void this.receive(message)\n options.endpoint.addMessageListener(this.listener)\n options.endpoint.start?.()\n }\n\n async close(): Promise<void> {\n if (this.isClosed) return\n this.isClosed = true\n this.options.endpoint.removeMessageListener(this.listener)\n const completions: Promise<unknown>[] = []\n for (const state of this.requests.values()) {\n state.isCancelled = true\n state.controller.abort(ApplicationPortProxyErrorCode.detached)\n if (state.kind === 'unary' && state.completion !== undefined) completions.push(state.completion)\n if (state.kind === 'stream') this.collectStreamClosePromises(state, completions)\n }\n await Promise.allSettled(completions)\n this.requests.clear()\n }\n\n private cancelAcknowledgement(frame: PortFrame): PortFrame {\n return parseApplicationPortFrame({\n ...applicationPortFrameBase(this.options.grant, frame),\n frameKind: 'cancel-ack',\n willEmitNoNewWork: true,\n })\n }\n\n private async cancelRequest(frame: Extract<PortFrame, { frameKind: 'cancel' }>): Promise<void> {\n const state = this.requests.get(frame.requestId)\n if (state === undefined) {\n this.report(ApplicationPortProxyErrorCode.requestUnknown, 'Cancellation targets an unknown request', frame)\n return\n }\n if (state.isTerminal || state.isCancelled) return\n state.isCancelled = true\n state.controller.abort(frame.reasonCode)\n if (state.kind === 'unary') {\n await state.completion\n return\n }\n await state.openPromise\n if (state.pumpPromise !== undefined) await state.pumpPromise\n await state.source?.cancel?.(frame.reasonCode)\n if (!this.isClosed && !state.isTerminal) {\n state.isTerminal = true\n this.post(this.cancelAcknowledgement(frame))\n }\n this.requests.delete(frame.requestId)\n }\n\n private collectStreamClosePromises(state: HostStreamState, completions: Promise<unknown>[]): void {\n if (state.openPromise !== undefined) completions.push(state.openPromise)\n if (state.pumpPromise !== undefined) completions.push(state.pumpPromise)\n if (state.source?.cancel !== undefined) {\n completions.push(state.source.cancel(ApplicationPortProxyErrorCode.detached))\n }\n }\n\n private dispatchStart(frame: StreamStartFrame): void {\n const operation = this.operations.get(applicationPortOperationKey(frame.portId, frame.operationId))\n const grant = applicationPortOperationGrant(this.options.grant, frame.portId, frame.operationId)\n if (operation === undefined || grant === undefined) {\n this.postError(frame, ApplicationPortProxyErrorCode.operationUnavailable)\n return\n }\n if (operation.streaming !== grant.streaming) {\n this.postError(frame, ApplicationPortProxyErrorCode.operationKindMismatch)\n return\n }\n if (operation.streaming && grant.streaming) {\n this.openStream(frame, operation, grant)\n return\n }\n if (frame.frameKind === 'request' && !operation.streaming) {\n this.startUnary(frame, operation)\n return\n }\n this.postError(frame, ApplicationPortProxyErrorCode.operationKindMismatch)\n }\n\n private mapError(frame: PortFrame, cause: unknown): ApplicationPortErrorData {\n const fallback = { code: ApplicationPortProxyErrorCode.hostFailure, retriable: false }\n try {\n const mapped = this.options.mapError(cause)\n applicationPortErrorFrame(this.options.grant, frame, mapped)\n return mapped\n } catch {\n return fallback\n }\n }\n\n private openStream(\n frame: StreamStartFrame,\n operation: ApplicationPortStreamOperation,\n grant: Extract<PortOperationGrant, { streaming: true }>,\n ): void {\n const state: HostStreamState = {\n availableCredit: frame.frameKind === 'stream-resume' ? frame.credit : 0,\n controller: new AbortController(),\n frame,\n grant,\n isCancelled: false,\n isTerminal: false,\n kind: 'stream',\n lastSequence: frame.frameKind === 'stream-resume' ? frame.lastAcceptedSequence : -1,\n ...(frame.frameKind === 'stream-resume' ? { resumeCursor: frame.resumeCursor } : {}),\n }\n this.requests.set(frame.requestId, state)\n state.openPromise = this.runStreamOpen(state, frame, operation)\n }\n\n private post(frame: PortFrame): void {\n if (!this.isClosed) this.options.endpoint.send(frame)\n }\n\n private postError(frame: PortFrame, code: string): void {\n this.post(applicationPortErrorFrame(this.options.grant, frame, { code, retriable: false }))\n }\n\n private async pump(state: HostStreamState): Promise<void> {\n if (state.pumpPromise !== undefined || state.source === undefined || state.isTerminal || state.isCancelled) return\n const pumping = this.pumpOnce(state)\n state.pumpPromise = pumping\n await pumping\n if (state.pumpPromise === pumping) state.pumpPromise = undefined\n }\n\n private async pumpOnce(state: HostStreamState): Promise<void> {\n try {\n while (state.availableCredit > 0 && !state.isTerminal && !state.isCancelled && !this.isClosed) {\n if (!await this.sendNext(state)) return\n }\n } catch (error) {\n if (!state.isCancelled && !this.isClosed) this.terminateStreamWithError(state, error)\n }\n }\n\n private async receive(value: unknown): Promise<void> {\n if (this.isClosed) return\n const result = validatePortFrame(value, {\n authenticatedPrincipalId: this.options.authenticatedPrincipalId,\n grant: this.options.grant,\n now: this.options.now(),\n })\n if (!result.success) {\n this.reportInvalid(result.issues, value)\n return\n }\n const frame = result.value\n if (frame.frameKind === 'cancel') {\n await this.cancelRequest(frame)\n return\n }\n if (frame.frameKind === 'stream-credit') {\n await this.receiveCredit(frame)\n return\n }\n if (frame.frameKind !== 'request' && frame.frameKind !== 'stream-resume') {\n this.report(ApplicationPortProxyErrorCode.directionInvalid, 'Host received a server-to-client frame', frame)\n return\n }\n if (this.requests.has(frame.requestId)) {\n this.report(ApplicationPortProxyErrorCode.duplicateRequest, 'Request ID is already active', frame)\n return\n }\n this.dispatchStart(frame)\n }\n\n private async receiveCredit(frame: Extract<PortFrame, { frameKind: 'stream-credit' }>): Promise<void> {\n const state = this.requests.get(frame.requestId)\n if (state?.kind !== 'stream' || state.source?.streamId !== frame.streamId || state.isTerminal) {\n this.report(ApplicationPortProxyErrorCode.streamStateInvalid, 'Stream credit targets an inactive stream', frame)\n return\n }\n if (state.availableCredit + frame.credit > state.grant.maximumCredit) {\n this.terminateStreamWithError(state, undefined, 'port.credit-exceeded')\n return\n }\n state.availableCredit += frame.credit\n await this.pump(state)\n }\n\n private report(code: ApplicationPortProxyErrorCode, message: string, value: unknown): void {\n this.options.onProtocolError({ cause: new ApplicationPortProxyError(code, message), value })\n }\n\n private reportInvalid(issues: readonly PortFrameIssue[], value: unknown): void {\n this.options.onProtocolError({\n cause: new ApplicationPortProxyError(\n ApplicationPortProxyErrorCode.directionInvalid,\n 'Application-port frame failed attachment validation',\n issues,\n ),\n value,\n })\n }\n\n private async runStreamOpen(\n state: HostStreamState,\n frame: StreamStartFrame,\n operation: ApplicationPortStreamOperation,\n ): Promise<void> {\n try {\n const source = await this.startStreamSource(state, frame, operation)\n this.verifyStreamSource(source, frame, state.grant)\n state.source = source\n state.lastSequence = source.nextSequence - 1\n state.resumeCursor = source.resumeCursor\n if (state.isCancelled || this.isClosed) return\n this.post(parseApplicationPortFrame({\n ...applicationPortFrameBase(this.options.grant, frame),\n frameKind: 'stream-open',\n streamId: source.streamId,\n delivery: 'at-least-once',\n resumable: source.resumable,\n nextSequence: source.nextSequence,\n ...(source.resumeCursor === undefined ? {} : { resumeCursor: source.resumeCursor }),\n }))\n await this.pump(state)\n } catch (error) {\n if (!state.isCancelled && !this.isClosed) {\n state.isTerminal = true\n this.post(applicationPortErrorFrame(this.options.grant, frame, this.mapError(frame, error)))\n this.requests.delete(frame.requestId)\n }\n }\n }\n\n private async runUnary(\n state: HostUnaryState,\n frame: RequestFrame,\n operation: ApplicationPortUnaryOperation,\n ): Promise<void> {\n try {\n const result = await operation.handle({\n body: frame.body,\n grant: this.options.grant,\n requestId: frame.requestId,\n signal: state.controller.signal,\n })\n if (!state.isCancelled && !this.isClosed) {\n state.isTerminal = true\n this.post(parseApplicationPortFrame({\n ...applicationPortFrameBase(this.options.grant, frame),\n frameKind: 'response',\n consistency: result.consistency,\n body: result.body,\n }))\n }\n } catch (error) {\n if (!state.isCancelled && !this.isClosed) {\n state.isTerminal = true\n this.post(applicationPortErrorFrame(this.options.grant, frame, this.mapError(frame, error)))\n }\n } finally {\n if (state.isCancelled && !state.isTerminal && !this.isClosed) {\n state.isTerminal = true\n this.post(this.cancelAcknowledgement(frame))\n }\n this.requests.delete(frame.requestId)\n }\n }\n\n private async sendNext(state: HostStreamState): Promise<boolean> {\n const source = state.source\n if (source === undefined) return false\n const read = await source.next(state.controller.signal)\n if (state.isCancelled || this.isClosed) return false\n if (read.done) {\n state.isTerminal = true\n this.post(parseApplicationPortFrame({\n ...applicationPortFrameBase(this.options.grant, state.frame),\n frameKind: 'stream-close',\n streamId: source.streamId,\n lastSequence: Math.max(0, state.lastSequence),\n ...(read.resumeCursor === undefined ? {} : { resumeCursor: read.resumeCursor }),\n }))\n this.requests.delete(state.frame.requestId)\n return false\n }\n if (source.resumable && read.value.resumeCursor === undefined) {\n throw new ApplicationPortProxyError(\n ApplicationPortProxyErrorCode.streamStateInvalid,\n 'Resumable stream item did not provide a durable cursor',\n )\n }\n state.availableCredit -= 1\n state.lastSequence += 1\n state.resumeCursor = read.value.resumeCursor\n this.post(parseApplicationPortFrame({\n ...applicationPortFrameBase(this.options.grant, state.frame),\n frameKind: 'stream-item',\n streamId: source.streamId,\n sequence: state.lastSequence,\n ...(read.value.resumeCursor === undefined ? {} : { resumeCursor: read.value.resumeCursor }),\n consistency: read.value.consistency,\n body: read.value.body,\n }))\n return true\n }\n\n private async startStreamSource(\n state: HostStreamState,\n frame: StreamStartFrame,\n operation: ApplicationPortStreamOperation,\n ): Promise<ApplicationPortStreamSource> {\n const context = {\n body: frame.frameKind === 'request' ? frame.body : null,\n grant: this.options.grant,\n requestId: frame.requestId,\n signal: state.controller.signal,\n }\n if (frame.frameKind === 'request') return await operation.open(context)\n if (operation.resume === undefined) {\n throw new ApplicationPortProxyError(\n ApplicationPortProxyErrorCode.operationUnavailable,\n 'Stream operation does not implement resume',\n )\n }\n return await operation.resume({\n ...context,\n lastAcceptedSequence: frame.lastAcceptedSequence,\n resumeCursor: frame.resumeCursor,\n streamId: frame.streamId,\n })\n }\n\n private startUnary(frame: RequestFrame, operation: ApplicationPortUnaryOperation): void {\n const state: HostUnaryState = {\n controller: new AbortController(),\n frame,\n isCancelled: false,\n isTerminal: false,\n kind: 'unary',\n }\n this.requests.set(frame.requestId, state)\n state.completion = this.runUnary(state, frame, operation)\n }\n\n private terminateStreamWithError(state: HostStreamState, cause: unknown, code?: string): void {\n const source = state.source\n if (source === undefined || state.isTerminal || this.isClosed) return\n state.isTerminal = true\n const error = code === undefined ? this.mapError(state.frame, cause) : { code, retriable: false }\n this.post(parseApplicationPortFrame({\n ...applicationPortFrameBase(this.options.grant, state.frame),\n frameKind: 'stream-error',\n streamId: source.streamId,\n lastSequence: Math.max(0, state.lastSequence),\n ...(state.resumeCursor === undefined ? {} : { resumeCursor: state.resumeCursor }),\n error,\n }))\n this.requests.delete(state.frame.requestId)\n }\n\n private verifyStreamSource(\n source: ApplicationPortStreamSource,\n frame: StreamStartFrame,\n grant: Extract<PortOperationGrant, { streaming: true }>,\n ): void {\n const resumeMismatch = frame.frameKind === 'stream-resume'\n && (source.streamId !== frame.streamId || source.nextSequence !== frame.lastAcceptedSequence + 1)\n if (source.resumable !== grant.resumable\n || (source.resumable && source.resumeCursor === undefined)\n || resumeMismatch) {\n throw new ApplicationPortProxyError(\n ApplicationPortProxyErrorCode.streamStateInvalid,\n 'Stream source conflicts with its grant or resume request',\n )\n }\n }\n}\n\nexport function createApplicationPortHost(options: CreateApplicationPortHostOptions): ApplicationPortHost {\n return new ApplicationPortHostInstance(options)\n}\n", "import type { PortFrame } from '@xyo-network/dapp-kit'\nimport {\n canonicalizeIJson,\n IdentifierZod,\n parseStrictJsonText,\n PortAttachmentGrantZod,\n PortFrameZod,\n} from '@xyo-network/dapp-kit'\nimport { z } from 'zod'\n\nexport const ApplicationPortTransportSchema = 'network.xyo.dapp.port.transport' as const\n\nexport const ApplicationPortTransportHelloZod = z.strictObject({\n schema: z.literal(ApplicationPortTransportSchema),\n schemaVersion: z.literal(1),\n messageKind: z.literal('hello'),\n maximumFrameBytes: z.number().int().positive().max(16 * 1024 * 1024),\n grant: PortAttachmentGrantZod,\n})\n\nexport type ApplicationPortTransportHello = z.infer<typeof ApplicationPortTransportHelloZod>\n\nexport const ApplicationPortTransportErrorZod = z.strictObject({\n schema: z.literal(ApplicationPortTransportSchema),\n schemaVersion: z.literal(1),\n messageKind: z.literal('error'),\n code: IdentifierZod,\n retriable: z.boolean(),\n})\n\nexport type ApplicationPortTransportError = z.infer<typeof ApplicationPortTransportErrorZod>\n\nexport const ApplicationPortWireMessageZod = z.union([\n PortFrameZod,\n ApplicationPortTransportHelloZod,\n ApplicationPortTransportErrorZod,\n])\n\nexport type ApplicationPortWireMessage = z.infer<typeof ApplicationPortWireMessageZod>\n\nexport const ApplicationPortWireErrorCode = {\n frameTooLarge: 'port.wire-frame-too-large',\n invalidMessage: 'port.wire-invalid-message',\n} as const\n\nexport type ApplicationPortWireErrorCode\n = typeof ApplicationPortWireErrorCode[keyof typeof ApplicationPortWireErrorCode]\n\nexport class ApplicationPortWireError extends Error {\n readonly code: ApplicationPortWireErrorCode\n\n constructor(code: ApplicationPortWireErrorCode, message: string, options?: ErrorOptions) {\n super(message, options)\n this.name = 'ApplicationPortWireError'\n this.code = code\n }\n}\n\nfunction byteLength(value: string): number {\n return new TextEncoder().encode(value).byteLength\n}\n\nfunction verifyMaximumFrameBytes(value: number): number {\n if (!Number.isSafeInteger(value) || value <= 0 || value > 16 * 1024 * 1024) {\n throw new RangeError('maximum application-port frame bytes must be between 1 and 16777216')\n }\n return value\n}\n\nexport function isApplicationPortFrame(message: ApplicationPortWireMessage): message is PortFrame {\n return message.schema === 'network.xyo.dapp.port.frame'\n}\n\nexport function parseApplicationPortWireText(\n source: string,\n maximumFrameBytes: number,\n): ApplicationPortWireMessage {\n const maximum = verifyMaximumFrameBytes(maximumFrameBytes)\n if (byteLength(source) > maximum) {\n throw new ApplicationPortWireError(\n ApplicationPortWireErrorCode.frameTooLarge,\n `application-port frame exceeds ${maximum} bytes`,\n )\n }\n try {\n return ApplicationPortWireMessageZod.parse(parseStrictJsonText(source, { maximumDepth: 64 }))\n } catch (cause) {\n if (cause instanceof ApplicationPortWireError) throw cause\n throw new ApplicationPortWireError(\n ApplicationPortWireErrorCode.invalidMessage,\n 'application-port wire message is invalid',\n { cause },\n )\n }\n}\n\nexport function serializeApplicationPortWireMessage(\n message: ApplicationPortWireMessage,\n maximumFrameBytes: number,\n): string {\n const maximum = verifyMaximumFrameBytes(maximumFrameBytes)\n let source: string\n try {\n source = canonicalizeIJson(ApplicationPortWireMessageZod.parse(message))\n } catch (cause) {\n throw new ApplicationPortWireError(\n ApplicationPortWireErrorCode.invalidMessage,\n 'application-port wire message is invalid',\n { cause },\n )\n }\n if (byteLength(source) > maximum) {\n throw new ApplicationPortWireError(\n ApplicationPortWireErrorCode.frameTooLarge,\n `application-port frame exceeds ${maximum} bytes`,\n )\n }\n return source\n}\n", "import type { PortAttachmentGrant } from '@xyo-network/dapp-kit'\nimport { PortFrameZod } from '@xyo-network/dapp-kit'\n\nimport { createApplicationPortClient } from './applicationPortClient.ts'\nimport type {\n ApplicationPortClient,\n ApplicationPortMessageEndpoint,\n ApplicationPortProtocolErrorContext,\n} from './applicationPortModel.ts'\nimport {\n ApplicationPortTransportErrorZod,\n ApplicationPortTransportHelloZod,\n isApplicationPortFrame,\n parseApplicationPortWireText,\n serializeApplicationPortWireMessage,\n} from './applicationPortWire.ts'\n\nexport const WebSocketApplicationPortClientErrorCode = {\n aborted: 'port.websocket-aborted',\n closed: 'port.websocket-closed',\n handshakeInvalid: 'port.websocket-handshake-invalid',\n serverRejected: 'port.websocket-server-rejected',\n socketError: 'port.websocket-socket-error',\n timeout: 'port.websocket-timeout',\n urlInvalid: 'port.websocket-url-invalid',\n} as const\n\nexport type WebSocketApplicationPortClientErrorCode\n = typeof WebSocketApplicationPortClientErrorCode[keyof typeof WebSocketApplicationPortClientErrorCode]\n\nexport class WebSocketApplicationPortClientError extends Error {\n readonly code: WebSocketApplicationPortClientErrorCode\n\n constructor(code: WebSocketApplicationPortClientErrorCode, message: string, options?: ErrorOptions) {\n super(message, options)\n this.name = 'WebSocketApplicationPortClientError'\n this.code = code\n }\n}\n\nexport interface ExpectedApplicationPortAttachment {\n readonly dappId: string\n readonly planId: string\n readonly protocolVersion: string\n}\n\nexport interface ConnectWebSocketApplicationPortOptions {\n readonly expected: ExpectedApplicationPortAttachment\n readonly handshakeTimeoutMs?: number\n readonly maximumFrameBytes?: number\n readonly nextRequestId: () => string\n readonly now: () => number\n readonly onProtocolError: (context: ApplicationPortProtocolErrorContext) => void\n readonly onTransportError?: (error: unknown) => void\n readonly signal?: AbortSignal\n readonly url: string | URL\n readonly webSocketFactory?: (url: string) => WebSocket\n}\n\nexport interface WebSocketApplicationPortClose {\n readonly code: number\n readonly reason: string\n readonly wasClean: boolean\n}\n\nexport interface WebSocketApplicationPortClientSession {\n readonly client: ApplicationPortClient\n readonly grant: PortAttachmentGrant\n readonly whenClosed: Promise<WebSocketApplicationPortClose>\n close(): void\n}\n\nfunction report(options: ConnectWebSocketApplicationPortOptions, error: unknown): void {\n try {\n options.onTransportError?.(error)\n } catch {\n // Diagnostics must not change connection ownership.\n }\n}\n\nfunction webSocketUrl(value: string | URL): string {\n let url: URL\n try {\n url = new URL(value.toString())\n } catch (cause) {\n throw new WebSocketApplicationPortClientError(\n WebSocketApplicationPortClientErrorCode.urlInvalid,\n 'application-port WebSocket URL is invalid',\n { cause },\n )\n }\n if ((url.protocol !== 'ws:' && url.protocol !== 'wss:')\n || url.username !== '' || url.password !== '' || url.hash !== '' || url.search !== '') {\n throw new WebSocketApplicationPortClientError(\n WebSocketApplicationPortClientErrorCode.urlInvalid,\n 'application-port URL must be credential-free WebSocket without query or fragment data',\n )\n }\n return url.href\n}\n\nfunction positiveInteger(value: number, name: string, maximum: number): number {\n if (!Number.isSafeInteger(value) || value <= 0 || value > maximum) {\n throw new RangeError(`${name} must be between 1 and ${maximum}`)\n }\n return value\n}\n\nfunction closeWebSocket(socket: WebSocket, code: number, reason: string): void {\n if (socket.readyState === WebSocket.OPEN) socket.close(code, reason)\n else if (socket.readyState === WebSocket.CONNECTING) socket.close()\n}\n\nfunction assertExpectedGrant(\n grant: PortAttachmentGrant,\n expected: ExpectedApplicationPortAttachment,\n now: number,\n): void {\n if (grant.dappId !== expected.dappId || grant.planId !== expected.planId\n || grant.protocolVersion !== expected.protocolVersion || grant.expiresAt <= now) {\n throw new WebSocketApplicationPortClientError(\n WebSocketApplicationPortClientErrorCode.handshakeInvalid,\n 'application-port attachment does not match the expected dApp, plan, protocol, or lifetime',\n )\n }\n}\n\nclass BrowserWebSocketApplicationPortEndpoint implements ApplicationPortMessageEndpoint {\n private readonly listeners = new Set<(message: unknown) => void>()\n private readonly maximumFrameBytes: number\n private readonly onFailure: (error: unknown) => void\n private readonly socket: WebSocket\n\n constructor(socket: WebSocket, maximumFrameBytes: number, onFailure: (error: unknown) => void) {\n this.maximumFrameBytes = maximumFrameBytes\n this.onFailure = onFailure\n this.socket = socket\n this.socket.addEventListener('message', this.receive)\n }\n\n addMessageListener(listener: (message: unknown) => void): void {\n this.listeners.add(listener)\n }\n\n dispose(): void {\n this.listeners.clear()\n this.socket.removeEventListener('message', this.receive)\n }\n\n removeMessageListener(listener: (message: unknown) => void): void {\n this.listeners.delete(listener)\n }\n\n send(message: unknown): void {\n if (this.socket.readyState !== WebSocket.OPEN) {\n throw new WebSocketApplicationPortClientError(\n WebSocketApplicationPortClientErrorCode.closed,\n 'application-port WebSocket is not open',\n )\n }\n const frame = PortFrameZod.parse(message)\n this.socket.send(serializeApplicationPortWireMessage(frame, this.maximumFrameBytes))\n }\n\n private readonly receive = (event: MessageEvent<unknown>): void => {\n try {\n if (typeof event.data !== 'string') {\n throw new WebSocketApplicationPortClientError(\n WebSocketApplicationPortClientErrorCode.handshakeInvalid,\n 'binary application-port frames are forbidden',\n )\n }\n const message = parseApplicationPortWireText(event.data, this.maximumFrameBytes)\n if (!isApplicationPortFrame(message)) {\n throw new WebSocketApplicationPortClientError(\n WebSocketApplicationPortClientErrorCode.handshakeInvalid,\n 'server sent a transport control message after attachment',\n )\n }\n for (const listener of this.listeners) listener(message)\n } catch (error) {\n this.onFailure(error)\n }\n }\n}\n\nexport async function connectWebSocketApplicationPort(\n options: ConnectWebSocketApplicationPortOptions,\n): Promise<WebSocketApplicationPortClientSession> {\n if (options.signal?.aborted === true) {\n throw new WebSocketApplicationPortClientError(\n WebSocketApplicationPortClientErrorCode.aborted,\n 'application-port connection was aborted before launch',\n )\n }\n const maximumFrameBytes = positiveInteger(\n options.maximumFrameBytes ?? 256 * 1024,\n 'maximum frame bytes',\n 16 * 1024 * 1024,\n )\n const handshakeTimeoutMs = positiveInteger(options.handshakeTimeoutMs ?? 10_000, 'handshake timeout', 60_000)\n const createWebSocket = options.webSocketFactory ?? (url => new WebSocket(url))\n const socket = createWebSocket(webSocketUrl(options.url))\n const closed = Promise.withResolvers<WebSocketApplicationPortClose>()\n socket.addEventListener('close', event => closed.resolve({\n code: event.code,\n reason: event.reason,\n wasClean: event.wasClean,\n }), { once: true })\n\n let timer: ReturnType<typeof setTimeout> | undefined\n let abortListener: (() => void) | undefined\n try {\n const hello = await new Promise<ReturnType<typeof ApplicationPortTransportHelloZod.parse>>((resolve, reject) => {\n const cleanup = () => {\n clearTimeout(timer)\n socket.removeEventListener('message', onMessage)\n socket.removeEventListener('error', onError)\n socket.removeEventListener('close', onClose)\n if (abortListener !== undefined) options.signal?.removeEventListener('abort', abortListener)\n }\n const fail = (error: unknown) => {\n cleanup()\n closeWebSocket(socket, 4000, 'attachment failed')\n reject(error instanceof Error ? error : new Error('application-port attachment failed', { cause: error }))\n }\n const onClose = () => fail(new WebSocketApplicationPortClientError(\n WebSocketApplicationPortClientErrorCode.closed,\n 'application-port WebSocket closed before attachment',\n ))\n const onError = () => fail(new WebSocketApplicationPortClientError(\n WebSocketApplicationPortClientErrorCode.socketError,\n 'application-port WebSocket failed before attachment',\n ))\n const onMessage = (event: MessageEvent<unknown>) => {\n try {\n if (typeof event.data !== 'string') throw new TypeError('binary handshake')\n const message = parseApplicationPortWireText(event.data, maximumFrameBytes)\n const rejected = ApplicationPortTransportErrorZod.safeParse(message)\n if (rejected.success) {\n fail(new WebSocketApplicationPortClientError(\n WebSocketApplicationPortClientErrorCode.serverRejected,\n `application-port server rejected attachment: ${rejected.data.code}`,\n ))\n return\n }\n const parsed = ApplicationPortTransportHelloZod.parse(message)\n assertExpectedGrant(parsed.grant, options.expected, options.now())\n cleanup()\n resolve(parsed)\n } catch (cause) {\n fail(cause instanceof WebSocketApplicationPortClientError\n ? cause\n : new WebSocketApplicationPortClientError(\n WebSocketApplicationPortClientErrorCode.handshakeInvalid,\n 'application-port attachment handshake is invalid',\n { cause },\n ))\n }\n }\n abortListener = () => fail(new WebSocketApplicationPortClientError(\n WebSocketApplicationPortClientErrorCode.aborted,\n 'application-port connection was aborted',\n ))\n options.signal?.addEventListener('abort', abortListener, { once: true })\n socket.addEventListener('message', onMessage)\n socket.addEventListener('error', onError, { once: true })\n socket.addEventListener('close', onClose, { once: true })\n timer = setTimeout(() => fail(new WebSocketApplicationPortClientError(\n WebSocketApplicationPortClientErrorCode.timeout,\n 'application-port attachment handshake timed out',\n )), handshakeTimeoutMs)\n })\n\n const negotiatedMaximum = Math.min(maximumFrameBytes, hello.maximumFrameBytes)\n const endpoint = new BrowserWebSocketApplicationPortEndpoint(socket, negotiatedMaximum, (error) => {\n report(options, error)\n closeWebSocket(socket, 4001, 'invalid application-port frame')\n })\n const client: ApplicationPortClient = createApplicationPortClient({\n authenticatedPrincipalId: hello.grant.principalId,\n endpoint,\n grant: hello.grant,\n nextRequestId: options.nextRequestId,\n now: options.now,\n onProtocolError: options.onProtocolError,\n })\n socket.addEventListener('close', () => {\n endpoint.dispose()\n client.close()\n }, { once: true })\n let isClosed = false\n return {\n client,\n grant: hello.grant,\n whenClosed: closed.promise,\n close: () => {\n if (isClosed) return\n isClosed = true\n client.close()\n endpoint.dispose()\n closeWebSocket(socket, 1000, 'client detached')\n },\n }\n } catch (error) {\n report(options, error)\n throw error\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["PortAttachmentGrantZod", "validatePortFrame", "PortAttachmentGrantZod", "validatePortFrame", "canonicalizeIJson", "PortAttachmentGrantZod", "PortFrameZod", "PortFrameZod", "PortFrameZod"]
7
+ }
@@ -0,0 +1,46 @@
1
+ import type { PortAttachmentGrant } from '@xyo-network/dapp-kit';
2
+ import type { ApplicationPortClient, ApplicationPortProtocolErrorContext } from './applicationPortModel.ts';
3
+ export declare const WebSocketApplicationPortClientErrorCode: {
4
+ readonly aborted: "port.websocket-aborted";
5
+ readonly closed: "port.websocket-closed";
6
+ readonly handshakeInvalid: "port.websocket-handshake-invalid";
7
+ readonly serverRejected: "port.websocket-server-rejected";
8
+ readonly socketError: "port.websocket-socket-error";
9
+ readonly timeout: "port.websocket-timeout";
10
+ readonly urlInvalid: "port.websocket-url-invalid";
11
+ };
12
+ export type WebSocketApplicationPortClientErrorCode = typeof WebSocketApplicationPortClientErrorCode[keyof typeof WebSocketApplicationPortClientErrorCode];
13
+ export declare class WebSocketApplicationPortClientError extends Error {
14
+ readonly code: WebSocketApplicationPortClientErrorCode;
15
+ constructor(code: WebSocketApplicationPortClientErrorCode, message: string, options?: ErrorOptions);
16
+ }
17
+ export interface ExpectedApplicationPortAttachment {
18
+ readonly dappId: string;
19
+ readonly planId: string;
20
+ readonly protocolVersion: string;
21
+ }
22
+ export interface ConnectWebSocketApplicationPortOptions {
23
+ readonly expected: ExpectedApplicationPortAttachment;
24
+ readonly handshakeTimeoutMs?: number;
25
+ readonly maximumFrameBytes?: number;
26
+ readonly nextRequestId: () => string;
27
+ readonly now: () => number;
28
+ readonly onProtocolError: (context: ApplicationPortProtocolErrorContext) => void;
29
+ readonly onTransportError?: (error: unknown) => void;
30
+ readonly signal?: AbortSignal;
31
+ readonly url: string | URL;
32
+ readonly webSocketFactory?: (url: string) => WebSocket;
33
+ }
34
+ export interface WebSocketApplicationPortClose {
35
+ readonly code: number;
36
+ readonly reason: string;
37
+ readonly wasClean: boolean;
38
+ }
39
+ export interface WebSocketApplicationPortClientSession {
40
+ readonly client: ApplicationPortClient;
41
+ readonly grant: PortAttachmentGrant;
42
+ readonly whenClosed: Promise<WebSocketApplicationPortClose>;
43
+ close(): void;
44
+ }
45
+ export declare function connectWebSocketApplicationPort(options: ConnectWebSocketApplicationPortOptions): Promise<WebSocketApplicationPortClientSession>;
46
+ //# sourceMappingURL=webSocketApplicationPortClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webSocketApplicationPortClient.d.ts","sourceRoot":"","sources":["../../src/webSocketApplicationPortClient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAIhE,OAAO,KAAK,EACV,qBAAqB,EAErB,mCAAmC,EACpC,MAAM,2BAA2B,CAAA;AASlC,eAAO,MAAM,uCAAuC;;;;;;;;CAQ1C,CAAA;AAEV,MAAM,MAAM,uCAAuC,GAC/C,OAAO,uCAAuC,CAAC,MAAM,OAAO,uCAAuC,CAAC,CAAA;AAExG,qBAAa,mCAAoC,SAAQ,KAAK;IAC5D,QAAQ,CAAC,IAAI,EAAE,uCAAuC,CAAA;gBAE1C,IAAI,EAAE,uCAAuC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAKnG;AAED,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAA;CACjC;AAED,MAAM,WAAW,sCAAsC;IACrD,QAAQ,CAAC,QAAQ,EAAE,iCAAiC,CAAA;IACpD,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IACpC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAA;IACnC,QAAQ,CAAC,aAAa,EAAE,MAAM,MAAM,CAAA;IACpC,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAA;IAC1B,QAAQ,CAAC,eAAe,EAAE,CAAC,OAAO,EAAE,mCAAmC,KAAK,IAAI,CAAA;IAChF,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACpD,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAA;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;IAC1B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,CAAA;CACvD;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAC3B;AAED,MAAM,WAAW,qCAAqC;IACpD,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAA;IACtC,QAAQ,CAAC,KAAK,EAAE,mBAAmB,CAAA;IACnC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,6BAA6B,CAAC,CAAA;IAC3D,KAAK,IAAI,IAAI,CAAA;CACd;AAoHD,wBAAsB,+BAA+B,CACnD,OAAO,EAAE,sCAAsC,GAC9C,OAAO,CAAC,qCAAqC,CAAC,CAwHhD"}
@@ -0,0 +1,6 @@
1
+ import type { ApplicationPortClient, ApplicationPortPeerOptions } from './applicationPortModel.ts';
2
+ export interface CreateApplicationPortClientOptions extends ApplicationPortPeerOptions {
3
+ readonly nextRequestId: () => string;
4
+ }
5
+ export declare function createApplicationPortClient(options: CreateApplicationPortClientOptions): ApplicationPortClient;
6
+ //# sourceMappingURL=applicationPortClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applicationPortClient.d.ts","sourceRoot":"","sources":["../../src/applicationPortClient.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,qBAAqB,EACrB,0BAA0B,EAO3B,MAAM,2BAA2B,CAAA;AAWlC,MAAM,WAAW,kCAAmC,SAAQ,0BAA0B;IACpF,QAAQ,CAAC,aAAa,EAAE,MAAM,MAAM,CAAA;CACrC;AA+cD,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,kCAAkC,GAAG,qBAAqB,CAE9G"}
@@ -0,0 +1,10 @@
1
+ import type { ApplicationPortErrorData, ApplicationPortOperation, ApplicationPortPeerOptions } from './applicationPortModel.ts';
2
+ export interface CreateApplicationPortHostOptions extends ApplicationPortPeerOptions {
3
+ readonly mapError: (error: unknown) => ApplicationPortErrorData;
4
+ readonly operations: readonly ApplicationPortOperation[];
5
+ }
6
+ export interface ApplicationPortHost {
7
+ close(): Promise<void>;
8
+ }
9
+ export declare function createApplicationPortHost(options: CreateApplicationPortHostOptions): ApplicationPortHost;
10
+ //# sourceMappingURL=applicationPortHost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applicationPortHost.d.ts","sourceRoot":"","sources":["../../src/applicationPortHost.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,wBAAwB,EACxB,wBAAwB,EACxB,0BAA0B,EAI3B,MAAM,2BAA2B,CAAA;AAWlC,MAAM,WAAW,gCAAiC,SAAQ,0BAA0B;IAClF,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,wBAAwB,CAAA;IAC/D,QAAQ,CAAC,UAAU,EAAE,SAAS,wBAAwB,EAAE,CAAA;CACzD;AAED,MAAM,WAAW,mBAAmB;IAClC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAA;CACvB;AAmbD,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,gCAAgC,GAAG,mBAAmB,CAExG"}
@@ -0,0 +1,154 @@
1
+ import type { JsonValue, PortAttachmentGrant, PortConsistencyEvidence, PortFrame, PortFrameIssue, PortOperationGrant } from '@xyo-network/dapp-kit';
2
+ export interface ApplicationPortMessageEndpoint {
3
+ addMessageListener(listener: (message: unknown) => void): void;
4
+ removeMessageListener(listener: (message: unknown) => void): void;
5
+ send(message: unknown): void;
6
+ start?(): void;
7
+ }
8
+ export declare const ApplicationPortProxyErrorCode: {
9
+ readonly cancelled: "port.cancelled";
10
+ readonly detached: "port.detached";
11
+ readonly directionInvalid: "port.direction-invalid";
12
+ readonly duplicateRequest: "port.duplicate-request";
13
+ readonly hostFailure: "port.host-failure";
14
+ readonly operationKindMismatch: "port.operation-kind-mismatch";
15
+ readonly operationUnavailable: "port.operation-unavailable";
16
+ readonly requestUnknown: "port.request-unknown";
17
+ readonly streamStateInvalid: "port.stream-state-invalid";
18
+ };
19
+ export type ApplicationPortProxyErrorCode = typeof ApplicationPortProxyErrorCode[keyof typeof ApplicationPortProxyErrorCode];
20
+ export interface ApplicationPortErrorData {
21
+ readonly code: string;
22
+ readonly details?: JsonValue;
23
+ readonly retriable: boolean;
24
+ }
25
+ export declare class ApplicationPortProxyError extends Error {
26
+ readonly code: ApplicationPortProxyErrorCode;
27
+ readonly issues?: readonly PortFrameIssue[];
28
+ constructor(code: ApplicationPortProxyErrorCode, message: string, issues?: readonly PortFrameIssue[]);
29
+ }
30
+ export declare class ApplicationPortRemoteError extends Error {
31
+ readonly code: string;
32
+ readonly details?: JsonValue;
33
+ readonly retriable: boolean;
34
+ constructor(error: ApplicationPortErrorData);
35
+ }
36
+ export declare class ApplicationPortCancelledError extends Error {
37
+ readonly code: "port.cancelled";
38
+ readonly reasonCode: string;
39
+ constructor(reasonCode: string);
40
+ }
41
+ export interface ApplicationPortProtocolErrorContext {
42
+ readonly cause: ApplicationPortProxyError;
43
+ readonly value: unknown;
44
+ }
45
+ export interface ApplicationPortPeerOptions {
46
+ readonly authenticatedPrincipalId: string;
47
+ readonly endpoint: ApplicationPortMessageEndpoint;
48
+ readonly grant: PortAttachmentGrant;
49
+ readonly now: () => number;
50
+ readonly onProtocolError: (context: ApplicationPortProtocolErrorContext) => void;
51
+ }
52
+ export interface ApplicationPortRequestContext {
53
+ readonly body: JsonValue;
54
+ readonly grant: PortAttachmentGrant;
55
+ readonly requestId: string;
56
+ readonly signal: AbortSignal;
57
+ }
58
+ export interface ApplicationPortUnaryResult {
59
+ readonly body: JsonValue;
60
+ readonly consistency: PortConsistencyEvidence;
61
+ }
62
+ export interface ApplicationPortUnaryOperation {
63
+ readonly operationId: string;
64
+ readonly portId: string;
65
+ readonly streaming: false;
66
+ handle(context: ApplicationPortRequestContext): Promise<ApplicationPortUnaryResult>;
67
+ }
68
+ export interface ApplicationPortStreamItem {
69
+ readonly body: JsonValue;
70
+ readonly consistency: PortConsistencyEvidence;
71
+ readonly resumeCursor?: string;
72
+ }
73
+ export type ApplicationPortStreamRead = {
74
+ readonly done: false;
75
+ readonly value: ApplicationPortStreamItem;
76
+ } | {
77
+ readonly done: true;
78
+ readonly resumeCursor?: string;
79
+ };
80
+ export interface ApplicationPortStreamSource {
81
+ readonly nextSequence: number;
82
+ readonly resumable: boolean;
83
+ readonly resumeCursor?: string;
84
+ readonly streamId: string;
85
+ cancel?(reasonCode: string): Promise<void>;
86
+ next(signal: AbortSignal): Promise<ApplicationPortStreamRead>;
87
+ }
88
+ export interface ApplicationPortStreamResumeContext extends ApplicationPortRequestContext {
89
+ readonly lastAcceptedSequence: number;
90
+ readonly resumeCursor: string;
91
+ readonly streamId: string;
92
+ }
93
+ export interface ApplicationPortStreamOperation {
94
+ readonly operationId: string;
95
+ readonly portId: string;
96
+ readonly streaming: true;
97
+ open(context: ApplicationPortRequestContext): Promise<ApplicationPortStreamSource>;
98
+ resume?(context: ApplicationPortStreamResumeContext): Promise<ApplicationPortStreamSource>;
99
+ }
100
+ export type ApplicationPortOperation = ApplicationPortStreamOperation | ApplicationPortUnaryOperation;
101
+ export interface ApplicationPortRequestOptions {
102
+ readonly body: JsonValue;
103
+ readonly deadlineUnixMs: number;
104
+ readonly operationId: string;
105
+ readonly portId: string;
106
+ readonly signal?: AbortSignal;
107
+ }
108
+ export interface ApplicationPortStreamRequestOptions extends ApplicationPortRequestOptions {
109
+ readonly initialCredit: number;
110
+ }
111
+ export interface ApplicationPortStreamResumeOptions {
112
+ readonly credit: number;
113
+ readonly deadlineUnixMs: number;
114
+ readonly lastAcceptedSequence: number;
115
+ readonly operationId: string;
116
+ readonly portId: string;
117
+ readonly resumeCursor: string;
118
+ readonly signal?: AbortSignal;
119
+ readonly streamId: string;
120
+ }
121
+ export interface ApplicationPortStreamValue extends ApplicationPortStreamItem {
122
+ readonly sequence: number;
123
+ }
124
+ export interface ApplicationPortStream extends AsyncIterableIterator<ApplicationPortStreamValue> {
125
+ readonly requestId: string;
126
+ readonly streamId: string;
127
+ cancel(reasonCode?: string): void;
128
+ credit(value: number): void;
129
+ }
130
+ export interface ApplicationPortClient {
131
+ close(): void;
132
+ request(options: ApplicationPortRequestOptions): Promise<ApplicationPortUnaryResult>;
133
+ resumeStream(options: ApplicationPortStreamResumeOptions): Promise<ApplicationPortStream>;
134
+ stream(options: ApplicationPortStreamRequestOptions): Promise<ApplicationPortStream>;
135
+ }
136
+ export declare function applicationPortOperationKey(portId: string, operationId: string): string;
137
+ export declare function applicationPortOperationGrant(grant: PortAttachmentGrant, portId: string, operationId: string): PortOperationGrant | undefined;
138
+ export declare function applicationPortFrameBase(grant: PortAttachmentGrant, frame: Pick<PortFrame, 'deadlineUnixMs' | 'operationId' | 'portId' | 'requestId'>): {
139
+ schema: "network.xyo.dapp.port.frame";
140
+ schemaVersion: 1;
141
+ dappId: string;
142
+ protocolVersion: string;
143
+ planId: string;
144
+ systemInstanceId: string;
145
+ hostSessionId: string;
146
+ attachmentId: string;
147
+ requestId: string;
148
+ deadlineUnixMs: number;
149
+ portId: string;
150
+ operationId: string;
151
+ };
152
+ export declare function parseApplicationPortFrame(value: unknown): PortFrame;
153
+ export declare function applicationPortErrorFrame(grant: PortAttachmentGrant, frame: PortFrame, error: ApplicationPortErrorData): PortFrame;
154
+ //# sourceMappingURL=applicationPortModel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applicationPortModel.d.ts","sourceRoot":"","sources":["../../src/applicationPortModel.ts"],"names":[],"mappings":"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"}