@calimero-network/mero-react 5.0.0 → 5.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +180 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +47 -3
- package/dist/index.d.ts +47 -3
- package/dist/index.js +180 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.cts
CHANGED
|
@@ -2,9 +2,9 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import React__default, { CSSProperties, ReactNode } from 'react';
|
|
4
4
|
import * as _calimero_network_mero_js from '@calimero-network/mero-js';
|
|
5
|
-
import { MeroJs, TokenStore, SetMetadataRequest, SseEventData, GroupMembershipEventData, GroupMigrationEventData, AddGroupMembersRequest, CreateContextRequest, CreateGroupInNamespaceRequest, CreateNamespaceRequest, CreateNamespaceInvitationRequest, CreateNamespaceInvitationResponseData, CreateRecursiveInvitationResponseData, DeleteGroupRequest, DeleteNamespaceRequest, DetachContextFromGroupRequest, GroupUpgradeStatusResponseData, GroupContextEntry, GroupInfo, CreateGroupInvitationRequest, MetadataRecord, JoinGroupRequest, JoinNamespaceRequest, MigrationStatus, MigrationStatusRollup, MemberMigrationStatusEntry, MigrateMyEntriesSummary, Namespace, SubgroupEntry, NamespaceIdentity, RemoveGroupMembersRequest, ReparentGroupRequest, ResyncContextRequest, RetryGroupUpgradeRequest, SetDefaultCapabilitiesRequest, SetSubgroupVisibilityRequest, SetTeeAdmissionPolicyRequest, SyncGroupRequest, UpdateMemberRoleRequest, UpgradeGroupRequest, TokenData } from '@calimero-network/mero-js';
|
|
5
|
+
import { MeroJs, TokenStore, SetMetadataRequest, SseEventData, GroupMembershipEventData, GroupMigrationEventData, Codec, AddGroupMembersRequest, CreateContextRequest, CreateGroupInNamespaceRequest, CreateNamespaceRequest, CreateNamespaceInvitationRequest, CreateNamespaceInvitationResponseData, CreateRecursiveInvitationResponseData, DeleteGroupRequest, DeleteNamespaceRequest, DetachContextFromGroupRequest, GroupUpgradeStatusResponseData, GroupContextEntry, GroupInfo, CreateGroupInvitationRequest, MetadataRecord, JoinGroupRequest, JoinNamespaceRequest, MigrationStatus, MigrationStatusRollup, MemberMigrationStatusEntry, MigrateMyEntriesSummary, Namespace, SubgroupEntry, NamespaceIdentity, RemoveGroupMembersRequest, ReparentGroupRequest, ResyncContextRequest, RetryGroupUpgradeRequest, SetDefaultCapabilitiesRequest, SetSubgroupVisibilityRequest, SetTeeAdmissionPolicyRequest, SyncGroupRequest, UpdateMemberRoleRequest, UpgradeGroupRequest, TokenData } from '@calimero-network/mero-js';
|
|
6
6
|
export * from '@calimero-network/mero-js';
|
|
7
|
-
export { CAPABILITIES, DEFAULT_LOCAL_NODE_PORTS, DiscoverLocalNodesOptions, MetadataRecord, discoverLocalNodes, hasCap, localNodeUrl, nodeEndpoint, probeNodeHealth, withCap, withoutCap } from '@calimero-network/mero-js';
|
|
7
|
+
export { CAPABILITIES, Codec, DEFAULT_LOCAL_NODE_PORTS, DiscoverLocalNodesOptions, EphemeralClient, EphemeralEntry, MetadataRecord, discoverLocalNodes, hasCap, localNodeUrl, nodeEndpoint, probeNodeHealth, withCap, withoutCap } from '@calimero-network/mero-js';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Types for mero-react
|
|
@@ -336,6 +336,50 @@ interface MigrationAdminPanelProps {
|
|
|
336
336
|
*/
|
|
337
337
|
declare function MigrationAdminPanel({ namespaceId, pollIntervalMs, className }: MigrationAdminPanelProps): react_jsx_runtime.JSX.Element;
|
|
338
338
|
|
|
339
|
+
interface UseEphemeralOptions<T> {
|
|
340
|
+
/** Encoding for the presence slice. Defaults to JSON. */
|
|
341
|
+
codec?: Codec<T>;
|
|
342
|
+
/** Base value for the first `setPresence` merge. */
|
|
343
|
+
initial?: T;
|
|
344
|
+
/** Minimum ms between publishes. Trailing edge — the latest value wins. */
|
|
345
|
+
throttleMs?: number;
|
|
346
|
+
/** Include your own echoed presence in `peers`. Default false. */
|
|
347
|
+
includeSelf?: boolean;
|
|
348
|
+
}
|
|
349
|
+
/** Shape returned by {@link useEphemeral}. */
|
|
350
|
+
interface UseEphemeralResult<T> {
|
|
351
|
+
peers: Map<string, T>;
|
|
352
|
+
setPresence: (partial: Partial<T>) => void;
|
|
353
|
+
ageOf: (author: string) => number | undefined;
|
|
354
|
+
error: Error | null;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Observe and publish ephemeral presence (cursors, typing, online) for a
|
|
358
|
+
* context.
|
|
359
|
+
*
|
|
360
|
+
* ONE read path: the subscription. When a client subscribes, the node replays
|
|
361
|
+
* that context's current presence to that connection as ordinary entries
|
|
362
|
+
* before the live deltas start, so seeding and updating share a single shape
|
|
363
|
+
* ({@link EphemeralEntry}) and a reconnect — `SseClient` auto-reconnects and
|
|
364
|
+
* re-subscribes — re-seeds itself. There is no snapshot fetch and no
|
|
365
|
+
* client-side reconciliation pass.
|
|
366
|
+
*
|
|
367
|
+
* Freshness is computed entirely from local clock deltas: a replayed entry is
|
|
368
|
+
* current as of `Date.now() - ageMs`, a live delta as of `Date.now()`. No
|
|
369
|
+
* cross-machine clock comparison is ever performed.
|
|
370
|
+
*
|
|
371
|
+
* No client-side TTL or heartbeat: the node sweeps at 7s and emits removals,
|
|
372
|
+
* and re-publishes on your behalf every 2.5s. A replay is treated as
|
|
373
|
+
* AUTHORITATIVE — see the replay-reconcile pass in the read effect — so a peer
|
|
374
|
+
* swept while the SSE connection was down does not survive the reconnect.
|
|
375
|
+
*
|
|
376
|
+
* `error` is derived, not accumulated: standing conditions (no `ephemeral`
|
|
377
|
+
* surface) are recomputed every render, one-shot async failures are latched
|
|
378
|
+
* keyed by the context they happened in, and whether a latched failure is even
|
|
379
|
+
* relevant (an unresolved identity when `includeSelf` is true) is decided at
|
|
380
|
+
* read time. Nothing survives a context switch.
|
|
381
|
+
*/
|
|
382
|
+
declare function useEphemeral<T>(contextId: string | null, options?: UseEphemeralOptions<T>): UseEphemeralResult<T>;
|
|
339
383
|
/**
|
|
340
384
|
* Shape accepted by the metadata-setter hooks — re-exported from mero-js so
|
|
341
385
|
* callers have one canonical type. A `set*Metadata` call **replaces the whole
|
|
@@ -803,4 +847,4 @@ declare function clearContextIdentity(): void;
|
|
|
803
847
|
*/
|
|
804
848
|
declare function clearAllStorage(): void;
|
|
805
849
|
|
|
806
|
-
export { type AppContext, AppMode, type ApplicationContextRecord, CalimeroLogo, type CalimeroLogoProps, ConnectButton, type ConnectButtonProps, ConnectionType, type ContextDiscoveryOptions, type ContextDiscoveryState, type CustomConnectionConfig, type ExecutionResult, LoginModal, type LoginModalProps, MERO_CSS_VARS, MeroContext, type MeroContextValue, MeroProvider, type MeroProviderConfig, type MeroProviderProps, type MeroTheme, MigrationAdminPanel, type MigrationAdminPanelProps, MigrationPendingBanner, type MigrationPendingBannerProps, type ResolvedMeroTheme, type SetMetadataInput, type SubscriptionEventData, type SubscriptionInput, clearAllStorage, clearApplicationId, clearContextId, clearContextIdentity, clearNodeUrl, clearTokenNodeUrl, cssVar, defaultMeroTheme, getApplicationId, getContextId, getContextIdentity, getNodeUrl, getTokenNodeUrl, localStorageTokenStorage, resolveMeroTheme, setApplicationId, setContextId, setContextIdentity, setNodeUrl, setTokenNodeUrl, themeToCssVars, useAddGroupMembers, useAppVersion, useApplicationContexts, useContextDiscovery, useContextGroup, useContexts, useCreateContext, useCreateGroupInNamespace, useCreateNamespace, useCreateNamespaceInvitation, useDefaultCapabilities, useDeleteContext, useDeleteGroup, useDeleteNamespace, useDetachContextFromGroup, useExecute, useGroupAppVersion, useGroupCapabilities, useGroupContexts, useGroupInfo, useGroupInvitations, useGroupMembers, useGroupMetadata, useGroupUpgradeStatus, useInstallFromRegistry, useJoinContext, useJoinGroup, useJoinNamespace, useJoinSubgroupInheritance, useLatestVersion, useMemberMetadata, useMero, useMigrationStatus, useMyAuthoredMigration, useNamespace, useNamespaceGroups, useNamespaceIdentity, useNamespaces, useNamespacesForApplication, useRemoveGroupMembers, useReparentGroup, useResyncContext, useRetryGroupUpgrade, useSetContextMetadata, useSetDefaultCapabilities, useSetGroupMetadata, useSetMemberMetadata, useSetSubgroupVisibility, useSetTeeAdmissionPolicy, useSubgroupVisibility, useSubgroups, useSubscription, useSyncGroup, useUpdateMemberRole, useUpgradeGroup };
|
|
850
|
+
export { type AppContext, AppMode, type ApplicationContextRecord, CalimeroLogo, type CalimeroLogoProps, ConnectButton, type ConnectButtonProps, ConnectionType, type ContextDiscoveryOptions, type ContextDiscoveryState, type CustomConnectionConfig, type ExecutionResult, LoginModal, type LoginModalProps, MERO_CSS_VARS, MeroContext, type MeroContextValue, MeroProvider, type MeroProviderConfig, type MeroProviderProps, type MeroTheme, MigrationAdminPanel, type MigrationAdminPanelProps, MigrationPendingBanner, type MigrationPendingBannerProps, type ResolvedMeroTheme, type SetMetadataInput, type SubscriptionEventData, type SubscriptionInput, type UseEphemeralOptions, type UseEphemeralResult, clearAllStorage, clearApplicationId, clearContextId, clearContextIdentity, clearNodeUrl, clearTokenNodeUrl, cssVar, defaultMeroTheme, getApplicationId, getContextId, getContextIdentity, getNodeUrl, getTokenNodeUrl, localStorageTokenStorage, resolveMeroTheme, setApplicationId, setContextId, setContextIdentity, setNodeUrl, setTokenNodeUrl, themeToCssVars, useAddGroupMembers, useAppVersion, useApplicationContexts, useContextDiscovery, useContextGroup, useContexts, useCreateContext, useCreateGroupInNamespace, useCreateNamespace, useCreateNamespaceInvitation, useDefaultCapabilities, useDeleteContext, useDeleteGroup, useDeleteNamespace, useDetachContextFromGroup, useEphemeral, useExecute, useGroupAppVersion, useGroupCapabilities, useGroupContexts, useGroupInfo, useGroupInvitations, useGroupMembers, useGroupMetadata, useGroupUpgradeStatus, useInstallFromRegistry, useJoinContext, useJoinGroup, useJoinNamespace, useJoinSubgroupInheritance, useLatestVersion, useMemberMetadata, useMero, useMigrationStatus, useMyAuthoredMigration, useNamespace, useNamespaceGroups, useNamespaceIdentity, useNamespaces, useNamespacesForApplication, useRemoveGroupMembers, useReparentGroup, useResyncContext, useRetryGroupUpgrade, useSetContextMetadata, useSetDefaultCapabilities, useSetGroupMetadata, useSetMemberMetadata, useSetSubgroupVisibility, useSetTeeAdmissionPolicy, useSubgroupVisibility, useSubgroups, useSubscription, useSyncGroup, useUpdateMemberRole, useUpgradeGroup };
|
package/dist/index.d.ts
CHANGED
|
@@ -2,9 +2,9 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import React__default, { CSSProperties, ReactNode } from 'react';
|
|
4
4
|
import * as _calimero_network_mero_js from '@calimero-network/mero-js';
|
|
5
|
-
import { MeroJs, TokenStore, SetMetadataRequest, SseEventData, GroupMembershipEventData, GroupMigrationEventData, AddGroupMembersRequest, CreateContextRequest, CreateGroupInNamespaceRequest, CreateNamespaceRequest, CreateNamespaceInvitationRequest, CreateNamespaceInvitationResponseData, CreateRecursiveInvitationResponseData, DeleteGroupRequest, DeleteNamespaceRequest, DetachContextFromGroupRequest, GroupUpgradeStatusResponseData, GroupContextEntry, GroupInfo, CreateGroupInvitationRequest, MetadataRecord, JoinGroupRequest, JoinNamespaceRequest, MigrationStatus, MigrationStatusRollup, MemberMigrationStatusEntry, MigrateMyEntriesSummary, Namespace, SubgroupEntry, NamespaceIdentity, RemoveGroupMembersRequest, ReparentGroupRequest, ResyncContextRequest, RetryGroupUpgradeRequest, SetDefaultCapabilitiesRequest, SetSubgroupVisibilityRequest, SetTeeAdmissionPolicyRequest, SyncGroupRequest, UpdateMemberRoleRequest, UpgradeGroupRequest, TokenData } from '@calimero-network/mero-js';
|
|
5
|
+
import { MeroJs, TokenStore, SetMetadataRequest, SseEventData, GroupMembershipEventData, GroupMigrationEventData, Codec, AddGroupMembersRequest, CreateContextRequest, CreateGroupInNamespaceRequest, CreateNamespaceRequest, CreateNamespaceInvitationRequest, CreateNamespaceInvitationResponseData, CreateRecursiveInvitationResponseData, DeleteGroupRequest, DeleteNamespaceRequest, DetachContextFromGroupRequest, GroupUpgradeStatusResponseData, GroupContextEntry, GroupInfo, CreateGroupInvitationRequest, MetadataRecord, JoinGroupRequest, JoinNamespaceRequest, MigrationStatus, MigrationStatusRollup, MemberMigrationStatusEntry, MigrateMyEntriesSummary, Namespace, SubgroupEntry, NamespaceIdentity, RemoveGroupMembersRequest, ReparentGroupRequest, ResyncContextRequest, RetryGroupUpgradeRequest, SetDefaultCapabilitiesRequest, SetSubgroupVisibilityRequest, SetTeeAdmissionPolicyRequest, SyncGroupRequest, UpdateMemberRoleRequest, UpgradeGroupRequest, TokenData } from '@calimero-network/mero-js';
|
|
6
6
|
export * from '@calimero-network/mero-js';
|
|
7
|
-
export { CAPABILITIES, DEFAULT_LOCAL_NODE_PORTS, DiscoverLocalNodesOptions, MetadataRecord, discoverLocalNodes, hasCap, localNodeUrl, nodeEndpoint, probeNodeHealth, withCap, withoutCap } from '@calimero-network/mero-js';
|
|
7
|
+
export { CAPABILITIES, Codec, DEFAULT_LOCAL_NODE_PORTS, DiscoverLocalNodesOptions, EphemeralClient, EphemeralEntry, MetadataRecord, discoverLocalNodes, hasCap, localNodeUrl, nodeEndpoint, probeNodeHealth, withCap, withoutCap } from '@calimero-network/mero-js';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Types for mero-react
|
|
@@ -336,6 +336,50 @@ interface MigrationAdminPanelProps {
|
|
|
336
336
|
*/
|
|
337
337
|
declare function MigrationAdminPanel({ namespaceId, pollIntervalMs, className }: MigrationAdminPanelProps): react_jsx_runtime.JSX.Element;
|
|
338
338
|
|
|
339
|
+
interface UseEphemeralOptions<T> {
|
|
340
|
+
/** Encoding for the presence slice. Defaults to JSON. */
|
|
341
|
+
codec?: Codec<T>;
|
|
342
|
+
/** Base value for the first `setPresence` merge. */
|
|
343
|
+
initial?: T;
|
|
344
|
+
/** Minimum ms between publishes. Trailing edge — the latest value wins. */
|
|
345
|
+
throttleMs?: number;
|
|
346
|
+
/** Include your own echoed presence in `peers`. Default false. */
|
|
347
|
+
includeSelf?: boolean;
|
|
348
|
+
}
|
|
349
|
+
/** Shape returned by {@link useEphemeral}. */
|
|
350
|
+
interface UseEphemeralResult<T> {
|
|
351
|
+
peers: Map<string, T>;
|
|
352
|
+
setPresence: (partial: Partial<T>) => void;
|
|
353
|
+
ageOf: (author: string) => number | undefined;
|
|
354
|
+
error: Error | null;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Observe and publish ephemeral presence (cursors, typing, online) for a
|
|
358
|
+
* context.
|
|
359
|
+
*
|
|
360
|
+
* ONE read path: the subscription. When a client subscribes, the node replays
|
|
361
|
+
* that context's current presence to that connection as ordinary entries
|
|
362
|
+
* before the live deltas start, so seeding and updating share a single shape
|
|
363
|
+
* ({@link EphemeralEntry}) and a reconnect — `SseClient` auto-reconnects and
|
|
364
|
+
* re-subscribes — re-seeds itself. There is no snapshot fetch and no
|
|
365
|
+
* client-side reconciliation pass.
|
|
366
|
+
*
|
|
367
|
+
* Freshness is computed entirely from local clock deltas: a replayed entry is
|
|
368
|
+
* current as of `Date.now() - ageMs`, a live delta as of `Date.now()`. No
|
|
369
|
+
* cross-machine clock comparison is ever performed.
|
|
370
|
+
*
|
|
371
|
+
* No client-side TTL or heartbeat: the node sweeps at 7s and emits removals,
|
|
372
|
+
* and re-publishes on your behalf every 2.5s. A replay is treated as
|
|
373
|
+
* AUTHORITATIVE — see the replay-reconcile pass in the read effect — so a peer
|
|
374
|
+
* swept while the SSE connection was down does not survive the reconnect.
|
|
375
|
+
*
|
|
376
|
+
* `error` is derived, not accumulated: standing conditions (no `ephemeral`
|
|
377
|
+
* surface) are recomputed every render, one-shot async failures are latched
|
|
378
|
+
* keyed by the context they happened in, and whether a latched failure is even
|
|
379
|
+
* relevant (an unresolved identity when `includeSelf` is true) is decided at
|
|
380
|
+
* read time. Nothing survives a context switch.
|
|
381
|
+
*/
|
|
382
|
+
declare function useEphemeral<T>(contextId: string | null, options?: UseEphemeralOptions<T>): UseEphemeralResult<T>;
|
|
339
383
|
/**
|
|
340
384
|
* Shape accepted by the metadata-setter hooks — re-exported from mero-js so
|
|
341
385
|
* callers have one canonical type. A `set*Metadata` call **replaces the whole
|
|
@@ -803,4 +847,4 @@ declare function clearContextIdentity(): void;
|
|
|
803
847
|
*/
|
|
804
848
|
declare function clearAllStorage(): void;
|
|
805
849
|
|
|
806
|
-
export { type AppContext, AppMode, type ApplicationContextRecord, CalimeroLogo, type CalimeroLogoProps, ConnectButton, type ConnectButtonProps, ConnectionType, type ContextDiscoveryOptions, type ContextDiscoveryState, type CustomConnectionConfig, type ExecutionResult, LoginModal, type LoginModalProps, MERO_CSS_VARS, MeroContext, type MeroContextValue, MeroProvider, type MeroProviderConfig, type MeroProviderProps, type MeroTheme, MigrationAdminPanel, type MigrationAdminPanelProps, MigrationPendingBanner, type MigrationPendingBannerProps, type ResolvedMeroTheme, type SetMetadataInput, type SubscriptionEventData, type SubscriptionInput, clearAllStorage, clearApplicationId, clearContextId, clearContextIdentity, clearNodeUrl, clearTokenNodeUrl, cssVar, defaultMeroTheme, getApplicationId, getContextId, getContextIdentity, getNodeUrl, getTokenNodeUrl, localStorageTokenStorage, resolveMeroTheme, setApplicationId, setContextId, setContextIdentity, setNodeUrl, setTokenNodeUrl, themeToCssVars, useAddGroupMembers, useAppVersion, useApplicationContexts, useContextDiscovery, useContextGroup, useContexts, useCreateContext, useCreateGroupInNamespace, useCreateNamespace, useCreateNamespaceInvitation, useDefaultCapabilities, useDeleteContext, useDeleteGroup, useDeleteNamespace, useDetachContextFromGroup, useExecute, useGroupAppVersion, useGroupCapabilities, useGroupContexts, useGroupInfo, useGroupInvitations, useGroupMembers, useGroupMetadata, useGroupUpgradeStatus, useInstallFromRegistry, useJoinContext, useJoinGroup, useJoinNamespace, useJoinSubgroupInheritance, useLatestVersion, useMemberMetadata, useMero, useMigrationStatus, useMyAuthoredMigration, useNamespace, useNamespaceGroups, useNamespaceIdentity, useNamespaces, useNamespacesForApplication, useRemoveGroupMembers, useReparentGroup, useResyncContext, useRetryGroupUpgrade, useSetContextMetadata, useSetDefaultCapabilities, useSetGroupMetadata, useSetMemberMetadata, useSetSubgroupVisibility, useSetTeeAdmissionPolicy, useSubgroupVisibility, useSubgroups, useSubscription, useSyncGroup, useUpdateMemberRole, useUpgradeGroup };
|
|
850
|
+
export { type AppContext, AppMode, type ApplicationContextRecord, CalimeroLogo, type CalimeroLogoProps, ConnectButton, type ConnectButtonProps, ConnectionType, type ContextDiscoveryOptions, type ContextDiscoveryState, type CustomConnectionConfig, type ExecutionResult, LoginModal, type LoginModalProps, MERO_CSS_VARS, MeroContext, type MeroContextValue, MeroProvider, type MeroProviderConfig, type MeroProviderProps, type MeroTheme, MigrationAdminPanel, type MigrationAdminPanelProps, MigrationPendingBanner, type MigrationPendingBannerProps, type ResolvedMeroTheme, type SetMetadataInput, type SubscriptionEventData, type SubscriptionInput, type UseEphemeralOptions, type UseEphemeralResult, clearAllStorage, clearApplicationId, clearContextId, clearContextIdentity, clearNodeUrl, clearTokenNodeUrl, cssVar, defaultMeroTheme, getApplicationId, getContextId, getContextIdentity, getNodeUrl, getTokenNodeUrl, localStorageTokenStorage, resolveMeroTheme, setApplicationId, setContextId, setContextIdentity, setNodeUrl, setTokenNodeUrl, themeToCssVars, useAddGroupMembers, useAppVersion, useApplicationContexts, useContextDiscovery, useContextGroup, useContexts, useCreateContext, useCreateGroupInNamespace, useCreateNamespace, useCreateNamespaceInvitation, useDefaultCapabilities, useDeleteContext, useDeleteGroup, useDeleteNamespace, useDetachContextFromGroup, useEphemeral, useExecute, useGroupAppVersion, useGroupCapabilities, useGroupContexts, useGroupInfo, useGroupInvitations, useGroupMembers, useGroupMetadata, useGroupUpgradeStatus, useInstallFromRegistry, useJoinContext, useJoinGroup, useJoinNamespace, useJoinSubgroupInheritance, useLatestVersion, useMemberMetadata, useMero, useMigrationStatus, useMyAuthoredMigration, useNamespace, useNamespaceGroups, useNamespaceIdentity, useNamespaces, useNamespacesForApplication, useRemoveGroupMembers, useReparentGroup, useResyncContext, useRetryGroupUpgrade, useSetContextMetadata, useSetDefaultCapabilities, useSetGroupMetadata, useSetMemberMetadata, useSetSubgroupVisibility, useSetTeeAdmissionPolicy, useSubgroupVisibility, useSubgroups, useSubscription, useSyncGroup, useUpdateMemberRole, useUpgradeGroup };
|
package/dist/index.js
CHANGED
|
@@ -1266,6 +1266,185 @@ function base58ToHex(input) {
|
|
|
1266
1266
|
}
|
|
1267
1267
|
|
|
1268
1268
|
// src/hooks/index.ts
|
|
1269
|
+
var NO_EPHEMERAL_SURFACE_MESSAGE = "useEphemeral: this client has no `mero.ephemeral` surface. Ephemeral presence requires @calimero-network/mero-js >= 9.1.0; upgrade the installed @calimero-network/mero-js (and any lockfile pin) to use it.";
|
|
1270
|
+
var COULD_NOT_RESOLVE_IDENTITY_MESSAGE = "useEphemeral: could not resolve a local context identity, so your own presence cannot be filtered out. Pass includeSelf: true to accept this.";
|
|
1271
|
+
var REPLAY_RECONCILE_MS = 50;
|
|
1272
|
+
function useEphemeral(contextId, options = {}) {
|
|
1273
|
+
const { includeSelf = false } = options;
|
|
1274
|
+
const { mero } = useMero();
|
|
1275
|
+
const ephemeral = mero ? mero.ephemeral ?? null : null;
|
|
1276
|
+
const [peers, setPeers] = useState(/* @__PURE__ */ new Map());
|
|
1277
|
+
const [latchedError, setLatchedError] = useState(null);
|
|
1278
|
+
const contextKeyRef = useRef(contextId);
|
|
1279
|
+
contextKeyRef.current = contextId;
|
|
1280
|
+
const setSourceError = useCallback(
|
|
1281
|
+
(source, err, key) => {
|
|
1282
|
+
if (key !== contextKeyRef.current) return;
|
|
1283
|
+
setLatchedError({ contextKey: key, source, error: err });
|
|
1284
|
+
},
|
|
1285
|
+
[]
|
|
1286
|
+
);
|
|
1287
|
+
const clearSourceError = useCallback((source, key) => {
|
|
1288
|
+
setLatchedError(
|
|
1289
|
+
(prev) => prev && prev.source === source && prev.contextKey === key ? null : prev
|
|
1290
|
+
);
|
|
1291
|
+
}, []);
|
|
1292
|
+
const surfaceError = useMemo(
|
|
1293
|
+
() => mero && !ephemeral ? new Error(NO_EPHEMERAL_SURFACE_MESSAGE) : null,
|
|
1294
|
+
[mero, ephemeral]
|
|
1295
|
+
);
|
|
1296
|
+
const error = surfaceError ?? (latchedError && latchedError.contextKey === contextId && !(latchedError.source === "identity" && includeSelf) ? latchedError.error : null);
|
|
1297
|
+
const receivedAtRef = useRef(/* @__PURE__ */ new Map());
|
|
1298
|
+
const codecRef = useRef(options.codec);
|
|
1299
|
+
codecRef.current = options.codec;
|
|
1300
|
+
const initialRef = useRef(options.initial);
|
|
1301
|
+
initialRef.current = options.initial;
|
|
1302
|
+
const selfRef = useRef(null);
|
|
1303
|
+
const lastLocalRef = useRef(options.initial);
|
|
1304
|
+
const pendingRef = useRef(void 0);
|
|
1305
|
+
const timerRef = useRef(null);
|
|
1306
|
+
const lastSentAtRef = useRef(Date.now());
|
|
1307
|
+
const replaySeenRef = useRef(null);
|
|
1308
|
+
const replayTimerRef = useRef(null);
|
|
1309
|
+
const ageOf = useCallback((author) => {
|
|
1310
|
+
const at = receivedAtRef.current.get(author);
|
|
1311
|
+
return at === void 0 ? void 0 : Date.now() - at;
|
|
1312
|
+
}, []);
|
|
1313
|
+
useEffect(() => {
|
|
1314
|
+
setPeers(/* @__PURE__ */ new Map());
|
|
1315
|
+
receivedAtRef.current = /* @__PURE__ */ new Map();
|
|
1316
|
+
if (timerRef.current) {
|
|
1317
|
+
clearTimeout(timerRef.current);
|
|
1318
|
+
timerRef.current = null;
|
|
1319
|
+
}
|
|
1320
|
+
if (replayTimerRef.current) {
|
|
1321
|
+
clearTimeout(replayTimerRef.current);
|
|
1322
|
+
replayTimerRef.current = null;
|
|
1323
|
+
}
|
|
1324
|
+
replaySeenRef.current = null;
|
|
1325
|
+
pendingRef.current = void 0;
|
|
1326
|
+
lastLocalRef.current = initialRef.current;
|
|
1327
|
+
selfRef.current = null;
|
|
1328
|
+
setLatchedError(null);
|
|
1329
|
+
}, [contextId]);
|
|
1330
|
+
useEffect(() => {
|
|
1331
|
+
if (!mero || !contextId) return;
|
|
1332
|
+
const key = contextId;
|
|
1333
|
+
let cancelled = false;
|
|
1334
|
+
mero.admin.getContextIdentitiesOwned(contextId).then((res) => {
|
|
1335
|
+
if (cancelled) return;
|
|
1336
|
+
const self = res.identities?.[0] ?? null;
|
|
1337
|
+
selfRef.current = self;
|
|
1338
|
+
if (!self) {
|
|
1339
|
+
setSourceError("identity", new Error(COULD_NOT_RESOLVE_IDENTITY_MESSAGE), key);
|
|
1340
|
+
return;
|
|
1341
|
+
}
|
|
1342
|
+
clearSourceError("identity", key);
|
|
1343
|
+
if (!includeSelf) {
|
|
1344
|
+
receivedAtRef.current.delete(self);
|
|
1345
|
+
setPeers((prev) => {
|
|
1346
|
+
if (!prev.has(self)) return prev;
|
|
1347
|
+
const next = new Map(prev);
|
|
1348
|
+
next.delete(self);
|
|
1349
|
+
return next;
|
|
1350
|
+
});
|
|
1351
|
+
}
|
|
1352
|
+
}).catch((err) => {
|
|
1353
|
+
if (!cancelled) {
|
|
1354
|
+
setSourceError("identity", toError(err), key);
|
|
1355
|
+
}
|
|
1356
|
+
});
|
|
1357
|
+
return () => {
|
|
1358
|
+
cancelled = true;
|
|
1359
|
+
};
|
|
1360
|
+
}, [mero, contextId, includeSelf, setSourceError, clearSourceError]);
|
|
1361
|
+
useEffect(() => {
|
|
1362
|
+
if (!ephemeral || !contextId) return;
|
|
1363
|
+
const closeReplayWindow = () => {
|
|
1364
|
+
replayTimerRef.current = null;
|
|
1365
|
+
const seen = replaySeenRef.current;
|
|
1366
|
+
replaySeenRef.current = null;
|
|
1367
|
+
if (!seen) return;
|
|
1368
|
+
setPeers((prev) => {
|
|
1369
|
+
let next = null;
|
|
1370
|
+
for (const author of prev.keys()) {
|
|
1371
|
+
if (seen.has(author)) continue;
|
|
1372
|
+
if (!next) next = new Map(prev);
|
|
1373
|
+
next.delete(author);
|
|
1374
|
+
receivedAtRef.current.delete(author);
|
|
1375
|
+
}
|
|
1376
|
+
return next ?? prev;
|
|
1377
|
+
});
|
|
1378
|
+
};
|
|
1379
|
+
const unsubscribe = ephemeral.subscribe(
|
|
1380
|
+
contextId,
|
|
1381
|
+
(entry) => {
|
|
1382
|
+
const { author, state } = entry;
|
|
1383
|
+
if (entry.ageMs !== void 0) {
|
|
1384
|
+
if (!replaySeenRef.current) replaySeenRef.current = /* @__PURE__ */ new Set();
|
|
1385
|
+
if (replayTimerRef.current) clearTimeout(replayTimerRef.current);
|
|
1386
|
+
replayTimerRef.current = setTimeout(closeReplayWindow, REPLAY_RECONCILE_MS);
|
|
1387
|
+
}
|
|
1388
|
+
if (entry.removed || state === void 0) {
|
|
1389
|
+
replaySeenRef.current?.delete(author);
|
|
1390
|
+
receivedAtRef.current.delete(author);
|
|
1391
|
+
setPeers((prev) => {
|
|
1392
|
+
if (!prev.has(author)) return prev;
|
|
1393
|
+
const next = new Map(prev);
|
|
1394
|
+
next.delete(author);
|
|
1395
|
+
return next;
|
|
1396
|
+
});
|
|
1397
|
+
return;
|
|
1398
|
+
}
|
|
1399
|
+
if (!includeSelf && author === selfRef.current) return;
|
|
1400
|
+
replaySeenRef.current?.add(author);
|
|
1401
|
+
receivedAtRef.current.set(author, Date.now() - (entry.ageMs ?? 0));
|
|
1402
|
+
setPeers((prev) => new Map(prev).set(author, state));
|
|
1403
|
+
},
|
|
1404
|
+
codecRef.current
|
|
1405
|
+
);
|
|
1406
|
+
return () => {
|
|
1407
|
+
if (replayTimerRef.current) {
|
|
1408
|
+
clearTimeout(replayTimerRef.current);
|
|
1409
|
+
replayTimerRef.current = null;
|
|
1410
|
+
}
|
|
1411
|
+
replaySeenRef.current = null;
|
|
1412
|
+
unsubscribe();
|
|
1413
|
+
};
|
|
1414
|
+
}, [ephemeral, contextId, includeSelf]);
|
|
1415
|
+
const publish = useCallback((value) => {
|
|
1416
|
+
if (!ephemeral || !contextId) return;
|
|
1417
|
+
const key = contextId;
|
|
1418
|
+
lastSentAtRef.current = Date.now();
|
|
1419
|
+
void ephemeral.set(key, value, codecRef.current).then(
|
|
1420
|
+
() => clearSourceError("publish", key),
|
|
1421
|
+
(err) => setSourceError("publish", toError(err), key)
|
|
1422
|
+
);
|
|
1423
|
+
}, [ephemeral, contextId, setSourceError, clearSourceError]);
|
|
1424
|
+
const setPresence = useCallback((partial) => {
|
|
1425
|
+
const next = { ...lastLocalRef.current ?? {}, ...partial };
|
|
1426
|
+
lastLocalRef.current = next;
|
|
1427
|
+
const throttleMs = options.throttleMs ?? 30;
|
|
1428
|
+
if (throttleMs <= 0) {
|
|
1429
|
+
publish(next);
|
|
1430
|
+
return;
|
|
1431
|
+
}
|
|
1432
|
+
pendingRef.current = next;
|
|
1433
|
+
if (timerRef.current) return;
|
|
1434
|
+
const elapsed = Date.now() - lastSentAtRef.current;
|
|
1435
|
+
const delay = Math.max(throttleMs - elapsed, 0);
|
|
1436
|
+
timerRef.current = setTimeout(() => {
|
|
1437
|
+
timerRef.current = null;
|
|
1438
|
+
const queued = pendingRef.current;
|
|
1439
|
+
pendingRef.current = void 0;
|
|
1440
|
+
if (queued !== void 0) publish(queued);
|
|
1441
|
+
}, delay);
|
|
1442
|
+
}, [publish, options.throttleMs]);
|
|
1443
|
+
useEffect(() => () => {
|
|
1444
|
+
if (timerRef.current) clearTimeout(timerRef.current);
|
|
1445
|
+
}, []);
|
|
1446
|
+
return { peers, setPresence, ageOf, error };
|
|
1447
|
+
}
|
|
1269
1448
|
function toError(err) {
|
|
1270
1449
|
return err instanceof Error ? err : new Error(String(err));
|
|
1271
1450
|
}
|
|
@@ -2583,6 +2762,6 @@ function MigrationAdminPanel({ namespaceId, pollIntervalMs, className }) {
|
|
|
2583
2762
|
] });
|
|
2584
2763
|
}
|
|
2585
2764
|
|
|
2586
|
-
export { AppMode, CalimeroLogo, ConnectButton, ConnectionType, LoginModal, MERO_CSS_VARS, MeroContext, MeroProvider, MigrationAdminPanel, MigrationPendingBanner, clearAllStorage, clearApplicationId, clearContextId, clearContextIdentity, clearNodeUrl, clearTokenNodeUrl, cssVar, defaultMeroTheme, getApplicationId, getContextId, getContextIdentity, getNodeUrl, getTokenNodeUrl, localStorageTokenStorage, resolveMeroTheme, setApplicationId, setContextId, setContextIdentity, setNodeUrl, setTokenNodeUrl, themeToCssVars, useAddGroupMembers, useAppVersion, useApplicationContexts, useContextDiscovery, useContextGroup, useContexts, useCreateContext, useCreateGroupInNamespace, useCreateNamespace, useCreateNamespaceInvitation, useDefaultCapabilities, useDeleteContext, useDeleteGroup, useDeleteNamespace, useDetachContextFromGroup, useExecute, useGroupAppVersion, useGroupCapabilities, useGroupContexts, useGroupInfo, useGroupInvitations, useGroupMembers, useGroupMetadata, useGroupUpgradeStatus, useInstallFromRegistry, useJoinContext, useJoinGroup, useJoinNamespace, useJoinSubgroupInheritance, useLatestVersion, useMemberMetadata, useMero, useMigrationStatus, useMyAuthoredMigration, useNamespace, useNamespaceGroups, useNamespaceIdentity, useNamespaces, useNamespacesForApplication, useRemoveGroupMembers, useReparentGroup, useResyncContext, useRetryGroupUpgrade, useSetContextMetadata, useSetDefaultCapabilities, useSetGroupMetadata, useSetMemberMetadata, useSetSubgroupVisibility, useSetTeeAdmissionPolicy, useSubgroupVisibility, useSubgroups, useSubscription, useSyncGroup, useUpdateMemberRole, useUpgradeGroup };
|
|
2765
|
+
export { AppMode, CalimeroLogo, ConnectButton, ConnectionType, LoginModal, MERO_CSS_VARS, MeroContext, MeroProvider, MigrationAdminPanel, MigrationPendingBanner, clearAllStorage, clearApplicationId, clearContextId, clearContextIdentity, clearNodeUrl, clearTokenNodeUrl, cssVar, defaultMeroTheme, getApplicationId, getContextId, getContextIdentity, getNodeUrl, getTokenNodeUrl, localStorageTokenStorage, resolveMeroTheme, setApplicationId, setContextId, setContextIdentity, setNodeUrl, setTokenNodeUrl, themeToCssVars, useAddGroupMembers, useAppVersion, useApplicationContexts, useContextDiscovery, useContextGroup, useContexts, useCreateContext, useCreateGroupInNamespace, useCreateNamespace, useCreateNamespaceInvitation, useDefaultCapabilities, useDeleteContext, useDeleteGroup, useDeleteNamespace, useDetachContextFromGroup, useEphemeral, useExecute, useGroupAppVersion, useGroupCapabilities, useGroupContexts, useGroupInfo, useGroupInvitations, useGroupMembers, useGroupMetadata, useGroupUpgradeStatus, useInstallFromRegistry, useJoinContext, useJoinGroup, useJoinNamespace, useJoinSubgroupInheritance, useLatestVersion, useMemberMetadata, useMero, useMigrationStatus, useMyAuthoredMigration, useNamespace, useNamespaceGroups, useNamespaceIdentity, useNamespaces, useNamespacesForApplication, useRemoveGroupMembers, useReparentGroup, useResyncContext, useRetryGroupUpgrade, useSetContextMetadata, useSetDefaultCapabilities, useSetGroupMetadata, useSetMemberMetadata, useSetSubgroupVisibility, useSetTeeAdmissionPolicy, useSubgroupVisibility, useSubgroups, useSubscription, useSyncGroup, useUpdateMemberRole, useUpgradeGroup };
|
|
2587
2766
|
//# sourceMappingURL=index.js.map
|
|
2588
2767
|
//# sourceMappingURL=index.js.map
|