holosphere 2.0.0-alpha7 → 2.0.0-alpha9
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 +446 -0
- package/FEATURES.md +431 -0
- package/LICENSE +29 -166
- package/LICENSE-AGPL.md +180 -0
- package/dist/cdn/holosphere.min.js +55 -0
- package/dist/cdn/holosphere.min.js.map +1 -0
- package/dist/cjs/holosphere.cjs +1 -1
- package/dist/esm/holosphere.js +1 -1
- package/dist/{index-C-IlLYlk.cjs → index-DDGt_V9o.cjs} +2 -2
- package/dist/{index-C-IlLYlk.cjs.map → index-DDGt_V9o.cjs.map} +1 -1
- package/dist/{index-d6f4RJBM.js → index-DJXftyvB.js} +2253 -387
- 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-jmTHEbR2.js → index-DeZ1xz_s.js} +2 -2
- package/dist/{index-jmTHEbR2.js.map → index-DeZ1xz_s.js.map} +1 -1
- package/dist/{indexeddb-storage-D8kOl0oK.js → indexeddb-storage-BFt6hMeF.js} +48 -4
- package/dist/indexeddb-storage-BFt6hMeF.js.map +1 -0
- package/dist/{indexeddb-storage-a8GipaDr.cjs → indexeddb-storage-BK5tv4Sh.cjs} +2 -2
- package/dist/indexeddb-storage-BK5tv4Sh.cjs.map +1 -0
- package/dist/{memory-storage-DBQK622V.js → memory-storage-C9HuoL2E.js} +44 -4
- package/dist/memory-storage-C9HuoL2E.js.map +1 -0
- package/dist/{memory-storage-gfRovk2O.cjs → memory-storage-Dao7jfYG.cjs} +2 -2
- package/dist/memory-storage-Dao7jfYG.cjs.map +1 -0
- package/dist/{secp256k1-BCAPF45D.cjs → secp256k1-BbKzbLtD.cjs} +2 -2
- package/dist/{secp256k1-BCAPF45D.cjs.map → secp256k1-BbKzbLtD.cjs.map} +1 -1
- package/dist/{secp256k1-DYm_CMqW.js → secp256k1-CreY7Pcl.js} +2 -2
- package/dist/{secp256k1-DYm_CMqW.js.map → secp256k1-CreY7Pcl.js.map} +1 -1
- 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/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 +16 -3
- 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/chain-manager.js +68 -40
- package/src/contracts/deployer.js +70 -42
- package/src/contracts/event-listener.js +61 -29
- package/src/contracts/holon-contracts.js +46 -31
- package/src/contracts/index.js +5 -6
- package/src/contracts/networks.js +19 -14
- package/src/contracts/operations.js +58 -41
- package/src/contracts/queries.js +70 -21
- package/src/core/holosphere.js +37 -8
- package/src/crypto/nostr-utils.js +105 -65
- package/src/crypto/secp256k1.js +7 -2
- package/src/federation/handshake.js +23 -11
- package/src/federation/hologram.js +9 -1
- package/src/hierarchical/upcast.js +34 -20
- package/src/index.js +671 -7
- package/src/lib/ai-methods.js +352 -3
- package/src/lib/contract-methods.js +152 -3
- package/src/lib/errors.js +31 -1
- package/src/lib/federation-methods.js +110 -3
- package/src/lib/index.js +9 -5
- package/src/schema/validator.js +22 -3
- package/src/spatial/h3-operations.js +17 -1
- 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 +322 -11
- 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 +7 -2
- package/src/storage/gun-async.js +20 -11
- package/src/storage/gun-auth.js +15 -4
- package/src/storage/gun-federation.js +14 -5
- package/src/storage/gun-references.js +16 -5
- package/src/storage/gun-schema.js +25 -10
- package/src/storage/gun-wrapper.js +160 -49
- package/src/storage/indexeddb-storage.js +65 -4
- package/src/storage/key-storage-simple.js +32 -9
- package/src/storage/key-storage.js +45 -13
- package/src/storage/memory-storage.js +65 -4
- package/src/storage/migration.js +20 -7
- package/src/storage/nostr-async.js +195 -90
- package/src/storage/nostr-client.js +173 -49
- package/src/storage/nostr-wrapper.js +6 -2
- package/src/storage/outbox-queue.js +55 -18
- package/src/storage/persistent-storage.js +56 -13
- package/src/storage/sync-service.js +51 -17
- package/src/storage/unified-storage.js +38 -3
- package/src/subscriptions/manager.js +33 -16
- package/vite.config.cdn.js +60 -0
- package/dist/index-Bvwyvd0T.cjs +0 -5
- package/dist/index-Bvwyvd0T.cjs.map +0 -1
- package/dist/index-d6f4RJBM.js.map +0 -1
- package/dist/indexeddb-storage-D8kOl0oK.js.map +0 -1
- package/dist/indexeddb-storage-a8GipaDr.cjs.map +0 -1
- package/dist/memory-storage-DBQK622V.js.map +0 -1
- package/dist/memory-storage-gfRovk2O.cjs.map +0 -1
- /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
|
@@ -1,18 +1,52 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Nostr Storage Backend
|
|
2
|
+
* @fileoverview Nostr Storage Backend.
|
|
3
|
+
*
|
|
3
4
|
* Wraps existing nostr-wrapper.js and nostr-client.js as a StorageBackend
|
|
5
|
+
* implementation. Provides Nostr-based distributed storage with relay support.
|
|
6
|
+
*
|
|
7
|
+
* @module storage/backends/nostr-backend
|
|
4
8
|
*/
|
|
5
9
|
|
|
6
10
|
import { StorageBackend } from '../backend-interface.js';
|
|
7
11
|
import { createClient } from '../nostr-client.js';
|
|
8
12
|
import * as wrapper from '../nostr-wrapper.js';
|
|
9
13
|
|
|
14
|
+
/**
|
|
15
|
+
* Nostr storage backend implementation.
|
|
16
|
+
*
|
|
17
|
+
* Provides distributed storage using Nostr relays with event-based data storage.
|
|
18
|
+
*
|
|
19
|
+
* @class NostrBackend
|
|
20
|
+
* @extends StorageBackend
|
|
21
|
+
* @example
|
|
22
|
+
* const backend = new NostrBackend({
|
|
23
|
+
* relays: ['wss://relay.example.com'],
|
|
24
|
+
* appName: 'myapp',
|
|
25
|
+
* persistence: true
|
|
26
|
+
* });
|
|
27
|
+
* await backend.init();
|
|
28
|
+
*/
|
|
10
29
|
export class NostrBackend extends StorageBackend {
|
|
30
|
+
/**
|
|
31
|
+
* Create a new NostrBackend.
|
|
32
|
+
*
|
|
33
|
+
* @param {Object} config - Backend configuration
|
|
34
|
+
* @param {string[]} [config.relays] - Relay URLs
|
|
35
|
+
* @param {string} [config.privateKey] - Private key for signing
|
|
36
|
+
* @param {string} [config.appName] - Application name
|
|
37
|
+
* @param {boolean} [config.persistence=true] - Enable persistent storage
|
|
38
|
+
* @param {boolean} [config.backgroundSync] - Enable background sync
|
|
39
|
+
*/
|
|
11
40
|
constructor(config) {
|
|
12
41
|
super(config);
|
|
13
42
|
this.client = null;
|
|
14
43
|
}
|
|
15
44
|
|
|
45
|
+
/**
|
|
46
|
+
* Initialize the backend.
|
|
47
|
+
*
|
|
48
|
+
* @returns {Promise<void>}
|
|
49
|
+
*/
|
|
16
50
|
async init() {
|
|
17
51
|
this.client = createClient({
|
|
18
52
|
relays: this.config.relays || ['wss://relay.holons.io'],
|
|
@@ -32,38 +66,102 @@ export class NostrBackend extends StorageBackend {
|
|
|
32
66
|
this.publicKey = this.client.publicKey;
|
|
33
67
|
}
|
|
34
68
|
|
|
69
|
+
/**
|
|
70
|
+
* Build path from components.
|
|
71
|
+
*
|
|
72
|
+
* @param {string} appName - Application name
|
|
73
|
+
* @param {string} holonId - Holon ID
|
|
74
|
+
* @param {string} lensName - Lens name
|
|
75
|
+
* @param {string} [key=null] - Optional key
|
|
76
|
+
* @returns {string} Built path
|
|
77
|
+
*/
|
|
35
78
|
buildPath(appName, holonId, lensName, key = null) {
|
|
36
79
|
return wrapper.buildPath(appName, holonId, lensName, key);
|
|
37
80
|
}
|
|
38
81
|
|
|
82
|
+
/**
|
|
83
|
+
* Write data to path.
|
|
84
|
+
*
|
|
85
|
+
* @param {string} path - Storage path
|
|
86
|
+
* @param {Object} data - Data to write
|
|
87
|
+
* @param {Object} [options={}] - Write options
|
|
88
|
+
* @returns {Promise<Object>} Write result
|
|
89
|
+
*/
|
|
39
90
|
async write(path, data, options = {}) {
|
|
40
91
|
return wrapper.write(this.client, path, data);
|
|
41
92
|
}
|
|
42
93
|
|
|
94
|
+
/**
|
|
95
|
+
* Read data from path.
|
|
96
|
+
*
|
|
97
|
+
* @param {string} path - Storage path
|
|
98
|
+
* @param {Object} [options={}] - Read options
|
|
99
|
+
* @returns {Promise<Object|null>} Data or null
|
|
100
|
+
*/
|
|
43
101
|
async read(path, options = {}) {
|
|
44
102
|
return wrapper.read(this.client, path, options);
|
|
45
103
|
}
|
|
46
104
|
|
|
105
|
+
/**
|
|
106
|
+
* Read all data under path.
|
|
107
|
+
*
|
|
108
|
+
* @param {string} path - Storage path prefix
|
|
109
|
+
* @param {Object} [options={}] - Read options
|
|
110
|
+
* @returns {Promise<Object[]>} Array of data objects
|
|
111
|
+
*/
|
|
47
112
|
async readAll(path, options = {}) {
|
|
48
113
|
return wrapper.readAll(this.client, path, options);
|
|
49
114
|
}
|
|
50
115
|
|
|
116
|
+
/**
|
|
117
|
+
* Update data at path.
|
|
118
|
+
*
|
|
119
|
+
* @param {string} path - Storage path
|
|
120
|
+
* @param {Object} updates - Fields to update
|
|
121
|
+
* @returns {Promise<Object>} Update result
|
|
122
|
+
*/
|
|
51
123
|
async update(path, updates) {
|
|
52
124
|
return wrapper.update(this.client, path, updates);
|
|
53
125
|
}
|
|
54
126
|
|
|
127
|
+
/**
|
|
128
|
+
* Delete data at path.
|
|
129
|
+
*
|
|
130
|
+
* @param {string} path - Storage path
|
|
131
|
+
* @returns {Promise<boolean>} Success indicator
|
|
132
|
+
*/
|
|
55
133
|
async delete(path) {
|
|
56
134
|
return wrapper.deleteData(this.client, path);
|
|
57
135
|
}
|
|
58
136
|
|
|
137
|
+
/**
|
|
138
|
+
* Delete all data under path.
|
|
139
|
+
*
|
|
140
|
+
* @param {string} path - Storage path prefix
|
|
141
|
+
* @returns {Promise<Object>} Deletion results
|
|
142
|
+
*/
|
|
59
143
|
async deleteAll(path) {
|
|
60
144
|
return wrapper.deleteAll(this.client, path);
|
|
61
145
|
}
|
|
62
146
|
|
|
147
|
+
/**
|
|
148
|
+
* Subscribe to changes at path.
|
|
149
|
+
*
|
|
150
|
+
* @param {string} path - Storage path
|
|
151
|
+
* @param {Function} callback - Callback function
|
|
152
|
+
* @param {Object} [options={}] - Subscribe options
|
|
153
|
+
* @returns {Promise<Object>} Subscription object with unsubscribe method
|
|
154
|
+
*/
|
|
63
155
|
async subscribe(path, callback, options = {}) {
|
|
64
156
|
return wrapper.subscribe(this.client, path, callback, options);
|
|
65
157
|
}
|
|
66
158
|
|
|
159
|
+
/**
|
|
160
|
+
* Export all data for this user.
|
|
161
|
+
*
|
|
162
|
+
* @param {string} [pathPrefix=''] - Optional path prefix filter
|
|
163
|
+
* @returns {Promise<Object[]>} Array of exported records
|
|
164
|
+
*/
|
|
67
165
|
async exportData(pathPrefix = '') {
|
|
68
166
|
// Wait for client to be ready
|
|
69
167
|
await this.client._initReady;
|
|
@@ -101,6 +199,13 @@ export class NostrBackend extends StorageBackend {
|
|
|
101
199
|
.filter(record => !record.data._deleted); // Filter out deleted items
|
|
102
200
|
}
|
|
103
201
|
|
|
202
|
+
/**
|
|
203
|
+
* Import data records.
|
|
204
|
+
*
|
|
205
|
+
* @param {Object[]} records - Array of records to import
|
|
206
|
+
* @param {Object} [options={}] - Import options
|
|
207
|
+
* @returns {Promise<Object>} Import results with success/failed counts
|
|
208
|
+
*/
|
|
104
209
|
async importData(records, options = {}) {
|
|
105
210
|
const results = { success: 0, failed: 0, errors: [] };
|
|
106
211
|
|
|
@@ -117,12 +222,22 @@ export class NostrBackend extends StorageBackend {
|
|
|
117
222
|
return results;
|
|
118
223
|
}
|
|
119
224
|
|
|
225
|
+
/**
|
|
226
|
+
* Close the backend and cleanup resources.
|
|
227
|
+
*
|
|
228
|
+
* @returns {void}
|
|
229
|
+
*/
|
|
120
230
|
close() {
|
|
121
231
|
if (this.client) {
|
|
122
232
|
this.client.close();
|
|
123
233
|
}
|
|
124
234
|
}
|
|
125
235
|
|
|
236
|
+
/**
|
|
237
|
+
* Get backend status.
|
|
238
|
+
*
|
|
239
|
+
* @returns {Object} Status object with type, publicKey, relays, connected
|
|
240
|
+
*/
|
|
126
241
|
getStatus() {
|
|
127
242
|
return {
|
|
128
243
|
type: 'nostr',
|
|
@@ -1,40 +1,80 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Browser stub for FileSystemStorage
|
|
3
|
-
*
|
|
2
|
+
* @fileoverview Browser stub for FileSystemStorage.
|
|
3
|
+
*
|
|
4
|
+
* This stub throws errors if FileSystemStorage is used in browser environments.
|
|
5
|
+
* Browsers should use IndexedDBStorage or MemoryStorage instead.
|
|
6
|
+
*
|
|
7
|
+
* @module storage/filesystem-storage-browser
|
|
4
8
|
*/
|
|
5
9
|
|
|
6
10
|
import { PersistentStorage } from './persistent-storage.js';
|
|
7
11
|
|
|
12
|
+
/**
|
|
13
|
+
* Browser stub for FileSystemStorage.
|
|
14
|
+
*
|
|
15
|
+
* All methods throw errors indicating filesystem storage is unavailable in browsers.
|
|
16
|
+
*
|
|
17
|
+
* @class FileSystemStorage
|
|
18
|
+
* @extends PersistentStorage
|
|
19
|
+
* @throws {Error} Always throws - not available in browser environments
|
|
20
|
+
*/
|
|
8
21
|
export class FileSystemStorage extends PersistentStorage {
|
|
22
|
+
/**
|
|
23
|
+
* Constructor throws error in browser.
|
|
24
|
+
*
|
|
25
|
+
* @param {string} [baseDir=null] - Ignored in browser
|
|
26
|
+
* @throws {Error} Always throws - not available in browser
|
|
27
|
+
*/
|
|
9
28
|
constructor(baseDir = null) {
|
|
10
29
|
super();
|
|
11
30
|
throw new Error('FileSystemStorage is not available in browser environments. Use IndexedDBStorage or MemoryStorage instead.');
|
|
12
31
|
}
|
|
13
32
|
|
|
33
|
+
/**
|
|
34
|
+
* @throws {Error} Always throws - not available in browser
|
|
35
|
+
*/
|
|
14
36
|
async init(namespace) {
|
|
15
37
|
throw new Error('FileSystemStorage is not available in browser environments');
|
|
16
38
|
}
|
|
17
39
|
|
|
40
|
+
/**
|
|
41
|
+
* @throws {Error} Always throws - not available in browser
|
|
42
|
+
*/
|
|
18
43
|
async put(key, event) {
|
|
19
44
|
throw new Error('FileSystemStorage is not available in browser environments');
|
|
20
45
|
}
|
|
21
46
|
|
|
47
|
+
/**
|
|
48
|
+
* @throws {Error} Always throws - not available in browser
|
|
49
|
+
*/
|
|
22
50
|
async get(key) {
|
|
23
51
|
throw new Error('FileSystemStorage is not available in browser environments');
|
|
24
52
|
}
|
|
25
53
|
|
|
54
|
+
/**
|
|
55
|
+
* @throws {Error} Always throws - not available in browser
|
|
56
|
+
*/
|
|
26
57
|
async getAll(prefix) {
|
|
27
58
|
throw new Error('FileSystemStorage is not available in browser environments');
|
|
28
59
|
}
|
|
29
60
|
|
|
61
|
+
/**
|
|
62
|
+
* @throws {Error} Always throws - not available in browser
|
|
63
|
+
*/
|
|
30
64
|
async delete(key) {
|
|
31
65
|
throw new Error('FileSystemStorage is not available in browser environments');
|
|
32
66
|
}
|
|
33
67
|
|
|
68
|
+
/**
|
|
69
|
+
* @throws {Error} Always throws - not available in browser
|
|
70
|
+
*/
|
|
34
71
|
async clear() {
|
|
35
72
|
throw new Error('FileSystemStorage is not available in browser environments');
|
|
36
73
|
}
|
|
37
74
|
|
|
75
|
+
/**
|
|
76
|
+
* @throws {Error} Always throws - not available in browser
|
|
77
|
+
*/
|
|
38
78
|
async close() {
|
|
39
79
|
throw new Error('FileSystemStorage is not available in browser environments');
|
|
40
80
|
}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* File system storage adapter for Node.js
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* @fileoverview File system storage adapter for Node.js.
|
|
3
|
+
*
|
|
4
|
+
* Stores events as JSON files in a directory structure.
|
|
5
|
+
* This module is only loaded in Node.js environments.
|
|
6
|
+
*
|
|
7
|
+
* @module storage/filesystem-storage
|
|
5
8
|
*/
|
|
6
9
|
|
|
7
10
|
// Guard against browser environments
|
|
@@ -14,7 +17,24 @@ import { promises as fs } from 'fs';
|
|
|
14
17
|
import path from 'path';
|
|
15
18
|
import os from 'os';
|
|
16
19
|
|
|
20
|
+
/**
|
|
21
|
+
* File system storage adapter for Node.js.
|
|
22
|
+
*
|
|
23
|
+
* Stores events as JSON files in a directory structure for persistent storage.
|
|
24
|
+
*
|
|
25
|
+
* @class FileSystemStorage
|
|
26
|
+
* @extends PersistentStorage
|
|
27
|
+
* @example
|
|
28
|
+
* const storage = new FileSystemStorage('/custom/path');
|
|
29
|
+
* await storage.init('myapp');
|
|
30
|
+
* await storage.put('key1', { id: 'event1', data: 'test' });
|
|
31
|
+
*/
|
|
17
32
|
export class FileSystemStorage extends PersistentStorage {
|
|
33
|
+
/**
|
|
34
|
+
* Create a new FileSystemStorage instance.
|
|
35
|
+
*
|
|
36
|
+
* @param {string} [baseDir=null] - Base directory for storage (defaults to ~/.holosphere)
|
|
37
|
+
*/
|
|
18
38
|
constructor(baseDir = null) {
|
|
19
39
|
super();
|
|
20
40
|
this.baseDir = baseDir || path.join(os.homedir(), '.holosphere');
|
|
@@ -22,6 +42,12 @@ export class FileSystemStorage extends PersistentStorage {
|
|
|
22
42
|
this.storageDir = null;
|
|
23
43
|
}
|
|
24
44
|
|
|
45
|
+
/**
|
|
46
|
+
* Initialize storage with namespace.
|
|
47
|
+
*
|
|
48
|
+
* @param {string} namespace - Storage namespace (app name)
|
|
49
|
+
* @returns {Promise<void>}
|
|
50
|
+
*/
|
|
25
51
|
async init(namespace) {
|
|
26
52
|
this.namespace = namespace;
|
|
27
53
|
this.storageDir = path.join(this.baseDir, namespace);
|
|
@@ -37,8 +63,11 @@ export class FileSystemStorage extends PersistentStorage {
|
|
|
37
63
|
}
|
|
38
64
|
|
|
39
65
|
/**
|
|
40
|
-
* Convert key to safe filename
|
|
66
|
+
* Convert key to safe filename.
|
|
67
|
+
*
|
|
41
68
|
* @private
|
|
69
|
+
* @param {string} key - Storage key
|
|
70
|
+
* @returns {string} Safe filename
|
|
42
71
|
*/
|
|
43
72
|
_keyToFilename(key) {
|
|
44
73
|
// Replace unsafe characters
|
|
@@ -46,19 +75,35 @@ export class FileSystemStorage extends PersistentStorage {
|
|
|
46
75
|
}
|
|
47
76
|
|
|
48
77
|
/**
|
|
49
|
-
* Get full file path for key
|
|
78
|
+
* Get full file path for key.
|
|
79
|
+
*
|
|
50
80
|
* @private
|
|
81
|
+
* @param {string} key - Storage key
|
|
82
|
+
* @returns {string} Full file path
|
|
51
83
|
*/
|
|
52
84
|
_getFilePath(key) {
|
|
53
85
|
return path.join(this.storageDir, this._keyToFilename(key));
|
|
54
86
|
}
|
|
55
87
|
|
|
88
|
+
/**
|
|
89
|
+
* Store an event.
|
|
90
|
+
*
|
|
91
|
+
* @param {string} key - Storage key
|
|
92
|
+
* @param {Object} event - Event data to store
|
|
93
|
+
* @returns {Promise<void>}
|
|
94
|
+
*/
|
|
56
95
|
async put(key, event) {
|
|
57
96
|
const filePath = this._getFilePath(key);
|
|
58
97
|
const data = JSON.stringify(event, null, 2);
|
|
59
98
|
await fs.writeFile(filePath, data, 'utf8');
|
|
60
99
|
}
|
|
61
100
|
|
|
101
|
+
/**
|
|
102
|
+
* Retrieve an event.
|
|
103
|
+
*
|
|
104
|
+
* @param {string} key - Storage key
|
|
105
|
+
* @returns {Promise<Object|null>} Event data or null if not found
|
|
106
|
+
*/
|
|
62
107
|
async get(key) {
|
|
63
108
|
const filePath = this._getFilePath(key);
|
|
64
109
|
try {
|
|
@@ -72,6 +117,12 @@ export class FileSystemStorage extends PersistentStorage {
|
|
|
72
117
|
}
|
|
73
118
|
}
|
|
74
119
|
|
|
120
|
+
/**
|
|
121
|
+
* Retrieve all events matching a prefix.
|
|
122
|
+
*
|
|
123
|
+
* @param {string} prefix - Key prefix to match
|
|
124
|
+
* @returns {Promise<Object[]>} Array of matching events
|
|
125
|
+
*/
|
|
75
126
|
async getAll(prefix) {
|
|
76
127
|
const results = [];
|
|
77
128
|
|
|
@@ -108,6 +159,12 @@ export class FileSystemStorage extends PersistentStorage {
|
|
|
108
159
|
return results;
|
|
109
160
|
}
|
|
110
161
|
|
|
162
|
+
/**
|
|
163
|
+
* Delete an event.
|
|
164
|
+
*
|
|
165
|
+
* @param {string} key - Storage key
|
|
166
|
+
* @returns {Promise<void>}
|
|
167
|
+
*/
|
|
111
168
|
async delete(key) {
|
|
112
169
|
const filePath = this._getFilePath(key);
|
|
113
170
|
try {
|
|
@@ -119,6 +176,11 @@ export class FileSystemStorage extends PersistentStorage {
|
|
|
119
176
|
}
|
|
120
177
|
}
|
|
121
178
|
|
|
179
|
+
/**
|
|
180
|
+
* Clear all stored events.
|
|
181
|
+
*
|
|
182
|
+
* @returns {Promise<void>}
|
|
183
|
+
*/
|
|
122
184
|
async clear() {
|
|
123
185
|
try {
|
|
124
186
|
const files = await fs.readdir(this.storageDir);
|
|
@@ -132,6 +194,11 @@ export class FileSystemStorage extends PersistentStorage {
|
|
|
132
194
|
}
|
|
133
195
|
}
|
|
134
196
|
|
|
197
|
+
/**
|
|
198
|
+
* Close storage (no-op for filesystem).
|
|
199
|
+
*
|
|
200
|
+
* @returns {Promise<void>}
|
|
201
|
+
*/
|
|
135
202
|
async close() {
|
|
136
203
|
// Nothing to close for file system storage
|
|
137
204
|
}
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Global Data Operations
|
|
3
|
-
*
|
|
2
|
+
* @fileoverview Global Data Operations.
|
|
3
|
+
*
|
|
4
|
+
* Provides non-location-specific (non-holon) data storage operations.
|
|
5
|
+
* Used for storing application-wide data like federation configs, schemas,
|
|
6
|
+
* and user preferences that aren't tied to specific H3 cells.
|
|
7
|
+
*
|
|
8
|
+
* @module storage/global-tables
|
|
4
9
|
*/
|
|
5
10
|
|
|
6
11
|
import { write, read, readAll, update, deleteData, deleteAll, subscribe } from './unified-storage.js';
|
package/src/storage/gun-async.js
CHANGED
|
@@ -1,13 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Gun Async Utilities
|
|
3
|
-
*
|
|
2
|
+
* @fileoverview Gun Async Utilities.
|
|
3
|
+
*
|
|
4
|
+
* Provides Promise-based wrappers and async patterns for Gun operations.
|
|
5
|
+
* Includes utilities for promises, batch operations, retries, streams, and async iteration.
|
|
6
|
+
*
|
|
7
|
+
* @module storage/gun-async
|
|
4
8
|
*/
|
|
5
9
|
|
|
6
10
|
/**
|
|
7
|
-
* Get data from Gun using native .then() support
|
|
11
|
+
* Get data from Gun using native .then() support.
|
|
12
|
+
*
|
|
8
13
|
* @param {Object} gunChain - Gun chain reference
|
|
9
|
-
* @param {number} timeout - Timeout in ms
|
|
10
|
-
* @returns {Promise<any>} Promise resolving to data
|
|
14
|
+
* @param {number} [timeout=1000] - Timeout in ms
|
|
15
|
+
* @returns {Promise<any>} Promise resolving to data or null on timeout
|
|
11
16
|
*/
|
|
12
17
|
export function gunPromise(gunChain, timeout = 1000) {
|
|
13
18
|
return new Promise((resolve, reject) => {
|
|
@@ -31,11 +36,13 @@ export function gunPromise(gunChain, timeout = 1000) {
|
|
|
31
36
|
}
|
|
32
37
|
|
|
33
38
|
/**
|
|
34
|
-
* Wait for Gun write acknowledgement
|
|
39
|
+
* Wait for Gun write acknowledgement.
|
|
40
|
+
*
|
|
35
41
|
* @param {Object} gunChain - Gun chain reference
|
|
36
42
|
* @param {any} data - Data to write
|
|
37
|
-
* @param {number} timeout - Timeout in ms
|
|
38
|
-
* @returns {Promise<Object>} Promise resolving to ack object
|
|
43
|
+
* @param {number} [timeout=1000] - Timeout in ms
|
|
44
|
+
* @returns {Promise<Object>} Promise resolving to ack object { ok, timeout? }
|
|
45
|
+
* @throws {Error} If write fails with error
|
|
39
46
|
*/
|
|
40
47
|
export function gunPut(gunChain, data, timeout = 1000) {
|
|
41
48
|
return new Promise((resolve, reject) => {
|
|
@@ -63,10 +70,12 @@ export function gunPut(gunChain, data, timeout = 1000) {
|
|
|
63
70
|
}
|
|
64
71
|
|
|
65
72
|
/**
|
|
66
|
-
* Get all items from a Gun map
|
|
67
|
-
*
|
|
73
|
+
* Get all items from a Gun map.
|
|
74
|
+
*
|
|
75
|
+
* First gets count of items, then collects until count is reached.
|
|
76
|
+
*
|
|
68
77
|
* @param {Object} gunChain - Gun chain reference
|
|
69
|
-
* @param {number} timeout - Timeout in ms (fallback
|
|
78
|
+
* @param {number} [timeout=5000] - Timeout in ms (fallback)
|
|
70
79
|
* @returns {Promise<Object>} Promise resolving to map of items
|
|
71
80
|
*/
|
|
72
81
|
export async function gunMap(gunChain, timeout = 5000) {
|
package/src/storage/gun-auth.js
CHANGED
|
@@ -1,19 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GunDB Authentication Handler
|
|
3
|
-
* Handles user authentication and private data storage using Gun's user system
|
|
2
|
+
* @fileoverview GunDB Authentication Handler.
|
|
4
3
|
*
|
|
4
|
+
* Handles user authentication and private data storage using Gun's user system.
|
|
5
5
|
* Private data is stored under: user.get('private').get(lens).get(key)
|
|
6
6
|
* Usernames are namespaced: ${appname}:${holonId}
|
|
7
|
+
*
|
|
8
|
+
* @module storage/gun-auth
|
|
7
9
|
*/
|
|
8
10
|
|
|
9
11
|
import { gunPromise, gunPut } from './gun-async.js';
|
|
10
12
|
|
|
11
13
|
/**
|
|
12
|
-
* Authentication handler for GunDB backend
|
|
14
|
+
* Authentication handler for GunDB backend.
|
|
15
|
+
*
|
|
16
|
+
* Manages user creation, authentication, and private data access.
|
|
17
|
+
*
|
|
18
|
+
* @class GunAuth
|
|
19
|
+
* @example
|
|
20
|
+
* const auth = new GunAuth(gun, 'myapp');
|
|
21
|
+
* await auth.createUser('holon123', 'password');
|
|
22
|
+
* await auth.authenticate('holon123', 'password');
|
|
13
23
|
*/
|
|
14
24
|
export class GunAuth {
|
|
15
25
|
/**
|
|
16
|
-
* Create a new authentication handler
|
|
26
|
+
* Create a new authentication handler.
|
|
27
|
+
*
|
|
17
28
|
* @param {Object} gun - Gun instance
|
|
18
29
|
* @param {string} appname - Application namespace
|
|
19
30
|
*/
|
|
@@ -1,19 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GunDB Federation Module
|
|
3
|
-
* Provides methods for creating, managing, and using federated spaces
|
|
2
|
+
* @fileoverview GunDB Federation Module.
|
|
4
3
|
*
|
|
5
|
-
*
|
|
4
|
+
* Provides methods for creating, managing, and using federated spaces.
|
|
5
|
+
* Supports data propagation with references for lightweight federation,
|
|
6
|
+
* aggregation across federated sources, and subscription to federated changes.
|
|
7
|
+
*
|
|
8
|
+
* Ported from holosphere/federation.js to work with the GunDBBackend.
|
|
9
|
+
*
|
|
10
|
+
* @module storage/gun-federation
|
|
6
11
|
*/
|
|
7
12
|
|
|
8
13
|
/**
|
|
9
|
-
* Creates a federation relationship between two spaces
|
|
14
|
+
* Creates a federation relationship between two spaces.
|
|
15
|
+
*
|
|
10
16
|
* Federation is bidirectional by default, and data propagation uses soul references by default.
|
|
11
17
|
*
|
|
12
18
|
* @param {Object} backend - The GunDBBackend instance
|
|
13
19
|
* @param {string} spaceId1 - The first space ID
|
|
14
20
|
* @param {string} spaceId2 - The second space ID
|
|
15
|
-
* @param {boolean} bidirectional - Whether to set up bidirectional notifications
|
|
21
|
+
* @param {boolean} [bidirectional=true] - Whether to set up bidirectional notifications
|
|
16
22
|
* @returns {Promise<boolean>} True if federation was created successfully
|
|
23
|
+
* @throws {Error} If space IDs are missing or identical
|
|
24
|
+
* @example
|
|
25
|
+
* await federate(backend, 'space1', 'space2');
|
|
17
26
|
*/
|
|
18
27
|
export async function federate(backend, spaceId1, spaceId2, bidirectional = true) {
|
|
19
28
|
if (!spaceId1 || !spaceId2) {
|
|
@@ -1,19 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GunDB Reference Handler
|
|
3
|
-
* Handles creation and resolution of data references for federation
|
|
2
|
+
* @fileoverview GunDB Reference Handler.
|
|
4
3
|
*
|
|
4
|
+
* Handles creation and resolution of data references for federation.
|
|
5
5
|
* References use a "soul" pattern: appname/holon/lens/key
|
|
6
|
-
* This allows lightweight propagation without data duplication
|
|
6
|
+
* This allows lightweight propagation without data duplication.
|
|
7
|
+
*
|
|
8
|
+
* @module storage/gun-references
|
|
7
9
|
*/
|
|
8
10
|
|
|
9
11
|
import { read } from './gun-wrapper.js';
|
|
10
12
|
|
|
11
13
|
/**
|
|
12
|
-
* Reference handler for GunDB backend
|
|
14
|
+
* Reference handler for GunDB backend.
|
|
15
|
+
*
|
|
16
|
+
* Manages creation, detection, and resolution of data references.
|
|
17
|
+
*
|
|
18
|
+
* @class GunReferenceHandler
|
|
19
|
+
* @example
|
|
20
|
+
* const handler = new GunReferenceHandler('myapp');
|
|
21
|
+
* const ref = handler.createReference('holon1', 'items', { id: '123', name: 'Test' });
|
|
22
|
+
* const resolved = await handler.resolveReference(gun, ref);
|
|
13
23
|
*/
|
|
14
24
|
export class GunReferenceHandler {
|
|
15
25
|
/**
|
|
16
|
-
* Create a new reference handler
|
|
26
|
+
* Create a new reference handler.
|
|
27
|
+
*
|
|
17
28
|
* @param {string} appname - Application namespace
|
|
18
29
|
*/
|
|
19
30
|
constructor(appname) {
|
|
@@ -1,14 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* GunDB Schema Validator
|
|
3
|
-
* Handles JSON Schema validation for data stored in GunDB
|
|
2
|
+
* @fileoverview GunDB Schema Validator.
|
|
4
3
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
4
|
+
* Handles JSON Schema validation for data stored in GunDB.
|
|
5
|
+
* Schemas are stored in the global 'schemas' table.
|
|
6
|
+
* Validation uses AJV (Another JSON Schema Validator) with JSON Schema 2019.
|
|
7
|
+
*
|
|
8
|
+
* @module storage/gun-schema
|
|
7
9
|
*/
|
|
8
10
|
|
|
9
11
|
import { writeGlobal, readGlobal, readAllGlobal, deleteGlobal } from './gun-wrapper.js';
|
|
10
12
|
|
|
11
|
-
|
|
13
|
+
/**
|
|
14
|
+
* Default meta-schema for validating schema definitions.
|
|
15
|
+
* @private
|
|
16
|
+
* @constant {Object}
|
|
17
|
+
*/
|
|
12
18
|
const META_SCHEMA = {
|
|
13
19
|
type: 'object',
|
|
14
20
|
required: ['type'],
|
|
@@ -23,14 +29,23 @@ const META_SCHEMA = {
|
|
|
23
29
|
};
|
|
24
30
|
|
|
25
31
|
/**
|
|
26
|
-
* Schema validator for GunDB backend
|
|
32
|
+
* Schema validator for GunDB backend.
|
|
33
|
+
*
|
|
34
|
+
* Provides JSON Schema validation with caching and lazy-loaded AJV.
|
|
35
|
+
*
|
|
36
|
+
* @class GunSchemaValidator
|
|
37
|
+
* @example
|
|
38
|
+
* const validator = new GunSchemaValidator({ strict: true });
|
|
39
|
+
* await validator.init();
|
|
40
|
+
* await validator.setSchema(gun, 'myapp', 'user', { type: 'object', properties: { name: { type: 'string' } } });
|
|
27
41
|
*/
|
|
28
42
|
export class GunSchemaValidator {
|
|
29
43
|
/**
|
|
30
|
-
* Create a new schema validator
|
|
31
|
-
*
|
|
32
|
-
* @param {
|
|
33
|
-
* @param {
|
|
44
|
+
* Create a new schema validator.
|
|
45
|
+
*
|
|
46
|
+
* @param {Object} [options={}] - Validator options
|
|
47
|
+
* @param {boolean} [options.strict=false] - Whether to enforce strict validation
|
|
48
|
+
* @param {number} [options.cacheMaxAge=3600000] - Schema cache TTL in ms (1 hour)
|
|
34
49
|
*/
|
|
35
50
|
constructor(options = {}) {
|
|
36
51
|
this.strict = options.strict || false;
|