@polytric/openws-spec 0.0.2 → 0.0.4

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.
package/README.md CHANGED
@@ -1,5 +1,8 @@
1
1
  # OpenWS Specification <!-- omit in toc -->
2
2
 
3
+ [![npm](https://img.shields.io/npm/v/@polytric/openws-spec)](https://www.npmjs.com/package/@polytric/openws-spec)
4
+ [![license](https://img.shields.io/npm/l/@polytric/openws-spec)](https://github.com/polytric/openws/blob/main/LICENSE)
5
+
3
6
  OpenWS is a specification for describing **WebSocket-based systems** in the same way OpenAPI describes HTTP APIs. It models WebSocket communication as an **asymmetrical 2-way request-response mesh**: multiple components exchange named messages, and "responses" are simply messages sent back through the same network.
4
7
 
5
8
  An OpenWS document describes:
@@ -23,16 +26,16 @@ This spec intentionally does **not** describe behavior or execution.
23
26
  - [Document Structure](#document-structure)
24
27
  - [Ecosystem](#ecosystem)
25
28
  - [Core Concepts](#core-concepts)
26
- - [Networks](#networks)
27
- - [Roles](#roles)
28
- - [Messages](#messages)
29
- - [Request/response modeling](#requestresponse-modeling)
30
- - [Payload](#payload)
31
- - [Metadata \& Connection Hints](#metadata--connection-hints)
32
- - [Document metadata](#document-metadata)
33
- - [Connection hints](#connection-hints)
34
- - [Custom metadata and extensions](#custom-metadata-and-extensions)
35
- - [Complete Example](#complete-example)
29
+ - [Networks](#networks)
30
+ - [Roles](#roles)
31
+ - [Messages](#messages)
32
+ - [Request/response modeling](#requestresponse-modeling)
33
+ - [Payload](#payload)
34
+ - [Metadata \& Connection Hints](#metadata--connection-hints)
35
+ - [Document metadata](#document-metadata)
36
+ - [Connection hints](#connection-hints)
37
+ - [Custom metadata and extensions](#custom-metadata-and-extensions)
38
+ - [Complete Example](#complete-example)
36
39
 
37
40
  # Conventions
38
41
 
@@ -90,14 +93,17 @@ This repository/spec is intended to support a full "fleet" of packages, includin
90
93
 
91
94
  - **Spec & validation**
92
95
  - [`@polytric/openws-spec`](https://www.npmjs.com/package/@polytric/openws-spec) - This library
93
- - [`@polytric/fastify-openws-spec`](https://www.npmjs.com/package/@polytric/fastify-openws-spec) -- Fastify plugin to generate OpenWS spec from code
94
96
 
95
97
  - **Runtime framework**
96
- - [`@polytric/ws`](https://www.npmjs.com/package/@polytric/ws) -- Polytric WS framework for JavaScript.
97
- - [`@polytric/fastify-openws`](https://www.npmjs.com/package/@polytric/fastify-openws) -- Fastify OpenWS SDK for JavaScript
98
+ - [`@polytric/openws`](https://www.npmjs.com/package/@polytric/openws) - OpenWS framework for JavaScript/TypeScript
99
+ - [`@polytric/fastify-openws`](https://www.npmjs.com/package/@polytric/fastify-openws) - Fastify WebSocket integration
100
+
101
+ - **UI & tooling**
102
+ - [`@polytric/openws-ui`](https://www.npmjs.com/package/@polytric/openws-ui) - Swagger-like spec explorer
103
+ - [`@polytric/fastify-openws-ui`](https://www.npmjs.com/package/@polytric/fastify-openws-ui) - Mount OpenWS UI in Fastify
98
104
 
99
105
  - **SDK generation**
100
- - [`@polytric/openws-sdkgen`](https://www.npmjs.com/package/@polytric/openws-sdkgen) -- OpenWS code generation tool with multi-language support
106
+ - [`@polytric/openws-sdkgen`](https://www.npmjs.com/package/@polytric/openws-sdkgen) - CLI for generating typed SDKs
101
107
 
102
108
  > The spec intentionally stays framework-agnostic; framework integrations and SDKs belong to the ecosystem layer.
103
109
 
@@ -333,121 +339,121 @@ The following example is a minimal but complete OpenWS document modeling a chat
333
339
  "version": "1.0.0",
334
340
  "description": "A minimal OpenWS document modeling a chat network.",
335
341
  "networks": {
336
- "chat": {
337
- "description": "Realtime chat network.",
338
- "roles": {
339
- "server": {
340
- "description": "Backend that hosts rooms and broadcasts messages.",
341
- "endpoints": [
342
- {
343
- "scheme": "wss",
344
- "host": "chat.example.com",
345
- "port": 443,
346
- "path": "/ws/chat"
347
- }
348
- ],
349
- "messages": {
350
- "join": {
351
- "description": "Request to join a room.",
352
- "payload": {
353
- "type": "object",
354
- "additionalProperties": false,
355
- "required": ["userId", "roomId"],
356
- "properties": {
357
- "userId": { "type": "string", "minLength": 1 },
358
- "roomId": { "type": "string", "minLength": 1 }
359
- }
360
- }
361
- },
362
- "message": {
363
- "description": "Send a chat message to a room.",
364
- "payload": {
365
- "type": "object",
366
- "additionalProperties": false,
367
- "required": ["userId", "roomId", "text"],
368
- "properties": {
369
- "userId": { "type": "string", "minLength": 1 },
370
- "roomId": { "type": "string", "minLength": 1 },
371
- "text": { "type": "string", "minLength": 1, "maxLength": 2048 }
372
- }
373
- }
374
- },
375
- "createRoom": {
376
- "description": "Create a new room.",
377
- "payload": {
378
- "type": "object",
379
- "additionalProperties": false,
380
- "required": ["userId", "name"],
381
- "properties": {
382
- "userId": { "type": "string", "minLength": 1 },
383
- "name": { "type": "string", "minLength": 1, "maxLength": 128 }
384
- }
385
- }
386
- },
387
- "requestStats": {
388
- "description": "Request channel statistics.",
389
- "payload": {
390
- "type": "object",
391
- "additionalProperties": false,
392
- "required": ["roomId"],
393
- "properties": {
394
- "roomId": { "type": "string", "minLength": 1 }
395
- }
396
- }
397
- }
398
- }
399
- },
400
- "client": {
401
- "description": "End-user client that receives events from the server.",
402
- "messages": {
403
- "roomJoined": {
404
- "description": "Emitted after a join succeeds.",
405
- "payload": {
406
- "type": "object",
407
- "additionalProperties": false,
408
- "required": ["roomId"],
409
- "properties": {
410
- "roomId": { "type": "string", "minLength": 1 }
411
- }
412
- }
413
- },
414
- "messageReceived": {
415
- "description": "Broadcast of a message to participants in a room.",
416
- "payload": {
417
- "type": "object",
418
- "additionalProperties": false,
419
- "required": ["roomId", "text", "senderId", "sentAt"],
420
- "properties": {
421
- "roomId": { "type": "string", "minLength": 1 },
422
- "text": { "type": "string", "minLength": 1, "maxLength": 2048 },
423
- "senderId": { "type": "string", "minLength": 1 },
424
- "sentAt": { "type": "integer" }
425
- }
426
- }
427
- }
428
- }
429
- },
430
- "portal": {
431
- "description": "Internal web portal that receives aggregated stats.",
432
- "messages": {
433
- "channelStats": {
434
- "description": "Room-level metrics snapshot.",
435
- "payload": {
436
- "type": "object",
437
- "additionalProperties": false,
438
- "required": ["roomId", "members", "messagesLastMinute"],
439
- "properties": {
440
- "roomId": { "type": "string", "minLength": 1 },
441
- "members": { "type": "integer", "minimum": 0 },
442
- "messagesLastMinute": { "type": "integer", "minimum": 0 }
443
- }
342
+ "chat": {
343
+ "description": "Realtime chat network.",
344
+ "roles": {
345
+ "server": {
346
+ "description": "Backend that hosts rooms and broadcasts messages.",
347
+ "endpoints": [
348
+ {
349
+ "scheme": "wss",
350
+ "host": "chat.example.com",
351
+ "port": 443,
352
+ "path": "/ws/chat"
353
+ }
354
+ ],
355
+ "messages": {
356
+ "join": {
357
+ "description": "Request to join a room.",
358
+ "payload": {
359
+ "type": "object",
360
+ "additionalProperties": false,
361
+ "required": ["userId", "roomId"],
362
+ "properties": {
363
+ "userId": { "type": "string", "minLength": 1 },
364
+ "roomId": { "type": "string", "minLength": 1 }
365
+ }
366
+ }
367
+ },
368
+ "message": {
369
+ "description": "Send a chat message to a room.",
370
+ "payload": {
371
+ "type": "object",
372
+ "additionalProperties": false,
373
+ "required": ["userId", "roomId", "text"],
374
+ "properties": {
375
+ "userId": { "type": "string", "minLength": 1 },
376
+ "roomId": { "type": "string", "minLength": 1 },
377
+ "text": { "type": "string", "minLength": 1, "maxLength": 2048 }
378
+ }
379
+ }
380
+ },
381
+ "createRoom": {
382
+ "description": "Create a new room.",
383
+ "payload": {
384
+ "type": "object",
385
+ "additionalProperties": false,
386
+ "required": ["userId", "name"],
387
+ "properties": {
388
+ "userId": { "type": "string", "minLength": 1 },
389
+ "name": { "type": "string", "minLength": 1, "maxLength": 128 }
390
+ }
391
+ }
392
+ },
393
+ "requestStats": {
394
+ "description": "Request channel statistics.",
395
+ "payload": {
396
+ "type": "object",
397
+ "additionalProperties": false,
398
+ "required": ["roomId"],
399
+ "properties": {
400
+ "roomId": { "type": "string", "minLength": 1 }
401
+ }
402
+ }
403
+ }
404
+ }
405
+ },
406
+ "client": {
407
+ "description": "End-user client that receives events from the server.",
408
+ "messages": {
409
+ "roomJoined": {
410
+ "description": "Emitted after a join succeeds.",
411
+ "payload": {
412
+ "type": "object",
413
+ "additionalProperties": false,
414
+ "required": ["roomId"],
415
+ "properties": {
416
+ "roomId": { "type": "string", "minLength": 1 }
417
+ }
418
+ }
419
+ },
420
+ "messageReceived": {
421
+ "description": "Broadcast of a message to participants in a room.",
422
+ "payload": {
423
+ "type": "object",
424
+ "additionalProperties": false,
425
+ "required": ["roomId", "text", "senderId", "sentAt"],
426
+ "properties": {
427
+ "roomId": { "type": "string", "minLength": 1 },
428
+ "text": { "type": "string", "minLength": 1, "maxLength": 2048 },
429
+ "senderId": { "type": "string", "minLength": 1 },
430
+ "sentAt": { "type": "integer" }
431
+ }
432
+ }
433
+ }
434
+ }
435
+ },
436
+ "portal": {
437
+ "description": "Internal web portal that receives aggregated stats.",
438
+ "messages": {
439
+ "channelStats": {
440
+ "description": "Room-level metrics snapshot.",
441
+ "payload": {
442
+ "type": "object",
443
+ "additionalProperties": false,
444
+ "required": ["roomId", "members", "messagesLastMinute"],
445
+ "properties": {
446
+ "roomId": { "type": "string", "minLength": 1 },
447
+ "members": { "type": "integer", "minimum": 0 },
448
+ "messagesLastMinute": { "type": "integer", "minimum": 0 }
449
+ }
450
+ }
451
+ }
452
+ }
444
453
  }
445
- }
446
- }
447
- }
448
- },
449
- "x-routingNotes": "Clients send server.join/server.message. Server emits client.roomJoined/client.messageReceived and portal.channelStats."
450
- }
454
+ },
455
+ "x-routingNotes": "Clients send server.join/server.message. Server emits client.roomJoined/client.messageReceived and portal.channelStats."
456
+ }
451
457
  }
452
- }
458
+ }
453
459
  ```
package/dist/builder.cjs CHANGED
@@ -254,17 +254,17 @@ var Network = class _Network extends Base {
254
254
  }
255
255
  assertValid() {
256
256
  const hostRoles = [];
257
- const consumerRoles = [];
257
+ const remoteRoles = [];
258
258
  for (const role2 of Object.values(this.#roles)) {
259
259
  role2.assertValid();
260
260
  if (role2.isHost) {
261
261
  hostRoles.push(role2);
262
262
  } else {
263
- consumerRoles.push(role2);
263
+ remoteRoles.push(role2);
264
264
  }
265
265
  }
266
- if (consumerRoles.length === 0) {
267
- throw new Error("At least one consumer role must be defined");
266
+ if (remoteRoles.length === 0) {
267
+ throw new Error("At least one remote role must be defined");
268
268
  }
269
269
  const messages = /* @__PURE__ */ new Set();
270
270
  for (const role2 of Object.values(this.#roles)) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/builder.ts"],"sourcesContent":["import type * as Types from './types'\n\nconst WELL_KNOWN_METADATA_KEYS = new Set<string>(['description', 'version', 'openws', 'name'])\n\nexport class Base {\n #metadata: Types.CommonMetadata\n\n constructor(name: string) {\n this.#metadata = { name }\n }\n\n #setMetadata(name: string, value: Types.JsonValue): this {\n this.#metadata[name] = value\n return this\n }\n\n #getMetadataKey(name: string): string {\n if (WELL_KNOWN_METADATA_KEYS.has(name)) {\n return name\n }\n if (!name.startsWith('x-')) {\n return `x-${name}`\n }\n return name\n }\n\n get name(): string {\n return this.#metadata['name'] as string\n }\n\n metadata(name: string, value: Types.JsonValue): this {\n return this.#setMetadata(this.#getMetadataKey(name), value)\n }\n\n getMetadata(name: string): Types.JsonValue | undefined {\n return this.#metadata[this.#getMetadataKey(name)] as Types.JsonValue | undefined\n }\n\n desc(description: string): this {\n return this.description(description)\n }\n\n description(description: string): this {\n return this.#setMetadata('description', description)\n }\n\n version(version: string): this {\n return this.#setMetadata('version', version)\n }\n\n title(title: string): this {\n return this.#setMetadata('title', title)\n }\n\n valueOf(): Types.CommonMetadata {\n return { ...this.#metadata }\n }\n\n toJson(): Types.CommonMetadata {\n return this.valueOf()\n }\n\n isValid(): boolean {\n return false\n }\n}\n\nexport class Message extends Base {\n get isPolytricMessage(): boolean {\n return true\n }\n #payload?: any\n #from?: string[]\n\n constructor(name: string) {\n super(name)\n }\n\n getPayload(): any | undefined {\n return this.#payload\n }\n\n payload(payload: any): this {\n this.#payload = payload.valueOf()\n return this\n }\n\n from(...from: string[]): this {\n this.#from ??= []\n this.#from.push(...from)\n return this\n }\n\n valueOf(): Types.Message {\n if (!this.#payload) {\n throw new Error('Payload is required')\n }\n const ret: Types.Message = {\n ...super.valueOf(),\n payload: this.#payload,\n }\n if (this.#from) {\n ret.from = this.#from\n }\n return ret\n }\n\n static fromJson(json: Types.Message): Message {\n const { payload, from, ...metadata } = json\n const ret = new Message(json.name as string)\n for (const [key, value] of Object.entries(metadata)) {\n ret.metadata(key, value)\n }\n ret.payload(payload)\n if (from) {\n ret.from(...from)\n }\n return ret\n }\n\n assertValid(): boolean {\n if (this.#payload === undefined) {\n throw new Error('Payload is required')\n }\n return true\n }\n}\n\nexport class Endpoint {\n #scheme: string = 'ws'\n #host: string\n #port: number = 433\n #path: string\n\n constructor(scheme: string, host: string, port: number, path: string) {\n this.#scheme = scheme\n this.#host = host\n this.#port = port\n this.#path = path\n }\n\n valueOf(): Types.Endpoint {\n return {\n scheme: this.#scheme,\n host: this.#host,\n port: this.#port,\n path: this.#path,\n }\n }\n\n toJson(): Types.Endpoint {\n return this.valueOf()\n }\n\n static fromJson(json: Types.Endpoint): Endpoint {\n return new Endpoint(json.scheme, json.host, json.port, json.path)\n }\n}\n\nexport class Role extends Base {\n get isPolytricRole(): boolean {\n return true\n }\n #messages: { [key: string]: Message } = {}\n #endpoints: Endpoint[] = []\n\n isHost: boolean = false\n\n asHost(): this {\n this.isHost = true\n return this\n }\n\n message(message: Message): this {\n this.#messages[message.name] = message\n return this\n }\n\n get messages(): Record<string, Message> {\n return this.#messages\n }\n\n endpoint(endpoint: Endpoint): this {\n this.#endpoints.push(endpoint)\n return this\n }\n\n valueOf(): Types.Role {\n const messages: { [key: string]: Types.Message } = {}\n for (const [name, message] of Object.entries(this.#messages)) {\n messages[name] = message.valueOf()\n }\n const ret: Types.Role = {\n ...super.valueOf(),\n messages,\n }\n if (this.#endpoints.length > 0) {\n ret.endpoints = this.#endpoints.map(endpoint => endpoint.valueOf())\n }\n return ret\n }\n\n static fromJson(json: Types.Role): Role {\n const { messages, endpoints, ...metadata } = json\n const ret = new Role(json.name)\n for (const [key, value] of Object.entries(metadata)) {\n ret.metadata(key, value)\n }\n for (const message of Object.values(messages)) {\n ret.message(Message.fromJson(message))\n }\n for (const endpoint of endpoints ?? []) {\n ret.endpoint(Endpoint.fromJson(endpoint))\n }\n return ret\n }\n\n assertValid(): boolean {\n for (const message of Object.values(this.#messages)) {\n message.assertValid()\n }\n return true\n }\n}\n\nexport class Network extends Base {\n get isPolytricNetwork(): boolean {\n return true\n }\n #roles: { [key: string]: Role } = {}\n\n role(role: Role): this {\n this.#roles[role.name] = role\n return this\n }\n\n get roles(): { [key: string]: Role } {\n return this.#roles\n }\n\n valueOf(): Types.Network {\n const roles: { [key: string]: Types.Role } = {}\n for (const [name, role] of Object.entries(this.#roles)) {\n roles[name] = role.valueOf()\n }\n return {\n ...super.valueOf(),\n roles,\n }\n }\n\n static fromJson(json: Types.Network): Network {\n const { roles, ...metadata } = json\n const ret = new Network(json.name as string)\n for (const [key, value] of Object.entries(metadata)) {\n ret.metadata(key, value)\n }\n for (const role of Object.values(roles)) {\n ret.role(Role.fromJson(role))\n }\n return ret\n }\n\n assertValid(): boolean {\n const hostRoles: Role[] = []\n const consumerRoles: Role[] = []\n for (const role of Object.values(this.#roles)) {\n role.assertValid()\n\n if (role.isHost) {\n hostRoles.push(role as Role)\n } else {\n consumerRoles.push(role as Role)\n }\n }\n if (consumerRoles.length === 0) {\n throw new Error('At least one consumer role must be defined')\n }\n const messages = new Set<string>()\n for (const role of Object.values(this.#roles)) {\n if (!role.isHost) {\n continue\n }\n for (const message of Object.values(role.messages)) {\n if (messages.has(message.name)) {\n throw new Error(\n `Message '${message.name}' is defined in multiple host roles: ${hostRoles.map(role => role.name).join(', ')}`\n )\n }\n messages.add(message.name)\n }\n }\n\n return true\n }\n}\n\nexport class Spec extends Base {\n get isPolytricSpec(): boolean {\n return true\n }\n #networks: { [key: string]: Network } = {}\n\n constructor(openws: string, name: string) {\n super(name)\n this.metadata('openws', openws)\n }\n\n network(network: Network): this {\n this.#networks[network.name] = network\n return this\n }\n\n get networks(): Record<string, Network> {\n return this.#networks\n }\n\n valueOf(): Types.Spec {\n const networks: { [key: string]: Types.Network } = {}\n for (const [name, network] of Object.entries(this.#networks)) {\n networks[name] = network.valueOf()\n }\n return {\n ...super.valueOf(),\n openws: this.getMetadata('openws') as string,\n networks,\n }\n }\n\n static fromJson(json: Types.Spec): Spec {\n const { networks, ...metadata } = json\n const ret = new Spec(json.openws as string, json.name as string)\n for (const [key, value] of Object.entries(metadata)) {\n ret.metadata(key, value)\n }\n for (const network of Object.values(networks)) {\n ret.network(Network.fromJson(network))\n }\n return ret\n }\n\n assertValid(): boolean {\n for (const network of Object.values(this.#networks)) {\n network.assertValid()\n }\n return true\n }\n}\n\nexport function spec(openws: string, name: string): Spec\nexport function spec(spec: Types.Spec): Spec\nexport function spec(openwsOrSpec: string | Types.Spec, name?: string): Spec {\n if (typeof openwsOrSpec === 'string') {\n return new Spec(openwsOrSpec, name!)\n } else {\n return Spec.fromJson(openwsOrSpec)\n }\n}\n\nexport function network(network: string | Types.Network): Network {\n if (typeof network === 'string') {\n return new Network(network)\n } else {\n return Network.fromJson(network)\n }\n}\n\nexport function role(role: string | Types.Role): Role {\n if (typeof role === 'string') {\n return new Role(role)\n } else {\n return Role.fromJson(role)\n }\n}\n\nexport function message(msg: string | Types.Message): Message {\n if (typeof msg === 'string') {\n return new Message(msg)\n } else {\n return Message.fromJson(msg)\n }\n}\n\nexport function endpoint(endpoint: Types.Endpoint): Endpoint\nexport function endpoint(scheme: string, host: string, port: number, path: string): Endpoint\nexport function endpoint(\n schemeOrEndpoint: string | Types.Endpoint,\n host?: string,\n port?: number,\n path?: string\n): Endpoint {\n if (typeof schemeOrEndpoint === 'string') {\n return new Endpoint(schemeOrEndpoint, host!, port!, path!)\n } else {\n return Endpoint.fromJson(schemeOrEndpoint)\n }\n}\n"],"mappings":"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","names":["message","endpoint","role","network"]}
1
+ {"version":3,"sources":["../src/builder.ts"],"sourcesContent":["import type * as Types from './types'\n\nconst WELL_KNOWN_METADATA_KEYS = new Set<string>(['description', 'version', 'openws', 'name'])\n\nexport class Base {\n #metadata: Types.CommonMetadata\n\n constructor(name: string) {\n this.#metadata = { name }\n }\n\n #setMetadata(name: string, value: Types.JsonValue): this {\n this.#metadata[name] = value\n return this\n }\n\n #getMetadataKey(name: string): string {\n if (WELL_KNOWN_METADATA_KEYS.has(name)) {\n return name\n }\n if (!name.startsWith('x-')) {\n return `x-${name}`\n }\n return name\n }\n\n get name(): string {\n return this.#metadata['name'] as string\n }\n\n metadata(name: string, value: Types.JsonValue): this {\n return this.#setMetadata(this.#getMetadataKey(name), value)\n }\n\n getMetadata(name: string): Types.JsonValue | undefined {\n return this.#metadata[this.#getMetadataKey(name)] as Types.JsonValue | undefined\n }\n\n desc(description: string): this {\n return this.description(description)\n }\n\n description(description: string): this {\n return this.#setMetadata('description', description)\n }\n\n version(version: string): this {\n return this.#setMetadata('version', version)\n }\n\n title(title: string): this {\n return this.#setMetadata('title', title)\n }\n\n valueOf(): Types.CommonMetadata {\n return { ...this.#metadata }\n }\n\n toJson(): Types.CommonMetadata {\n return this.valueOf()\n }\n\n isValid(): boolean {\n return false\n }\n}\n\nexport class Message extends Base {\n get isPolytricMessage(): boolean {\n return true\n }\n #payload?: any\n #from?: string[]\n\n constructor(name: string) {\n super(name)\n }\n\n getPayload(): any | undefined {\n return this.#payload\n }\n\n payload(payload: any): this {\n this.#payload = payload.valueOf()\n return this\n }\n\n from(...from: string[]): this {\n this.#from ??= []\n this.#from.push(...from)\n return this\n }\n\n valueOf(): Types.Message {\n if (!this.#payload) {\n throw new Error('Payload is required')\n }\n const ret: Types.Message = {\n ...super.valueOf(),\n payload: this.#payload,\n }\n if (this.#from) {\n ret.from = this.#from\n }\n return ret\n }\n\n static fromJson(json: Types.Message): Message {\n const { payload, from, ...metadata } = json\n const ret = new Message(json.name as string)\n for (const [key, value] of Object.entries(metadata)) {\n ret.metadata(key, value)\n }\n ret.payload(payload)\n if (from) {\n ret.from(...from)\n }\n return ret\n }\n\n assertValid(): boolean {\n if (this.#payload === undefined) {\n throw new Error('Payload is required')\n }\n return true\n }\n}\n\nexport class Endpoint {\n #scheme: string = 'ws'\n #host: string\n #port: number = 433\n #path: string\n\n constructor(scheme: string, host: string, port: number, path: string) {\n this.#scheme = scheme\n this.#host = host\n this.#port = port\n this.#path = path\n }\n\n valueOf(): Types.Endpoint {\n return {\n scheme: this.#scheme,\n host: this.#host,\n port: this.#port,\n path: this.#path,\n }\n }\n\n toJson(): Types.Endpoint {\n return this.valueOf()\n }\n\n static fromJson(json: Types.Endpoint): Endpoint {\n return new Endpoint(json.scheme, json.host, json.port, json.path)\n }\n}\n\nexport class Role extends Base {\n get isPolytricRole(): boolean {\n return true\n }\n #messages: { [key: string]: Message } = {}\n #endpoints: Endpoint[] = []\n\n isHost: boolean = false\n\n asHost(): this {\n this.isHost = true\n return this\n }\n\n message(message: Message): this {\n this.#messages[message.name] = message\n return this\n }\n\n get messages(): Record<string, Message> {\n return this.#messages\n }\n\n endpoint(endpoint: Endpoint): this {\n this.#endpoints.push(endpoint)\n return this\n }\n\n valueOf(): Types.Role {\n const messages: { [key: string]: Types.Message } = {}\n for (const [name, message] of Object.entries(this.#messages)) {\n messages[name] = message.valueOf()\n }\n const ret: Types.Role = {\n ...super.valueOf(),\n messages,\n }\n if (this.#endpoints.length > 0) {\n ret.endpoints = this.#endpoints.map(endpoint => endpoint.valueOf())\n }\n return ret\n }\n\n static fromJson(json: Types.Role): Role {\n const { messages, endpoints, ...metadata } = json\n const ret = new Role(json.name)\n for (const [key, value] of Object.entries(metadata)) {\n ret.metadata(key, value)\n }\n for (const message of Object.values(messages)) {\n ret.message(Message.fromJson(message))\n }\n for (const endpoint of endpoints ?? []) {\n ret.endpoint(Endpoint.fromJson(endpoint))\n }\n return ret\n }\n\n assertValid(): boolean {\n for (const message of Object.values(this.#messages)) {\n message.assertValid()\n }\n return true\n }\n}\n\nexport class Network extends Base {\n get isPolytricNetwork(): boolean {\n return true\n }\n #roles: { [key: string]: Role } = {}\n\n role(role: Role): this {\n this.#roles[role.name] = role\n return this\n }\n\n get roles(): { [key: string]: Role } {\n return this.#roles\n }\n\n valueOf(): Types.Network {\n const roles: { [key: string]: Types.Role } = {}\n for (const [name, role] of Object.entries(this.#roles)) {\n roles[name] = role.valueOf()\n }\n return {\n ...super.valueOf(),\n roles,\n }\n }\n\n static fromJson(json: Types.Network): Network {\n const { roles, ...metadata } = json\n const ret = new Network(json.name as string)\n for (const [key, value] of Object.entries(metadata)) {\n ret.metadata(key, value)\n }\n for (const role of Object.values(roles)) {\n ret.role(Role.fromJson(role))\n }\n return ret\n }\n\n assertValid(): boolean {\n const hostRoles: Role[] = []\n const remoteRoles: Role[] = []\n for (const role of Object.values(this.#roles)) {\n role.assertValid()\n\n if (role.isHost) {\n hostRoles.push(role as Role)\n } else {\n remoteRoles.push(role as Role)\n }\n }\n if (remoteRoles.length === 0) {\n throw new Error('At least one remote role must be defined')\n }\n const messages = new Set<string>()\n for (const role of Object.values(this.#roles)) {\n if (!role.isHost) {\n continue\n }\n for (const message of Object.values(role.messages)) {\n if (messages.has(message.name)) {\n throw new Error(\n `Message '${message.name}' is defined in multiple host roles: ${hostRoles.map(role => role.name).join(', ')}`\n )\n }\n messages.add(message.name)\n }\n }\n\n return true\n }\n}\n\nexport class Spec extends Base {\n get isPolytricSpec(): boolean {\n return true\n }\n #networks: { [key: string]: Network } = {}\n\n constructor(openws: string, name: string) {\n super(name)\n this.metadata('openws', openws)\n }\n\n network(network: Network): this {\n this.#networks[network.name] = network\n return this\n }\n\n get networks(): Record<string, Network> {\n return this.#networks\n }\n\n valueOf(): Types.Spec {\n const networks: { [key: string]: Types.Network } = {}\n for (const [name, network] of Object.entries(this.#networks)) {\n networks[name] = network.valueOf()\n }\n return {\n ...super.valueOf(),\n openws: this.getMetadata('openws') as string,\n networks,\n }\n }\n\n static fromJson(json: Types.Spec): Spec {\n const { networks, ...metadata } = json\n const ret = new Spec(json.openws as string, json.name as string)\n for (const [key, value] of Object.entries(metadata)) {\n ret.metadata(key, value)\n }\n for (const network of Object.values(networks)) {\n ret.network(Network.fromJson(network))\n }\n return ret\n }\n\n assertValid(): boolean {\n for (const network of Object.values(this.#networks)) {\n network.assertValid()\n }\n return true\n }\n}\n\nexport function spec(openws: string, name: string): Spec\nexport function spec(spec: Types.Spec): Spec\nexport function spec(openwsOrSpec: string | Types.Spec, name?: string): Spec {\n if (typeof openwsOrSpec === 'string') {\n return new Spec(openwsOrSpec, name!)\n } else {\n return Spec.fromJson(openwsOrSpec)\n }\n}\n\nexport function network(network: string | Types.Network): Network {\n if (typeof network === 'string') {\n return new Network(network)\n } else {\n return Network.fromJson(network)\n }\n}\n\nexport function role(role: string | Types.Role): Role {\n if (typeof role === 'string') {\n return new Role(role)\n } else {\n return Role.fromJson(role)\n }\n}\n\nexport function message(msg: string | Types.Message): Message {\n if (typeof msg === 'string') {\n return new Message(msg)\n } else {\n return Message.fromJson(msg)\n }\n}\n\nexport function endpoint(endpoint: Types.Endpoint): Endpoint\nexport function endpoint(scheme: string, host: string, port: number, path: string): Endpoint\nexport function endpoint(\n schemeOrEndpoint: string | Types.Endpoint,\n host?: string,\n port?: number,\n path?: string\n): Endpoint {\n if (typeof schemeOrEndpoint === 'string') {\n return new Endpoint(schemeOrEndpoint, host!, port!, path!)\n } else {\n return Endpoint.fromJson(schemeOrEndpoint)\n }\n}\n"],"mappings":"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","names":["message","endpoint","role","network"]}
package/dist/builder.js CHANGED
@@ -1,5 +1,3 @@
1
- import "./chunk-7D4SUZUM.js";
2
-
3
1
  // src/builder.ts
4
2
  var WELL_KNOWN_METADATA_KEYS = /* @__PURE__ */ new Set(["description", "version", "openws", "name"]);
5
3
  var Base = class {
@@ -222,17 +220,17 @@ var Network = class _Network extends Base {
222
220
  }
223
221
  assertValid() {
224
222
  const hostRoles = [];
225
- const consumerRoles = [];
223
+ const remoteRoles = [];
226
224
  for (const role2 of Object.values(this.#roles)) {
227
225
  role2.assertValid();
228
226
  if (role2.isHost) {
229
227
  hostRoles.push(role2);
230
228
  } else {
231
- consumerRoles.push(role2);
229
+ remoteRoles.push(role2);
232
230
  }
233
231
  }
234
- if (consumerRoles.length === 0) {
235
- throw new Error("At least one consumer role must be defined");
232
+ if (remoteRoles.length === 0) {
233
+ throw new Error("At least one remote role must be defined");
236
234
  }
237
235
  const messages = /* @__PURE__ */ new Set();
238
236
  for (const role2 of Object.values(this.#roles)) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/builder.ts"],"sourcesContent":["import type * as Types from './types'\n\nconst WELL_KNOWN_METADATA_KEYS = new Set<string>(['description', 'version', 'openws', 'name'])\n\nexport class Base {\n #metadata: Types.CommonMetadata\n\n constructor(name: string) {\n this.#metadata = { name }\n }\n\n #setMetadata(name: string, value: Types.JsonValue): this {\n this.#metadata[name] = value\n return this\n }\n\n #getMetadataKey(name: string): string {\n if (WELL_KNOWN_METADATA_KEYS.has(name)) {\n return name\n }\n if (!name.startsWith('x-')) {\n return `x-${name}`\n }\n return name\n }\n\n get name(): string {\n return this.#metadata['name'] as string\n }\n\n metadata(name: string, value: Types.JsonValue): this {\n return this.#setMetadata(this.#getMetadataKey(name), value)\n }\n\n getMetadata(name: string): Types.JsonValue | undefined {\n return this.#metadata[this.#getMetadataKey(name)] as Types.JsonValue | undefined\n }\n\n desc(description: string): this {\n return this.description(description)\n }\n\n description(description: string): this {\n return this.#setMetadata('description', description)\n }\n\n version(version: string): this {\n return this.#setMetadata('version', version)\n }\n\n title(title: string): this {\n return this.#setMetadata('title', title)\n }\n\n valueOf(): Types.CommonMetadata {\n return { ...this.#metadata }\n }\n\n toJson(): Types.CommonMetadata {\n return this.valueOf()\n }\n\n isValid(): boolean {\n return false\n }\n}\n\nexport class Message extends Base {\n get isPolytricMessage(): boolean {\n return true\n }\n #payload?: any\n #from?: string[]\n\n constructor(name: string) {\n super(name)\n }\n\n getPayload(): any | undefined {\n return this.#payload\n }\n\n payload(payload: any): this {\n this.#payload = payload.valueOf()\n return this\n }\n\n from(...from: string[]): this {\n this.#from ??= []\n this.#from.push(...from)\n return this\n }\n\n valueOf(): Types.Message {\n if (!this.#payload) {\n throw new Error('Payload is required')\n }\n const ret: Types.Message = {\n ...super.valueOf(),\n payload: this.#payload,\n }\n if (this.#from) {\n ret.from = this.#from\n }\n return ret\n }\n\n static fromJson(json: Types.Message): Message {\n const { payload, from, ...metadata } = json\n const ret = new Message(json.name as string)\n for (const [key, value] of Object.entries(metadata)) {\n ret.metadata(key, value)\n }\n ret.payload(payload)\n if (from) {\n ret.from(...from)\n }\n return ret\n }\n\n assertValid(): boolean {\n if (this.#payload === undefined) {\n throw new Error('Payload is required')\n }\n return true\n }\n}\n\nexport class Endpoint {\n #scheme: string = 'ws'\n #host: string\n #port: number = 433\n #path: string\n\n constructor(scheme: string, host: string, port: number, path: string) {\n this.#scheme = scheme\n this.#host = host\n this.#port = port\n this.#path = path\n }\n\n valueOf(): Types.Endpoint {\n return {\n scheme: this.#scheme,\n host: this.#host,\n port: this.#port,\n path: this.#path,\n }\n }\n\n toJson(): Types.Endpoint {\n return this.valueOf()\n }\n\n static fromJson(json: Types.Endpoint): Endpoint {\n return new Endpoint(json.scheme, json.host, json.port, json.path)\n }\n}\n\nexport class Role extends Base {\n get isPolytricRole(): boolean {\n return true\n }\n #messages: { [key: string]: Message } = {}\n #endpoints: Endpoint[] = []\n\n isHost: boolean = false\n\n asHost(): this {\n this.isHost = true\n return this\n }\n\n message(message: Message): this {\n this.#messages[message.name] = message\n return this\n }\n\n get messages(): Record<string, Message> {\n return this.#messages\n }\n\n endpoint(endpoint: Endpoint): this {\n this.#endpoints.push(endpoint)\n return this\n }\n\n valueOf(): Types.Role {\n const messages: { [key: string]: Types.Message } = {}\n for (const [name, message] of Object.entries(this.#messages)) {\n messages[name] = message.valueOf()\n }\n const ret: Types.Role = {\n ...super.valueOf(),\n messages,\n }\n if (this.#endpoints.length > 0) {\n ret.endpoints = this.#endpoints.map(endpoint => endpoint.valueOf())\n }\n return ret\n }\n\n static fromJson(json: Types.Role): Role {\n const { messages, endpoints, ...metadata } = json\n const ret = new Role(json.name)\n for (const [key, value] of Object.entries(metadata)) {\n ret.metadata(key, value)\n }\n for (const message of Object.values(messages)) {\n ret.message(Message.fromJson(message))\n }\n for (const endpoint of endpoints ?? []) {\n ret.endpoint(Endpoint.fromJson(endpoint))\n }\n return ret\n }\n\n assertValid(): boolean {\n for (const message of Object.values(this.#messages)) {\n message.assertValid()\n }\n return true\n }\n}\n\nexport class Network extends Base {\n get isPolytricNetwork(): boolean {\n return true\n }\n #roles: { [key: string]: Role } = {}\n\n role(role: Role): this {\n this.#roles[role.name] = role\n return this\n }\n\n get roles(): { [key: string]: Role } {\n return this.#roles\n }\n\n valueOf(): Types.Network {\n const roles: { [key: string]: Types.Role } = {}\n for (const [name, role] of Object.entries(this.#roles)) {\n roles[name] = role.valueOf()\n }\n return {\n ...super.valueOf(),\n roles,\n }\n }\n\n static fromJson(json: Types.Network): Network {\n const { roles, ...metadata } = json\n const ret = new Network(json.name as string)\n for (const [key, value] of Object.entries(metadata)) {\n ret.metadata(key, value)\n }\n for (const role of Object.values(roles)) {\n ret.role(Role.fromJson(role))\n }\n return ret\n }\n\n assertValid(): boolean {\n const hostRoles: Role[] = []\n const consumerRoles: Role[] = []\n for (const role of Object.values(this.#roles)) {\n role.assertValid()\n\n if (role.isHost) {\n hostRoles.push(role as Role)\n } else {\n consumerRoles.push(role as Role)\n }\n }\n if (consumerRoles.length === 0) {\n throw new Error('At least one consumer role must be defined')\n }\n const messages = new Set<string>()\n for (const role of Object.values(this.#roles)) {\n if (!role.isHost) {\n continue\n }\n for (const message of Object.values(role.messages)) {\n if (messages.has(message.name)) {\n throw new Error(\n `Message '${message.name}' is defined in multiple host roles: ${hostRoles.map(role => role.name).join(', ')}`\n )\n }\n messages.add(message.name)\n }\n }\n\n return true\n }\n}\n\nexport class Spec extends Base {\n get isPolytricSpec(): boolean {\n return true\n }\n #networks: { [key: string]: Network } = {}\n\n constructor(openws: string, name: string) {\n super(name)\n this.metadata('openws', openws)\n }\n\n network(network: Network): this {\n this.#networks[network.name] = network\n return this\n }\n\n get networks(): Record<string, Network> {\n return this.#networks\n }\n\n valueOf(): Types.Spec {\n const networks: { [key: string]: Types.Network } = {}\n for (const [name, network] of Object.entries(this.#networks)) {\n networks[name] = network.valueOf()\n }\n return {\n ...super.valueOf(),\n openws: this.getMetadata('openws') as string,\n networks,\n }\n }\n\n static fromJson(json: Types.Spec): Spec {\n const { networks, ...metadata } = json\n const ret = new Spec(json.openws as string, json.name as string)\n for (const [key, value] of Object.entries(metadata)) {\n ret.metadata(key, value)\n }\n for (const network of Object.values(networks)) {\n ret.network(Network.fromJson(network))\n }\n return ret\n }\n\n assertValid(): boolean {\n for (const network of Object.values(this.#networks)) {\n network.assertValid()\n }\n return true\n }\n}\n\nexport function spec(openws: string, name: string): Spec\nexport function spec(spec: Types.Spec): Spec\nexport function spec(openwsOrSpec: string | Types.Spec, name?: string): Spec {\n if (typeof openwsOrSpec === 'string') {\n return new Spec(openwsOrSpec, name!)\n } else {\n return Spec.fromJson(openwsOrSpec)\n }\n}\n\nexport function network(network: string | Types.Network): Network {\n if (typeof network === 'string') {\n return new Network(network)\n } else {\n return Network.fromJson(network)\n }\n}\n\nexport function role(role: string | Types.Role): Role {\n if (typeof role === 'string') {\n return new Role(role)\n } else {\n return Role.fromJson(role)\n }\n}\n\nexport function message(msg: string | Types.Message): Message {\n if (typeof msg === 'string') {\n return new Message(msg)\n } else {\n return Message.fromJson(msg)\n }\n}\n\nexport function endpoint(endpoint: Types.Endpoint): Endpoint\nexport function endpoint(scheme: string, host: string, port: number, path: string): Endpoint\nexport function endpoint(\n schemeOrEndpoint: string | Types.Endpoint,\n host?: string,\n port?: number,\n path?: string\n): Endpoint {\n if (typeof schemeOrEndpoint === 'string') {\n return new Endpoint(schemeOrEndpoint, host!, port!, path!)\n } else {\n return Endpoint.fromJson(schemeOrEndpoint)\n }\n}\n"],"mappings":"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","names":["message","endpoint","role","network"]}
1
+ {"version":3,"sources":["../src/builder.ts"],"sourcesContent":["import type * as Types from './types'\n\nconst WELL_KNOWN_METADATA_KEYS = new Set<string>(['description', 'version', 'openws', 'name'])\n\nexport class Base {\n #metadata: Types.CommonMetadata\n\n constructor(name: string) {\n this.#metadata = { name }\n }\n\n #setMetadata(name: string, value: Types.JsonValue): this {\n this.#metadata[name] = value\n return this\n }\n\n #getMetadataKey(name: string): string {\n if (WELL_KNOWN_METADATA_KEYS.has(name)) {\n return name\n }\n if (!name.startsWith('x-')) {\n return `x-${name}`\n }\n return name\n }\n\n get name(): string {\n return this.#metadata['name'] as string\n }\n\n metadata(name: string, value: Types.JsonValue): this {\n return this.#setMetadata(this.#getMetadataKey(name), value)\n }\n\n getMetadata(name: string): Types.JsonValue | undefined {\n return this.#metadata[this.#getMetadataKey(name)] as Types.JsonValue | undefined\n }\n\n desc(description: string): this {\n return this.description(description)\n }\n\n description(description: string): this {\n return this.#setMetadata('description', description)\n }\n\n version(version: string): this {\n return this.#setMetadata('version', version)\n }\n\n title(title: string): this {\n return this.#setMetadata('title', title)\n }\n\n valueOf(): Types.CommonMetadata {\n return { ...this.#metadata }\n }\n\n toJson(): Types.CommonMetadata {\n return this.valueOf()\n }\n\n isValid(): boolean {\n return false\n }\n}\n\nexport class Message extends Base {\n get isPolytricMessage(): boolean {\n return true\n }\n #payload?: any\n #from?: string[]\n\n constructor(name: string) {\n super(name)\n }\n\n getPayload(): any | undefined {\n return this.#payload\n }\n\n payload(payload: any): this {\n this.#payload = payload.valueOf()\n return this\n }\n\n from(...from: string[]): this {\n this.#from ??= []\n this.#from.push(...from)\n return this\n }\n\n valueOf(): Types.Message {\n if (!this.#payload) {\n throw new Error('Payload is required')\n }\n const ret: Types.Message = {\n ...super.valueOf(),\n payload: this.#payload,\n }\n if (this.#from) {\n ret.from = this.#from\n }\n return ret\n }\n\n static fromJson(json: Types.Message): Message {\n const { payload, from, ...metadata } = json\n const ret = new Message(json.name as string)\n for (const [key, value] of Object.entries(metadata)) {\n ret.metadata(key, value)\n }\n ret.payload(payload)\n if (from) {\n ret.from(...from)\n }\n return ret\n }\n\n assertValid(): boolean {\n if (this.#payload === undefined) {\n throw new Error('Payload is required')\n }\n return true\n }\n}\n\nexport class Endpoint {\n #scheme: string = 'ws'\n #host: string\n #port: number = 433\n #path: string\n\n constructor(scheme: string, host: string, port: number, path: string) {\n this.#scheme = scheme\n this.#host = host\n this.#port = port\n this.#path = path\n }\n\n valueOf(): Types.Endpoint {\n return {\n scheme: this.#scheme,\n host: this.#host,\n port: this.#port,\n path: this.#path,\n }\n }\n\n toJson(): Types.Endpoint {\n return this.valueOf()\n }\n\n static fromJson(json: Types.Endpoint): Endpoint {\n return new Endpoint(json.scheme, json.host, json.port, json.path)\n }\n}\n\nexport class Role extends Base {\n get isPolytricRole(): boolean {\n return true\n }\n #messages: { [key: string]: Message } = {}\n #endpoints: Endpoint[] = []\n\n isHost: boolean = false\n\n asHost(): this {\n this.isHost = true\n return this\n }\n\n message(message: Message): this {\n this.#messages[message.name] = message\n return this\n }\n\n get messages(): Record<string, Message> {\n return this.#messages\n }\n\n endpoint(endpoint: Endpoint): this {\n this.#endpoints.push(endpoint)\n return this\n }\n\n valueOf(): Types.Role {\n const messages: { [key: string]: Types.Message } = {}\n for (const [name, message] of Object.entries(this.#messages)) {\n messages[name] = message.valueOf()\n }\n const ret: Types.Role = {\n ...super.valueOf(),\n messages,\n }\n if (this.#endpoints.length > 0) {\n ret.endpoints = this.#endpoints.map(endpoint => endpoint.valueOf())\n }\n return ret\n }\n\n static fromJson(json: Types.Role): Role {\n const { messages, endpoints, ...metadata } = json\n const ret = new Role(json.name)\n for (const [key, value] of Object.entries(metadata)) {\n ret.metadata(key, value)\n }\n for (const message of Object.values(messages)) {\n ret.message(Message.fromJson(message))\n }\n for (const endpoint of endpoints ?? []) {\n ret.endpoint(Endpoint.fromJson(endpoint))\n }\n return ret\n }\n\n assertValid(): boolean {\n for (const message of Object.values(this.#messages)) {\n message.assertValid()\n }\n return true\n }\n}\n\nexport class Network extends Base {\n get isPolytricNetwork(): boolean {\n return true\n }\n #roles: { [key: string]: Role } = {}\n\n role(role: Role): this {\n this.#roles[role.name] = role\n return this\n }\n\n get roles(): { [key: string]: Role } {\n return this.#roles\n }\n\n valueOf(): Types.Network {\n const roles: { [key: string]: Types.Role } = {}\n for (const [name, role] of Object.entries(this.#roles)) {\n roles[name] = role.valueOf()\n }\n return {\n ...super.valueOf(),\n roles,\n }\n }\n\n static fromJson(json: Types.Network): Network {\n const { roles, ...metadata } = json\n const ret = new Network(json.name as string)\n for (const [key, value] of Object.entries(metadata)) {\n ret.metadata(key, value)\n }\n for (const role of Object.values(roles)) {\n ret.role(Role.fromJson(role))\n }\n return ret\n }\n\n assertValid(): boolean {\n const hostRoles: Role[] = []\n const remoteRoles: Role[] = []\n for (const role of Object.values(this.#roles)) {\n role.assertValid()\n\n if (role.isHost) {\n hostRoles.push(role as Role)\n } else {\n remoteRoles.push(role as Role)\n }\n }\n if (remoteRoles.length === 0) {\n throw new Error('At least one remote role must be defined')\n }\n const messages = new Set<string>()\n for (const role of Object.values(this.#roles)) {\n if (!role.isHost) {\n continue\n }\n for (const message of Object.values(role.messages)) {\n if (messages.has(message.name)) {\n throw new Error(\n `Message '${message.name}' is defined in multiple host roles: ${hostRoles.map(role => role.name).join(', ')}`\n )\n }\n messages.add(message.name)\n }\n }\n\n return true\n }\n}\n\nexport class Spec extends Base {\n get isPolytricSpec(): boolean {\n return true\n }\n #networks: { [key: string]: Network } = {}\n\n constructor(openws: string, name: string) {\n super(name)\n this.metadata('openws', openws)\n }\n\n network(network: Network): this {\n this.#networks[network.name] = network\n return this\n }\n\n get networks(): Record<string, Network> {\n return this.#networks\n }\n\n valueOf(): Types.Spec {\n const networks: { [key: string]: Types.Network } = {}\n for (const [name, network] of Object.entries(this.#networks)) {\n networks[name] = network.valueOf()\n }\n return {\n ...super.valueOf(),\n openws: this.getMetadata('openws') as string,\n networks,\n }\n }\n\n static fromJson(json: Types.Spec): Spec {\n const { networks, ...metadata } = json\n const ret = new Spec(json.openws as string, json.name as string)\n for (const [key, value] of Object.entries(metadata)) {\n ret.metadata(key, value)\n }\n for (const network of Object.values(networks)) {\n ret.network(Network.fromJson(network))\n }\n return ret\n }\n\n assertValid(): boolean {\n for (const network of Object.values(this.#networks)) {\n network.assertValid()\n }\n return true\n }\n}\n\nexport function spec(openws: string, name: string): Spec\nexport function spec(spec: Types.Spec): Spec\nexport function spec(openwsOrSpec: string | Types.Spec, name?: string): Spec {\n if (typeof openwsOrSpec === 'string') {\n return new Spec(openwsOrSpec, name!)\n } else {\n return Spec.fromJson(openwsOrSpec)\n }\n}\n\nexport function network(network: string | Types.Network): Network {\n if (typeof network === 'string') {\n return new Network(network)\n } else {\n return Network.fromJson(network)\n }\n}\n\nexport function role(role: string | Types.Role): Role {\n if (typeof role === 'string') {\n return new Role(role)\n } else {\n return Role.fromJson(role)\n }\n}\n\nexport function message(msg: string | Types.Message): Message {\n if (typeof msg === 'string') {\n return new Message(msg)\n } else {\n return Message.fromJson(msg)\n }\n}\n\nexport function endpoint(endpoint: Types.Endpoint): Endpoint\nexport function endpoint(scheme: string, host: string, port: number, path: string): Endpoint\nexport function endpoint(\n schemeOrEndpoint: string | Types.Endpoint,\n host?: string,\n port?: number,\n path?: string\n): Endpoint {\n if (typeof schemeOrEndpoint === 'string') {\n return new Endpoint(schemeOrEndpoint, host!, port!, path!)\n } else {\n return Endpoint.fromJson(schemeOrEndpoint)\n }\n}\n"],"mappings":";AAEA,IAAM,2BAA2B,oBAAI,IAAY,CAAC,eAAe,WAAW,UAAU,MAAM,CAAC;AAEtF,IAAM,OAAN,MAAW;AAAA,EACd;AAAA,EAEA,YAAY,MAAc;AACtB,SAAK,YAAY,EAAE,KAAK;AAAA,EAC5B;AAAA,EAEA,aAAa,MAAc,OAA8B;AACrD,SAAK,UAAU,IAAI,IAAI;AACvB,WAAO;AAAA,EACX;AAAA,EAEA,gBAAgB,MAAsB;AAClC,QAAI,yBAAyB,IAAI,IAAI,GAAG;AACpC,aAAO;AAAA,IACX;AACA,QAAI,CAAC,KAAK,WAAW,IAAI,GAAG;AACxB,aAAO,KAAK,IAAI;AAAA,IACpB;AACA,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,OAAe;AACf,WAAO,KAAK,UAAU,MAAM;AAAA,EAChC;AAAA,EAEA,SAAS,MAAc,OAA8B;AACjD,WAAO,KAAK,aAAa,KAAK,gBAAgB,IAAI,GAAG,KAAK;AAAA,EAC9D;AAAA,EAEA,YAAY,MAA2C;AACnD,WAAO,KAAK,UAAU,KAAK,gBAAgB,IAAI,CAAC;AAAA,EACpD;AAAA,EAEA,KAAK,aAA2B;AAC5B,WAAO,KAAK,YAAY,WAAW;AAAA,EACvC;AAAA,EAEA,YAAY,aAA2B;AACnC,WAAO,KAAK,aAAa,eAAe,WAAW;AAAA,EACvD;AAAA,EAEA,QAAQ,SAAuB;AAC3B,WAAO,KAAK,aAAa,WAAW,OAAO;AAAA,EAC/C;AAAA,EAEA,MAAM,OAAqB;AACvB,WAAO,KAAK,aAAa,SAAS,KAAK;AAAA,EAC3C;AAAA,EAEA,UAAgC;AAC5B,WAAO,EAAE,GAAG,KAAK,UAAU;AAAA,EAC/B;AAAA,EAEA,SAA+B;AAC3B,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,UAAmB;AACf,WAAO;AAAA,EACX;AACJ;AAEO,IAAM,UAAN,MAAM,iBAAgB,KAAK;AAAA,EAC9B,IAAI,oBAA6B;AAC7B,WAAO;AAAA,EACX;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,MAAc;AACtB,UAAM,IAAI;AAAA,EACd;AAAA,EAEA,aAA8B;AAC1B,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,QAAQ,SAAoB;AACxB,SAAK,WAAW,QAAQ,QAAQ;AAChC,WAAO;AAAA,EACX;AAAA,EAEA,QAAQ,MAAsB;AAC1B,SAAK,UAAU,CAAC;AAChB,SAAK,MAAM,KAAK,GAAG,IAAI;AACvB,WAAO;AAAA,EACX;AAAA,EAEA,UAAyB;AACrB,QAAI,CAAC,KAAK,UAAU;AAChB,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACzC;AACA,UAAM,MAAqB;AAAA,MACvB,GAAG,MAAM,QAAQ;AAAA,MACjB,SAAS,KAAK;AAAA,IAClB;AACA,QAAI,KAAK,OAAO;AACZ,UAAI,OAAO,KAAK;AAAA,IACpB;AACA,WAAO;AAAA,EACX;AAAA,EAEA,OAAO,SAAS,MAA8B;AAC1C,UAAM,EAAE,SAAS,MAAM,GAAG,SAAS,IAAI;AACvC,UAAM,MAAM,IAAI,SAAQ,KAAK,IAAc;AAC3C,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACjD,UAAI,SAAS,KAAK,KAAK;AAAA,IAC3B;AACA,QAAI,QAAQ,OAAO;AACnB,QAAI,MAAM;AACN,UAAI,KAAK,GAAG,IAAI;AAAA,IACpB;AACA,WAAO;AAAA,EACX;AAAA,EAEA,cAAuB;AACnB,QAAI,KAAK,aAAa,QAAW;AAC7B,YAAM,IAAI,MAAM,qBAAqB;AAAA,IACzC;AACA,WAAO;AAAA,EACX;AACJ;AAEO,IAAM,WAAN,MAAM,UAAS;AAAA,EAClB,UAAkB;AAAA,EAClB;AAAA,EACA,QAAgB;AAAA,EAChB;AAAA,EAEA,YAAY,QAAgB,MAAc,MAAc,MAAc;AAClE,SAAK,UAAU;AACf,SAAK,QAAQ;AACb,SAAK,QAAQ;AACb,SAAK,QAAQ;AAAA,EACjB;AAAA,EAEA,UAA0B;AACtB,WAAO;AAAA,MACH,QAAQ,KAAK;AAAA,MACb,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,MACX,MAAM,KAAK;AAAA,IACf;AAAA,EACJ;AAAA,EAEA,SAAyB;AACrB,WAAO,KAAK,QAAQ;AAAA,EACxB;AAAA,EAEA,OAAO,SAAS,MAAgC;AAC5C,WAAO,IAAI,UAAS,KAAK,QAAQ,KAAK,MAAM,KAAK,MAAM,KAAK,IAAI;AAAA,EACpE;AACJ;AAEO,IAAM,OAAN,MAAM,cAAa,KAAK;AAAA,EAC3B,IAAI,iBAA0B;AAC1B,WAAO;AAAA,EACX;AAAA,EACA,YAAwC,CAAC;AAAA,EACzC,aAAyB,CAAC;AAAA,EAE1B,SAAkB;AAAA,EAElB,SAAe;AACX,SAAK,SAAS;AACd,WAAO;AAAA,EACX;AAAA,EAEA,QAAQA,UAAwB;AAC5B,SAAK,UAAUA,SAAQ,IAAI,IAAIA;AAC/B,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,WAAoC;AACpC,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,SAASC,WAA0B;AAC/B,SAAK,WAAW,KAAKA,SAAQ;AAC7B,WAAO;AAAA,EACX;AAAA,EAEA,UAAsB;AAClB,UAAM,WAA6C,CAAC;AACpD,eAAW,CAAC,MAAMD,QAAO,KAAK,OAAO,QAAQ,KAAK,SAAS,GAAG;AAC1D,eAAS,IAAI,IAAIA,SAAQ,QAAQ;AAAA,IACrC;AACA,UAAM,MAAkB;AAAA,MACpB,GAAG,MAAM,QAAQ;AAAA,MACjB;AAAA,IACJ;AACA,QAAI,KAAK,WAAW,SAAS,GAAG;AAC5B,UAAI,YAAY,KAAK,WAAW,IAAI,CAAAC,cAAYA,UAAS,QAAQ,CAAC;AAAA,IACtE;AACA,WAAO;AAAA,EACX;AAAA,EAEA,OAAO,SAAS,MAAwB;AACpC,UAAM,EAAE,UAAU,WAAW,GAAG,SAAS,IAAI;AAC7C,UAAM,MAAM,IAAI,MAAK,KAAK,IAAI;AAC9B,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACjD,UAAI,SAAS,KAAK,KAAK;AAAA,IAC3B;AACA,eAAWD,YAAW,OAAO,OAAO,QAAQ,GAAG;AAC3C,UAAI,QAAQ,QAAQ,SAASA,QAAO,CAAC;AAAA,IACzC;AACA,eAAWC,aAAY,aAAa,CAAC,GAAG;AACpC,UAAI,SAAS,SAAS,SAASA,SAAQ,CAAC;AAAA,IAC5C;AACA,WAAO;AAAA,EACX;AAAA,EAEA,cAAuB;AACnB,eAAWD,YAAW,OAAO,OAAO,KAAK,SAAS,GAAG;AACjD,MAAAA,SAAQ,YAAY;AAAA,IACxB;AACA,WAAO;AAAA,EACX;AACJ;AAEO,IAAM,UAAN,MAAM,iBAAgB,KAAK;AAAA,EAC9B,IAAI,oBAA6B;AAC7B,WAAO;AAAA,EACX;AAAA,EACA,SAAkC,CAAC;AAAA,EAEnC,KAAKE,OAAkB;AACnB,SAAK,OAAOA,MAAK,IAAI,IAAIA;AACzB,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,QAAiC;AACjC,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,UAAyB;AACrB,UAAM,QAAuC,CAAC;AAC9C,eAAW,CAAC,MAAMA,KAAI,KAAK,OAAO,QAAQ,KAAK,MAAM,GAAG;AACpD,YAAM,IAAI,IAAIA,MAAK,QAAQ;AAAA,IAC/B;AACA,WAAO;AAAA,MACH,GAAG,MAAM,QAAQ;AAAA,MACjB;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,OAAO,SAAS,MAA8B;AAC1C,UAAM,EAAE,OAAO,GAAG,SAAS,IAAI;AAC/B,UAAM,MAAM,IAAI,SAAQ,KAAK,IAAc;AAC3C,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACjD,UAAI,SAAS,KAAK,KAAK;AAAA,IAC3B;AACA,eAAWA,SAAQ,OAAO,OAAO,KAAK,GAAG;AACrC,UAAI,KAAK,KAAK,SAASA,KAAI,CAAC;AAAA,IAChC;AACA,WAAO;AAAA,EACX;AAAA,EAEA,cAAuB;AACnB,UAAM,YAAoB,CAAC;AAC3B,UAAM,cAAsB,CAAC;AAC7B,eAAWA,SAAQ,OAAO,OAAO,KAAK,MAAM,GAAG;AAC3C,MAAAA,MAAK,YAAY;AAEjB,UAAIA,MAAK,QAAQ;AACb,kBAAU,KAAKA,KAAY;AAAA,MAC/B,OAAO;AACH,oBAAY,KAAKA,KAAY;AAAA,MACjC;AAAA,IACJ;AACA,QAAI,YAAY,WAAW,GAAG;AAC1B,YAAM,IAAI,MAAM,0CAA0C;AAAA,IAC9D;AACA,UAAM,WAAW,oBAAI,IAAY;AACjC,eAAWA,SAAQ,OAAO,OAAO,KAAK,MAAM,GAAG;AAC3C,UAAI,CAACA,MAAK,QAAQ;AACd;AAAA,MACJ;AACA,iBAAWF,YAAW,OAAO,OAAOE,MAAK,QAAQ,GAAG;AAChD,YAAI,SAAS,IAAIF,SAAQ,IAAI,GAAG;AAC5B,gBAAM,IAAI;AAAA,YACN,YAAYA,SAAQ,IAAI,wCAAwC,UAAU,IAAI,CAAAE,UAAQA,MAAK,IAAI,EAAE,KAAK,IAAI,CAAC;AAAA,UAC/G;AAAA,QACJ;AACA,iBAAS,IAAIF,SAAQ,IAAI;AAAA,MAC7B;AAAA,IACJ;AAEA,WAAO;AAAA,EACX;AACJ;AAEO,IAAM,OAAN,MAAM,cAAa,KAAK;AAAA,EAC3B,IAAI,iBAA0B;AAC1B,WAAO;AAAA,EACX;AAAA,EACA,YAAwC,CAAC;AAAA,EAEzC,YAAY,QAAgB,MAAc;AACtC,UAAM,IAAI;AACV,SAAK,SAAS,UAAU,MAAM;AAAA,EAClC;AAAA,EAEA,QAAQG,UAAwB;AAC5B,SAAK,UAAUA,SAAQ,IAAI,IAAIA;AAC/B,WAAO;AAAA,EACX;AAAA,EAEA,IAAI,WAAoC;AACpC,WAAO,KAAK;AAAA,EAChB;AAAA,EAEA,UAAsB;AAClB,UAAM,WAA6C,CAAC;AACpD,eAAW,CAAC,MAAMA,QAAO,KAAK,OAAO,QAAQ,KAAK,SAAS,GAAG;AAC1D,eAAS,IAAI,IAAIA,SAAQ,QAAQ;AAAA,IACrC;AACA,WAAO;AAAA,MACH,GAAG,MAAM,QAAQ;AAAA,MACjB,QAAQ,KAAK,YAAY,QAAQ;AAAA,MACjC;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,OAAO,SAAS,MAAwB;AACpC,UAAM,EAAE,UAAU,GAAG,SAAS,IAAI;AAClC,UAAM,MAAM,IAAI,MAAK,KAAK,QAAkB,KAAK,IAAc;AAC/D,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACjD,UAAI,SAAS,KAAK,KAAK;AAAA,IAC3B;AACA,eAAWA,YAAW,OAAO,OAAO,QAAQ,GAAG;AAC3C,UAAI,QAAQ,QAAQ,SAASA,QAAO,CAAC;AAAA,IACzC;AACA,WAAO;AAAA,EACX;AAAA,EAEA,cAAuB;AACnB,eAAWA,YAAW,OAAO,OAAO,KAAK,SAAS,GAAG;AACjD,MAAAA,SAAQ,YAAY;AAAA,IACxB;AACA,WAAO;AAAA,EACX;AACJ;AAIO,SAAS,KAAK,cAAmC,MAAqB;AACzE,MAAI,OAAO,iBAAiB,UAAU;AAClC,WAAO,IAAI,KAAK,cAAc,IAAK;AAAA,EACvC,OAAO;AACH,WAAO,KAAK,SAAS,YAAY;AAAA,EACrC;AACJ;AAEO,SAAS,QAAQA,UAA0C;AAC9D,MAAI,OAAOA,aAAY,UAAU;AAC7B,WAAO,IAAI,QAAQA,QAAO;AAAA,EAC9B,OAAO;AACH,WAAO,QAAQ,SAASA,QAAO;AAAA,EACnC;AACJ;AAEO,SAAS,KAAKD,OAAiC;AAClD,MAAI,OAAOA,UAAS,UAAU;AAC1B,WAAO,IAAI,KAAKA,KAAI;AAAA,EACxB,OAAO;AACH,WAAO,KAAK,SAASA,KAAI;AAAA,EAC7B;AACJ;AAEO,SAAS,QAAQ,KAAsC;AAC1D,MAAI,OAAO,QAAQ,UAAU;AACzB,WAAO,IAAI,QAAQ,GAAG;AAAA,EAC1B,OAAO;AACH,WAAO,QAAQ,SAAS,GAAG;AAAA,EAC/B;AACJ;AAIO,SAAS,SACZ,kBACA,MACA,MACA,MACQ;AACR,MAAI,OAAO,qBAAqB,UAAU;AACtC,WAAO,IAAI,SAAS,kBAAkB,MAAO,MAAO,IAAK;AAAA,EAC7D,OAAO;AACH,WAAO,SAAS,SAAS,gBAAgB;AAAA,EAC7C;AACJ;","names":["message","endpoint","role","network"]}