@ddd-qc/lit-happ 0.34.12 → 0.35.0

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.
@@ -26,7 +26,7 @@ export class NetworkCaller {
26
26
  }
27
27
  startCallLoop(interval) {
28
28
  if (this.isLooping()) {
29
- this.stopCallLoop();
29
+ return;
30
30
  }
31
31
  if (interval <= 1000) {
32
32
  throw Error(`Loop interval is too short: ${interval}`);
@@ -1 +1 @@
1
- {"version":3,"file":"NetworkCaller.js","sourceRoot":"","sources":["../src/NetworkCaller.ts"],"names":[],"mappings":"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","sourcesContent":["import {AgentId, AppProxy, CellAddress, prettyDate, RingBuffer} from \"@ddd-qc/cell-proxy\";\r\nimport {\r\n DhtArc,\r\n DumpNetworkMetricsRequest,\r\n FetchStateSummary,\r\n hashFrom32AndType, HoloHashType,\r\n NetworkMetrics,\r\n Timestamp\r\n} from \"@holochain/client\";\r\nimport {TransportStats} from \"@holochain/client/lib/api/admin/types\";\r\n\r\n\r\nexport type NetworkInfoResponse = {\r\n error: any,\r\n metrics: NetworkMetrics | undefined,\r\n stats: TransportStats | undefined,\r\n};\r\n\r\nexport type NetworkInfoCb = (r: NetworkInfoResponse) => void;\r\n\r\n\r\n/**\r\n * Class handling network info calling and result storing\r\n */\r\nexport class NetworkCaller {\r\n\r\n /** */\r\n constructor(private appProxy: AppProxy, private cellAddr?: CellAddress) {\r\n // N/A\r\n }\r\n\r\n\r\n private _lastTimeQueried: Timestamp = 0;\r\n private _networkMetricsLogs: RingBuffer<[Timestamp, NetworkMetrics]> = new RingBuffer(50);\r\n private _networkStatsLogs: RingBuffer<[Timestamp, TransportStats]> = new RingBuffer(50);\r\n\r\n private _intervalId: any | undefined = undefined;\r\n private _isCallRunning: boolean = false;\r\n\r\n private _callbacks: NetworkInfoCb[] = [];\r\n\r\n /** peer pub key to AgentId */\r\n private _transportToAgentMap: Map<string, AgentId> = new Map();\r\n\r\n\r\n /** -- Getters & Setters -- */\r\n\r\n setCellAddr(cellAddr: CellAddress) { this.cellAddr = cellAddr};\r\n\r\n setCapacity(n: number) {\r\n this._networkMetricsLogs.resize(n);\r\n this._networkStatsLogs.resize(n);\r\n }\r\n\r\n get networkMetricsLogs(): [Timestamp, NetworkMetrics][] {return this._networkMetricsLogs.toArray();}\r\n\r\n get networkStatsLogs(): [Timestamp, TransportStats][] {return this._networkStatsLogs.toArray();}\r\n\r\n\r\n /** -- Methods -- */\r\n\r\n /** */\r\n isLooping(): boolean {\r\n return this._intervalId !== undefined;\r\n }\r\n\r\n /** Calling twice will stop it */\r\n private _callTimeout: number = 30 * 1000;\r\n startCallLoop(interval: number) {\r\n //console.debug(`startCallLoop(${interval})`);\r\n if (this.isLooping()) {\r\n this.stopCallLoop();\r\n }\r\n if (interval <= 1000) {\r\n throw Error(`Loop interval is too short: ${interval}`);\r\n }\r\n this._callTimeout = interval - 100;\r\n this._intervalId = setInterval(async () => {\r\n // skip if previous call not done\r\n if (this._isCallRunning) {\r\n return;\r\n }\r\n this._isCallRunning = true;\r\n try {\r\n const metrics = await this.callNetworkMetrics();\r\n const stats = await this.callNetworkStats();\r\n this.callRegisteredCallbacks({metrics, stats, error: undefined});\r\n } catch (e) {\r\n console.error(\"Error when calling Network Metrics & Stats.\", e);\r\n this.callRegisteredCallbacks({error: e, metrics: undefined, stats: undefined});\r\n } finally {\r\n this._isCallRunning = false;\r\n }\r\n }, interval);\r\n }\r\n\r\n\r\n /** */\r\n private callRegisteredCallbacks(resp: NetworkInfoResponse) {\r\n for (const cb of this._callbacks) {\r\n try {\r\n cb(resp);\r\n } catch (e) {\r\n console.error(\"Error in NetworkCaller callback\", e);\r\n }\r\n }\r\n }\r\n\r\n\r\n /** */\r\n addCallback(callback: NetworkInfoCb) {\r\n this._callbacks.push(callback);\r\n }\r\n\r\n /** */\r\n clearAllCallbacks() {\r\n this._callbacks = [];\r\n }\r\n\r\n /** */\r\n stopCallLoop() {\r\n console.log(\"NetworkCaller.stopCallLoop()\");\r\n clearInterval(this._intervalId);\r\n this._intervalId = undefined;\r\n this._isCallRunning = false;\r\n }\r\n\r\n\r\n /** */\r\n clear() {\r\n this._networkMetricsLogs.clear();\r\n this._networkStatsLogs.clear();\r\n }\r\n\r\n\r\n async peerKeyToAgentId(transportKey: string): Promise<AgentId | undefined> {\r\n const maybe = this._transportToAgentMap.get(transportKey);\r\n if (maybe) {\r\n return maybe;\r\n }\r\n await this.updateTransportToAgentMap();\r\n return this._transportToAgentMap.get(transportKey);\r\n }\r\n\r\n\r\n /** debug */\r\n dumpTransportToAgentMap() {\r\n this.updateTransportToAgentMap().then(() => console.table(this._transportToAgentMap));\r\n }\r\n\r\n /**\r\n * Build a mapping from transport pub_key to AgentPubKey by fetching agentInfo.\r\n * AgentInfo returns both the kitsune agent ID and the peer URL, allowing us to\r\n * map the transport key (from URL) to the actual AgentPubKey.\r\n */\r\n async updateTransportToAgentMap() {\r\n if (!this.cellAddr) {\r\n throw Promise.reject(\"buildTransportToAgentMap() aborted. cellAddr not specified.\");\r\n }\r\n\r\n // Fetch agentInfo for these DNAs\r\n const agentInfoResponse = await this.appProxy.agentInfo({ dna_hashes: [this.cellAddr.dnaId.hash] });\r\n\r\n for (const agentInfoItem of agentInfoResponse) {\r\n try {\r\n // Parse the structure: { agentInfo: \"{...json...}\", signature: \"...\" }\r\n const parsed =\r\n typeof agentInfoItem === 'string' ? JSON.parse(agentInfoItem) : agentInfoItem;\r\n const agentInfoData =\r\n typeof parsed.agentInfo === 'string' ? JSON.parse(parsed.agentInfo) : parsed.agentInfo;\r\n const partialAgentId = agentInfoData.agent;\r\n const peerUrl = agentInfoData.url;\r\n if (!partialAgentId || !peerUrl) {\r\n continue;\r\n }\r\n // Extract transport key from the peer URL\r\n const transportKey = extractTransportKeyFromUrl(peerUrl);\r\n if (!transportKey) {\r\n continue;\r\n }\r\n // Convert partial agent ID to full AgentPubKey\r\n const bytes = decodeUrlSafeBase64(partialAgentId);\r\n // Convert the 32-byte core to a full agent pub key (adds type prefix and DHT location)\r\n const fullAgentKey = hashFrom32AndType(bytes, HoloHashType.Agent);\r\n // Update Map\r\n this._transportToAgentMap.set(transportKey, new AgentId(fullAgentKey));\r\n\r\n } catch (e) {\r\n // Skip invalid entries\r\n }\r\n }\r\n }\r\n \r\n\r\n /** */\r\n async callNetworkMetrics(): Promise<NetworkMetrics> {\r\n if (!this.cellAddr) {\r\n throw Promise.reject(\"callNetworkMetrics() aborted. cellAddr not specified.\");\r\n }\r\n /* Call networkInfo */\r\n const request: DumpNetworkMetricsRequest = {\r\n dna_hash: this.cellAddr.dnaId.hash,\r\n include_dht_summary: false, // not needed and expensive\r\n };\r\n const response = await this.appProxy.dumpNetworkMetrics(request, this._callTimeout);\r\n if (!response || !response[this.cellAddr.dnaId.b64]) {\r\n throw Promise.reject(\"No network metrics response for dna\");\r\n }\r\n /* Store */\r\n const dnaResp = response[this.cellAddr.dnaId.b64]!;\r\n this._lastTimeQueried = Date.now();\r\n this._networkMetricsLogs.add([this._lastTimeQueried, dnaResp]);\r\n /** */\r\n return dnaResp;\r\n }\r\n\r\n\r\n /** */\r\n dumpNetworkMetricsLogs(n?: number) {\r\n console.log(`dumpNetworkMetricsLogs()`, this.cellAddr);\r\n if (!this.cellAddr) {\r\n throw Error(\"dumpNetworkMetricsLogs() aborted. cellAddr not specified.\");\r\n }\r\n const nn = n? n : this._networkMetricsLogs.getBufferLength();\r\n let logs = this._networkMetricsLogs.getLastN(nn).map(([ts, metrics]) => {\r\n if (metrics.local_agents.length == 0) {\r\n throw Error(\"No local agents found in NetworkMetrics\");\r\n }\r\n if (metrics.local_agents.length == 0) {\r\n console.warn(\"dumpNetworkMetricsLogs() More than one local_agent found\");\r\n }\r\n const local_agent = metrics.local_agents[0]!;\r\n return {\r\n //ts,\r\n ts: prettyDate(new Date(ts)),\r\n current_arc: arc_size(local_agent.storage_arc),\r\n target_arc: arc_size(local_agent.target_arc),\r\n peers: Object.keys(metrics.gossip_state_summary.peer_meta).length,\r\n //total_peers: Object.keys(metrics.gossip_state_summary.peer_meta).length,\r\n rounds: metrics.gossip_state_summary.accepted_rounds.length,\r\n pending_requests: count_pending_requests(metrics.fetch_state_summary),\r\n }\r\n })\r\n console.table(logs);\r\n }\r\n\r\n /** */\r\n async callNetworkStats(): Promise<TransportStats> {\r\n const response = await this.appProxy.dumpNetworkStats(this._callTimeout);\r\n if (!response) {\r\n throw Promise.reject(\"No network stats response for dna\");\r\n }\r\n /* Store */\r\n this._networkStatsLogs.add([this._lastTimeQueried, response]);\r\n /** */\r\n return response;\r\n }\r\n\r\n\r\n /** */\r\n dumpNetworkStatsLogs(n?: number) {\r\n console.log(`dumpNetworkStatsLogs()`);\r\n const nn = n ? n : this._networkStatsLogs.getBufferLength();\r\n this._networkStatsLogs.getLastN(nn).map(([ts, stats]) => {\r\n console.log(`[${prettyDate(new Date(ts))}] Backend: ${stats.backend} ; Peers: ${stats.peer_urls.length}`);\r\n const logs = stats.connections.map((connection) => {\r\n return connection;\r\n });\r\n console.table(logs);\r\n });\r\n }\r\n\r\n}\r\n\r\n\r\n/** */\r\nfunction count_pending_requests(fetchSummary: FetchStateSummary): number {\r\n let total = 0;\r\n for (const peerUrls of Object.values(fetchSummary.pending_requests)) {\r\n total += peerUrls.length;\r\n }\r\n return total;\r\n}\r\n\r\n\r\n/** */\r\nfunction arc_size(arc: DhtArc): number {\r\n if (arc == null) {\r\n return 0;\r\n }\r\n return arc[1] - arc[0];\r\n}\r\n\r\n\r\n/**\r\n * Extract the transport pub_key from a peer URL.\r\n * Peer URLs typically have format: wss://host/tx5-ws/sig/<transport_pub_key>\r\n * The transport pub_key is the last path segment.\r\n */\r\nfunction extractTransportKeyFromUrl(peerUrl: string): string | null {\r\n try {\r\n const urlObj = new URL(peerUrl);\r\n const pathParts = urlObj.pathname.split('/').filter((p) => p.length > 0);\r\n // The transport key is the last segment after /tx5-ws/sig/ or similar\r\n if (pathParts.length > 0) {\r\n const lastPart = pathParts[pathParts.length - 1]!;\r\n // Transport keys are typically 40+ characters in URL-safe base64\r\n if (lastPart.length >= 40) {\r\n return lastPart;\r\n }\r\n }\r\n } catch {\r\n // If URL parsing fails, try direct string splitting\r\n const parts = peerUrl.split('/');\r\n const lastPart = parts[parts.length - 1];\r\n if (lastPart && lastPart.length >= 40) {\r\n return lastPart;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Decode URL-safe base64 string to Uint8Array.\r\n * URL-safe base64 uses - and _ instead of + and /.\r\n */\r\nfunction decodeUrlSafeBase64(urlSafeBase64: string): Uint8Array {\r\n // Convert URL-safe base64 to standard base64\r\n let standardBase64 = urlSafeBase64.replace(/-/g, '+').replace(/_/g, '/');\r\n // Add padding if necessary\r\n while (standardBase64.length % 4 !== 0) {\r\n standardBase64 += '=';\r\n }\r\n // Decode base64 to bytes\r\n const binaryString = atob(standardBase64);\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (let i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n return bytes;\r\n}"]}
1
+ {"version":3,"file":"NetworkCaller.js","sourceRoot":"","sources":["../src/NetworkCaller.ts"],"names":[],"mappings":"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","sourcesContent":["import {AgentId, AppProxy, CellAddress, prettyDate, RingBuffer} from \"@ddd-qc/cell-proxy\";\r\nimport {\r\n DhtArc,\r\n DumpNetworkMetricsRequest,\r\n FetchStateSummary,\r\n hashFrom32AndType, HoloHashType,\r\n NetworkMetrics,\r\n Timestamp\r\n} from \"@holochain/client\";\r\nimport {TransportStats} from \"@holochain/client/lib/api/admin/types\";\r\n\r\n\r\nexport type NetworkInfoResponse = {\r\n error: any,\r\n metrics: NetworkMetrics | undefined,\r\n stats: TransportStats | undefined,\r\n};\r\n\r\nexport type NetworkInfoCb = (r: NetworkInfoResponse) => void;\r\n\r\n\r\n/**\r\n * Class handling network info calling and result storing\r\n */\r\nexport class NetworkCaller {\r\n\r\n /** */\r\n constructor(private appProxy: AppProxy, private cellAddr?: CellAddress) {\r\n // N/A\r\n }\r\n\r\n\r\n private _lastTimeQueried: Timestamp = 0;\r\n private _networkMetricsLogs: RingBuffer<[Timestamp, NetworkMetrics]> = new RingBuffer(50);\r\n private _networkStatsLogs: RingBuffer<[Timestamp, TransportStats]> = new RingBuffer(50);\r\n\r\n private _intervalId: any | undefined = undefined;\r\n private _isCallRunning: boolean = false;\r\n\r\n private _callbacks: NetworkInfoCb[] = [];\r\n\r\n /** peer pub key to AgentId */\r\n private _transportToAgentMap: Map<string, AgentId> = new Map();\r\n\r\n\r\n /** -- Getters & Setters -- */\r\n\r\n setCellAddr(cellAddr: CellAddress) { this.cellAddr = cellAddr};\r\n\r\n setCapacity(n: number) {\r\n this._networkMetricsLogs.resize(n);\r\n this._networkStatsLogs.resize(n);\r\n }\r\n\r\n get networkMetricsLogs(): [Timestamp, NetworkMetrics][] {return this._networkMetricsLogs.toArray();}\r\n\r\n get networkStatsLogs(): [Timestamp, TransportStats][] {return this._networkStatsLogs.toArray();}\r\n\r\n\r\n /** -- Methods -- */\r\n\r\n /** */\r\n isLooping(): boolean {\r\n return this._intervalId !== undefined;\r\n }\r\n\r\n /** */\r\n private _callTimeout: number = 30 * 1000;\r\n startCallLoop(interval: number) {\r\n //console.debug(`startCallLoop(${interval})`);\r\n if (this.isLooping()) {\r\n return;\r\n }\r\n if (interval <= 1000) {\r\n throw Error(`Loop interval is too short: ${interval}`);\r\n }\r\n this._callTimeout = interval - 100;\r\n this._intervalId = setInterval(async () => {\r\n // skip if previous call not done\r\n if (this._isCallRunning) {\r\n return;\r\n }\r\n this._isCallRunning = true;\r\n try {\r\n const metrics = await this.callNetworkMetrics();\r\n const stats = await this.callNetworkStats();\r\n this.callRegisteredCallbacks({metrics, stats, error: undefined});\r\n } catch (e) {\r\n console.error(\"Error when calling Network Metrics & Stats.\", e);\r\n this.callRegisteredCallbacks({error: e, metrics: undefined, stats: undefined});\r\n } finally {\r\n this._isCallRunning = false;\r\n }\r\n }, interval);\r\n }\r\n\r\n\r\n /** */\r\n private callRegisteredCallbacks(resp: NetworkInfoResponse) {\r\n for (const cb of this._callbacks) {\r\n try {\r\n cb(resp);\r\n } catch (e) {\r\n console.error(\"Error in NetworkCaller callback\", e);\r\n }\r\n }\r\n }\r\n\r\n\r\n /** */\r\n addCallback(callback: NetworkInfoCb) {\r\n this._callbacks.push(callback);\r\n }\r\n\r\n /** */\r\n clearAllCallbacks() {\r\n this._callbacks = [];\r\n }\r\n\r\n /** */\r\n stopCallLoop() {\r\n console.log(\"NetworkCaller.stopCallLoop()\");\r\n clearInterval(this._intervalId);\r\n this._intervalId = undefined;\r\n this._isCallRunning = false;\r\n }\r\n\r\n\r\n /** */\r\n clear() {\r\n this._networkMetricsLogs.clear();\r\n this._networkStatsLogs.clear();\r\n }\r\n\r\n\r\n async peerKeyToAgentId(transportKey: string): Promise<AgentId | undefined> {\r\n const maybe = this._transportToAgentMap.get(transportKey);\r\n if (maybe) {\r\n return maybe;\r\n }\r\n await this.updateTransportToAgentMap();\r\n return this._transportToAgentMap.get(transportKey);\r\n }\r\n\r\n\r\n /** debug */\r\n dumpTransportToAgentMap() {\r\n this.updateTransportToAgentMap().then(() => console.table(this._transportToAgentMap));\r\n }\r\n\r\n /**\r\n * Build a mapping from transport pub_key to AgentPubKey by fetching agentInfo.\r\n * AgentInfo returns both the kitsune agent ID and the peer URL, allowing us to\r\n * map the transport key (from URL) to the actual AgentPubKey.\r\n */\r\n async updateTransportToAgentMap() {\r\n if (!this.cellAddr) {\r\n throw Promise.reject(\"buildTransportToAgentMap() aborted. cellAddr not specified.\");\r\n }\r\n\r\n // Fetch agentInfo for these DNAs\r\n const agentInfoResponse = await this.appProxy.agentInfo({ dna_hashes: [this.cellAddr.dnaId.hash] });\r\n\r\n for (const agentInfoItem of agentInfoResponse) {\r\n try {\r\n // Parse the structure: { agentInfo: \"{...json...}\", signature: \"...\" }\r\n const parsed =\r\n typeof agentInfoItem === 'string' ? JSON.parse(agentInfoItem) : agentInfoItem;\r\n const agentInfoData =\r\n typeof parsed.agentInfo === 'string' ? JSON.parse(parsed.agentInfo) : parsed.agentInfo;\r\n const partialAgentId = agentInfoData.agent;\r\n const peerUrl = agentInfoData.url;\r\n if (!partialAgentId || !peerUrl) {\r\n continue;\r\n }\r\n // Extract transport key from the peer URL\r\n const transportKey = extractTransportKeyFromUrl(peerUrl);\r\n if (!transportKey) {\r\n continue;\r\n }\r\n // Convert partial agent ID to full AgentPubKey\r\n const bytes = decodeUrlSafeBase64(partialAgentId);\r\n // Convert the 32-byte core to a full agent pub key (adds type prefix and DHT location)\r\n const fullAgentKey = hashFrom32AndType(bytes, HoloHashType.Agent);\r\n // Update Map\r\n this._transportToAgentMap.set(transportKey, new AgentId(fullAgentKey));\r\n\r\n } catch (e) {\r\n // Skip invalid entries\r\n }\r\n }\r\n }\r\n \r\n\r\n /** */\r\n async callNetworkMetrics(): Promise<NetworkMetrics> {\r\n if (!this.cellAddr) {\r\n throw Promise.reject(\"callNetworkMetrics() aborted. cellAddr not specified.\");\r\n }\r\n /* Call networkInfo */\r\n const request: DumpNetworkMetricsRequest = {\r\n dna_hash: this.cellAddr.dnaId.hash,\r\n include_dht_summary: false, // not needed and expensive\r\n };\r\n const response = await this.appProxy.dumpNetworkMetrics(request, this._callTimeout);\r\n if (!response || !response[this.cellAddr.dnaId.b64]) {\r\n throw Promise.reject(\"No network metrics response for dna\");\r\n }\r\n /* Store */\r\n const dnaResp = response[this.cellAddr.dnaId.b64]!;\r\n this._lastTimeQueried = Date.now();\r\n this._networkMetricsLogs.add([this._lastTimeQueried, dnaResp]);\r\n /** */\r\n return dnaResp;\r\n }\r\n\r\n\r\n /** */\r\n dumpNetworkMetricsLogs(n?: number) {\r\n console.log(`dumpNetworkMetricsLogs()`, this.cellAddr);\r\n if (!this.cellAddr) {\r\n throw Error(\"dumpNetworkMetricsLogs() aborted. cellAddr not specified.\");\r\n }\r\n const nn = n? n : this._networkMetricsLogs.getBufferLength();\r\n let logs = this._networkMetricsLogs.getLastN(nn).map(([ts, metrics]) => {\r\n if (metrics.local_agents.length == 0) {\r\n throw Error(\"No local agents found in NetworkMetrics\");\r\n }\r\n if (metrics.local_agents.length == 0) {\r\n console.warn(\"dumpNetworkMetricsLogs() More than one local_agent found\");\r\n }\r\n const local_agent = metrics.local_agents[0]!;\r\n return {\r\n //ts,\r\n ts: prettyDate(new Date(ts)),\r\n current_arc: arc_size(local_agent.storage_arc),\r\n target_arc: arc_size(local_agent.target_arc),\r\n peers: Object.keys(metrics.gossip_state_summary.peer_meta).length,\r\n //total_peers: Object.keys(metrics.gossip_state_summary.peer_meta).length,\r\n rounds: metrics.gossip_state_summary.accepted_rounds.length,\r\n pending_requests: count_pending_requests(metrics.fetch_state_summary),\r\n }\r\n })\r\n console.table(logs);\r\n }\r\n\r\n /** */\r\n async callNetworkStats(): Promise<TransportStats> {\r\n const response = await this.appProxy.dumpNetworkStats(this._callTimeout);\r\n if (!response) {\r\n throw Promise.reject(\"No network stats response for dna\");\r\n }\r\n /* Store */\r\n this._networkStatsLogs.add([this._lastTimeQueried, response]);\r\n /** */\r\n return response;\r\n }\r\n\r\n\r\n /** */\r\n dumpNetworkStatsLogs(n?: number) {\r\n console.log(`dumpNetworkStatsLogs()`);\r\n const nn = n ? n : this._networkStatsLogs.getBufferLength();\r\n this._networkStatsLogs.getLastN(nn).map(([ts, stats]) => {\r\n console.log(`[${prettyDate(new Date(ts))}] Backend: ${stats.backend} ; Peers: ${stats.peer_urls.length}`);\r\n const logs = stats.connections.map((connection) => {\r\n return connection;\r\n });\r\n console.table(logs);\r\n });\r\n }\r\n\r\n}\r\n\r\n\r\n/** */\r\nfunction count_pending_requests(fetchSummary: FetchStateSummary): number {\r\n let total = 0;\r\n for (const peerUrls of Object.values(fetchSummary.pending_requests)) {\r\n total += peerUrls.length;\r\n }\r\n return total;\r\n}\r\n\r\n\r\n/** */\r\nfunction arc_size(arc: DhtArc): number {\r\n if (arc == null) {\r\n return 0;\r\n }\r\n return arc[1] - arc[0];\r\n}\r\n\r\n\r\n/**\r\n * Extract the transport pub_key from a peer URL.\r\n * Peer URLs typically have format: wss://host/tx5-ws/sig/<transport_pub_key>\r\n * The transport pub_key is the last path segment.\r\n */\r\nfunction extractTransportKeyFromUrl(peerUrl: string): string | null {\r\n try {\r\n const urlObj = new URL(peerUrl);\r\n const pathParts = urlObj.pathname.split('/').filter((p) => p.length > 0);\r\n // The transport key is the last segment after /tx5-ws/sig/ or similar\r\n if (pathParts.length > 0) {\r\n const lastPart = pathParts[pathParts.length - 1]!;\r\n // Transport keys are typically 40+ characters in URL-safe base64\r\n if (lastPart.length >= 40) {\r\n return lastPart;\r\n }\r\n }\r\n } catch {\r\n // If URL parsing fails, try direct string splitting\r\n const parts = peerUrl.split('/');\r\n const lastPart = parts[parts.length - 1];\r\n if (lastPart && lastPart.length >= 40) {\r\n return lastPart;\r\n }\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * Decode URL-safe base64 string to Uint8Array.\r\n * URL-safe base64 uses - and _ instead of + and /.\r\n */\r\nfunction decodeUrlSafeBase64(urlSafeBase64: string): Uint8Array {\r\n // Convert URL-safe base64 to standard base64\r\n let standardBase64 = urlSafeBase64.replace(/-/g, '+').replace(/_/g, '/');\r\n // Add padding if necessary\r\n while (standardBase64.length % 4 !== 0) {\r\n standardBase64 += '=';\r\n }\r\n // Decode base64 to bytes\r\n const binaryString = atob(standardBase64);\r\n const bytes = new Uint8Array(binaryString.length);\r\n for (let i = 0; i < binaryString.length; i++) {\r\n bytes[i] = binaryString.charCodeAt(i);\r\n }\r\n return bytes;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"ZomeViewModelWithSignals.d.ts","sourceRoot":"","sources":["../src/ZomeViewModelWithSignals.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ZomeViewModelWithSignals.d.ts","sourceRoot":"","sources":["../src/ZomeViewModelWithSignals.ts"],"names":[],"mappings":"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"}
@@ -194,11 +194,15 @@ export class ZomeViewModelWithSignals extends ZomeViewModel {
194
194
  if (ZomeSignalProtocolType.Entry in pulse) {
195
195
  const entryPulse = materializeEntryPulse(pulse.Entry, Object.values(this.zomeProxy.entryTypes));
196
196
  const typedEntry = decode(entryPulse.bytes);
197
- appSignals.push({ timestamp, from, pulse: ZomeSignalProtocolType.Entry, state: prettyState(pulse.Entry.state), type: entryPulse.entryType, payload: anyToB64(typedEntry), ah_base: entryPulse.ah.short, eh_target: entryPulse.eh.short });
197
+ appSignals.push({ timestamp, from, pulse: ZomeSignalProtocolType.Entry, state: prettyState(pulse.Entry.state), type: entryPulse.entryType, validation: entryPulse.validatedBy,
198
+ payload: anyToB64(typedEntry),
199
+ ah_base: entryPulse.ah.short, eh_target: entryPulse.eh.short });
198
200
  }
199
201
  if (ZomeSignalProtocolType.Link in pulse) {
200
202
  const linkPulse = materializeLinkPulse(pulse.Link, Object.values(this.zomeProxy.linkTypes));
201
- appSignals.push({ timestamp, from, pulse: ZomeSignalProtocolType.Link, state: prettyState(pulse.Link.state), type: linkPulse.link_type, payload: linkPulse.tag, ah_base: linkPulse.base.print(), eh_target: linkPulse.target.print() });
203
+ appSignals.push({ timestamp, from, pulse: ZomeSignalProtocolType.Link, state: prettyState(pulse.Link.state), type: linkPulse.link_type, payload: linkPulse.tag,
204
+ ah_base: linkPulse.base.print(), eh_target: linkPulse.target.print(), validation: linkPulse.validatedBy,
205
+ });
202
206
  }
203
207
  }
204
208
  });
@@ -1 +1 @@
1
- {"version":3,"file":"ZomeViewModelWithSignals.js","sourceRoot":"","sources":["../src/ZomeViewModelWithSignals.ts"],"names":[],"mappings":"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","sourcesContent":["import {SignalCb, EntryVisibility, Timestamp, ZomeIndex, Signal, SignalType, AppSignal} from \"@holochain/client\";\nimport {\n ActionId,\n AgentId,\n LinkableId,\n anyToB64,\n enc64,\n EntryId,\n EntryPulse,\n getIndexByVariant,\n intoLinkableId,\n LinkPulse,\n prettyDate,\n prettyState,\n SignalLog,\n AppSignalType,\n StateChange,\n TipProtocol,\n TipProtocolVariantEntry,\n TipProtocolVariantLink,\n ZomeSignal,\n ZomeSignalProtocol,\n ZomeSignalProtocolType,\n ZomeSignalProtocolVariantEntry,\n ZomeSignalProtocolVariantLink,\n TipProtocolType,\n intoAnyId,\n ValidatedBy, SynchronizeTipInput, TipProtocolVariantAppValue, TipProtocolVariantAppCustom,\n h64,\n} from \"@ddd-qc/cell-proxy\";\nimport {ZomeViewModel} from \"./ZomeViewModel\";\nimport {decode} from \"@msgpack/msgpack\";\n\n\n/** */\nexport interface CastLog {\n ts: Timestamp,\n tip: TipProtocol,\n peers: AgentId[],\n response: Timestamp | undefined,\n}\n\n\n/**\n * ZVM with support for ZomeSignals\n */\nexport abstract class ZomeViewModelWithSignals extends ZomeViewModel {\n\n private _castLogs: CastLog[] = [];\n\n /** Methods to override */\n protected handleCustomTip(_customTip: Uint8Array, _from: AgentId): ZomeSignalProtocol | undefined { return undefined;}\n protected handleValueTip(_key: string, _value: string, _from: AgentId): ZomeSignalProtocol | undefined { return undefined;}\n protected async handleEntryPulse(_pulse: EntryPulseMat, _from: AgentId): Promise<void> {}\n protected async handleLinkPulse(_pulse: LinkPulseMat, _from: AgentId): Promise<void> {}\n\n\n /** */\n override signalHandler?: SignalCb = this.mySignalHandler;\n\n\n /** */\n private mySignalHandler(signal: Signal): void {\n const defaultZomeName = (this.constructor as typeof ZomeViewModelWithSignals).ZOME_PROXY.DEFAULT_ZOME_NAME;\n //console.log(\"mySignalHandler()\", appSignal, defaultZomeName);\n if (SignalType.App != signal.type) {\n return;\n }\n const appSignal: AppSignal = signal.value;\n if (appSignal.zome_name !== defaultZomeName) {\n return;\n }\n const zomeSignal = appSignal.payload as ZomeSignal;\n if (!(\"pulses\" in zomeSignal)) {\n return;\n }\n /*await*/ this.handleSignal(zomeSignal);\n }\n\n\n /** */\n private _knownPulses: Set<BigInt> = new Set();\n private async handleSignal(signal: ZomeSignal): Promise<void> {\n const from = new AgentId(signal.from);\n let all = [];\n for (let pulse of signal.pulses) {\n /** Skip duplicate pulse */\n const pulseHash = h64(JSON.stringify(pulse));\n if (this._knownPulses.has(pulseHash)) {\n console.debug(\"handleSignal() Skipping duplicate pulse\", pulseHash);\n continue;\n }\n this._knownPulses.add(pulseHash);\n /** -- Handle Signal according to type -- */\n /** Change tip to Entry or Link signal */\n if (ZomeSignalProtocolType.Tip in pulse) {\n pulse = this.handleTip(pulse.Tip as TipProtocol, from)!;\n if (!pulse) {\n continue;\n }\n }\n if (ZomeSignalProtocolType.Entry in pulse) {\n const entryPulseMat = materializeEntryPulse(pulse.Entry as EntryPulse, (this.constructor as typeof ZomeViewModel).ENTRY_TYPES);\n all.push(this.handleEntryPulse(entryPulseMat, from));\n /** If the new entry is from this agent, broadcast to peers as a tip */\n if (entryPulseMat.isNew && this.cell.address.agentId.equals(from) && entryPulseMat.visibility == \"Public\") {\n this.broadcastTip({Entry: pulse.Entry as EntryPulse});\n }\n continue;\n }\n if (ZomeSignalProtocolType.Link in pulse) {\n const linkPulseMat = materializeLinkPulse(pulse.Link as LinkPulse, (this.constructor as typeof ZomeViewModel).LINK_TYPES);\n all.push(this.handleLinkPulse(linkPulseMat, from));\n /** If the new Link is from this agent, broadcast to peers as a tip */\n if (linkPulseMat.isNew && this.cell.address.agentId.equals(from)) {\n this.broadcastTip({Link: pulse.Link as LinkPulse});\n }\n continue;\n }\n }\n await Promise.all(all);\n this.notifySubscribers();\n }\n\n\n /** */\n private handleTip(tip: TipProtocol, from: AgentId): ZomeSignalProtocol | undefined {\n const type = Object.keys(tip)[0];\n console.log(\"handleTip()\", type, from, tip);\n /* Handle tip according to its type */\n switch (type) {\n case \"Ping\":\n case \"Pong\":\n break;\n case \"Entry\": return {Entry: (tip as TipProtocolVariantEntry).Entry} as ZomeSignalProtocolVariantEntry; break;\n case \"Link\": return {Link: (tip as TipProtocolVariantLink).Link} as ZomeSignalProtocolVariantLink; break;\n case \"AppValue\":\n const key = (tip as TipProtocolVariantAppValue).AppValue[0];\n const value = (tip as TipProtocolVariantAppValue).AppValue[1];\n return this.handleValueTip(key, value, from);\n break;\n case \"AppCustom\":\n return this.handleCustomTip((tip as TipProtocolVariantAppCustom).AppCustom, from);\n break;\n }\n return undefined;\n }\n\n\n /** */\n synchronizeValueTip(key: string, value: string, recipient: AgentId, zomeName: string): void {\n /* Only MainView can cast tips */\n if (!this.isMainView) {\n return;\n }\n console.debug(`synchronizeValueTip() Sending to ${recipient.b64} for zome ${zomeName}`);\n const tip: TipProtocol = {AppValue: [key, value]};\n this.zomeProxy.call('synchronize_tip', {tip, recipient: recipient.hash, zomeName} as SynchronizeTipInput)\n .then((response) => this._castLogs.push({ts: Date.now(), tip, peers: [recipient], response}))\n .catch((e) => {console.warn(\"zome call to synchronize_tip() failed: \", e)})\n }\n\n\n /** */\n synchronizeCustomTip(appTip: Uint8Array, recipient: AgentId, zomeName: string): void {\n /* Only MainView can cast tips */\n if (!this.isMainView) {\n return;\n }\n console.debug(`synchronizeCustomTip() Sending to ${recipient.b64} for zome ${zomeName}`);\n const tip: TipProtocol = {AppCustom: appTip};\n this.zomeProxy.call('synchronize_tip', {tip, recipient: recipient.hash, zomeName} as SynchronizeTipInput)\n .then((response) => this._castLogs.push({ts: Date.now(), tip, peers: [recipient], response}))\n .catch((e) => {console.warn(\"zome call to synchronize_tip() failed: \", e)})\n }\n\n\n /** Cast Tip to all known livePeers */\n broadcastTip(tip: TipProtocol, agents?: Array<AgentId>, timeoutMs?: number): void {\n /** Only MainView can cast tips */\n if (!this.isMainView) {\n return;\n }\n agents = agents ?? this._dvmParent.livePeers;\n /** Skip if no recipients or sending to self only */\n const filtered = agents.filter((key) => key.b64 != this.cell.address.agentId.b64);\n //if (!agents || agents.length == 1 && agents[0] === this._cellProxy.cell.agentPubKey) {\n if (!filtered || filtered.length == 0) {\n console.debug(\"broadcastTip() aborted: No recipients\")\n return;\n }\n /** Broadcast */\n console.debug(`broadcastTip() ${this.cell.address.agentId.short} sending Tip \"${Object.keys(tip)[0]}\" to agents ${filtered.map((key) => key.b64)}`);\n const peers = agents.map((key) => key.hash);\n this.zomeProxy.call('cast_tip', {tip, peers}, undefined, timeoutMs ?? 10 * 1000)\n .then(() => this._castLogs.push({ts: Date.now(), tip, peers: agents, response: undefined}))\n .catch((e) => {console.warn(\"broadcastTip() zome call to cast_tip() failed: \", e)})\n }\n\n\n /** */\n dumpCastLogs() {\n console.warn(`Tips sent from zome \"${this.zomeName}\"`);\n let appSignals: any[] = [];\n this._castLogs.map((log) => {\n const type = Object.keys(log.tip)[0]!;\n const payload = (log.tip as any)[type];\n appSignals.push({\n timestamp: prettyDate(new Date(log.ts)),\n type,\n payload,\n count: log.peers.length,\n first: log.peers[0]? log.peers[0].short : undefined,\n response: log.response });\n });\n console.table(appSignals);\n }\n\n\n private tip2Log(tip: TipProtocol, type: TipProtocolType): [string, string] {\n switch (type) {\n case TipProtocolType.Ping:\n case TipProtocolType.Pong: return [\"\", \"\"]; break;\n case TipProtocolType.AppValue: {\n const [key, value] = (tip as TipProtocolVariantAppValue).AppValue;\n return [key, value];\n }\n break;\n case TipProtocolType.AppCustom: {\n const app = (tip as TipProtocolVariantAppCustom).AppCustom;\n return [\"\" + app.length, \"\"];\n }\n break;\n case TipProtocolType.Entry: {\n const entryPulse = (tip as TipProtocolVariantEntry).Entry;\n return [intoAnyId(entryPulse.ah).short, intoAnyId(entryPulse.eh).short];\n }\n break;\n case TipProtocolType.Link: {\n const linkPulse = (tip as TipProtocolVariantLink).Link;\n return [intoAnyId(linkPulse.link.base).short, intoAnyId(linkPulse.link.target).short];\n }\n break;\n }\n }\n\n\n /** */\n override dumpSignalLogs(signalLogs: SignalLog[]) {\n this.dumpCastLogs();\n console.warn(`Signals received from zome \"${this.zomeName}\"`);\n let appSignals: any[] = [];\n signalLogs\n .filter((log) => log.type == AppSignalType.Zome)\n .map((log) => {\n const signal = log.zomeSignal as ZomeSignal;\n const pulses = signal.pulses as ZomeSignalProtocol[];\n const timestamp = prettyDate(new Date(log.ts));\n const from: string = enc64(signal.from) == this.cell.address.agentId.b64? \"self\" : new AgentId(signal.from).short;\n for (const pulse of pulses) {\n if (ZomeSignalProtocolType.Tip in pulse) {\n const tip: TipProtocol = pulse.Tip;\n const type = Object.keys(tip)[0];\n const [ah_base, eh_target] = this.tip2Log(tip, type as TipProtocolType);\n appSignals.push({timestamp, from, pulse: ZomeSignalProtocolType.Tip, type, payload: anyToB64(tip), ah_base, eh_target});\n }\n if (ZomeSignalProtocolType.Entry in pulse) {\n const entryPulse = materializeEntryPulse(pulse.Entry, Object.values(this.zomeProxy.entryTypes));\n const typedEntry = decode(entryPulse.bytes);\n appSignals.push({timestamp, from, pulse: ZomeSignalProtocolType.Entry, state: prettyState(pulse.Entry.state), type: entryPulse.entryType, payload: anyToB64(typedEntry), ah_base: entryPulse.ah.short, eh_target: entryPulse.eh.short});\n }\n if (ZomeSignalProtocolType.Link in pulse) {\n const linkPulse = materializeLinkPulse(pulse.Link, Object.values(this.zomeProxy.linkTypes));\n appSignals.push({timestamp, from, pulse: ZomeSignalProtocolType.Link, state: prettyState(pulse.Link.state), type: linkPulse.link_type, payload: linkPulse.tag, ah_base: linkPulse.base.print(), eh_target: linkPulse.target.print()});\n }\n }\n });\n console.table(appSignals);\n }\n}\n\n\n/** -- Materialze -- */\n\nexport interface EntryPulseMat {\n origAh: ActionId | null,\n ah: ActionId,\n state: string,\n validatedBy: ValidatedBy,\n isNew: boolean,\n ts: Timestamp,\n author: AgentId,\n eh: EntryId,\n entryType: string,\n visibility: EntryVisibility,\n bytes: Uint8Array,\n}\n\n\n/** */\nexport function materializeEntryPulse(entryPulse: EntryPulse, entryTypes: string[]): EntryPulseMat {\n //console.log(\"materializeEntryPulse()\", entryTypes);\n const stateStr = Object.keys(entryPulse.state)[0]!;\n return {\n origAh: entryPulse.orig_ah? new ActionId(entryPulse.orig_ah) : null,\n ah: new ActionId(entryPulse.ah),\n state: stateStr,\n validatedBy: entryPulse.validation,\n isNew: (entryPulse.state as any)[stateStr],\n ts: entryPulse.ts,\n author: new AgentId(entryPulse.author),\n eh: new EntryId(entryPulse.eh),\n entryType: entryTypes[entryPulse.def.entry_index]!,\n visibility: entryPulse.def.visibility,\n bytes: entryPulse.bytes,\n }\n}\n\n\n/** */\nexport function dematerializeEntryPulse(pulse: EntryPulseMat, entryTypes: string[]): EntryPulse {\n let state: Object = {};\n // @ts-ignore\n state[pulse.state] = pulse.isNew;\n //console.log(\"dematerializeEntryPulse()\", state, entryTypes);\n /** */\n let res: EntryPulse = {\n ah: pulse.ah.hash,\n state: state as StateChange,\n validation: pulse.validatedBy,\n ts: pulse.ts,\n author: pulse.author.hash,\n eh: pulse.eh.hash,\n def: {\n entry_index: getIndexByVariant(entryTypes, pulse.entryType),\n zome_index: 42, // Should not be used\n visibility: pulse.visibility,\n },\n bytes: pulse.bytes,\n }\n if (pulse.origAh) {\n res.orig_ah = pulse.origAh.hash\n }\n return res;\n}\n\n\n/** */\nexport interface LinkPulseMat {\n author: AgentId,\n base: LinkableId;\n target: LinkableId,\n timestamp: Timestamp,\n zome_index: ZomeIndex,\n link_type: string,\n tag: Uint8Array,\n create_link_hash: ActionId,\n /** */\n state: string,\n validatedBy: ValidatedBy,\n isNew: Boolean,\n}\n\n/** */\nexport function materializeLinkPulse(linkPulse: LinkPulse, linkTypes: string[]): LinkPulseMat {\n //console.log(\"materializeLinkPulse()\", linkTypes);\n const stateStr = Object.keys(linkPulse.state)[0]!;\n return {\n author: new AgentId(linkPulse.link.author),\n base: intoLinkableId(linkPulse.link.base),\n target: intoLinkableId(linkPulse.link.target),\n timestamp: linkPulse.link.timestamp,\n zome_index: linkPulse.link.zome_index,\n link_type: linkTypes[linkPulse.link.link_type]!,\n tag: linkPulse.link.tag,\n create_link_hash: new ActionId(linkPulse.link.create_link_hash),\n state: Object.keys(linkPulse.state)[0]!,\n validatedBy: linkPulse.validation,\n isNew: (linkPulse.state as any)[stateStr],\n }\n}\n\n/** */\nexport function dematerializeLinkPulse(pulse: LinkPulseMat, linkTypes: string[]): LinkPulse {\n let state: Object = {};\n // @ts-ignore\n state[pulse.state] = pulse.isNew;\n //console.log(\"dematerializeLinkPulse()\", state);\n /** */\n return {\n state: state as StateChange,\n validation: pulse.validatedBy,\n link: {\n author: pulse.author.hash,\n base: pulse.base.hash,\n target: pulse.target.hash,\n timestamp: pulse.timestamp,\n zome_index: pulse.zome_index,\n link_type: getIndexByVariant(linkTypes, pulse.link_type),\n tag: pulse.tag,\n create_link_hash: pulse.create_link_hash.hash,\n }\n }\n}\n"]}
1
+ {"version":3,"file":"ZomeViewModelWithSignals.js","sourceRoot":"","sources":["../src/ZomeViewModelWithSignals.ts"],"names":[],"mappings":"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","sourcesContent":["import {SignalCb, EntryVisibility, Timestamp, ZomeIndex, Signal, SignalType, AppSignal} from \"@holochain/client\";\nimport {\n ActionId,\n AgentId,\n LinkableId,\n anyToB64,\n enc64,\n EntryId,\n EntryPulse,\n getIndexByVariant,\n intoLinkableId,\n LinkPulse,\n prettyDate,\n prettyState,\n SignalLog,\n AppSignalType,\n StateChange,\n TipProtocol,\n TipProtocolVariantEntry,\n TipProtocolVariantLink,\n ZomeSignal,\n ZomeSignalProtocol,\n ZomeSignalProtocolType,\n ZomeSignalProtocolVariantEntry,\n ZomeSignalProtocolVariantLink,\n TipProtocolType,\n intoAnyId,\n ValidatedBy, SynchronizeTipInput, TipProtocolVariantAppValue, TipProtocolVariantAppCustom,\n h64,\n} from \"@ddd-qc/cell-proxy\";\nimport {ZomeViewModel} from \"./ZomeViewModel\";\nimport {decode} from \"@msgpack/msgpack\";\n\n\n/** */\nexport interface CastLog {\n ts: Timestamp,\n tip: TipProtocol,\n peers: AgentId[],\n response: Timestamp | undefined,\n}\n\n\n/**\n * ZVM with support for ZomeSignals\n */\nexport abstract class ZomeViewModelWithSignals extends ZomeViewModel {\n\n private _castLogs: CastLog[] = [];\n\n /** Methods to override */\n protected handleCustomTip(_customTip: Uint8Array, _from: AgentId): ZomeSignalProtocol | undefined { return undefined;}\n protected handleValueTip(_key: string, _value: string, _from: AgentId): ZomeSignalProtocol | undefined { return undefined;}\n protected async handleEntryPulse(_pulse: EntryPulseMat, _from: AgentId): Promise<void> {}\n protected async handleLinkPulse(_pulse: LinkPulseMat, _from: AgentId): Promise<void> {}\n\n\n /** */\n override signalHandler?: SignalCb = this.mySignalHandler;\n\n\n /** */\n private mySignalHandler(signal: Signal): void {\n const defaultZomeName = (this.constructor as typeof ZomeViewModelWithSignals).ZOME_PROXY.DEFAULT_ZOME_NAME;\n //console.log(\"mySignalHandler()\", appSignal, defaultZomeName);\n if (SignalType.App != signal.type) {\n return;\n }\n const appSignal: AppSignal = signal.value;\n if (appSignal.zome_name !== defaultZomeName) {\n return;\n }\n const zomeSignal = appSignal.payload as ZomeSignal;\n if (!(\"pulses\" in zomeSignal)) {\n return;\n }\n /*await*/ this.handleSignal(zomeSignal);\n }\n\n\n /** */\n private _knownPulses: Set<BigInt> = new Set();\n private async handleSignal(signal: ZomeSignal): Promise<void> {\n const from = new AgentId(signal.from);\n let all = [];\n for (let pulse of signal.pulses) {\n /** Skip duplicate pulse */\n const pulseHash = h64(JSON.stringify(pulse));\n if (this._knownPulses.has(pulseHash)) {\n console.debug(\"handleSignal() Skipping duplicate pulse\", pulseHash);\n continue;\n }\n this._knownPulses.add(pulseHash);\n /** -- Handle Signal according to type -- */\n /** Change tip to Entry or Link signal */\n if (ZomeSignalProtocolType.Tip in pulse) {\n pulse = this.handleTip(pulse.Tip as TipProtocol, from)!;\n if (!pulse) {\n continue;\n }\n }\n if (ZomeSignalProtocolType.Entry in pulse) {\n const entryPulseMat = materializeEntryPulse(pulse.Entry as EntryPulse, (this.constructor as typeof ZomeViewModel).ENTRY_TYPES);\n all.push(this.handleEntryPulse(entryPulseMat, from));\n /** If the new entry is from this agent, broadcast to peers as a tip */\n if (entryPulseMat.isNew && this.cell.address.agentId.equals(from) && entryPulseMat.visibility == \"Public\") {\n this.broadcastTip({Entry: pulse.Entry as EntryPulse});\n }\n continue;\n }\n if (ZomeSignalProtocolType.Link in pulse) {\n const linkPulseMat = materializeLinkPulse(pulse.Link as LinkPulse, (this.constructor as typeof ZomeViewModel).LINK_TYPES);\n all.push(this.handleLinkPulse(linkPulseMat, from));\n /** If the new Link is from this agent, broadcast to peers as a tip */\n if (linkPulseMat.isNew && this.cell.address.agentId.equals(from)) {\n this.broadcastTip({Link: pulse.Link as LinkPulse});\n }\n continue;\n }\n }\n await Promise.all(all);\n this.notifySubscribers();\n }\n\n\n /** */\n private handleTip(tip: TipProtocol, from: AgentId): ZomeSignalProtocol | undefined {\n const type = Object.keys(tip)[0];\n console.log(\"handleTip()\", type, from, tip);\n /* Handle tip according to its type */\n switch (type) {\n case \"Ping\":\n case \"Pong\":\n break;\n case \"Entry\": return {Entry: (tip as TipProtocolVariantEntry).Entry} as ZomeSignalProtocolVariantEntry; break;\n case \"Link\": return {Link: (tip as TipProtocolVariantLink).Link} as ZomeSignalProtocolVariantLink; break;\n case \"AppValue\":\n const key = (tip as TipProtocolVariantAppValue).AppValue[0];\n const value = (tip as TipProtocolVariantAppValue).AppValue[1];\n return this.handleValueTip(key, value, from);\n break;\n case \"AppCustom\":\n return this.handleCustomTip((tip as TipProtocolVariantAppCustom).AppCustom, from);\n break;\n }\n return undefined;\n }\n\n\n /** */\n synchronizeValueTip(key: string, value: string, recipient: AgentId, zomeName: string): void {\n /* Only MainView can cast tips */\n if (!this.isMainView) {\n return;\n }\n console.debug(`synchronizeValueTip() Sending to ${recipient.b64} for zome ${zomeName}`);\n const tip: TipProtocol = {AppValue: [key, value]};\n this.zomeProxy.call('synchronize_tip', {tip, recipient: recipient.hash, zomeName} as SynchronizeTipInput)\n .then((response) => this._castLogs.push({ts: Date.now(), tip, peers: [recipient], response}))\n .catch((e) => {console.warn(\"zome call to synchronize_tip() failed: \", e)})\n }\n\n\n /** */\n synchronizeCustomTip(appTip: Uint8Array, recipient: AgentId, zomeName: string): void {\n /* Only MainView can cast tips */\n if (!this.isMainView) {\n return;\n }\n console.debug(`synchronizeCustomTip() Sending to ${recipient.b64} for zome ${zomeName}`);\n const tip: TipProtocol = {AppCustom: appTip};\n this.zomeProxy.call('synchronize_tip', {tip, recipient: recipient.hash, zomeName} as SynchronizeTipInput)\n .then((response) => this._castLogs.push({ts: Date.now(), tip, peers: [recipient], response}))\n .catch((e) => {console.warn(\"zome call to synchronize_tip() failed: \", e)})\n }\n\n\n /** Cast Tip to all known livePeers */\n broadcastTip(tip: TipProtocol, agents?: Array<AgentId>, timeoutMs?: number): void {\n /** Only MainView can cast tips */\n if (!this.isMainView) {\n return;\n }\n agents = agents ?? this._dvmParent.livePeers;\n /** Skip if no recipients or sending to self only */\n const filtered = agents.filter((key) => key.b64 != this.cell.address.agentId.b64);\n //if (!agents || agents.length == 1 && agents[0] === this._cellProxy.cell.agentPubKey) {\n if (!filtered || filtered.length == 0) {\n console.debug(\"broadcastTip() aborted: No recipients\")\n return;\n }\n /** Broadcast */\n console.debug(`broadcastTip() ${this.cell.address.agentId.short} sending Tip \"${Object.keys(tip)[0]}\" to agents ${filtered.map((key) => key.b64)}`);\n const peers = agents.map((key) => key.hash);\n this.zomeProxy.call('cast_tip', {tip, peers}, undefined, timeoutMs ?? 10 * 1000)\n .then(() => this._castLogs.push({ts: Date.now(), tip, peers: agents, response: undefined}))\n .catch((e) => {console.warn(\"broadcastTip() zome call to cast_tip() failed: \", e)})\n }\n\n\n /** */\n dumpCastLogs() {\n console.warn(`Tips sent from zome \"${this.zomeName}\"`);\n let appSignals: any[] = [];\n this._castLogs.map((log) => {\n const type = Object.keys(log.tip)[0]!;\n const payload = (log.tip as any)[type];\n appSignals.push({\n timestamp: prettyDate(new Date(log.ts)),\n type,\n payload,\n count: log.peers.length,\n first: log.peers[0]? log.peers[0].short : undefined,\n response: log.response });\n });\n console.table(appSignals);\n }\n\n\n private tip2Log(tip: TipProtocol, type: TipProtocolType): [string, string] {\n switch (type) {\n case TipProtocolType.Ping:\n case TipProtocolType.Pong: return [\"\", \"\"]; break;\n case TipProtocolType.AppValue: {\n const [key, value] = (tip as TipProtocolVariantAppValue).AppValue;\n return [key, value];\n }\n break;\n case TipProtocolType.AppCustom: {\n const app = (tip as TipProtocolVariantAppCustom).AppCustom;\n return [\"\" + app.length, \"\"];\n }\n break;\n case TipProtocolType.Entry: {\n const entryPulse = (tip as TipProtocolVariantEntry).Entry;\n return [intoAnyId(entryPulse.ah).short, intoAnyId(entryPulse.eh).short];\n }\n break;\n case TipProtocolType.Link: {\n const linkPulse = (tip as TipProtocolVariantLink).Link;\n return [intoAnyId(linkPulse.link.base).short, intoAnyId(linkPulse.link.target).short];\n }\n break;\n }\n }\n\n\n /** */\n override dumpSignalLogs(signalLogs: SignalLog[]) {\n this.dumpCastLogs();\n console.warn(`Signals received from zome \"${this.zomeName}\"`);\n let appSignals: any[] = [];\n signalLogs\n .filter((log) => log.type == AppSignalType.Zome)\n .map((log) => {\n const signal = log.zomeSignal as ZomeSignal;\n const pulses = signal.pulses as ZomeSignalProtocol[];\n const timestamp = prettyDate(new Date(log.ts));\n const from: string = enc64(signal.from) == this.cell.address.agentId.b64? \"self\" : new AgentId(signal.from).short;\n for (const pulse of pulses) {\n if (ZomeSignalProtocolType.Tip in pulse) {\n const tip: TipProtocol = pulse.Tip;\n const type = Object.keys(tip)[0];\n const [ah_base, eh_target] = this.tip2Log(tip, type as TipProtocolType);\n appSignals.push({timestamp, from, pulse: ZomeSignalProtocolType.Tip, type, payload: anyToB64(tip), ah_base, eh_target});\n }\n if (ZomeSignalProtocolType.Entry in pulse) {\n const entryPulse = materializeEntryPulse(pulse.Entry, Object.values(this.zomeProxy.entryTypes));\n const typedEntry = decode(entryPulse.bytes);\n appSignals.push({timestamp, from, pulse: ZomeSignalProtocolType.Entry, state: prettyState(pulse.Entry.state), type: entryPulse.entryType, validation: entryPulse.validatedBy,\n payload: anyToB64(typedEntry),\n ah_base: entryPulse.ah.short, eh_target: entryPulse.eh.short});\n }\n if (ZomeSignalProtocolType.Link in pulse) {\n const linkPulse = materializeLinkPulse(pulse.Link, Object.values(this.zomeProxy.linkTypes));\n appSignals.push({timestamp, from, pulse: ZomeSignalProtocolType.Link, state: prettyState(pulse.Link.state), type: linkPulse.link_type, payload: linkPulse.tag,\n ah_base: linkPulse.base.print(), eh_target: linkPulse.target.print(), validation: linkPulse.validatedBy,\n });\n }\n }\n });\n console.table(appSignals);\n }\n}\n\n\n/** -- Materialze -- */\n\nexport interface EntryPulseMat {\n origAh: ActionId | null,\n ah: ActionId,\n state: string,\n validatedBy: ValidatedBy,\n isNew: boolean,\n ts: Timestamp,\n author: AgentId,\n eh: EntryId,\n entryType: string,\n visibility: EntryVisibility,\n bytes: Uint8Array,\n}\n\n\n/** */\nexport function materializeEntryPulse(entryPulse: EntryPulse, entryTypes: string[]): EntryPulseMat {\n //console.log(\"materializeEntryPulse()\", entryTypes);\n const stateStr = Object.keys(entryPulse.state)[0]!;\n return {\n origAh: entryPulse.orig_ah? new ActionId(entryPulse.orig_ah) : null,\n ah: new ActionId(entryPulse.ah),\n state: stateStr,\n validatedBy: entryPulse.validation,\n isNew: (entryPulse.state as any)[stateStr],\n ts: entryPulse.ts,\n author: new AgentId(entryPulse.author),\n eh: new EntryId(entryPulse.eh),\n entryType: entryTypes[entryPulse.def.entry_index]!,\n visibility: entryPulse.def.visibility,\n bytes: entryPulse.bytes,\n }\n}\n\n\n/** */\nexport function dematerializeEntryPulse(pulse: EntryPulseMat, entryTypes: string[]): EntryPulse {\n let state: Object = {};\n // @ts-ignore\n state[pulse.state] = pulse.isNew;\n //console.log(\"dematerializeEntryPulse()\", state, entryTypes);\n /** */\n let res: EntryPulse = {\n ah: pulse.ah.hash,\n state: state as StateChange,\n validation: pulse.validatedBy,\n ts: pulse.ts,\n author: pulse.author.hash,\n eh: pulse.eh.hash,\n def: {\n entry_index: getIndexByVariant(entryTypes, pulse.entryType),\n zome_index: 42, // Should not be used\n visibility: pulse.visibility,\n },\n bytes: pulse.bytes,\n }\n if (pulse.origAh) {\n res.orig_ah = pulse.origAh.hash\n }\n return res;\n}\n\n\n/** */\nexport interface LinkPulseMat {\n author: AgentId,\n base: LinkableId;\n target: LinkableId,\n timestamp: Timestamp,\n zome_index: ZomeIndex,\n link_type: string,\n tag: Uint8Array,\n create_link_hash: ActionId,\n /** */\n state: string,\n validatedBy: ValidatedBy,\n isNew: Boolean,\n}\n\n/** */\nexport function materializeLinkPulse(linkPulse: LinkPulse, linkTypes: string[]): LinkPulseMat {\n //console.log(\"materializeLinkPulse()\", linkTypes);\n const stateStr = Object.keys(linkPulse.state)[0]!;\n return {\n author: new AgentId(linkPulse.link.author),\n base: intoLinkableId(linkPulse.link.base),\n target: intoLinkableId(linkPulse.link.target),\n timestamp: linkPulse.link.timestamp,\n zome_index: linkPulse.link.zome_index,\n link_type: linkTypes[linkPulse.link.link_type]!,\n tag: linkPulse.link.tag,\n create_link_hash: new ActionId(linkPulse.link.create_link_hash),\n state: Object.keys(linkPulse.state)[0]!,\n validatedBy: linkPulse.validation,\n isNew: (linkPulse.state as any)[stateStr],\n }\n}\n\n/** */\nexport function dematerializeLinkPulse(pulse: LinkPulseMat, linkTypes: string[]): LinkPulse {\n let state: Object = {};\n // @ts-ignore\n state[pulse.state] = pulse.isNew;\n //console.log(\"dematerializeLinkPulse()\", state);\n /** */\n return {\n state: state as StateChange,\n validation: pulse.validatedBy,\n link: {\n author: pulse.author.hash,\n base: pulse.base.hash,\n target: pulse.target.hash,\n timestamp: pulse.timestamp,\n zome_index: pulse.zome_index,\n link_type: getIndexByVariant(linkTypes, pulse.link_type),\n tag: pulse.tag,\n create_link_hash: pulse.create_link_hash.hash,\n }\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ddd-qc/lit-happ",
3
- "version": "0.34.12",
3
+ "version": "0.35.0",
4
4
  "description": "MVVM Framework for holochain apps using Lit",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.js",
@@ -29,7 +29,7 @@
29
29
  "typescript": "~5.9"
30
30
  },
31
31
  "dependencies": {
32
- "@holochain/client": "=0.20.4-rc.0",
32
+ "@holochain/client": "=0.20.4",
33
33
  "@ddd-qc/cell-proxy": "file:../cell-proxy",
34
34
  "@lit/context": "1.0.1",
35
35
  "lit": "3.0.2",