@kubun/protocol 0.5.0 → 0.5.1

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.
@@ -1399,6 +1399,7 @@ export declare const validateClusterModel: import("@enkaku/schema").Validator<{
1399
1399
  }>;
1400
1400
  export declare function verifyCluster(cluster: ClusterModel): DocumentModelsRecord;
1401
1401
  export type ClusterBuilderParams = {
1402
+ externalModels?: Record<string, DocumentModel>;
1402
1403
  logger?: Logger;
1403
1404
  };
1404
1405
  export declare class ClusterBuilder {
@@ -1 +1 @@
1
- import{toB64 as e}from"@enkaku/codec";import{assertType as t,createValidator as r}from"@enkaku/schema";import{DocumentModelID as o,digestJSON as l}from"@kubun/id";import{getKubunLogger as i}from"@kubun/logger";import{DocumentModelNormalizer as s,documentModelsCluster as n}from"./document.js";import{binaryStringValue as u}from"./value.js";export const clusterModel={$id:"urn:kubun:protocol:model:cluster",type:"object",properties:{digest:u,models:n,record:{type:"object",patternProperties:{"^k[0-9a-z]{56}$":{type:"integer",minimum:0}},additionalProperties:!1}},required:["digest","models","record"],additionalProperties:!1};export const validateClusterModel=r(clusterModel);export function verifyCluster(r){t(validateClusterModel,r);let i=l(r.models);if(r.digest!==e(i))throw Error("Invalid cluster: digest mismatch");let s=Object.entries(r.record);if(s.length!==r.models.length)throw Error("Invalid cluster: record length mismatch");let n={};for(let[e,t]of s){let l=new o(i,t).toString();if(e!==l)throw Error(`Invalid cluster: record key mismatch, expected ${l}, got ${e}`);let s=r.models[t];if(null==s)throw Error(`Invalid cluster: missing model at index ${t}`);n[e]=s}return n}export class ClusterBuilder{#e=[];#t;constructor(e={}){this.#t=e.logger??i("protocol")}get cluster(){return this.#e}get length(){return this.#e.length}build(){let t=this.#e;if(0===t.length)throw Error("Cluster is empty");let r=l(t),i={};for(let e=0;e<t.length;e++)i[new o(r,e).toString()]=e;return{digest:e(r),models:t,record:i}}get(e){let t;if("number"==typeof e)t=e;else if("string"==typeof e&&"#"===e[0]){if(Number.isNaN(t=Number.parseInt(e.slice(1),10)))throw Error(`Invalid DocumentModelID: ${e}`)}else{let r="string"==typeof e?o.fromString(e):e;if(!r.isLocal)throw Error("Invalid DocumentModelID to access model in cluster: must be a local ID");t=r.index}let r=this.#e[t];if(null==r)throw RangeError(`Invalid cluster index: ${t}`);return r}add(e){let t=(e.interfaces??[]).map(e=>{if(e.startsWith("#")){let t=Number.parseInt(e.slice(1),10);if(Number.isNaN(t))throw Error(`Invalid DocumentModelID: ${e}`);return o.local(t).toString()}return e}),r=new s({inputModel:e,interfaceModels:t.map(e=>this.get(e)),logger:this.#t,normalizedInterfaceIDs:t}).toDocumentModel(),l=this.#e.length;return this.#e.push(r),o.local(l)}addAll(e){return e.map(e=>this.add(e))}}
1
+ import{toB64 as e}from"@enkaku/codec";import{assertType as t,createValidator as r}from"@enkaku/schema";import{DocumentModelID as l,digestJSON as o}from"@kubun/id";import{getKubunLogger as i}from"@kubun/logger";import{DocumentModelNormalizer as s,documentModelsCluster as n}from"./document.js";import{binaryStringValue as d}from"./value.js";export const clusterModel={$id:"urn:kubun:protocol:model:cluster",type:"object",properties:{digest:d,models:n,record:{type:"object",patternProperties:{"^k[0-9a-z]{56}$":{type:"integer",minimum:0}},additionalProperties:!1}},required:["digest","models","record"],additionalProperties:!1};export const validateClusterModel=r(clusterModel);export function verifyCluster(r){t(validateClusterModel,r);let i=o(r.models);if(r.digest!==e(i))throw Error("Invalid cluster: digest mismatch");let s=Object.entries(r.record);if(s.length!==r.models.length)throw Error("Invalid cluster: record length mismatch");let n={};for(let[e,t]of s){let o=new l(i,t).toString();if(e!==o)throw Error(`Invalid cluster: record key mismatch, expected ${o}, got ${e}`);let s=r.models[t];if(null==s)throw Error(`Invalid cluster: missing model at index ${t}`);n[e]=s}return n}export class ClusterBuilder{#e=[];#t;#r;constructor(e={}){this.#t=e.externalModels??{},this.#r=e.logger??i("protocol")}get cluster(){return this.#e}get length(){return this.#e.length}build(){let t=this.#e;if(0===t.length)throw Error("Cluster is empty");let r=o(t),i={};for(let e=0;e<t.length;e++)i[new l(r,e).toString()]=e;return{digest:e(r),models:t,record:i}}get(e){let t;if("number"==typeof e)t=e;else if("string"==typeof e&&"#"===e[0]){if(Number.isNaN(t=Number.parseInt(e.slice(1),10)))throw Error(`Invalid DocumentModelID: ${e}`)}else{let r="string"==typeof e?l.fromString(e):e;if(!r.isLocal){let t="string"==typeof e?e:e.toString(),r=this.#t[t];if(null!=r)return r;throw Error(`External model not found: ${t}`)}t=r.index}let r=this.#e[t];if(null==r)throw RangeError(`Invalid cluster index: ${t}`);return r}add(e){let t=(e.interfaces??[]).map(e=>{if(e.startsWith("#")){let t=Number.parseInt(e.slice(1),10);if(Number.isNaN(t))throw Error(`Invalid DocumentModelID: ${e}`);return l.local(t).toString()}return e}),r=new s({inputModel:e,interfaceModels:t.map(e=>this.get(e)),logger:this.#r,normalizedInterfaceIDs:t}).toDocumentModel(),o=this.#e.length;return this.#e.push(r),l.local(o)}addAll(e){return e.map(e=>this.add(e))}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kubun/protocol",
3
- "version": "0.5.0",
3
+ "version": "0.5.1",
4
4
  "license": "see LICENSE.md",
5
5
  "keywords": [],
6
6
  "type": "module",