holosphere 2.0.0-alpha0 → 2.0.0-alpha10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (418) hide show
  1. package/CHANGELOG.md +473 -0
  2. package/FEATURES.md +431 -0
  3. package/LICENSE +29 -42
  4. package/LICENSE-AGPL.md +180 -0
  5. package/README.md +97 -16
  6. package/dist/2019-D2OG2idw.js +6680 -0
  7. package/dist/2019-D2OG2idw.js.map +1 -0
  8. package/dist/2019-EION3wKo.cjs +8 -0
  9. package/dist/2019-EION3wKo.cjs.map +1 -0
  10. package/dist/_commonjsHelpers-C37NGDzP.cjs +2 -0
  11. package/dist/_commonjsHelpers-C37NGDzP.cjs.map +1 -0
  12. package/dist/_commonjsHelpers-CUmg6egw.js +7 -0
  13. package/dist/_commonjsHelpers-CUmg6egw.js.map +1 -0
  14. package/dist/browser-BSniCNqO.js +3058 -0
  15. package/dist/browser-BSniCNqO.js.map +1 -0
  16. package/dist/browser-Cq59Ij19.cjs +2 -0
  17. package/dist/browser-Cq59Ij19.cjs.map +1 -0
  18. package/dist/cdn/holosphere.min.js +55 -0
  19. package/dist/cdn/holosphere.min.js.map +1 -0
  20. package/dist/cjs/holosphere.cjs +2 -0
  21. package/dist/cjs/holosphere.cjs.map +1 -0
  22. package/dist/esm/holosphere.js +53 -0
  23. package/dist/esm/holosphere.js.map +1 -0
  24. package/dist/index-DDGt_V9o.cjs +12 -0
  25. package/dist/index-DDGt_V9o.cjs.map +1 -0
  26. package/dist/index-DJXftyvB.js +39841 -0
  27. package/dist/index-DJXftyvB.js.map +1 -0
  28. package/dist/index-DMbdcMtK.cjs +18 -0
  29. package/dist/index-DMbdcMtK.cjs.map +1 -0
  30. package/dist/index-DeZ1xz_s.js +15104 -0
  31. package/dist/index-DeZ1xz_s.js.map +1 -0
  32. package/dist/indexeddb-storage-BFt6hMeF.js +176 -0
  33. package/dist/indexeddb-storage-BFt6hMeF.js.map +1 -0
  34. package/dist/indexeddb-storage-BK5tv4Sh.cjs +2 -0
  35. package/dist/indexeddb-storage-BK5tv4Sh.cjs.map +1 -0
  36. package/dist/memory-storage-C9HuoL2E.js +91 -0
  37. package/dist/memory-storage-C9HuoL2E.js.map +1 -0
  38. package/dist/memory-storage-Dao7jfYG.cjs +2 -0
  39. package/dist/memory-storage-Dao7jfYG.cjs.map +1 -0
  40. package/dist/secp256k1-BbKzbLtD.cjs +12 -0
  41. package/dist/secp256k1-BbKzbLtD.cjs.map +1 -0
  42. package/dist/secp256k1-CreY7Pcl.js +1890 -0
  43. package/dist/secp256k1-CreY7Pcl.js.map +1 -0
  44. package/docs/CONTRACTS.md +797 -0
  45. package/docs/FOSDEM_PROPOSAL.md +388 -0
  46. package/docs/LOCALFIRST.md +266 -0
  47. package/docs/api/ai_aggregation.js.html +333 -0
  48. package/docs/api/ai_breakdown.js.html +524 -0
  49. package/docs/api/ai_classifier.js.html +231 -0
  50. package/docs/api/ai_council.js.html +246 -0
  51. package/docs/api/ai_embeddings.js.html +304 -0
  52. package/docs/api/ai_federation-ai.js.html +338 -0
  53. package/docs/api/ai_h3-ai.js.html +970 -0
  54. package/docs/api/ai_index.js.html +124 -0
  55. package/docs/api/ai_json-ops.js.html +241 -0
  56. package/docs/api/ai_llm-service.js.html +239 -0
  57. package/docs/api/ai_nl-query.js.html +236 -0
  58. package/docs/api/ai_relationships.js.html +367 -0
  59. package/docs/api/ai_schema-extractor.js.html +235 -0
  60. package/docs/api/ai_spatial.js.html +307 -0
  61. package/docs/api/ai_tts.js.html +214 -0
  62. package/docs/api/content_social-protocols.js.html +180 -0
  63. package/docs/api/core_holosphere.js.html +757 -0
  64. package/docs/api/crypto_nostr-utils.js.html +306 -0
  65. package/docs/api/crypto_secp256k1.js.html +267 -0
  66. package/docs/api/data/search.json +1 -0
  67. package/docs/api/federation_discovery.js.html +337 -0
  68. package/docs/api/federation_handshake.js.html +478 -0
  69. package/docs/api/federation_hologram.js.html +1053 -0
  70. package/docs/api/federation_registry.js.html +389 -0
  71. package/docs/api/fonts/Inconsolata-Regular.ttf +0 -0
  72. package/docs/api/fonts/OpenSans-Regular.ttf +0 -0
  73. package/docs/api/fonts/WorkSans-Bold.ttf +0 -0
  74. package/docs/api/global.html +3 -0
  75. package/docs/api/hierarchical_upcast.js.html +128 -0
  76. package/docs/api/index.html +265 -0
  77. package/docs/api/index.js.html +1868 -0
  78. package/docs/api/lib_ai-methods.js.html +660 -0
  79. package/docs/api/lib_contract-methods.js.html +445 -0
  80. package/docs/api/lib_errors.js.html +56 -0
  81. package/docs/api/lib_federation-methods.js.html +348 -0
  82. package/docs/api/lib_index.js.html +33 -0
  83. package/docs/api/module-ai.html +5 -0
  84. package/docs/api/module-ai_aggregation-SmartAggregation.html +6 -0
  85. package/docs/api/module-ai_aggregation.SmartAggregation.html +3 -0
  86. package/docs/api/module-ai_aggregation.html +3 -0
  87. package/docs/api/module-ai_breakdown-TaskBreakdown.html +5 -0
  88. package/docs/api/module-ai_breakdown.TaskBreakdown.html +3 -0
  89. package/docs/api/module-ai_breakdown.html +3 -0
  90. package/docs/api/module-ai_classifier-Classifier.html +6 -0
  91. package/docs/api/module-ai_classifier.Classifier.html +3 -0
  92. package/docs/api/module-ai_classifier.html +3 -0
  93. package/docs/api/module-ai_council-Council.html +6 -0
  94. package/docs/api/module-ai_council.Council.html +3 -0
  95. package/docs/api/module-ai_council.html +3 -0
  96. package/docs/api/module-ai_embeddings-Embeddings.html +5 -0
  97. package/docs/api/module-ai_embeddings.Embeddings.html +3 -0
  98. package/docs/api/module-ai_embeddings.html +3 -0
  99. package/docs/api/module-ai_federation-ai-FederationAdvisor.html +6 -0
  100. package/docs/api/module-ai_federation-ai.FederationAdvisor.html +3 -0
  101. package/docs/api/module-ai_federation-ai.html +3 -0
  102. package/docs/api/module-ai_h3-ai-H3AI.html +6 -0
  103. package/docs/api/module-ai_h3-ai.H3AI.html +3 -0
  104. package/docs/api/module-ai_h3-ai.html +3 -0
  105. package/docs/api/module-ai_json-ops-JSONOps.html +5 -0
  106. package/docs/api/module-ai_json-ops.JSONOps.html +3 -0
  107. package/docs/api/module-ai_json-ops.html +3 -0
  108. package/docs/api/module-ai_llm-service-LLMService.html +5 -0
  109. package/docs/api/module-ai_llm-service.LLMService.html +3 -0
  110. package/docs/api/module-ai_llm-service.html +3 -0
  111. package/docs/api/module-ai_nl-query-NLQuery.html +5 -0
  112. package/docs/api/module-ai_nl-query.NLQuery.html +3 -0
  113. package/docs/api/module-ai_nl-query.html +3 -0
  114. package/docs/api/module-ai_relationships-RelationshipDiscovery.html +6 -0
  115. package/docs/api/module-ai_relationships.RelationshipDiscovery.html +3 -0
  116. package/docs/api/module-ai_relationships.html +3 -0
  117. package/docs/api/module-ai_schema-extractor-SchemaExtractor.html +5 -0
  118. package/docs/api/module-ai_schema-extractor.SchemaExtractor.html +3 -0
  119. package/docs/api/module-ai_schema-extractor.html +3 -0
  120. package/docs/api/module-ai_spatial-SpatialAnalysis.html +6 -0
  121. package/docs/api/module-ai_spatial.SpatialAnalysis.html +3 -0
  122. package/docs/api/module-ai_spatial.html +3 -0
  123. package/docs/api/module-ai_tts-TTS.html +5 -0
  124. package/docs/api/module-ai_tts.TTS.html +3 -0
  125. package/docs/api/module-ai_tts.html +3 -0
  126. package/docs/api/module-content_social-protocols.html +3 -0
  127. package/docs/api/module-core_holosphere-HoloSphere.html +6 -0
  128. package/docs/api/module-core_holosphere.HoloSphere.html +3 -0
  129. package/docs/api/module-core_holosphere.html +3 -0
  130. package/docs/api/module-crypto_nostr-utils.html +3 -0
  131. package/docs/api/module-crypto_secp256k1.html +3 -0
  132. package/docs/api/module-federation_hologram.html +3 -0
  133. package/docs/api/module-hierarchical_upcast.html +3 -0
  134. package/docs/api/module-holosphere-HoloSphereBase.html +3 -0
  135. package/docs/api/module-holosphere.html +3 -0
  136. package/docs/api/module-lib_ai-methods.html +3 -0
  137. package/docs/api/module-lib_contract-methods.html +3 -0
  138. package/docs/api/module-lib_errors-AuthorizationError.html +3 -0
  139. package/docs/api/module-lib_errors-ValidationError.html +3 -0
  140. package/docs/api/module-lib_errors.AuthorizationError.html +3 -0
  141. package/docs/api/module-lib_errors.ValidationError.html +3 -0
  142. package/docs/api/module-lib_errors.html +3 -0
  143. package/docs/api/module-lib_federation-methods.html +3 -0
  144. package/docs/api/module-lib_index.html +3 -0
  145. package/docs/api/module-schema_validator-ValidationError.html +3 -0
  146. package/docs/api/module-schema_validator.ValidationError.html +3 -0
  147. package/docs/api/module-schema_validator.html +3 -0
  148. package/docs/api/module-spatial_h3-operations.html +4 -0
  149. package/docs/api/module-storage_backend-factory.BackendFactory.html +3 -0
  150. package/docs/api/module-storage_backend-factory.html +3 -0
  151. package/docs/api/module-storage_backend-interface-StorageBackend.html +3 -0
  152. package/docs/api/module-storage_backend-interface.StorageBackend.html +3 -0
  153. package/docs/api/module-storage_backend-interface.html +3 -0
  154. package/docs/api/module-storage_backends_activitypub-backend-ActivityPubBackend.html +7 -0
  155. package/docs/api/module-storage_backends_activitypub-backend.ActivityPubBackend.html +3 -0
  156. package/docs/api/module-storage_backends_activitypub-backend.html +3 -0
  157. package/docs/api/module-storage_backends_activitypub_server-ActivityPubServer.html +8 -0
  158. package/docs/api/module-storage_backends_activitypub_server.ActivityPubServer.html +3 -0
  159. package/docs/api/module-storage_backends_activitypub_server.html +3 -0
  160. package/docs/api/module-storage_backends_gundb-backend-GunDBBackend.html +7 -0
  161. package/docs/api/module-storage_backends_gundb-backend.GunDBBackend.html +3 -0
  162. package/docs/api/module-storage_backends_gundb-backend.html +3 -0
  163. package/docs/api/module-storage_backends_nostr-backend-NostrBackend.html +8 -0
  164. package/docs/api/module-storage_backends_nostr-backend.NostrBackend.html +3 -0
  165. package/docs/api/module-storage_backends_nostr-backend.html +3 -0
  166. package/docs/api/module-storage_filesystem-storage-FileSystemStorage.html +5 -0
  167. package/docs/api/module-storage_filesystem-storage-browser-FileSystemStorage.html +3 -0
  168. package/docs/api/module-storage_filesystem-storage-browser.FileSystemStorage.html +3 -0
  169. package/docs/api/module-storage_filesystem-storage-browser.html +3 -0
  170. package/docs/api/module-storage_filesystem-storage.FileSystemStorage.html +3 -0
  171. package/docs/api/module-storage_filesystem-storage.html +3 -0
  172. package/docs/api/module-storage_global-tables.html +3 -0
  173. package/docs/api/module-storage_gun-async.html +3 -0
  174. package/docs/api/module-storage_gun-auth-GunAuth.html +5 -0
  175. package/docs/api/module-storage_gun-auth.GunAuth.html +3 -0
  176. package/docs/api/module-storage_gun-auth.html +3 -0
  177. package/docs/api/module-storage_gun-federation.html +3 -0
  178. package/docs/api/module-storage_gun-references-GunReferenceHandler.html +5 -0
  179. package/docs/api/module-storage_gun-references.GunReferenceHandler.html +3 -0
  180. package/docs/api/module-storage_gun-references.html +3 -0
  181. package/docs/api/module-storage_gun-schema-GunSchemaValidator.html +5 -0
  182. package/docs/api/module-storage_gun-schema.GunSchemaValidator.html +3 -0
  183. package/docs/api/module-storage_gun-schema.html +3 -0
  184. package/docs/api/module-storage_gun-wrapper.html +11 -0
  185. package/docs/api/module-storage_indexeddb-storage-IndexedDBStorage.html +5 -0
  186. package/docs/api/module-storage_indexeddb-storage.IndexedDBStorage.html +3 -0
  187. package/docs/api/module-storage_indexeddb-storage.html +3 -0
  188. package/docs/api/module-storage_key-storage-simple.html +3 -0
  189. package/docs/api/module-storage_key-storage.html +4 -0
  190. package/docs/api/module-storage_memory-storage-MemoryStorage.html +5 -0
  191. package/docs/api/module-storage_memory-storage.MemoryStorage.html +3 -0
  192. package/docs/api/module-storage_memory-storage.html +3 -0
  193. package/docs/api/module-storage_migration-MigrationTool.html +6 -0
  194. package/docs/api/module-storage_migration.MigrationTool.html +3 -0
  195. package/docs/api/module-storage_migration.html +3 -0
  196. package/docs/api/module-storage_nostr-async.html +18 -0
  197. package/docs/api/module-storage_nostr-client-LRUCache.html +3 -0
  198. package/docs/api/module-storage_nostr-client-NostrClient.html +7 -0
  199. package/docs/api/module-storage_nostr-client.NostrClient.html +15 -0
  200. package/docs/api/module-storage_nostr-client.html +6 -0
  201. package/docs/api/module-storage_nostr-wrapper.html +3 -0
  202. package/docs/api/module-storage_outbox-queue-OutboxQueue.html +4 -0
  203. package/docs/api/module-storage_outbox-queue.OutboxQueue.html +3 -0
  204. package/docs/api/module-storage_outbox-queue.html +3 -0
  205. package/docs/api/module-storage_persistent-storage-PersistentStorage.html +3 -0
  206. package/docs/api/module-storage_persistent-storage.html +4 -0
  207. package/docs/api/module-storage_sync-service-SyncService.html +5 -0
  208. package/docs/api/module-storage_sync-service.SyncService.html +3 -0
  209. package/docs/api/module-storage_sync-service.html +3 -0
  210. package/docs/api/module-storage_unified-storage.html +3 -0
  211. package/docs/api/module-subscriptions_manager.SubscriptionRegistry.html +3 -0
  212. package/docs/api/module-subscriptions_manager.html +3 -0
  213. package/docs/api/schema_validator.js.html +113 -0
  214. package/docs/api/scripts/core.js +726 -0
  215. package/docs/api/scripts/core.min.js +23 -0
  216. package/docs/api/scripts/resize.js +90 -0
  217. package/docs/api/scripts/search.js +265 -0
  218. package/docs/api/scripts/search.min.js +6 -0
  219. package/docs/api/scripts/third-party/Apache-License-2.0.txt +202 -0
  220. package/docs/api/scripts/third-party/fuse.js +9 -0
  221. package/docs/api/scripts/third-party/hljs-line-num-original.js +369 -0
  222. package/docs/api/scripts/third-party/hljs-line-num.js +1 -0
  223. package/docs/api/scripts/third-party/hljs-original.js +5171 -0
  224. package/docs/api/scripts/third-party/hljs.js +1 -0
  225. package/docs/api/scripts/third-party/popper.js +5 -0
  226. package/docs/api/scripts/third-party/tippy.js +1 -0
  227. package/docs/api/scripts/third-party/tocbot.js +672 -0
  228. package/docs/api/scripts/third-party/tocbot.min.js +1 -0
  229. package/docs/api/spatial_h3-operations.js.html +129 -0
  230. package/docs/api/storage_backend-factory.js.html +133 -0
  231. package/docs/api/storage_backend-interface.js.html +164 -0
  232. package/docs/api/storage_backends_activitypub-backend.js.html +298 -0
  233. package/docs/api/storage_backends_activitypub_server.js.html +678 -0
  234. package/docs/api/storage_backends_gundb-backend.js.html +878 -0
  235. package/docs/api/storage_backends_nostr-backend.js.html +254 -0
  236. package/docs/api/storage_filesystem-storage-browser.js.html +83 -0
  237. package/docs/api/storage_filesystem-storage.js.html +207 -0
  238. package/docs/api/storage_global-tables.js.html +116 -0
  239. package/docs/api/storage_gun-async.js.html +344 -0
  240. package/docs/api/storage_gun-auth.js.html +376 -0
  241. package/docs/api/storage_gun-federation.js.html +788 -0
  242. package/docs/api/storage_gun-references.js.html +212 -0
  243. package/docs/api/storage_gun-schema.js.html +309 -0
  244. package/docs/api/storage_gun-wrapper.js.html +645 -0
  245. package/docs/api/storage_indexeddb-storage.js.html +224 -0
  246. package/docs/api/storage_key-storage-simple.js.html +102 -0
  247. package/docs/api/storage_key-storage.js.html +171 -0
  248. package/docs/api/storage_memory-storage.js.html +128 -0
  249. package/docs/api/storage_migration.js.html +354 -0
  250. package/docs/api/storage_nostr-async.js.html +1076 -0
  251. package/docs/api/storage_nostr-client.js.html +1598 -0
  252. package/docs/api/storage_nostr-wrapper.js.html +218 -0
  253. package/docs/api/storage_outbox-queue.js.html +248 -0
  254. package/docs/api/storage_persistent-storage.js.html +160 -0
  255. package/docs/api/storage_sync-service.js.html +201 -0
  256. package/docs/api/storage_unified-storage.js.html +157 -0
  257. package/docs/api/styles/clean-jsdoc-theme-base.css +1159 -0
  258. package/docs/api/styles/clean-jsdoc-theme-dark.css +412 -0
  259. package/docs/api/styles/clean-jsdoc-theme-light.css +482 -0
  260. package/docs/api/styles/clean-jsdoc-theme-scrollbar.css +30 -0
  261. package/docs/api/styles/clean-jsdoc-theme-without-scrollbar.min.css +1 -0
  262. package/docs/api/styles/clean-jsdoc-theme.min.css +1 -0
  263. package/docs/api/subscriptions_manager.js.html +162 -0
  264. package/docs/contracts/api-interface.md +793 -0
  265. package/docs/data-model.md +476 -0
  266. package/docs/gun-async-usage.md +338 -0
  267. package/docs/plan.md +349 -0
  268. package/docs/quickstart.md +674 -0
  269. package/docs/research.md +362 -0
  270. package/docs/spec.md +244 -0
  271. package/docs/storage-backends.md +326 -0
  272. package/docs/tasks.md +947 -0
  273. package/examples/demo.html +47 -0
  274. package/examples/holosphere-widget.js +1242 -0
  275. package/examples/widget-demo.html +274 -0
  276. package/examples/widget.html +703 -0
  277. package/jsdoc.json +26 -0
  278. package/package.json +25 -7
  279. package/src/ai/aggregation.js +13 -2
  280. package/src/ai/breakdown.js +12 -2
  281. package/src/ai/classifier.js +14 -3
  282. package/src/ai/council.js +22 -7
  283. package/src/ai/embeddings.js +37 -15
  284. package/src/ai/federation-ai.js +13 -2
  285. package/src/ai/h3-ai.js +14 -2
  286. package/src/ai/index.js +16 -7
  287. package/src/ai/json-ops.js +18 -5
  288. package/src/ai/llm-service.js +62 -31
  289. package/src/ai/nl-query.js +12 -2
  290. package/src/ai/relationships.js +13 -2
  291. package/src/ai/schema-extractor.js +24 -10
  292. package/src/ai/spatial.js +13 -2
  293. package/src/ai/tts.js +25 -8
  294. package/src/cdn-entry.js +22 -0
  295. package/src/content/social-protocols.js +34 -25
  296. package/src/contracts/abis/Appreciative.json +1280 -0
  297. package/src/contracts/abis/AppreciativeFactory.json +101 -0
  298. package/src/contracts/abis/Bundle.json +1438 -0
  299. package/src/contracts/abis/BundleFactory.json +106 -0
  300. package/src/contracts/abis/Holon.json +881 -0
  301. package/src/contracts/abis/Holons.json +330 -0
  302. package/src/contracts/abis/Managed.json +1262 -0
  303. package/src/contracts/abis/ManagedFactory.json +149 -0
  304. package/src/contracts/abis/Membrane.json +261 -0
  305. package/src/contracts/abis/Splitter.json +1624 -0
  306. package/src/contracts/abis/SplitterFactory.json +220 -0
  307. package/src/contracts/abis/TestToken.json +321 -0
  308. package/src/contracts/abis/Zoned.json +1461 -0
  309. package/src/contracts/abis/ZonedFactory.json +154 -0
  310. package/src/contracts/chain-manager.js +403 -0
  311. package/src/contracts/deployer.js +500 -0
  312. package/src/contracts/event-listener.js +539 -0
  313. package/src/contracts/holon-contracts.js +359 -0
  314. package/src/contracts/index.js +82 -0
  315. package/src/contracts/networks.js +229 -0
  316. package/src/contracts/operations.js +687 -0
  317. package/src/contracts/queries.js +638 -0
  318. package/src/core/holosphere.js +487 -6
  319. package/src/crypto/nostr-utils.js +303 -0
  320. package/src/crypto/secp256k1.js +7 -2
  321. package/src/federation/handshake.js +475 -0
  322. package/src/federation/hologram.js +117 -3
  323. package/src/hierarchical/upcast.js +40 -25
  324. package/src/index.js +1501 -1909
  325. package/src/lib/ai-methods.js +657 -0
  326. package/src/lib/contract-methods.js +442 -0
  327. package/src/lib/errors.js +53 -0
  328. package/src/lib/federation-methods.js +345 -0
  329. package/src/lib/index.js +30 -0
  330. package/src/schema/validator.js +22 -3
  331. package/src/spatial/h3-operations.js +19 -3
  332. package/src/storage/backend-factory.js +7 -2
  333. package/src/storage/backend-interface.js +21 -2
  334. package/src/storage/backends/activitypub/server.js +25 -3
  335. package/src/storage/backends/activitypub-backend.js +25 -2
  336. package/src/storage/backends/gundb-backend.js +692 -50
  337. package/src/storage/backends/nostr-backend.js +116 -1
  338. package/src/storage/filesystem-storage-browser.js +42 -2
  339. package/src/storage/filesystem-storage.js +72 -5
  340. package/src/storage/global-tables.js +35 -3
  341. package/src/storage/gun-async.js +75 -15
  342. package/src/storage/gun-auth.js +373 -0
  343. package/src/storage/gun-federation.js +785 -0
  344. package/src/storage/gun-references.js +209 -0
  345. package/src/storage/gun-schema.js +306 -0
  346. package/src/storage/gun-wrapper.js +475 -54
  347. package/src/storage/indexeddb-storage.js +112 -13
  348. package/src/storage/key-storage-simple.js +32 -9
  349. package/src/storage/key-storage.js +45 -13
  350. package/src/storage/memory-storage.js +68 -2
  351. package/src/storage/migration.js +20 -7
  352. package/src/storage/nostr-async.js +412 -122
  353. package/src/storage/nostr-client.js +749 -76
  354. package/src/storage/nostr-wrapper.js +6 -2
  355. package/src/storage/outbox-queue.js +55 -18
  356. package/src/storage/persistent-storage.js +62 -14
  357. package/src/storage/sync-service.js +51 -17
  358. package/src/storage/unified-storage.js +154 -0
  359. package/src/subscriptions/manager.js +34 -17
  360. package/types/index.d.ts +133 -0
  361. package/vite.config.cdn.js +60 -0
  362. package/tests/unit/ai/aggregation.test.js +0 -295
  363. package/tests/unit/ai/breakdown.test.js +0 -446
  364. package/tests/unit/ai/classifier.test.js +0 -294
  365. package/tests/unit/ai/council.test.js +0 -262
  366. package/tests/unit/ai/embeddings.test.js +0 -384
  367. package/tests/unit/ai/federation-ai.test.js +0 -344
  368. package/tests/unit/ai/h3-ai.test.js +0 -458
  369. package/tests/unit/ai/index.test.js +0 -304
  370. package/tests/unit/ai/json-ops.test.js +0 -307
  371. package/tests/unit/ai/llm-service.test.js +0 -390
  372. package/tests/unit/ai/nl-query.test.js +0 -383
  373. package/tests/unit/ai/relationships.test.js +0 -311
  374. package/tests/unit/ai/schema-extractor.test.js +0 -384
  375. package/tests/unit/ai/spatial.test.js +0 -279
  376. package/tests/unit/ai/tts.test.js +0 -279
  377. package/tests/unit/content.test.js +0 -332
  378. package/tests/unit/contract/core.test.js +0 -88
  379. package/tests/unit/contract/crypto.test.js +0 -198
  380. package/tests/unit/contract/data.test.js +0 -223
  381. package/tests/unit/contract/federation.test.js +0 -181
  382. package/tests/unit/contract/hierarchical.test.js +0 -113
  383. package/tests/unit/contract/schema.test.js +0 -114
  384. package/tests/unit/contract/social.test.js +0 -217
  385. package/tests/unit/contract/spatial.test.js +0 -110
  386. package/tests/unit/contract/subscriptions.test.js +0 -128
  387. package/tests/unit/contract/utils.test.js +0 -159
  388. package/tests/unit/core.test.js +0 -152
  389. package/tests/unit/crypto.test.js +0 -328
  390. package/tests/unit/federation.test.js +0 -234
  391. package/tests/unit/gun-async.test.js +0 -252
  392. package/tests/unit/hierarchical.test.js +0 -399
  393. package/tests/unit/integration/scenario-01-geographic-storage.test.js +0 -74
  394. package/tests/unit/integration/scenario-02-federation.test.js +0 -76
  395. package/tests/unit/integration/scenario-03-subscriptions.test.js +0 -102
  396. package/tests/unit/integration/scenario-04-validation.test.js +0 -129
  397. package/tests/unit/integration/scenario-05-hierarchy.test.js +0 -125
  398. package/tests/unit/integration/scenario-06-social.test.js +0 -135
  399. package/tests/unit/integration/scenario-07-persistence.test.js +0 -130
  400. package/tests/unit/integration/scenario-08-authorization.test.js +0 -161
  401. package/tests/unit/integration/scenario-09-cross-dimensional.test.js +0 -139
  402. package/tests/unit/integration/scenario-10-cross-holosphere-capabilities.test.js +0 -357
  403. package/tests/unit/integration/scenario-11-cross-holosphere-federation.test.js +0 -410
  404. package/tests/unit/integration/scenario-12-capability-federated-read.test.js +0 -719
  405. package/tests/unit/performance/benchmark.test.js +0 -85
  406. package/tests/unit/schema.test.js +0 -213
  407. package/tests/unit/spatial.test.js +0 -158
  408. package/tests/unit/storage.test.js +0 -195
  409. package/tests/unit/subscriptions.test.js +0 -328
  410. package/tests/unit/test-data-permanence-debug.js +0 -197
  411. package/tests/unit/test-data-permanence.js +0 -340
  412. package/tests/unit/test-key-persistence-fixed.js +0 -148
  413. package/tests/unit/test-key-persistence.js +0 -172
  414. package/tests/unit/test-relay-permanence.js +0 -376
  415. package/tests/unit/test-second-node.js +0 -95
  416. package/tests/unit/test-simple-write.js +0 -89
  417. /package/{cleanup-test-data.js → scripts/cleanup-test-data.js} +0 -0
  418. /package/{test-ai-real-api.js → scripts/test-ai-real-api.js} +0 -0
