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.
- package/CHANGELOG.md +473 -0
- package/FEATURES.md +431 -0
- package/LICENSE +29 -42
- package/LICENSE-AGPL.md +180 -0
- package/README.md +97 -16
- package/dist/2019-D2OG2idw.js +6680 -0
- package/dist/2019-D2OG2idw.js.map +1 -0
- package/dist/2019-EION3wKo.cjs +8 -0
- package/dist/2019-EION3wKo.cjs.map +1 -0
- package/dist/_commonjsHelpers-C37NGDzP.cjs +2 -0
- package/dist/_commonjsHelpers-C37NGDzP.cjs.map +1 -0
- package/dist/_commonjsHelpers-CUmg6egw.js +7 -0
- package/dist/_commonjsHelpers-CUmg6egw.js.map +1 -0
- package/dist/browser-BSniCNqO.js +3058 -0
- package/dist/browser-BSniCNqO.js.map +1 -0
- package/dist/browser-Cq59Ij19.cjs +2 -0
- package/dist/browser-Cq59Ij19.cjs.map +1 -0
- package/dist/cdn/holosphere.min.js +55 -0
- package/dist/cdn/holosphere.min.js.map +1 -0
- package/dist/cjs/holosphere.cjs +2 -0
- package/dist/cjs/holosphere.cjs.map +1 -0
- package/dist/esm/holosphere.js +53 -0
- package/dist/esm/holosphere.js.map +1 -0
- package/dist/index-DDGt_V9o.cjs +12 -0
- package/dist/index-DDGt_V9o.cjs.map +1 -0
- package/dist/index-DJXftyvB.js +39841 -0
- package/dist/index-DJXftyvB.js.map +1 -0
- package/dist/index-DMbdcMtK.cjs +18 -0
- package/dist/index-DMbdcMtK.cjs.map +1 -0
- package/dist/index-DeZ1xz_s.js +15104 -0
- package/dist/index-DeZ1xz_s.js.map +1 -0
- package/dist/indexeddb-storage-BFt6hMeF.js +176 -0
- package/dist/indexeddb-storage-BFt6hMeF.js.map +1 -0
- package/dist/indexeddb-storage-BK5tv4Sh.cjs +2 -0
- package/dist/indexeddb-storage-BK5tv4Sh.cjs.map +1 -0
- package/dist/memory-storage-C9HuoL2E.js +91 -0
- package/dist/memory-storage-C9HuoL2E.js.map +1 -0
- package/dist/memory-storage-Dao7jfYG.cjs +2 -0
- package/dist/memory-storage-Dao7jfYG.cjs.map +1 -0
- package/dist/secp256k1-BbKzbLtD.cjs +12 -0
- package/dist/secp256k1-BbKzbLtD.cjs.map +1 -0
- package/dist/secp256k1-CreY7Pcl.js +1890 -0
- package/dist/secp256k1-CreY7Pcl.js.map +1 -0
- package/docs/CONTRACTS.md +797 -0
- package/docs/FOSDEM_PROPOSAL.md +388 -0
- package/docs/LOCALFIRST.md +266 -0
- package/docs/api/ai_aggregation.js.html +333 -0
- package/docs/api/ai_breakdown.js.html +524 -0
- package/docs/api/ai_classifier.js.html +231 -0
- package/docs/api/ai_council.js.html +246 -0
- package/docs/api/ai_embeddings.js.html +304 -0
- package/docs/api/ai_federation-ai.js.html +338 -0
- package/docs/api/ai_h3-ai.js.html +970 -0
- package/docs/api/ai_index.js.html +124 -0
- package/docs/api/ai_json-ops.js.html +241 -0
- package/docs/api/ai_llm-service.js.html +239 -0
- package/docs/api/ai_nl-query.js.html +236 -0
- package/docs/api/ai_relationships.js.html +367 -0
- package/docs/api/ai_schema-extractor.js.html +235 -0
- package/docs/api/ai_spatial.js.html +307 -0
- package/docs/api/ai_tts.js.html +214 -0
- package/docs/api/content_social-protocols.js.html +180 -0
- package/docs/api/core_holosphere.js.html +757 -0
- package/docs/api/crypto_nostr-utils.js.html +306 -0
- package/docs/api/crypto_secp256k1.js.html +267 -0
- package/docs/api/data/search.json +1 -0
- package/docs/api/federation_discovery.js.html +337 -0
- package/docs/api/federation_handshake.js.html +478 -0
- package/docs/api/federation_hologram.js.html +1053 -0
- package/docs/api/federation_registry.js.html +389 -0
- package/docs/api/fonts/Inconsolata-Regular.ttf +0 -0
- package/docs/api/fonts/OpenSans-Regular.ttf +0 -0
- package/docs/api/fonts/WorkSans-Bold.ttf +0 -0
- package/docs/api/global.html +3 -0
- package/docs/api/hierarchical_upcast.js.html +128 -0
- package/docs/api/index.html +265 -0
- package/docs/api/index.js.html +1868 -0
- package/docs/api/lib_ai-methods.js.html +660 -0
- package/docs/api/lib_contract-methods.js.html +445 -0
- package/docs/api/lib_errors.js.html +56 -0
- package/docs/api/lib_federation-methods.js.html +348 -0
- package/docs/api/lib_index.js.html +33 -0
- package/docs/api/module-ai.html +5 -0
- package/docs/api/module-ai_aggregation-SmartAggregation.html +6 -0
- package/docs/api/module-ai_aggregation.SmartAggregation.html +3 -0
- package/docs/api/module-ai_aggregation.html +3 -0
- package/docs/api/module-ai_breakdown-TaskBreakdown.html +5 -0
- package/docs/api/module-ai_breakdown.TaskBreakdown.html +3 -0
- package/docs/api/module-ai_breakdown.html +3 -0
- package/docs/api/module-ai_classifier-Classifier.html +6 -0
- package/docs/api/module-ai_classifier.Classifier.html +3 -0
- package/docs/api/module-ai_classifier.html +3 -0
- package/docs/api/module-ai_council-Council.html +6 -0
- package/docs/api/module-ai_council.Council.html +3 -0
- package/docs/api/module-ai_council.html +3 -0
- package/docs/api/module-ai_embeddings-Embeddings.html +5 -0
- package/docs/api/module-ai_embeddings.Embeddings.html +3 -0
- package/docs/api/module-ai_embeddings.html +3 -0
- package/docs/api/module-ai_federation-ai-FederationAdvisor.html +6 -0
- package/docs/api/module-ai_federation-ai.FederationAdvisor.html +3 -0
- package/docs/api/module-ai_federation-ai.html +3 -0
- package/docs/api/module-ai_h3-ai-H3AI.html +6 -0
- package/docs/api/module-ai_h3-ai.H3AI.html +3 -0
- package/docs/api/module-ai_h3-ai.html +3 -0
- package/docs/api/module-ai_json-ops-JSONOps.html +5 -0
- package/docs/api/module-ai_json-ops.JSONOps.html +3 -0
- package/docs/api/module-ai_json-ops.html +3 -0
- package/docs/api/module-ai_llm-service-LLMService.html +5 -0
- package/docs/api/module-ai_llm-service.LLMService.html +3 -0
- package/docs/api/module-ai_llm-service.html +3 -0
- package/docs/api/module-ai_nl-query-NLQuery.html +5 -0
- package/docs/api/module-ai_nl-query.NLQuery.html +3 -0
- package/docs/api/module-ai_nl-query.html +3 -0
- package/docs/api/module-ai_relationships-RelationshipDiscovery.html +6 -0
- package/docs/api/module-ai_relationships.RelationshipDiscovery.html +3 -0
- package/docs/api/module-ai_relationships.html +3 -0
- package/docs/api/module-ai_schema-extractor-SchemaExtractor.html +5 -0
- package/docs/api/module-ai_schema-extractor.SchemaExtractor.html +3 -0
- package/docs/api/module-ai_schema-extractor.html +3 -0
- package/docs/api/module-ai_spatial-SpatialAnalysis.html +6 -0
- package/docs/api/module-ai_spatial.SpatialAnalysis.html +3 -0
- package/docs/api/module-ai_spatial.html +3 -0
- package/docs/api/module-ai_tts-TTS.html +5 -0
- package/docs/api/module-ai_tts.TTS.html +3 -0
- package/docs/api/module-ai_tts.html +3 -0
- package/docs/api/module-content_social-protocols.html +3 -0
- package/docs/api/module-core_holosphere-HoloSphere.html +6 -0
- package/docs/api/module-core_holosphere.HoloSphere.html +3 -0
- package/docs/api/module-core_holosphere.html +3 -0
- package/docs/api/module-crypto_nostr-utils.html +3 -0
- package/docs/api/module-crypto_secp256k1.html +3 -0
- package/docs/api/module-federation_hologram.html +3 -0
- package/docs/api/module-hierarchical_upcast.html +3 -0
- package/docs/api/module-holosphere-HoloSphereBase.html +3 -0
- package/docs/api/module-holosphere.html +3 -0
- package/docs/api/module-lib_ai-methods.html +3 -0
- package/docs/api/module-lib_contract-methods.html +3 -0
- package/docs/api/module-lib_errors-AuthorizationError.html +3 -0
- package/docs/api/module-lib_errors-ValidationError.html +3 -0
- package/docs/api/module-lib_errors.AuthorizationError.html +3 -0
- package/docs/api/module-lib_errors.ValidationError.html +3 -0
- package/docs/api/module-lib_errors.html +3 -0
- package/docs/api/module-lib_federation-methods.html +3 -0
- package/docs/api/module-lib_index.html +3 -0
- package/docs/api/module-schema_validator-ValidationError.html +3 -0
- package/docs/api/module-schema_validator.ValidationError.html +3 -0
- package/docs/api/module-schema_validator.html +3 -0
- package/docs/api/module-spatial_h3-operations.html +4 -0
- package/docs/api/module-storage_backend-factory.BackendFactory.html +3 -0
- package/docs/api/module-storage_backend-factory.html +3 -0
- package/docs/api/module-storage_backend-interface-StorageBackend.html +3 -0
- package/docs/api/module-storage_backend-interface.StorageBackend.html +3 -0
- package/docs/api/module-storage_backend-interface.html +3 -0
- package/docs/api/module-storage_backends_activitypub-backend-ActivityPubBackend.html +7 -0
- package/docs/api/module-storage_backends_activitypub-backend.ActivityPubBackend.html +3 -0
- package/docs/api/module-storage_backends_activitypub-backend.html +3 -0
- package/docs/api/module-storage_backends_activitypub_server-ActivityPubServer.html +8 -0
- package/docs/api/module-storage_backends_activitypub_server.ActivityPubServer.html +3 -0
- package/docs/api/module-storage_backends_activitypub_server.html +3 -0
- package/docs/api/module-storage_backends_gundb-backend-GunDBBackend.html +7 -0
- package/docs/api/module-storage_backends_gundb-backend.GunDBBackend.html +3 -0
- package/docs/api/module-storage_backends_gundb-backend.html +3 -0
- package/docs/api/module-storage_backends_nostr-backend-NostrBackend.html +8 -0
- package/docs/api/module-storage_backends_nostr-backend.NostrBackend.html +3 -0
- package/docs/api/module-storage_backends_nostr-backend.html +3 -0
- package/docs/api/module-storage_filesystem-storage-FileSystemStorage.html +5 -0
- package/docs/api/module-storage_filesystem-storage-browser-FileSystemStorage.html +3 -0
- package/docs/api/module-storage_filesystem-storage-browser.FileSystemStorage.html +3 -0
- package/docs/api/module-storage_filesystem-storage-browser.html +3 -0
- package/docs/api/module-storage_filesystem-storage.FileSystemStorage.html +3 -0
- package/docs/api/module-storage_filesystem-storage.html +3 -0
- package/docs/api/module-storage_global-tables.html +3 -0
- package/docs/api/module-storage_gun-async.html +3 -0
- package/docs/api/module-storage_gun-auth-GunAuth.html +5 -0
- package/docs/api/module-storage_gun-auth.GunAuth.html +3 -0
- package/docs/api/module-storage_gun-auth.html +3 -0
- package/docs/api/module-storage_gun-federation.html +3 -0
- package/docs/api/module-storage_gun-references-GunReferenceHandler.html +5 -0
- package/docs/api/module-storage_gun-references.GunReferenceHandler.html +3 -0
- package/docs/api/module-storage_gun-references.html +3 -0
- package/docs/api/module-storage_gun-schema-GunSchemaValidator.html +5 -0
- package/docs/api/module-storage_gun-schema.GunSchemaValidator.html +3 -0
- package/docs/api/module-storage_gun-schema.html +3 -0
- package/docs/api/module-storage_gun-wrapper.html +11 -0
- package/docs/api/module-storage_indexeddb-storage-IndexedDBStorage.html +5 -0
- package/docs/api/module-storage_indexeddb-storage.IndexedDBStorage.html +3 -0
- package/docs/api/module-storage_indexeddb-storage.html +3 -0
- package/docs/api/module-storage_key-storage-simple.html +3 -0
- package/docs/api/module-storage_key-storage.html +4 -0
- package/docs/api/module-storage_memory-storage-MemoryStorage.html +5 -0
- package/docs/api/module-storage_memory-storage.MemoryStorage.html +3 -0
- package/docs/api/module-storage_memory-storage.html +3 -0
- package/docs/api/module-storage_migration-MigrationTool.html +6 -0
- package/docs/api/module-storage_migration.MigrationTool.html +3 -0
- package/docs/api/module-storage_migration.html +3 -0
- package/docs/api/module-storage_nostr-async.html +18 -0
- package/docs/api/module-storage_nostr-client-LRUCache.html +3 -0
- package/docs/api/module-storage_nostr-client-NostrClient.html +7 -0
- package/docs/api/module-storage_nostr-client.NostrClient.html +15 -0
- package/docs/api/module-storage_nostr-client.html +6 -0
- package/docs/api/module-storage_nostr-wrapper.html +3 -0
- package/docs/api/module-storage_outbox-queue-OutboxQueue.html +4 -0
- package/docs/api/module-storage_outbox-queue.OutboxQueue.html +3 -0
- package/docs/api/module-storage_outbox-queue.html +3 -0
- package/docs/api/module-storage_persistent-storage-PersistentStorage.html +3 -0
- package/docs/api/module-storage_persistent-storage.html +4 -0
- package/docs/api/module-storage_sync-service-SyncService.html +5 -0
- package/docs/api/module-storage_sync-service.SyncService.html +3 -0
- package/docs/api/module-storage_sync-service.html +3 -0
- package/docs/api/module-storage_unified-storage.html +3 -0
- package/docs/api/module-subscriptions_manager.SubscriptionRegistry.html +3 -0
- package/docs/api/module-subscriptions_manager.html +3 -0
- package/docs/api/schema_validator.js.html +113 -0
- package/docs/api/scripts/core.js +726 -0
- package/docs/api/scripts/core.min.js +23 -0
- package/docs/api/scripts/resize.js +90 -0
- package/docs/api/scripts/search.js +265 -0
- package/docs/api/scripts/search.min.js +6 -0
- package/docs/api/scripts/third-party/Apache-License-2.0.txt +202 -0
- package/docs/api/scripts/third-party/fuse.js +9 -0
- package/docs/api/scripts/third-party/hljs-line-num-original.js +369 -0
- package/docs/api/scripts/third-party/hljs-line-num.js +1 -0
- package/docs/api/scripts/third-party/hljs-original.js +5171 -0
- package/docs/api/scripts/third-party/hljs.js +1 -0
- package/docs/api/scripts/third-party/popper.js +5 -0
- package/docs/api/scripts/third-party/tippy.js +1 -0
- package/docs/api/scripts/third-party/tocbot.js +672 -0
- package/docs/api/scripts/third-party/tocbot.min.js +1 -0
- package/docs/api/spatial_h3-operations.js.html +129 -0
- package/docs/api/storage_backend-factory.js.html +133 -0
- package/docs/api/storage_backend-interface.js.html +164 -0
- package/docs/api/storage_backends_activitypub-backend.js.html +298 -0
- package/docs/api/storage_backends_activitypub_server.js.html +678 -0
- package/docs/api/storage_backends_gundb-backend.js.html +878 -0
- package/docs/api/storage_backends_nostr-backend.js.html +254 -0
- package/docs/api/storage_filesystem-storage-browser.js.html +83 -0
- package/docs/api/storage_filesystem-storage.js.html +207 -0
- package/docs/api/storage_global-tables.js.html +116 -0
- package/docs/api/storage_gun-async.js.html +344 -0
- package/docs/api/storage_gun-auth.js.html +376 -0
- package/docs/api/storage_gun-federation.js.html +788 -0
- package/docs/api/storage_gun-references.js.html +212 -0
- package/docs/api/storage_gun-schema.js.html +309 -0
- package/docs/api/storage_gun-wrapper.js.html +645 -0
- package/docs/api/storage_indexeddb-storage.js.html +224 -0
- package/docs/api/storage_key-storage-simple.js.html +102 -0
- package/docs/api/storage_key-storage.js.html +171 -0
- package/docs/api/storage_memory-storage.js.html +128 -0
- package/docs/api/storage_migration.js.html +354 -0
- package/docs/api/storage_nostr-async.js.html +1076 -0
- package/docs/api/storage_nostr-client.js.html +1598 -0
- package/docs/api/storage_nostr-wrapper.js.html +218 -0
- package/docs/api/storage_outbox-queue.js.html +248 -0
- package/docs/api/storage_persistent-storage.js.html +160 -0
- package/docs/api/storage_sync-service.js.html +201 -0
- package/docs/api/storage_unified-storage.js.html +157 -0
- package/docs/api/styles/clean-jsdoc-theme-base.css +1159 -0
- package/docs/api/styles/clean-jsdoc-theme-dark.css +412 -0
- package/docs/api/styles/clean-jsdoc-theme-light.css +482 -0
- package/docs/api/styles/clean-jsdoc-theme-scrollbar.css +30 -0
- package/docs/api/styles/clean-jsdoc-theme-without-scrollbar.min.css +1 -0
- package/docs/api/styles/clean-jsdoc-theme.min.css +1 -0
- package/docs/api/subscriptions_manager.js.html +162 -0
- package/docs/contracts/api-interface.md +793 -0
- package/docs/data-model.md +476 -0
- package/docs/gun-async-usage.md +338 -0
- package/docs/plan.md +349 -0
- package/docs/quickstart.md +674 -0
- package/docs/research.md +362 -0
- package/docs/spec.md +244 -0
- package/docs/storage-backends.md +326 -0
- package/docs/tasks.md +947 -0
- package/examples/demo.html +47 -0
- package/examples/holosphere-widget.js +1242 -0
- package/examples/widget-demo.html +274 -0
- package/examples/widget.html +703 -0
- package/jsdoc.json +26 -0
- package/package.json +25 -7
- package/src/ai/aggregation.js +13 -2
- package/src/ai/breakdown.js +12 -2
- package/src/ai/classifier.js +14 -3
- package/src/ai/council.js +22 -7
- package/src/ai/embeddings.js +37 -15
- package/src/ai/federation-ai.js +13 -2
- package/src/ai/h3-ai.js +14 -2
- package/src/ai/index.js +16 -7
- package/src/ai/json-ops.js +18 -5
- package/src/ai/llm-service.js +62 -31
- package/src/ai/nl-query.js +12 -2
- package/src/ai/relationships.js +13 -2
- package/src/ai/schema-extractor.js +24 -10
- package/src/ai/spatial.js +13 -2
- package/src/ai/tts.js +25 -8
- package/src/cdn-entry.js +22 -0
- package/src/content/social-protocols.js +34 -25
- package/src/contracts/abis/Appreciative.json +1280 -0
- package/src/contracts/abis/AppreciativeFactory.json +101 -0
- package/src/contracts/abis/Bundle.json +1438 -0
- package/src/contracts/abis/BundleFactory.json +106 -0
- package/src/contracts/abis/Holon.json +881 -0
- package/src/contracts/abis/Holons.json +330 -0
- package/src/contracts/abis/Managed.json +1262 -0
- package/src/contracts/abis/ManagedFactory.json +149 -0
- package/src/contracts/abis/Membrane.json +261 -0
- package/src/contracts/abis/Splitter.json +1624 -0
- package/src/contracts/abis/SplitterFactory.json +220 -0
- package/src/contracts/abis/TestToken.json +321 -0
- package/src/contracts/abis/Zoned.json +1461 -0
- package/src/contracts/abis/ZonedFactory.json +154 -0
- package/src/contracts/chain-manager.js +403 -0
- package/src/contracts/deployer.js +500 -0
- package/src/contracts/event-listener.js +539 -0
- package/src/contracts/holon-contracts.js +359 -0
- package/src/contracts/index.js +82 -0
- package/src/contracts/networks.js +229 -0
- package/src/contracts/operations.js +687 -0
- package/src/contracts/queries.js +638 -0
- package/src/core/holosphere.js +487 -6
- package/src/crypto/nostr-utils.js +303 -0
- package/src/crypto/secp256k1.js +7 -2
- package/src/federation/handshake.js +475 -0
- package/src/federation/hologram.js +117 -3
- package/src/hierarchical/upcast.js +40 -25
- package/src/index.js +1501 -1909
- package/src/lib/ai-methods.js +657 -0
- package/src/lib/contract-methods.js +442 -0
- package/src/lib/errors.js +53 -0
- package/src/lib/federation-methods.js +345 -0
- package/src/lib/index.js +30 -0
- package/src/schema/validator.js +22 -3
- package/src/spatial/h3-operations.js +19 -3
- package/src/storage/backend-factory.js +7 -2
- package/src/storage/backend-interface.js +21 -2
- package/src/storage/backends/activitypub/server.js +25 -3
- package/src/storage/backends/activitypub-backend.js +25 -2
- package/src/storage/backends/gundb-backend.js +692 -50
- package/src/storage/backends/nostr-backend.js +116 -1
- package/src/storage/filesystem-storage-browser.js +42 -2
- package/src/storage/filesystem-storage.js +72 -5
- package/src/storage/global-tables.js +35 -3
- package/src/storage/gun-async.js +75 -15
- package/src/storage/gun-auth.js +373 -0
- package/src/storage/gun-federation.js +785 -0
- package/src/storage/gun-references.js +209 -0
- package/src/storage/gun-schema.js +306 -0
- package/src/storage/gun-wrapper.js +475 -54
- package/src/storage/indexeddb-storage.js +112 -13
- package/src/storage/key-storage-simple.js +32 -9
- package/src/storage/key-storage.js +45 -13
- package/src/storage/memory-storage.js +68 -2
- package/src/storage/migration.js +20 -7
- package/src/storage/nostr-async.js +412 -122
- package/src/storage/nostr-client.js +749 -76
- package/src/storage/nostr-wrapper.js +6 -2
- package/src/storage/outbox-queue.js +55 -18
- package/src/storage/persistent-storage.js +62 -14
- package/src/storage/sync-service.js +51 -17
- package/src/storage/unified-storage.js +154 -0
- package/src/subscriptions/manager.js +34 -17
- package/types/index.d.ts +133 -0
- package/vite.config.cdn.js +60 -0
- package/tests/unit/ai/aggregation.test.js +0 -295
- package/tests/unit/ai/breakdown.test.js +0 -446
- package/tests/unit/ai/classifier.test.js +0 -294
- package/tests/unit/ai/council.test.js +0 -262
- package/tests/unit/ai/embeddings.test.js +0 -384
- package/tests/unit/ai/federation-ai.test.js +0 -344
- package/tests/unit/ai/h3-ai.test.js +0 -458
- package/tests/unit/ai/index.test.js +0 -304
- package/tests/unit/ai/json-ops.test.js +0 -307
- package/tests/unit/ai/llm-service.test.js +0 -390
- package/tests/unit/ai/nl-query.test.js +0 -383
- package/tests/unit/ai/relationships.test.js +0 -311
- package/tests/unit/ai/schema-extractor.test.js +0 -384
- package/tests/unit/ai/spatial.test.js +0 -279
- package/tests/unit/ai/tts.test.js +0 -279
- package/tests/unit/content.test.js +0 -332
- package/tests/unit/contract/core.test.js +0 -88
- package/tests/unit/contract/crypto.test.js +0 -198
- package/tests/unit/contract/data.test.js +0 -223
- package/tests/unit/contract/federation.test.js +0 -181
- package/tests/unit/contract/hierarchical.test.js +0 -113
- package/tests/unit/contract/schema.test.js +0 -114
- package/tests/unit/contract/social.test.js +0 -217
- package/tests/unit/contract/spatial.test.js +0 -110
- package/tests/unit/contract/subscriptions.test.js +0 -128
- package/tests/unit/contract/utils.test.js +0 -159
- package/tests/unit/core.test.js +0 -152
- package/tests/unit/crypto.test.js +0 -328
- package/tests/unit/federation.test.js +0 -234
- package/tests/unit/gun-async.test.js +0 -252
- package/tests/unit/hierarchical.test.js +0 -399
- package/tests/unit/integration/scenario-01-geographic-storage.test.js +0 -74
- package/tests/unit/integration/scenario-02-federation.test.js +0 -76
- package/tests/unit/integration/scenario-03-subscriptions.test.js +0 -102
- package/tests/unit/integration/scenario-04-validation.test.js +0 -129
- package/tests/unit/integration/scenario-05-hierarchy.test.js +0 -125
- package/tests/unit/integration/scenario-06-social.test.js +0 -135
- package/tests/unit/integration/scenario-07-persistence.test.js +0 -130
- package/tests/unit/integration/scenario-08-authorization.test.js +0 -161
- package/tests/unit/integration/scenario-09-cross-dimensional.test.js +0 -139
- package/tests/unit/integration/scenario-10-cross-holosphere-capabilities.test.js +0 -357
- package/tests/unit/integration/scenario-11-cross-holosphere-federation.test.js +0 -410
- package/tests/unit/integration/scenario-12-capability-federated-read.test.js +0 -719
- package/tests/unit/performance/benchmark.test.js +0 -85
- package/tests/unit/schema.test.js +0 -213
- package/tests/unit/spatial.test.js +0 -158
- package/tests/unit/storage.test.js +0 -195
- package/tests/unit/subscriptions.test.js +0 -328
- package/tests/unit/test-data-permanence-debug.js +0 -197
- package/tests/unit/test-data-permanence.js +0 -340
- package/tests/unit/test-key-persistence-fixed.js +0 -148
- package/tests/unit/test-key-persistence.js +0 -172
- package/tests/unit/test-relay-permanence.js +0 -376
- package/tests/unit/test-second-node.js +0 -95
- package/tests/unit/test-simple-write.js +0 -89
- /package/{cleanup-test-data.js → scripts/cleanup-test-data.js} +0 -0
- /package/{test-ai-real-api.js → scripts/test-ai-real-api.js} +0 -0
|
@@ -0,0 +1,345 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Federation methods mixin for cross-HoloSphere federation and Nostr discovery.
|
|
3
|
+
* Provides federated data access, capability-based authorization, and federation request protocols
|
|
4
|
+
* for connecting multiple HoloSphere instances.
|
|
5
|
+
* @module lib/federation-methods
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import * as registry from '../federation/registry.js';
|
|
9
|
+
import * as discovery from '../federation/discovery.js';
|
|
10
|
+
import * as federation from '../federation/hologram.js';
|
|
11
|
+
import * as storage from '../storage/unified-storage.js';
|
|
12
|
+
import * as nostrAsync from '../storage/nostr-async.js';
|
|
13
|
+
import * as crypto from '../crypto/secp256k1.js';
|
|
14
|
+
import { ValidationError, AuthorizationError } from './errors.js';
|
|
15
|
+
import { sha256 } from '@noble/hashes/sha256';
|
|
16
|
+
import { bytesToHex } from '@noble/hashes/utils';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Mixin that adds federation methods to a HoloSphere class.
|
|
20
|
+
* Enables cross-HoloSphere federation with capability-based access control,
|
|
21
|
+
* hologram creation, and Nostr-based discovery protocols.
|
|
22
|
+
* @param {Class} Base - Base class to extend
|
|
23
|
+
* @returns {Class} Extended class with federation methods
|
|
24
|
+
*/
|
|
25
|
+
export function withFederationMethods(Base) {
|
|
26
|
+
return class extends Base {
|
|
27
|
+
// === Cross-Holosphere Federation ===
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Add a federated HoloSphere partner by public key.
|
|
31
|
+
* @param {string} pubKey - Public key (hex) of the federated HoloSphere
|
|
32
|
+
* @param {Object} [options={}] - Federation options (metadata, capabilities, etc.)
|
|
33
|
+
* @returns {Promise<Object>} Federation registration result
|
|
34
|
+
* @throws {ValidationError} If pubKey is invalid
|
|
35
|
+
*/
|
|
36
|
+
async addFederatedHolosphere(pubKey, options = {}) {
|
|
37
|
+
if (!pubKey || typeof pubKey !== 'string') {
|
|
38
|
+
throw new ValidationError('pubKey must be a valid public key string');
|
|
39
|
+
}
|
|
40
|
+
return registry.addFederatedPartner(
|
|
41
|
+
this.client,
|
|
42
|
+
this.config.appName,
|
|
43
|
+
pubKey,
|
|
44
|
+
options
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Remove a federated HoloSphere partner.
|
|
50
|
+
* @param {string} pubKey - Public key of the partner to remove
|
|
51
|
+
* @returns {Promise<void>}
|
|
52
|
+
*/
|
|
53
|
+
async removeFederatedHolosphere(pubKey) {
|
|
54
|
+
return registry.removeFederatedPartner(
|
|
55
|
+
this.client,
|
|
56
|
+
this.config.appName,
|
|
57
|
+
pubKey
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Get all federated HoloSphere public keys.
|
|
63
|
+
* @returns {Promise<string[]>} Array of federated public keys
|
|
64
|
+
*/
|
|
65
|
+
async getFederatedHolospheres() {
|
|
66
|
+
return registry.getFederatedAuthors(
|
|
67
|
+
this.client,
|
|
68
|
+
this.config.appName
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Get the complete federation registry.
|
|
74
|
+
* @returns {Promise<Object>} Federation registry with all partners and capabilities
|
|
75
|
+
*/
|
|
76
|
+
async getFederationRegistry() {
|
|
77
|
+
return registry.getFederationRegistry(
|
|
78
|
+
this.client,
|
|
79
|
+
this.config.appName
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Store an inbound capability token from a federated partner.
|
|
85
|
+
* @param {string} partnerPubKey - Partner's public key
|
|
86
|
+
* @param {Object} capabilityInfo - Capability token and metadata
|
|
87
|
+
* @returns {Promise<void>}
|
|
88
|
+
*/
|
|
89
|
+
async storeInboundCapability(partnerPubKey, capabilityInfo) {
|
|
90
|
+
return registry.storeInboundCapability(
|
|
91
|
+
this.client,
|
|
92
|
+
this.config.appName,
|
|
93
|
+
partnerPubKey,
|
|
94
|
+
capabilityInfo
|
|
95
|
+
);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Read data from a federated source with capability verification.
|
|
100
|
+
* @param {string} sourcePubKey - Source HoloSphere public key
|
|
101
|
+
* @param {string} holonId - Holon ID to read from
|
|
102
|
+
* @param {string} lensName - Lens name to read from
|
|
103
|
+
* @param {string|null} [dataId=null] - Optional specific data ID (null for all)
|
|
104
|
+
* @returns {Promise<Object|Object[]>} Data from federated source
|
|
105
|
+
* @throws {AuthorizationError} If capability verification fails
|
|
106
|
+
*/
|
|
107
|
+
async readFromFederatedSource(sourcePubKey, holonId, lensName, dataId = null) {
|
|
108
|
+
const capabilityEntry = await registry.getCapabilityForAuthor(
|
|
109
|
+
this.client,
|
|
110
|
+
this.config.appName,
|
|
111
|
+
sourcePubKey,
|
|
112
|
+
{ holonId, lensName, dataId }
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
if (!capabilityEntry) {
|
|
116
|
+
throw new AuthorizationError('No valid capability for federated source', 'read');
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const isValid = await this.verifyCapability(
|
|
120
|
+
capabilityEntry.token,
|
|
121
|
+
'read',
|
|
122
|
+
{ holonId, lensName, dataId }
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
if (!isValid) {
|
|
126
|
+
throw new AuthorizationError('Capability verification failed', 'read');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
if (dataId) {
|
|
130
|
+
const path = storage.buildPath(this.config.appName, holonId, lensName, dataId);
|
|
131
|
+
return nostrAsync.nostrGet(this.client, path, 30000, {
|
|
132
|
+
authors: [sourcePubKey],
|
|
133
|
+
includeAuthor: true,
|
|
134
|
+
});
|
|
135
|
+
} else {
|
|
136
|
+
const path = storage.buildPath(this.config.appName, holonId, lensName);
|
|
137
|
+
return nostrAsync.nostrGetAll(this.client, path, 30000, {
|
|
138
|
+
authors: [sourcePubKey],
|
|
139
|
+
includeAuthor: true,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Create a cross-HoloSphere hologram reference.
|
|
146
|
+
* Links data from another HoloSphere into this one using capability-based access.
|
|
147
|
+
* @param {string} sourcePubKey - Source HoloSphere public key
|
|
148
|
+
* @param {string} sourceHolon - Source holon ID
|
|
149
|
+
* @param {string} lensName - Lens name
|
|
150
|
+
* @param {string} dataId - Data ID
|
|
151
|
+
* @param {string} targetHolon - Target holon in this HoloSphere
|
|
152
|
+
* @param {Object} [options={}] - Hologram options
|
|
153
|
+
* @param {boolean} [options.embedCapability=true] - Embed capability in hologram
|
|
154
|
+
* @returns {Promise<Object>} Created hologram
|
|
155
|
+
* @throws {AuthorizationError} If no valid capability exists
|
|
156
|
+
*/
|
|
157
|
+
async createCrossHolosphereHologram(sourcePubKey, sourceHolon, lensName, dataId, targetHolon, options = {}) {
|
|
158
|
+
const { embedCapability = true } = options;
|
|
159
|
+
|
|
160
|
+
const capabilityEntry = await registry.getCapabilityForAuthor(
|
|
161
|
+
this.client,
|
|
162
|
+
this.config.appName,
|
|
163
|
+
sourcePubKey,
|
|
164
|
+
{ holonId: sourceHolon, lensName, dataId }
|
|
165
|
+
);
|
|
166
|
+
|
|
167
|
+
if (!capabilityEntry) {
|
|
168
|
+
throw new AuthorizationError('No valid capability for cross-holosphere hologram', 'read');
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const hologram = federation.createHologram(
|
|
172
|
+
sourceHolon,
|
|
173
|
+
targetHolon,
|
|
174
|
+
lensName,
|
|
175
|
+
dataId,
|
|
176
|
+
this.config.appName,
|
|
177
|
+
{
|
|
178
|
+
authorPubKey: sourcePubKey,
|
|
179
|
+
capability: embedCapability ? capabilityEntry.token : null,
|
|
180
|
+
}
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
const targetPath = storage.buildPath(this.config.appName, targetHolon, lensName, dataId);
|
|
184
|
+
await storage.write(this.client, targetPath, hologram);
|
|
185
|
+
|
|
186
|
+
return hologram;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* Issue a capability token for federated access.
|
|
191
|
+
* Grants another HoloSphere permission to access data with specified scope.
|
|
192
|
+
* @param {string} targetPubKey - Target HoloSphere public key to grant access to
|
|
193
|
+
* @param {Object} scope - Access scope (holonId, lensName, dataId patterns)
|
|
194
|
+
* @param {string[]} permissions - Array of permissions ('read', 'write', etc.)
|
|
195
|
+
* @param {Object} [options={}] - Capability options
|
|
196
|
+
* @param {number} [options.expiresIn=3600000] - Expiration time in milliseconds
|
|
197
|
+
* @param {boolean} [options.trackInRegistry=true] - Store in federation registry
|
|
198
|
+
* @returns {Promise<string>} Capability token
|
|
199
|
+
*/
|
|
200
|
+
async issueCapabilityForFederation(targetPubKey, scope, permissions, options = {}) {
|
|
201
|
+
const { expiresIn = 3600000, trackInRegistry = true } = options;
|
|
202
|
+
|
|
203
|
+
const token = await crypto.issueCapability(
|
|
204
|
+
permissions,
|
|
205
|
+
scope,
|
|
206
|
+
targetPubKey,
|
|
207
|
+
{
|
|
208
|
+
expiresIn,
|
|
209
|
+
issuerKey: this.client.privateKey,
|
|
210
|
+
}
|
|
211
|
+
);
|
|
212
|
+
|
|
213
|
+
if (trackInRegistry) {
|
|
214
|
+
const partner = await registry.getFederatedPartner(
|
|
215
|
+
this.client,
|
|
216
|
+
this.config.appName,
|
|
217
|
+
targetPubKey
|
|
218
|
+
);
|
|
219
|
+
|
|
220
|
+
if (!partner) {
|
|
221
|
+
await registry.addFederatedPartner(
|
|
222
|
+
this.client,
|
|
223
|
+
this.config.appName,
|
|
224
|
+
targetPubKey,
|
|
225
|
+
{ addedVia: 'capability_issued' }
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
await registry.storeOutboundCapability(
|
|
230
|
+
this.client,
|
|
231
|
+
this.config.appName,
|
|
232
|
+
targetPubKey,
|
|
233
|
+
{
|
|
234
|
+
tokenHash: await this._hashToken(token),
|
|
235
|
+
scope,
|
|
236
|
+
permissions,
|
|
237
|
+
expires: Date.now() + expiresIn,
|
|
238
|
+
}
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
return token;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* Hash a capability token for storage.
|
|
247
|
+
* @private
|
|
248
|
+
* @param {string} token - Capability token to hash
|
|
249
|
+
* @returns {Promise<string>} SHA256 hash of token
|
|
250
|
+
*/
|
|
251
|
+
async _hashToken(token) {
|
|
252
|
+
const encoder = new TextEncoder();
|
|
253
|
+
return bytesToHex(sha256(encoder.encode(token)));
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// === Nostr Discovery Protocol ===
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Send a federation request to another HoloSphere via Nostr.
|
|
260
|
+
* @param {string} targetPubKey - Target HoloSphere public key
|
|
261
|
+
* @param {Object} [options={}] - Request options (message, metadata, etc.)
|
|
262
|
+
* @returns {Promise<Object>} Request event
|
|
263
|
+
*/
|
|
264
|
+
async sendFederationRequest(targetPubKey, options = {}) {
|
|
265
|
+
return discovery.sendFederationRequest(
|
|
266
|
+
this.client,
|
|
267
|
+
this.config.appName,
|
|
268
|
+
targetPubKey,
|
|
269
|
+
options
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
/**
|
|
274
|
+
* Subscribe to incoming federation requests.
|
|
275
|
+
* @param {Function} callback - Callback function (request) => void
|
|
276
|
+
* @returns {Promise<Object>} Subscription object with unsubscribe method
|
|
277
|
+
*/
|
|
278
|
+
async subscribeFederationRequests(callback) {
|
|
279
|
+
return discovery.subscribeFederationRequests(this.client, callback);
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Accept a federation request and establish partnership.
|
|
284
|
+
* @param {Object} request - Federation request object
|
|
285
|
+
* @param {Object} [options={}] - Acceptance options (capabilities to grant, etc.)
|
|
286
|
+
* @returns {Promise<Object>} Acceptance event
|
|
287
|
+
*/
|
|
288
|
+
async acceptFederationRequest(request, options = {}) {
|
|
289
|
+
return discovery.acceptFederationRequest(
|
|
290
|
+
this.client,
|
|
291
|
+
this.config.appName,
|
|
292
|
+
request,
|
|
293
|
+
options
|
|
294
|
+
);
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Decline a federation request.
|
|
299
|
+
* @param {Object} request - Federation request object
|
|
300
|
+
* @param {string} [reason=''] - Optional reason for declining
|
|
301
|
+
* @returns {Promise<Object>} Decline event
|
|
302
|
+
*/
|
|
303
|
+
async declineFederationRequest(request, reason = '') {
|
|
304
|
+
return discovery.declineFederationRequest(
|
|
305
|
+
this.client,
|
|
306
|
+
this.config.appName,
|
|
307
|
+
request,
|
|
308
|
+
reason
|
|
309
|
+
);
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/**
|
|
313
|
+
* Subscribe to federation request acceptances.
|
|
314
|
+
* @param {Function} callback - Callback function (acceptance) => void
|
|
315
|
+
* @returns {Promise<Object>} Subscription object with unsubscribe method
|
|
316
|
+
*/
|
|
317
|
+
async subscribeFederationAcceptances(callback) {
|
|
318
|
+
return discovery.subscribeFederationAcceptances(
|
|
319
|
+
this.client,
|
|
320
|
+
this.config.appName,
|
|
321
|
+
callback
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Subscribe to federation request declines.
|
|
327
|
+
* @param {Function} callback - Callback function (decline) => void
|
|
328
|
+
* @returns {Promise<Object>} Subscription object with unsubscribe method
|
|
329
|
+
*/
|
|
330
|
+
async subscribeFederationDeclines(callback) {
|
|
331
|
+
return discovery.subscribeFederationDeclines(this.client, callback);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Get all pending federation requests.
|
|
336
|
+
* @param {Object} [options={}] - Query options (limit, since, etc.)
|
|
337
|
+
* @returns {Promise<Object[]>} Array of pending requests
|
|
338
|
+
*/
|
|
339
|
+
async getPendingFederationRequests(options = {}) {
|
|
340
|
+
return discovery.getPendingFederationRequests(this.client, options);
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
export default withFederationMethods;
|
package/src/lib/index.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview HoloSphere library modules and mixin composition utilities.
|
|
3
|
+
* Exports AI, contract, and federation method mixins for extending the base HoloSphere class.
|
|
4
|
+
* @module lib/index
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
export { withAIMethods } from './ai-methods.js';
|
|
8
|
+
export { withContractMethods } from './contract-methods.js';
|
|
9
|
+
export { withFederationMethods } from './federation-methods.js';
|
|
10
|
+
export { AuthorizationError, ValidationError } from './errors.js';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Compose multiple mixins into a single class.
|
|
14
|
+
* Applies mixins in order from left to right.
|
|
15
|
+
* @param {Class} BaseClass - Base class to extend
|
|
16
|
+
* @param {...Function} mixins - Mixin functions to apply sequentially
|
|
17
|
+
* @returns {Class} Composed class with all mixins applied
|
|
18
|
+
* @example
|
|
19
|
+
* const EnhancedClass = compose(BaseClass, withAIMethods, withContractMethods);
|
|
20
|
+
*/
|
|
21
|
+
export function compose(BaseClass, ...mixins) {
|
|
22
|
+
return mixins.reduce((acc, mixin) => mixin(acc), BaseClass);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export default {
|
|
26
|
+
withAIMethods,
|
|
27
|
+
withContractMethods,
|
|
28
|
+
withFederationMethods,
|
|
29
|
+
compose
|
|
30
|
+
};
|
package/src/schema/validator.js
CHANGED
|
@@ -1,17 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* JSON Schema Validation with Ajv and caching
|
|
2
|
+
* @fileoverview JSON Schema Validation with Ajv and caching.
|
|
3
|
+
*
|
|
4
|
+
* Provides JSON Schema validation using Ajv (Another JSON Schema Validator)
|
|
5
|
+
* with schema compilation caching for improved performance on repeated validations.
|
|
6
|
+
*
|
|
7
|
+
* @module schema/validator
|
|
3
8
|
*/
|
|
4
9
|
|
|
5
10
|
import Ajv from 'ajv';
|
|
6
11
|
|
|
12
|
+
/** @type {Ajv} Ajv instance configured for validation */
|
|
7
13
|
const ajv = new Ajv({ allErrors: true, strict: false });
|
|
14
|
+
|
|
15
|
+
/** @type {Map<string, {validator: Function, timestamp: number}>} Schema cache */
|
|
8
16
|
const schemaCache = new Map();
|
|
9
|
-
|
|
17
|
+
|
|
18
|
+
/** @constant {number} Cache TTL in milliseconds (1 hour) */
|
|
19
|
+
const CACHE_TTL = 3600000;
|
|
10
20
|
|
|
11
21
|
/**
|
|
12
|
-
*
|
|
22
|
+
* Custom error class for validation failures.
|
|
23
|
+
*
|
|
24
|
+
* @class ValidationError
|
|
25
|
+
* @extends Error
|
|
13
26
|
*/
|
|
14
27
|
export class ValidationError extends Error {
|
|
28
|
+
/**
|
|
29
|
+
* Creates a new ValidationError.
|
|
30
|
+
*
|
|
31
|
+
* @param {string} message - Error message
|
|
32
|
+
* @param {Array} [errors=[]] - Array of Ajv error objects
|
|
33
|
+
*/
|
|
15
34
|
constructor(message, errors = []) {
|
|
16
35
|
super(message);
|
|
17
36
|
this.name = 'ValidationError';
|
|
@@ -1,3 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview H3 Hexagonal Spatial Operations.
|
|
3
|
+
*
|
|
4
|
+
* Provides functions for working with H3 hexagonal hierarchical spatial indexing.
|
|
5
|
+
* H3 divides the world into hexagonal cells at 16 resolution levels (0-15),
|
|
6
|
+
* where resolution 0 covers the entire globe and resolution 15 provides
|
|
7
|
+
* approximately 0.5 square meter precision.
|
|
8
|
+
*
|
|
9
|
+
* @module spatial/h3-operations
|
|
10
|
+
* @see {@link https://h3geo.org/ H3 Spatial Indexing}
|
|
11
|
+
*/
|
|
12
|
+
|
|
1
13
|
import {
|
|
2
14
|
latLngToCell,
|
|
3
15
|
cellToParent,
|
|
@@ -7,7 +19,11 @@ import {
|
|
|
7
19
|
} from 'h3-js';
|
|
8
20
|
|
|
9
21
|
/**
|
|
10
|
-
*
|
|
22
|
+
* Converts geographic coordinates to an H3 holon ID.
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* // Get H3 cell for a location at resolution 9
|
|
26
|
+
* const holonId = toHolon(40.7128, -74.0060, 9); // New York City
|
|
11
27
|
* @param {number} lat - Latitude (-90 to 90)
|
|
12
28
|
* @param {number} lng - Longitude (-180 to 180)
|
|
13
29
|
* @param {number} resolution - H3 resolution (0-15)
|
|
@@ -92,8 +108,8 @@ export function getChildren(holonId) {
|
|
|
92
108
|
*/
|
|
93
109
|
export function isValidH3(holonId) {
|
|
94
110
|
if (typeof holonId !== 'string') return false;
|
|
95
|
-
|
|
96
|
-
|
|
111
|
+
// H3 indexes are 15-character hex strings, but can vary slightly
|
|
112
|
+
// Use h3-js isValidCell for proper validation
|
|
97
113
|
return isValidCell(holonId);
|
|
98
114
|
}
|
|
99
115
|
|
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Factory for
|
|
3
|
-
*
|
|
2
|
+
* @fileoverview Factory for Creating Storage Backends.
|
|
3
|
+
*
|
|
4
|
+
* Provides a factory pattern for creating and managing storage backend instances.
|
|
5
|
+
* Supports lazy loading of backend implementations to reduce initial bundle size.
|
|
6
|
+
*
|
|
7
|
+
* @module storage/backend-factory
|
|
4
8
|
*/
|
|
5
9
|
|
|
10
|
+
/** @type {Object<string, string>} Map of backend types to their module paths */
|
|
6
11
|
const BACKEND_MODULES = {
|
|
7
12
|
nostr: './backends/nostr-backend.js',
|
|
8
13
|
gundb: './backends/gundb-backend.js',
|
|
@@ -1,8 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Abstract Storage Backend Interface
|
|
3
|
-
*
|
|
2
|
+
* @fileoverview Abstract Storage Backend Interface.
|
|
3
|
+
*
|
|
4
|
+
* Defines the contract that all storage backends must implement.
|
|
5
|
+
* Provides a consistent API for CRUD operations, subscriptions,
|
|
6
|
+
* and data migration across different storage technologies.
|
|
7
|
+
*
|
|
8
|
+
* @module storage/backend-interface
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Abstract base class for storage backends.
|
|
13
|
+
* All concrete backends (Nostr, GunDB, ActivityPub) must extend this class.
|
|
14
|
+
*
|
|
15
|
+
* @abstract
|
|
16
|
+
* @class StorageBackend
|
|
4
17
|
*/
|
|
5
18
|
export class StorageBackend {
|
|
19
|
+
/**
|
|
20
|
+
* Creates a new StorageBackend instance.
|
|
21
|
+
*
|
|
22
|
+
* @param {Object} config - Backend-specific configuration
|
|
23
|
+
* @throws {Error} If instantiated directly (abstract class)
|
|
24
|
+
*/
|
|
6
25
|
constructor(config) {
|
|
7
26
|
if (new.target === StorageBackend) {
|
|
8
27
|
throw new Error('StorageBackend is abstract and cannot be instantiated directly');
|
|
@@ -1,19 +1,41 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Self-hosted ActivityPub server for HoloSphere
|
|
3
|
-
* Provides federation with Mastodon, Pleroma,
|
|
2
|
+
* @fileoverview Self-hosted ActivityPub server for HoloSphere federation.
|
|
3
|
+
* Provides complete ActivityPub protocol support for federation with Mastodon, Pleroma,
|
|
4
|
+
* and other fediverse servers. Includes WebFinger, NodeInfo, actor endpoints, and SSE subscriptions.
|
|
5
|
+
* @module storage/backends/activitypub/server
|
|
4
6
|
*/
|
|
5
7
|
|
|
6
8
|
import express from 'express';
|
|
7
9
|
import crypto from 'crypto';
|
|
8
10
|
import { createPersistentStorage } from '../../persistent-storage.js';
|
|
9
11
|
|
|
12
|
+
/** @constant {string} ActivityStreams JSON-LD context */
|
|
10
13
|
const ACTIVITY_STREAMS_CONTEXT = 'https://www.w3.org/ns/activitystreams';
|
|
14
|
+
/** @constant {string} Security vocabulary JSON-LD context */
|
|
11
15
|
const SECURITY_CONTEXT = 'https://w3id.org/security/v1';
|
|
12
16
|
|
|
13
17
|
/**
|
|
14
|
-
* ActivityPub
|
|
18
|
+
* Self-hosted ActivityPub server for HoloSphere data federation.
|
|
19
|
+
* Implements WebFinger discovery, actor endpoints, inbox/outbox, and HoloSphere data API.
|
|
20
|
+
*
|
|
21
|
+
* @class ActivityPubServer
|
|
22
|
+
* @example
|
|
23
|
+
* const server = new ActivityPubServer({
|
|
24
|
+
* port: 3000,
|
|
25
|
+
* domain: 'holon.example.com',
|
|
26
|
+
* dataDir: './data'
|
|
27
|
+
* });
|
|
28
|
+
* await server.start();
|
|
15
29
|
*/
|
|
16
30
|
export class ActivityPubServer {
|
|
31
|
+
/**
|
|
32
|
+
* Create a new ActivityPub server instance.
|
|
33
|
+
* @param {Object} [config={}] - Server configuration
|
|
34
|
+
* @param {number} [config.port=3000] - HTTP port to listen on
|
|
35
|
+
* @param {string} [config.domain='localhost'] - Server domain for URLs
|
|
36
|
+
* @param {string} [config.protocol='http'] - Protocol (http or https)
|
|
37
|
+
* @param {string} [config.dataDir] - Data directory for persistent storage
|
|
38
|
+
*/
|
|
17
39
|
constructor(config = {}) {
|
|
18
40
|
this.config = {
|
|
19
41
|
port: config.port || 3000,
|
|
@@ -1,11 +1,34 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* ActivityPub
|
|
3
|
-
*
|
|
2
|
+
* @fileoverview ActivityPub storage backend client adapter.
|
|
3
|
+
* Provides HTTP-based connectivity to an ActivityPub server for federated data storage
|
|
4
|
+
* and real-time subscriptions via Server-Sent Events.
|
|
5
|
+
* @module storage/backends/activitypub-backend
|
|
4
6
|
*/
|
|
5
7
|
|
|
6
8
|
import { StorageBackend } from '../backend-interface.js';
|
|
7
9
|
|
|
10
|
+
/**
|
|
11
|
+
* ActivityPub storage backend implementation.
|
|
12
|
+
* Client adapter for connecting to an ActivityPub server via HTTP API
|
|
13
|
+
* with SSE-based real-time subscriptions.
|
|
14
|
+
*
|
|
15
|
+
* @class ActivityPubBackend
|
|
16
|
+
* @extends StorageBackend
|
|
17
|
+
* @example
|
|
18
|
+
* const backend = await BackendFactory.create('activitypub', {
|
|
19
|
+
* serverUrl: 'https://ap.example.com',
|
|
20
|
+
* appName: 'myapp',
|
|
21
|
+
* apiKey: 'secret-key'
|
|
22
|
+
* });
|
|
23
|
+
*/
|
|
8
24
|
export class ActivityPubBackend extends StorageBackend {
|
|
25
|
+
/**
|
|
26
|
+
* Create a new ActivityPub backend instance.
|
|
27
|
+
* @param {Object} config - Backend configuration
|
|
28
|
+
* @param {string} config.serverUrl - ActivityPub server URL
|
|
29
|
+
* @param {string} [config.appName='holosphere'] - Application/actor name
|
|
30
|
+
* @param {string} [config.apiKey] - Optional API key for authentication
|
|
31
|
+
*/
|
|
9
32
|
constructor(config) {
|
|
10
33
|
super(config);
|
|
11
34
|
this.serverUrl = config.serverUrl;
|