@@ -1,7 +1,45 @@
1
+ /**
2
+ * @fileoverview Core HoloSphere class providing the foundational infrastructure
3
+ * for holonic geospatial communication.
4
+ *
5
+ * This module implements the core HoloSphere class that supports multiple storage
6
+ * backends (Nostr, GunDB, ActivityPub) and provides essential operations for
7
+ * distributed P2P communication and data management.
8
+ *
9
+ * @module core/holosphere
10
+ */
11
+
1
12
  import { createClient } from '../storage/nostr-client.js';
2
13
  import { BackendFactory } from '../storage/backend-factory.js';
14
+ import * as gunWrapper from '../storage/gun-wrapper.js';
15
+ import * as gunFederation from '../storage/gun-federation.js';
16
+ import { GunDBBackend } from '../storage/backends/gundb-backend.js';
3
17
  import pkg from '../../package.json' with { type: 'json' };
4
18
 
19
+ /** @type {Function|null} Gun constructor, loaded dynamically */
20
+ let Gun = null;
21
+ /** @type {Promise<Function>|null} Promise for Gun loading */
22
+ let gunLoadPromise = null;
23
+
24
+ /**
25
+ * Dynamically loads the Gun module.
26
+ * Uses lazy loading to reduce initial bundle size and improve startup time.
27
+ *
28
+ * @private
29
+ * @returns {Promise<Function>} Gun constructor
30
+ */
31
+ async function loadGun() {
32
+ if (Gun) return Gun;
33
+ if (gunLoadPromise) return gunLoadPromise;
34
+
35
+ gunLoadPromise = import('gun').then(module => {
36
+ Gun = module.default || module;
37
+ return Gun;
38
+ });
39
+
40
+ return gunLoadPromise;
41
+ }
42
+
5
43
  /**
6
44
  * Get environment variable (works in Node.js, returns undefined in browser)
7
45
  * @param {string} name - Environment variable name
@@ -27,9 +65,20 @@ function getDefaultRelays() {
27
65
  }
28
66
 
29
67
  /**
30
- * HoloSphere - Holonic Geospatial Communication Infrastructure
31
- * Combines H3 hexagonal indexing with distributed P2P storage
32
- * Supports multiple storage backends: nostr, gundb, activitypub
68
+ * HoloSphere - Holonic Geospatial Communication Infrastructure.
69
+ *
70
+ * The core class that combines H3 hexagonal indexing with distributed P2P storage.
71
+ * Supports multiple storage backends including Nostr, GunDB, and ActivityPub.
72
+ *
73
+ * @class HoloSphere
74
+ * @example
75
+ * // Create with Nostr backend (default)
76
+ * const hs = new HoloSphere({ appName: 'myapp', relays: ['wss://relay.example.com'] });
77
+ *
78
+ * @example
79
+ * // Create with GunDB backend
80
+ * const hs = new HoloSphere({ appName: 'myapp', backend: 'gundb' });
81
+ * await hs.ready(); // Wait for async initialization
33
82
  */
34
83
  export class HoloSphere {
35
84
  /**
@@ -38,7 +87,7 @@ export class HoloSphere {
38
87
  * @param {string} config.backend - Storage backend: 'nostr' | 'gundb' | 'activitypub' (default: 'nostr')
39
88
  * @param {string[]} config.relays - Nostr relay URLs (default from HOLOSPHERE_RELAYS env or ['wss://relay.holons.io', 'wss://relay.nostr.band'])
40
89
  * @param {string} config.privateKey - Private key for signing (hex format, optional)
41
- * @param {string} config.logLevel - Log verbosity: ERROR|WARN|INFO|DEBUG (default: 'WARN')
90
+ * @param {string} config.logLevel - Log verbosity: ERROR|WARN|INFO|DEBUG (default: 'INFO')
42
91
  * @param {boolean} config.hybridMode - Enable hybrid mode (local + relay queries) (default: true)
43
92
  * @param {Object} config.gundb - GunDB-specific configuration
44
93
  * @param {Object} config.activitypub - ActivityPub-specific configuration
@@ -74,7 +123,7 @@ export class HoloSphere {
74
123
  backend: config.backend || 'nostr',
75
124
  relays: config.relays || getDefaultRelays(),
76
125
  privateKey: config.privateKey || getEnv('HOLOSPHERE_PRIVATE_KEY'),
77
- logLevel: config.logLevel || getEnv('HOLOSPHERE_LOG_LEVEL') || 'WARN',
126
+ logLevel: config.logLevel || getEnv('HOLOSPHERE_LOG_LEVEL') || 'INFO',
78
127
  hybridMode: config.hybridMode !== false, // Enable by default
79
128
  };
80
129
 
@@ -89,9 +138,12 @@ export class HoloSphere {
89
138
  this._backend = null;
90
139
 
91
140
  // For backward compatibility with Nostr, initialize synchronously
92
- // Other backends use async initialization via _backendReady
141
+ // GunDB and other backends use async initialization via _backendReady
93
142
  if (this.config.backend === 'nostr') {
94
143
  this._initNostrSync(config);
144
+ } else if (this.config.backend === 'gundb') {
145
+ // GunDB uses async init due to dynamic import
146
+ this._backendReady = this._initGunDBAsync(config);
95
147
  } else {
96
148
  // Async initialization for other backends
97
149
  this._backendReady = this._initBackendAsync(config);
@@ -143,6 +195,68 @@ export class HoloSphere {
143
195
  }
144
196
  }
145
197
 
198
+ /**
199
+ * Initialize GunDB backend asynchronously (for browser compatibility with dynamic import)
200
+ * @private
201
+ */
202
+ async _initGunDBAsync(config) {
203
+ try {
204
+ const gundbConfig = config.gundb || {};
205
+
206
+ // Create the full-featured GunDB backend
207
+ this._backend = new GunDBBackend({
208
+ appName: this.config.appName,
209
+ peers: gundbConfig.peers || [],
210
+ radisk: gundbConfig.radisk !== false,
211
+ localStorage: gundbConfig.localStorage !== false,
212
+ dataDir: config.dataDir,
213
+ privateKey: this.config.privateKey,
214
+ strict: gundbConfig.strict || false,
215
+ schemaCacheMaxAge: gundbConfig.schemaCacheMaxAge || 3600000,
216
+ });
217
+
218
+ // Initialize the backend
219
+ await this._backend.init();
220
+
221
+ // Set public key from backend
222
+ this.publicKey = this._backend.publicKey;
223
+
224
+ // Store Gun instance for direct access
225
+ this._gun = this._backend.gun;
226
+
227
+ // Create a client-like interface for compatibility
228
+ this.client = {
229
+ publicKey: this.publicKey,
230
+ gun: this._gun,
231
+ write: (path, data) => this._backend.write(path, data),
232
+ read: (path, options) => this._backend.read(path, options),
233
+ readAll: (path, options) => this._backend.readAll(path, options),
234
+ update: (path, updates) => this._backend.update(path, updates),
235
+ delete: (path) => this._backend.delete(path),
236
+ subscribe: (path, callback, options) => this._backend.subscribe(path, callback, options),
237
+ buildPath: gunWrapper.buildPath,
238
+ };
239
+
240
+ // Store Gun wrapper functions for direct access
241
+ this._gunWrapper = gunWrapper;
242
+
243
+ // Log startup information
244
+ this._logStartup({
245
+ version: pkg.version,
246
+ appName: this.config.appName,
247
+ backend: 'gundb',
248
+ peers: gundbConfig.peers || [],
249
+ publicKey: this.publicKey,
250
+ logLevel: this.config.logLevel,
251
+ persistence: gundbConfig.radisk !== false,
252
+ dataDir: config.dataDir,
253
+ });
254
+ } catch (error) {
255
+ this._log('ERROR', 'GunDB client initialization failed', { error: error.message });
256
+ throw new Error(`GunDB client initialization failed: ${error.message}`);
257
+ }
258
+ }
259
+
146
260
  /**
147
261
  * Initialize non-Nostr backends asynchronously
148
262
  * @private
@@ -270,4 +384,371 @@ export class HoloSphere {
270
384
  metrics() {
271
385
  return { ...this._metrics };
272
386
  }
387
+
388
+ // ============================================================================
389
+ // GUNDB-SPECIFIC METHODS
390
+ // These methods are only available when using the 'gundb' backend
391
+ // ============================================================================
392
+
393
+ /**
394
+ * Check if using GunDB backend
395
+ * @private
396
+ */
397
+ _requireGunDB() {
398
+ if (this.config.backend !== 'gundb') {
399
+ throw new Error('This method requires the GunDB backend');
400
+ }
401
+ if (!this._backend) {
402
+ throw new Error('Backend not initialized. Call ready() first.');
403
+ }
404
+ }
405
+
406
+ // ============================================================================
407
+ // GLOBAL TABLE OPERATIONS
408
+ // ============================================================================
409
+
410
+ /**
411
+ * Write data to a global table
412
+ * @param {string} tableName - Global table name (e.g., 'federation', 'schemas')
413
+ * @param {Object} data - Data to write (must have 'id' field)
414
+ * @returns {Promise<boolean>} Success indicator
415
+ */
416
+ async putGlobal(tableName, data) {
417
+ await this.ready();
418
+ this._requireGunDB();
419
+ return this._backend.writeGlobal(tableName, data);
420
+ }
421
+
422
+ /**
423
+ * Read data from a global table
424
+ * @param {string} tableName - Global table name
425
+ * @param {string} key - Data key
426
+ * @returns {Promise<Object|null>} Data or null if not found
427
+ */
428
+ async getGlobal(tableName, key) {
429
+ await this.ready();
430
+ this._requireGunDB();
431
+ return this._backend.readGlobal(tableName, key);
432
+ }
433
+
434
+ /**
435
+ * Read all data from a global table
436
+ * @param {string} tableName - Global table name
437
+ * @returns {Promise<Object[]>} Array of data objects
438
+ */
439
+ async getAllGlobal(tableName) {
440
+ await this.ready();
441
+ this._requireGunDB();
442
+ return this._backend.readAllGlobal(tableName);
443
+ }
444
+
445
+ /**
446
+ * Delete data from a global table
447
+ * @param {string} tableName - Global table name
448
+ * @param {string} key - Data key
449
+ * @returns {Promise<boolean>} Success indicator
450
+ */
451
+ async deleteGlobal(tableName, key) {
452
+ await this.ready();
453
+ this._requireGunDB();
454
+ return this._backend.deleteGlobal(tableName, key);
455
+ }
456
+
457
+ // ============================================================================
458
+ // REFERENCE OPERATIONS
459
+ // ============================================================================
460
+
461
+ /**
462
+ * Create a reference to data
463
+ * @param {string} holon - Holon ID
464
+ * @param {string} lens - Lens name
465
+ * @param {Object} data - Data object (must have 'id' field)
466
+ * @returns {Object} Reference object with id and soul
467
+ */
468
+ createReference(holon, lens, data) {
469
+ this._requireGunDB();
470
+ return this._backend.createReference(holon, lens, data);
471
+ }
472
+
473
+ /**
474
+ * Check if data is a reference
475
+ * @param {Object} data - Data to check
476
+ * @returns {boolean} True if data is a reference
477
+ */
478
+ isReference(data) {
479
+ this._requireGunDB();
480
+ return this._backend.isReference(data);
481
+ }
482
+
483
+ /**
484
+ * Resolve a reference to get actual data
485
+ * @param {Object} reference - Reference object
486
+ * @param {Object} options - Resolution options
487
+ * @returns {Promise<Object|null>} Resolved data or null
488
+ */
489
+ async resolveReference(reference, options = {}) {
490
+ await this.ready();
491
+ this._requireGunDB();
492
+ return this._backend.resolveReference(reference, options);
493
+ }
494
+
495
+ // ============================================================================
496
+ // AUTHENTICATION OPERATIONS
497
+ // ============================================================================
498
+
499
+ /**
500
+ * Authenticate for a holon
501
+ * @param {string} holonId - Holon ID
502
+ * @param {string} password - Password
503
+ * @returns {Promise<Object>} Authenticated user object
504
+ */
505
+ async authenticate(holonId, password) {
506
+ await this.ready();
507
+ this._requireGunDB();
508
+ return this._backend.authenticate(holonId, password);
509
+ }
510
+
511
+ /**
512
+ * Create a new user for a holon
513
+ * @param {string} holonId - Holon ID
514
+ * @param {string} password - Password
515
+ * @returns {Promise<Object>} Created user object
516
+ */
517
+ async createUser(holonId, password) {
518
+ await this.ready();
519
+ this._requireGunDB();
520
+ return this._backend.createUser(holonId, password);
521
+ }
522
+
523
+ /**
524
+ * Logout current user
525
+ */
526
+ logout() {
527
+ this._requireGunDB();
528
+ this._backend.logout();
529
+ }
530
+
531
+ /**
532
+ * Check if authenticated
533
+ * @returns {boolean} True if authenticated
534
+ */
535
+ isAuthenticated() {
536
+ this._requireGunDB();
537
+ return this._backend.isAuthenticated();
538
+ }
539
+
540
+ /**
541
+ * Write to private storage (requires authentication)
542
+ * @param {string} lens - Lens name
543
+ * @param {string} key - Data key
544
+ * @param {Object} data - Data to write
545
+ * @returns {Promise<boolean>} Success indicator
546
+ */
547
+ async writePrivate(lens, key, data) {
548
+ await this.ready();
549
+ this._requireGunDB();
550
+ return this._backend.writePrivate(lens, key, data);
551
+ }
552
+
553
+ /**
554
+ * Read from private storage (requires authentication)
555
+ * @param {string} lens - Lens name
556
+ * @param {string} key - Data key
557
+ * @returns {Promise<Object|null>} Data or null
558
+ */
559
+ async readPrivate(lens, key) {
560
+ await this.ready();
561
+ this._requireGunDB();
562
+ return this._backend.readPrivate(lens, key);
563
+ }
564
+
565
+ // ============================================================================
566
+ // SCHEMA OPERATIONS
567
+ // ============================================================================
568
+
569
+ /**
570
+ * Set a schema for a lens
571
+ * @param {string} lens - Lens name
572
+ * @param {Object} schema - JSON Schema definition
573
+ * @returns {Promise<boolean>} Success indicator
574
+ */
575
+ async setSchema(lens, schema) {
576
+ await this.ready();
577
+ this._requireGunDB();
578
+ return this._backend.setSchema(lens, schema);
579
+ }
580
+
581
+ /**
582
+ * Get a schema for a lens
583
+ * @param {string} lens - Lens name
584
+ * @returns {Promise<Object|null>} Schema or null
585
+ */
586
+ async getSchema(lens) {
587
+ await this.ready();
588
+ this._requireGunDB();
589
+ return this._backend.getSchema(lens);
590
+ }
591
+
592
+ /**
593
+ * Validate data against a lens schema
594
+ * @param {string} lens - Lens name
595
+ * @param {Object} data - Data to validate
596
+ * @returns {Promise<Object>} Validation result { valid: boolean, errors: Array }
597
+ */
598
+ async validateData(lens, data) {
599
+ await this.ready();
600
+ this._requireGunDB();
601
+ return this._backend.validateData(lens, data);
602
+ }
603
+
604
+ // ============================================================================
605
+ // FEDERATION OPERATIONS
606
+ // ============================================================================
607
+
608
+ /**
609
+ * Create a federation relationship between two spaces
610
+ * @param {string} spaceId1 - First space ID
611
+ * @param {string} spaceId2 - Second space ID
612
+ * @param {boolean} bidirectional - Whether to set up bidirectional notifications (default: true)
613
+ * @returns {Promise<boolean>} True if federation was created
614
+ */
615
+ async federate(spaceId1, spaceId2, bidirectional = true) {
616
+ await this.ready();
617
+ this._requireGunDB();
618
+ return gunFederation.federate(this._backend, spaceId1, spaceId2, bidirectional);
619
+ }
620
+
621
+ /**
622
+ * Remove a federation relationship
623
+ * @param {string} spaceId1 - First space ID
624
+ * @param {string} spaceId2 - Second space ID
625
+ * @returns {Promise<boolean>} True if federation was removed
626
+ */
627
+ async unfederate(spaceId1, spaceId2) {
628
+ await this.ready();
629
+ this._requireGunDB();
630
+ return gunFederation.unfederate(this._backend, spaceId1, spaceId2);
631
+ }
632
+
633
+ /**
634
+ * Get federation info for a space
635
+ * @param {string} spaceId - Space ID
636
+ * @returns {Promise<Object|null>} Federation info or null
637
+ */
638
+ async getFederation(spaceId) {
639
+ await this.ready();
640
+ this._requireGunDB();
641
+ return gunFederation.getFederation(this._backend, spaceId);
642
+ }
643
+
644
+ /**
645
+ * Reset all federation relationships for a space
646
+ * @param {string} spaceId - Space ID
647
+ * @param {Object} options - Reset options
648
+ * @returns {Promise<Object>} Result object
649
+ */
650
+ async resetFederation(spaceId, options = {}) {
651
+ await this.ready();
652
+ this._requireGunDB();
653
+ return gunFederation.resetFederation(this._backend, spaceId, options);
654
+ }
655
+
656
+ /**
657
+ * Propagate data to federated spaces
658
+ * @param {string} holon - Holon identifier
659
+ * @param {string} lens - Lens identifier
660
+ * @param {Object} data - Data to propagate
661
+ * @param {Object} options - Propagation options
662
+ * @returns {Promise<Object>} Result with success count and errors
663
+ */
664
+ async propagate(holon, lens, data, options = {}) {
665
+ await this.ready();
666
+ this._requireGunDB();
667
+ return gunFederation.propagate(this._backend, holon, lens, data, options);
668
+ }
669
+
670
+ /**
671
+ * Get combined data from local and federated sources
672
+ * @param {string} holon - Local holon name
673
+ * @param {string} lens - Lens to query
674
+ * @param {Object} options - Options for data retrieval and aggregation
675
+ * @returns {Promise<Array>} Combined array of local and federated data
676
+ */
677
+ async getFederated(holon, lens, options = {}) {
678
+ await this.ready();
679
+ this._requireGunDB();
680
+ return gunFederation.getFederated(this._backend, holon, lens, options);
681
+ }
682
+
683
+ /**
684
+ * Subscribe to federation notifications for a space
685
+ * @param {string} spaceId - Space ID to subscribe to
686
+ * @param {Function} callback - Callback to execute on notifications
687
+ * @param {Object} options - Subscription options
688
+ * @returns {Promise<Object>} Subscription object with unsubscribe() method
689
+ */
690
+ async subscribeFederation(spaceId, callback, options = {}) {
691
+ await this.ready();
692
+ this._requireGunDB();
693
+ return gunFederation.subscribeFederation(this._backend, spaceId, callback, options);
694
+ }
695
+
696
+ /**
697
+ * Track a federated message across different chats
698
+ * @param {string} originalChatId - Original chat ID
699
+ * @param {string} messageId - Original message ID
700
+ * @param {string} federatedChatId - Federated chat ID
701
+ * @param {string} federatedMessageId - Federated message ID
702
+ * @param {string} type - Message type
703
+ * @returns {Promise<void>}
704
+ */
705
+ async federateMessage(originalChatId, messageId, federatedChatId, federatedMessageId, type = 'generic') {
706
+ await this.ready();
707
+ this._requireGunDB();
708
+ return gunFederation.federateMessage(this._backend, originalChatId, messageId, federatedChatId, federatedMessageId, type);
709
+ }
710
+
711
+ /**
712
+ * Get all federated messages for a given original message
713
+ * @param {string} originalChatId - Original chat ID
714
+ * @param {string} messageId - Original message ID
715
+ * @returns {Promise<Object|null>} Tracking information for the message
716
+ */
717
+ async getFederatedMessages(originalChatId, messageId) {
718
+ await this.ready();
719
+ this._requireGunDB();
720
+ return gunFederation.getFederatedMessages(this._backend, originalChatId, messageId);
721
+ }
722
+
723
+ /**
724
+ * Update a federated message across all federated chats
725
+ * @param {string} originalChatId - Original chat ID
726
+ * @param {string} messageId - Original message ID
727
+ * @param {Function} updateCallback - Function to update the message in each chat
728
+ * @returns {Promise<void>}
729
+ */
730
+ async updateFederatedMessages(originalChatId, messageId, updateCallback) {
731
+ await this.ready();
732
+ this._requireGunDB();
733
+ return gunFederation.updateFederatedMessages(this._backend, originalChatId, messageId, updateCallback);
734
+ }
735
+
736
+ // ============================================================================
737
+ // LIFECYCLE
738
+ // ============================================================================
739
+
740
+ /**
741
+ * Closes the backend and cleans up resources.
742
+ * Should be called when done using the HoloSphere instance.
743
+ *
744
+ * @returns {void}
745
+ */
746
+ close() {
747
+ if (this._backend) {
748
+ this._backend.close();
749
+ }
750
+ if (this.client && typeof this.client.close === 'function') {
751
+ this.client.close();
752
+ }
753
+ }
273
754
  }