@tuwaio/satellite-core 0.3.2 → 0.3.4

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/README.md CHANGED
@@ -4,26 +4,25 @@
4
4
  [![License](https://img.shields.io/npm/l/@tuwaio/satellite-core.svg)](./LICENSE)
5
5
  [![Build Status](https://img.shields.io/github/actions/workflow/status/TuwaIO/satellite-connect/release.yml?branch=main)](https://github.com/TuwaIO/satellite-connect/actions)
6
6
 
7
- Core of the Satellite ecosystem for Web3 wallet interactions, providing a universal interface for connecting and interacting with various blockchain wallets.
7
+ Framework-agnostic type-safe state engine for tracking multi-chain connection lifecycles and active wallet sessions in the TUWA Ecosystem.
8
8
 
9
9
  ---
10
10
 
11
11
  ## 🏛️ What is `@tuwaio/satellite-core`?
12
12
 
13
- `@tuwaio/satellite-core` is the foundation package of the Satellite ecosystem, designed to unify Web3 wallet interactions. It provides a single interface for connecting and interacting with wallets across different blockchains (EVM, Solana).
13
+ `@tuwaio/satellite-core` represents the core state management and cryptographic identity mapping layer of the Satellite framework. It functions as a framework-agnostic state tracker keeping absolute synchronization between multi-chain provider events and unified application session layers.
14
14
 
15
- Built with TypeScript, it leverages modern tools for state management and type-safe development.
15
+ By employing Zustand and Immer, it operates as a type-safe state engine without direct UI bindings, establishing a clean separation of concerns.
16
16
 
17
17
  ---
18
18
 
19
- ## ✨ Key Features
19
+ ## ✨ Core Primitives
20
20
 
21
- - **Universal Interface:** Single API for interacting with different blockchain wallets
22
- - **Type Safety:** Full TypeScript support
23
- - **Modular Architecture:** Easy extension for new wallet types
24
- - **State Management:** Built-in connection state management system
25
- - **Multi-Wallet Support:** Manage multiple simultaneous wallet connections
26
- - **Bundle Optimization:** Efficient tree-shaking optimization
21
+ - **Cryptographic Identity Mapping:** Standardized session and address models across EVM and Solana chains.
22
+ - **Connection Orchestration:** Framework-agnostic lifecycle management for active sessions and protocol-level connections.
23
+ - **Type-Safe Session Store:** Deterministic and immutable state transitions powered by Zustand and Immer.
24
+ - **Provider Event Synchronization:** Real-time event watchers for network mutations, account switches, and disconnections.
25
+ - **Zero UI Coupling:** Fully headless execution designed to feed directly into bindings or custom interfaces.
27
26
 
28
27
  ---
29
28
 
package/dist/index.d.mts CHANGED
@@ -128,6 +128,8 @@ type ISatelliteConnectStore<C, W extends BaseConnector = BaseConnector> = {
128
128
  switchNetworkError?: TuwaErrorState;
129
129
  /** Clears network switch error state */
130
130
  resetSwitchNetworkError: () => void;
131
+ /** Updates store initialization parameters dynamically */
132
+ updateParameters: (parameters: SatelliteConnectStoreInitialParameters<C, W>) => void;
131
133
  };
132
134
  /**
133
135
  * Callback type for successful connections
@@ -150,6 +152,6 @@ type SatelliteConnectStoreInitialParameters<C, W extends BaseConnector = BaseCon
150
152
  *
151
153
  * @returns A Zustand store instance with connection state and methods
152
154
  */
153
- declare function createSatelliteConnectStore<C, W extends BaseConnector = BaseConnector>({ adapter, callbackAfterConnected, }: SatelliteConnectStoreInitialParameters<C, W>): zustand_vanilla.StoreApi<ISatelliteConnectStore<C, W>>;
155
+ declare function createSatelliteConnectStore<C, W extends BaseConnector = BaseConnector>(params: SatelliteConnectStoreInitialParameters<C, W>): zustand_vanilla.StoreApi<ISatelliteConnectStore<C, W>>;
154
156
 
155
157
  export { type BaseConnector, type ConnectedCallback, type Connector, type ConnectorsInitProps, type ISatelliteConnectStore, type SatelliteAdapter, type SatelliteConnectStoreInitialParameters, createSatelliteConnectStore };
package/dist/index.d.ts CHANGED
@@ -128,6 +128,8 @@ type ISatelliteConnectStore<C, W extends BaseConnector = BaseConnector> = {
128
128
  switchNetworkError?: TuwaErrorState;
129
129
  /** Clears network switch error state */
130
130
  resetSwitchNetworkError: () => void;
131
+ /** Updates store initialization parameters dynamically */
132
+ updateParameters: (parameters: SatelliteConnectStoreInitialParameters<C, W>) => void;
131
133
  };
132
134
  /**
133
135
  * Callback type for successful connections
@@ -150,6 +152,6 @@ type SatelliteConnectStoreInitialParameters<C, W extends BaseConnector = BaseCon
150
152
  *
151
153
  * @returns A Zustand store instance with connection state and methods
152
154
  */
153
- declare function createSatelliteConnectStore<C, W extends BaseConnector = BaseConnector>({ adapter, callbackAfterConnected, }: SatelliteConnectStoreInitialParameters<C, W>): zustand_vanilla.StoreApi<ISatelliteConnectStore<C, W>>;
155
+ declare function createSatelliteConnectStore<C, W extends BaseConnector = BaseConnector>(params: SatelliteConnectStoreInitialParameters<C, W>): zustand_vanilla.StoreApi<ISatelliteConnectStore<C, W>>;
154
156
 
155
157
  export { type BaseConnector, type ConnectedCallback, type Connector, type ConnectorsInitProps, type ISatelliteConnectStore, type SatelliteAdapter, type SatelliteConnectStoreInitialParameters, createSatelliteConnectStore };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- 'use strict';var orbitCore=require('@tuwaio/orbit-core'),immer=require('immer'),vanilla=require('zustand/vanilla');function b({adapter:f,callbackAfterConnected:v}){return immer.setAutoFreeze(false),vanilla.createStore()((i,t)=>({getAdapter:n=>orbitCore.selectAdapterByKey({adapter:f,adapterKey:n}),getConnectors:()=>{let n;return Array.isArray(f)?n=f.map(o=>o.getConnectors()):n=[f.getConnectors()],n.reduce((o,e)=>{let c=e.adapter,r=e.connectors;return {...o,[c]:r}},{})},initializeAutoConnect:async n=>{await orbitCore.delay(null,300),await t().disconnectAll();let o=Date.now()-10080*60*1e3;if(orbitCore.recentlyConnectedConnectorsListHelpers.removeConnectorsOlderThan(o),n){let e=orbitCore.lastConnectedConnectorHelpers.getLastConnectedConnector();e&&!["impersonatedwallet","walletconnect","coinbasewallet","bitgetwallet"].includes(e.connectorType.split(":")[1])&&(await orbitCore.delay(null,100),await t().connect({connectorType:e.connectorType,chainId:e.chainId}));}else if(orbitCore.isSafeApp){await orbitCore.delay(null,100);let e=t().getAdapter(orbitCore.OrbitAdapter.EVM);if(e&&e.getSafeConnectorChainId){let c=await e.getSafeConnectorChainId();c&&await t().connect({connectorType:`${orbitCore.OrbitAdapter.EVM}:safewallet`,chainId:c});}}},connecting:false,disconnecting:false,connectionError:void 0,switchNetworkError:void 0,activeConnection:void 0,connections:{},setConnectionError:n=>i({connectionError:n}),connect:async({connectorType:n,chainId:o})=>{i({connecting:true,connectionError:void 0});let e=t().getAdapter(orbitCore.getAdapterFromConnectorType(n));if(!e){i({connecting:false,connectionError:orbitCore.normalizeError(new Error(`No adapter found for connector type: ${n}`))});return}try{if(t().connections[n])return;let r=await e.connect({connectorType:n,chainId:o});if(i(s=>({activeConnection:r,connections:{...s.connections,[r.connectorType]:r}})),e.checkIsContractAddress){let s=await e.checkIsContractAddress({address:r.address,chainId:o});t().updateActiveConnection({...r,isContractAddress:s});}if(v){let s=t().activeConnection;s&&s.connectorType===n&&await v(s);}i({connecting:!1}),orbitCore.lastConnectedConnectorHelpers.setLastConnectedConnector({connectorType:n,chainId:o,address:t().activeConnection?.address});let a=t().activeConnection;a&&a.address&&orbitCore.recentlyConnectedConnectorsListHelpers.addConnector(a.connectorType,{address:a.address,disconnectedTimestamp:Date.now(),icon:a.icon});}catch(c){i({connecting:false,connectionError:orbitCore.normalizeError(c)});}},disconnect:async n=>{if(!t().disconnecting){i({disconnecting:true});try{if(n){let e=t(),c=e.connections[n];if(!c){console.warn(`No connection found for connector type: ${n}`);return}let r=t().getAdapter(orbitCore.getAdapterFromConnectorType(c.connectorType));if(r)try{await r.disconnect(c);}catch(d){console.error(`Failed to disconnect connector ${n}:`,d);}let a=e.activeConnection?.connectorType===n,s=Object.values(e.connections).filter(d=>d.connectorType!==n),l;if(a&&s.length>0){let d=s[0];try{let C=t().getAdapter(orbitCore.getAdapterFromConnectorType(d.connectorType));C?.switchConnection&&await C.switchConnection(d.connectorType),l=d;}catch(C){console.error("Failed to switch to remaining connector:",C),l=void 0;}}else a||(l=e.activeConnection);i(d=>immer.produce(d,C=>{delete C.connections[n],C.activeConnection=l,C.connectionError=void 0,C.switchNetworkError=void 0;}));}else await t().disconnectAll();let o=t();Object.keys(o.connections).length===0?(orbitCore.lastConnectedConnectorHelpers.removeLastConnectedConnector(),orbitCore.impersonatedHelpers.removeImpersonated()):o.activeConnection&&orbitCore.lastConnectedConnectorHelpers.setLastConnectedConnector({connectorType:o.activeConnection.connectorType,chainId:o.activeConnection.chainId,address:o.activeConnection.address});}catch(o){console.error("Disconnect operation failed:",o),i(e=>immer.produce(e,c=>{c.connectionError=orbitCore.normalizeError(o);}));}finally{i({disconnecting:false});}}},disconnectAll:async()=>{if(Array.isArray(f))await Promise.allSettled(f.map(async n=>{try{await n.disconnect();}catch{}}));else try{await f.disconnect();}catch{}i({activeConnection:void 0,connections:{},connectionError:void 0,switchNetworkError:void 0}),orbitCore.impersonatedHelpers.removeImpersonated();},resetConnectionError:()=>{i({connectionError:void 0});},updateActiveConnection:n=>{let o=t().activeConnection,e=n.connectorType??o?.connectorType;e?(n.chainId&&e===o?.connectorType&&orbitCore.lastConnectedConnectorHelpers.setLastConnectedConnector({connectorType:e,chainId:n.chainId,address:n.address??o?.address}),i(c=>immer.produce(c,r=>{let a=r.connections[e];if(a){let l={...a,...n};r.connections[e]=l,r.activeConnection?.connectorType===e&&(r.activeConnection=l);}}))):n.connectorType!==void 0&&n.chainId!==void 0&&n.address!==void 0?(orbitCore.lastConnectedConnectorHelpers.setLastConnectedConnector({connectorType:n.connectorType,chainId:n.chainId,address:n.address}),i(r=>{let a=n;return {activeConnection:a,connections:{...r.connections,[a.connectorType]:a}}})):console.warn("Attempted to set activeConnection with incomplete data while activeConnection was undefined.");},switchConnection:async n=>{let o=t().connections[n];if(!o){console.warn(`No connection found for connector type: ${n}`);return}if(t().activeConnection?.connectorType!==n)try{let e=t().getAdapter(orbitCore.getAdapterFromConnectorType(n));e?.switchConnection&&await e.switchConnection(n),i(c=>immer.produce(c,r=>{r.activeConnection=o;})),orbitCore.lastConnectedConnectorHelpers.setLastConnectedConnector({connectorType:o.connectorType,chainId:o.chainId,address:o.address});}catch(e){console.error("Failed to switch connection:",e);}},switchNetwork:async(n,o)=>{i({switchNetworkError:void 0});let e=o?t().connections[o]:t().activeConnection;if(e){let c=t().getAdapter(orbitCore.getAdapterFromConnectorType(e.connectorType));if(!c){i({switchNetworkError:orbitCore.normalizeError(new Error(`No adapter found for active connector type: ${e.connectorType}`))});return}try{await c.checkAndSwitchNetwork(n,e.chainId,t().updateActiveConnection);}catch(r){i({switchNetworkError:orbitCore.normalizeError(r)});}}},resetSwitchNetworkError:()=>i({switchNetworkError:void 0})}))}exports.createSatelliteConnectStore=b;
1
+ 'use strict';var orbitCore=require('@tuwaio/orbit-core'),immer=require('immer'),vanilla=require('zustand/vanilla');function L(T){return immer.setAutoFreeze(false),vanilla.createStore()((i,o)=>{let d=T;return {updateParameters:n=>{d=n;},getAdapter:n=>orbitCore.selectAdapterByKey({adapter:d.adapter,adapterKey:n}),getConnectors:()=>{let n;return Array.isArray(d.adapter)?n=d.adapter.map(t=>t.getConnectors()):n=[d.adapter.getConnectors()],n.reduce((t,e)=>{let c=e.adapter,r=e.connectors;return {...t,[c]:r}},{})},initializeAutoConnect:async n=>{await orbitCore.delay(null,300),await o().disconnectAll();let t=Date.now()-10080*60*1e3;if(orbitCore.recentlyConnectedConnectorsListHelpers.removeConnectorsOlderThan(t),n){let e=orbitCore.lastConnectedConnectorHelpers.getLastConnectedConnector();e&&!["impersonatedwallet","walletconnect","coinbasewallet","bitgetwallet"].includes(e.connectorType.split(":")[1])&&(await orbitCore.delay(null,100),await o().connect({connectorType:e.connectorType,chainId:e.chainId}));}else if(orbitCore.isSafeApp){await orbitCore.delay(null,100);let e=o().getAdapter(orbitCore.OrbitAdapter.EVM);if(e&&e.getSafeConnectorChainId){let c=await e.getSafeConnectorChainId();c&&await o().connect({connectorType:`${orbitCore.OrbitAdapter.EVM}:safewallet`,chainId:c});}}},connecting:false,disconnecting:false,connectionError:void 0,switchNetworkError:void 0,activeConnection:void 0,connections:{},setConnectionError:n=>i({connectionError:n}),connect:async({connectorType:n,chainId:t})=>{i({connecting:true,connectionError:void 0});let e=o().getAdapter(orbitCore.getAdapterFromConnectorType(n));if(!e){i({connecting:false,connectionError:orbitCore.normalizeError(new Error(`No adapter found for connector type: ${n}`))});return}try{if(o().connections[n])return;let r=await e.connect({connectorType:n,chainId:t});if(i(s=>({activeConnection:r,connections:{...s.connections,[r.connectorType]:r}})),e.checkIsContractAddress){let s=await e.checkIsContractAddress({address:r.address,chainId:t});o().updateActiveConnection({...r,isContractAddress:s});}if(d.callbackAfterConnected){let s=o().activeConnection;s&&s.connectorType===n&&await d.callbackAfterConnected(s);}i({connecting:!1}),orbitCore.lastConnectedConnectorHelpers.setLastConnectedConnector({connectorType:n,chainId:t,address:o().activeConnection?.address});let a=o().activeConnection;a&&a.address&&orbitCore.recentlyConnectedConnectorsListHelpers.addConnector(a.connectorType,{address:a.address,disconnectedTimestamp:Date.now(),icon:a.icon});}catch(c){i({connecting:false,connectionError:orbitCore.normalizeError(c)});}},disconnect:async n=>{if(!o().disconnecting){i({disconnecting:true});try{if(n){let e=o(),c=e.connections[n];if(!c){console.warn(`No connection found for connector type: ${n}`);return}let r=o().getAdapter(orbitCore.getAdapterFromConnectorType(c.connectorType));if(r)try{await r.disconnect(c);}catch(C){console.error(`Failed to disconnect connector ${n}:`,C);}let a=e.activeConnection?.connectorType===n,s=Object.values(e.connections).filter(C=>C.connectorType!==n),f;if(a&&s.length>0){let C=s[0];try{let l=o().getAdapter(orbitCore.getAdapterFromConnectorType(C.connectorType));l?.switchConnection&&await l.switchConnection(C.connectorType),f=C;}catch(l){console.error("Failed to switch to remaining connector:",l),f=void 0;}}else a||(f=e.activeConnection);i(C=>immer.produce(C,l=>{delete l.connections[n],l.activeConnection=f,l.connectionError=void 0,l.switchNetworkError=void 0;}));}else await o().disconnectAll();let t=o();Object.keys(t.connections).length===0?(orbitCore.lastConnectedConnectorHelpers.removeLastConnectedConnector(),orbitCore.impersonatedHelpers.removeImpersonated()):t.activeConnection&&orbitCore.lastConnectedConnectorHelpers.setLastConnectedConnector({connectorType:t.activeConnection.connectorType,chainId:t.activeConnection.chainId,address:t.activeConnection.address});}catch(t){console.error("Disconnect operation failed:",t),i(e=>immer.produce(e,c=>{c.connectionError=orbitCore.normalizeError(t);}));}finally{i({disconnecting:false});}}},disconnectAll:async()=>{if(Array.isArray(d.adapter))await Promise.allSettled(d.adapter.map(async n=>{try{await n.disconnect();}catch{}}));else try{await d.adapter.disconnect();}catch{}i({activeConnection:void 0,connections:{},connectionError:void 0,switchNetworkError:void 0}),orbitCore.impersonatedHelpers.removeImpersonated();},resetConnectionError:()=>{i({connectionError:void 0});},updateActiveConnection:n=>{let t=o().activeConnection,e=n.connectorType??t?.connectorType;e?(n.chainId&&e===t?.connectorType&&orbitCore.lastConnectedConnectorHelpers.setLastConnectedConnector({connectorType:e,chainId:n.chainId,address:n.address??t?.address}),i(c=>immer.produce(c,r=>{let a=r.connections[e];if(a){let f={...a,...n};r.connections[e]=f,r.activeConnection?.connectorType===e&&(r.activeConnection=f);}}))):n.connectorType!==void 0&&n.chainId!==void 0&&n.address!==void 0?(orbitCore.lastConnectedConnectorHelpers.setLastConnectedConnector({connectorType:n.connectorType,chainId:n.chainId,address:n.address}),i(r=>{let a=n;return {activeConnection:a,connections:{...r.connections,[a.connectorType]:a}}})):console.warn("Attempted to set activeConnection with incomplete data while activeConnection was undefined.");},switchConnection:async n=>{let t=o().connections[n];if(!t){console.warn(`No connection found for connector type: ${n}`);return}if(o().activeConnection?.connectorType!==n)try{let e=o().getAdapter(orbitCore.getAdapterFromConnectorType(n));e?.switchConnection&&await e.switchConnection(n),i(c=>immer.produce(c,r=>{r.activeConnection=t;})),orbitCore.lastConnectedConnectorHelpers.setLastConnectedConnector({connectorType:t.connectorType,chainId:t.chainId,address:t.address});}catch(e){console.error("Failed to switch connection:",e);}},switchNetwork:async(n,t)=>{i({switchNetworkError:void 0});let e=t?o().connections[t]:o().activeConnection;if(e){let c=o().getAdapter(orbitCore.getAdapterFromConnectorType(e.connectorType));if(!c){i({switchNetworkError:orbitCore.normalizeError(new Error(`No adapter found for active connector type: ${e.connectorType}`))});return}try{await c.checkAndSwitchNetwork(n,e.chainId,o().updateActiveConnection);}catch(r){i({switchNetworkError:orbitCore.normalizeError(r)});}}},resetSwitchNetworkError:()=>i({switchNetworkError:void 0})}})}exports.createSatelliteConnectStore=L;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import {getAdapterFromConnectorType,normalizeError,lastConnectedConnectorHelpers,impersonatedHelpers,recentlyConnectedConnectorsListHelpers,delay,isSafeApp,OrbitAdapter,selectAdapterByKey}from'@tuwaio/orbit-core';import {setAutoFreeze,produce}from'immer';import {createStore}from'zustand/vanilla';function b({adapter:f,callbackAfterConnected:v}){return setAutoFreeze(false),createStore()((i,t)=>({getAdapter:n=>selectAdapterByKey({adapter:f,adapterKey:n}),getConnectors:()=>{let n;return Array.isArray(f)?n=f.map(o=>o.getConnectors()):n=[f.getConnectors()],n.reduce((o,e)=>{let c=e.adapter,r=e.connectors;return {...o,[c]:r}},{})},initializeAutoConnect:async n=>{await delay(null,300),await t().disconnectAll();let o=Date.now()-10080*60*1e3;if(recentlyConnectedConnectorsListHelpers.removeConnectorsOlderThan(o),n){let e=lastConnectedConnectorHelpers.getLastConnectedConnector();e&&!["impersonatedwallet","walletconnect","coinbasewallet","bitgetwallet"].includes(e.connectorType.split(":")[1])&&(await delay(null,100),await t().connect({connectorType:e.connectorType,chainId:e.chainId}));}else if(isSafeApp){await delay(null,100);let e=t().getAdapter(OrbitAdapter.EVM);if(e&&e.getSafeConnectorChainId){let c=await e.getSafeConnectorChainId();c&&await t().connect({connectorType:`${OrbitAdapter.EVM}:safewallet`,chainId:c});}}},connecting:false,disconnecting:false,connectionError:void 0,switchNetworkError:void 0,activeConnection:void 0,connections:{},setConnectionError:n=>i({connectionError:n}),connect:async({connectorType:n,chainId:o})=>{i({connecting:true,connectionError:void 0});let e=t().getAdapter(getAdapterFromConnectorType(n));if(!e){i({connecting:false,connectionError:normalizeError(new Error(`No adapter found for connector type: ${n}`))});return}try{if(t().connections[n])return;let r=await e.connect({connectorType:n,chainId:o});if(i(s=>({activeConnection:r,connections:{...s.connections,[r.connectorType]:r}})),e.checkIsContractAddress){let s=await e.checkIsContractAddress({address:r.address,chainId:o});t().updateActiveConnection({...r,isContractAddress:s});}if(v){let s=t().activeConnection;s&&s.connectorType===n&&await v(s);}i({connecting:!1}),lastConnectedConnectorHelpers.setLastConnectedConnector({connectorType:n,chainId:o,address:t().activeConnection?.address});let a=t().activeConnection;a&&a.address&&recentlyConnectedConnectorsListHelpers.addConnector(a.connectorType,{address:a.address,disconnectedTimestamp:Date.now(),icon:a.icon});}catch(c){i({connecting:false,connectionError:normalizeError(c)});}},disconnect:async n=>{if(!t().disconnecting){i({disconnecting:true});try{if(n){let e=t(),c=e.connections[n];if(!c){console.warn(`No connection found for connector type: ${n}`);return}let r=t().getAdapter(getAdapterFromConnectorType(c.connectorType));if(r)try{await r.disconnect(c);}catch(d){console.error(`Failed to disconnect connector ${n}:`,d);}let a=e.activeConnection?.connectorType===n,s=Object.values(e.connections).filter(d=>d.connectorType!==n),l;if(a&&s.length>0){let d=s[0];try{let C=t().getAdapter(getAdapterFromConnectorType(d.connectorType));C?.switchConnection&&await C.switchConnection(d.connectorType),l=d;}catch(C){console.error("Failed to switch to remaining connector:",C),l=void 0;}}else a||(l=e.activeConnection);i(d=>produce(d,C=>{delete C.connections[n],C.activeConnection=l,C.connectionError=void 0,C.switchNetworkError=void 0;}));}else await t().disconnectAll();let o=t();Object.keys(o.connections).length===0?(lastConnectedConnectorHelpers.removeLastConnectedConnector(),impersonatedHelpers.removeImpersonated()):o.activeConnection&&lastConnectedConnectorHelpers.setLastConnectedConnector({connectorType:o.activeConnection.connectorType,chainId:o.activeConnection.chainId,address:o.activeConnection.address});}catch(o){console.error("Disconnect operation failed:",o),i(e=>produce(e,c=>{c.connectionError=normalizeError(o);}));}finally{i({disconnecting:false});}}},disconnectAll:async()=>{if(Array.isArray(f))await Promise.allSettled(f.map(async n=>{try{await n.disconnect();}catch{}}));else try{await f.disconnect();}catch{}i({activeConnection:void 0,connections:{},connectionError:void 0,switchNetworkError:void 0}),impersonatedHelpers.removeImpersonated();},resetConnectionError:()=>{i({connectionError:void 0});},updateActiveConnection:n=>{let o=t().activeConnection,e=n.connectorType??o?.connectorType;e?(n.chainId&&e===o?.connectorType&&lastConnectedConnectorHelpers.setLastConnectedConnector({connectorType:e,chainId:n.chainId,address:n.address??o?.address}),i(c=>produce(c,r=>{let a=r.connections[e];if(a){let l={...a,...n};r.connections[e]=l,r.activeConnection?.connectorType===e&&(r.activeConnection=l);}}))):n.connectorType!==void 0&&n.chainId!==void 0&&n.address!==void 0?(lastConnectedConnectorHelpers.setLastConnectedConnector({connectorType:n.connectorType,chainId:n.chainId,address:n.address}),i(r=>{let a=n;return {activeConnection:a,connections:{...r.connections,[a.connectorType]:a}}})):console.warn("Attempted to set activeConnection with incomplete data while activeConnection was undefined.");},switchConnection:async n=>{let o=t().connections[n];if(!o){console.warn(`No connection found for connector type: ${n}`);return}if(t().activeConnection?.connectorType!==n)try{let e=t().getAdapter(getAdapterFromConnectorType(n));e?.switchConnection&&await e.switchConnection(n),i(c=>produce(c,r=>{r.activeConnection=o;})),lastConnectedConnectorHelpers.setLastConnectedConnector({connectorType:o.connectorType,chainId:o.chainId,address:o.address});}catch(e){console.error("Failed to switch connection:",e);}},switchNetwork:async(n,o)=>{i({switchNetworkError:void 0});let e=o?t().connections[o]:t().activeConnection;if(e){let c=t().getAdapter(getAdapterFromConnectorType(e.connectorType));if(!c){i({switchNetworkError:normalizeError(new Error(`No adapter found for active connector type: ${e.connectorType}`))});return}try{await c.checkAndSwitchNetwork(n,e.chainId,t().updateActiveConnection);}catch(r){i({switchNetworkError:normalizeError(r)});}}},resetSwitchNetworkError:()=>i({switchNetworkError:void 0})}))}export{b as createSatelliteConnectStore};
1
+ import {getAdapterFromConnectorType,normalizeError,lastConnectedConnectorHelpers,impersonatedHelpers,recentlyConnectedConnectorsListHelpers,delay,isSafeApp,OrbitAdapter,selectAdapterByKey}from'@tuwaio/orbit-core';import {setAutoFreeze,produce}from'immer';import {createStore}from'zustand/vanilla';function L(T){return setAutoFreeze(false),createStore()((i,o)=>{let d=T;return {updateParameters:n=>{d=n;},getAdapter:n=>selectAdapterByKey({adapter:d.adapter,adapterKey:n}),getConnectors:()=>{let n;return Array.isArray(d.adapter)?n=d.adapter.map(t=>t.getConnectors()):n=[d.adapter.getConnectors()],n.reduce((t,e)=>{let c=e.adapter,r=e.connectors;return {...t,[c]:r}},{})},initializeAutoConnect:async n=>{await delay(null,300),await o().disconnectAll();let t=Date.now()-10080*60*1e3;if(recentlyConnectedConnectorsListHelpers.removeConnectorsOlderThan(t),n){let e=lastConnectedConnectorHelpers.getLastConnectedConnector();e&&!["impersonatedwallet","walletconnect","coinbasewallet","bitgetwallet"].includes(e.connectorType.split(":")[1])&&(await delay(null,100),await o().connect({connectorType:e.connectorType,chainId:e.chainId}));}else if(isSafeApp){await delay(null,100);let e=o().getAdapter(OrbitAdapter.EVM);if(e&&e.getSafeConnectorChainId){let c=await e.getSafeConnectorChainId();c&&await o().connect({connectorType:`${OrbitAdapter.EVM}:safewallet`,chainId:c});}}},connecting:false,disconnecting:false,connectionError:void 0,switchNetworkError:void 0,activeConnection:void 0,connections:{},setConnectionError:n=>i({connectionError:n}),connect:async({connectorType:n,chainId:t})=>{i({connecting:true,connectionError:void 0});let e=o().getAdapter(getAdapterFromConnectorType(n));if(!e){i({connecting:false,connectionError:normalizeError(new Error(`No adapter found for connector type: ${n}`))});return}try{if(o().connections[n])return;let r=await e.connect({connectorType:n,chainId:t});if(i(s=>({activeConnection:r,connections:{...s.connections,[r.connectorType]:r}})),e.checkIsContractAddress){let s=await e.checkIsContractAddress({address:r.address,chainId:t});o().updateActiveConnection({...r,isContractAddress:s});}if(d.callbackAfterConnected){let s=o().activeConnection;s&&s.connectorType===n&&await d.callbackAfterConnected(s);}i({connecting:!1}),lastConnectedConnectorHelpers.setLastConnectedConnector({connectorType:n,chainId:t,address:o().activeConnection?.address});let a=o().activeConnection;a&&a.address&&recentlyConnectedConnectorsListHelpers.addConnector(a.connectorType,{address:a.address,disconnectedTimestamp:Date.now(),icon:a.icon});}catch(c){i({connecting:false,connectionError:normalizeError(c)});}},disconnect:async n=>{if(!o().disconnecting){i({disconnecting:true});try{if(n){let e=o(),c=e.connections[n];if(!c){console.warn(`No connection found for connector type: ${n}`);return}let r=o().getAdapter(getAdapterFromConnectorType(c.connectorType));if(r)try{await r.disconnect(c);}catch(C){console.error(`Failed to disconnect connector ${n}:`,C);}let a=e.activeConnection?.connectorType===n,s=Object.values(e.connections).filter(C=>C.connectorType!==n),f;if(a&&s.length>0){let C=s[0];try{let l=o().getAdapter(getAdapterFromConnectorType(C.connectorType));l?.switchConnection&&await l.switchConnection(C.connectorType),f=C;}catch(l){console.error("Failed to switch to remaining connector:",l),f=void 0;}}else a||(f=e.activeConnection);i(C=>produce(C,l=>{delete l.connections[n],l.activeConnection=f,l.connectionError=void 0,l.switchNetworkError=void 0;}));}else await o().disconnectAll();let t=o();Object.keys(t.connections).length===0?(lastConnectedConnectorHelpers.removeLastConnectedConnector(),impersonatedHelpers.removeImpersonated()):t.activeConnection&&lastConnectedConnectorHelpers.setLastConnectedConnector({connectorType:t.activeConnection.connectorType,chainId:t.activeConnection.chainId,address:t.activeConnection.address});}catch(t){console.error("Disconnect operation failed:",t),i(e=>produce(e,c=>{c.connectionError=normalizeError(t);}));}finally{i({disconnecting:false});}}},disconnectAll:async()=>{if(Array.isArray(d.adapter))await Promise.allSettled(d.adapter.map(async n=>{try{await n.disconnect();}catch{}}));else try{await d.adapter.disconnect();}catch{}i({activeConnection:void 0,connections:{},connectionError:void 0,switchNetworkError:void 0}),impersonatedHelpers.removeImpersonated();},resetConnectionError:()=>{i({connectionError:void 0});},updateActiveConnection:n=>{let t=o().activeConnection,e=n.connectorType??t?.connectorType;e?(n.chainId&&e===t?.connectorType&&lastConnectedConnectorHelpers.setLastConnectedConnector({connectorType:e,chainId:n.chainId,address:n.address??t?.address}),i(c=>produce(c,r=>{let a=r.connections[e];if(a){let f={...a,...n};r.connections[e]=f,r.activeConnection?.connectorType===e&&(r.activeConnection=f);}}))):n.connectorType!==void 0&&n.chainId!==void 0&&n.address!==void 0?(lastConnectedConnectorHelpers.setLastConnectedConnector({connectorType:n.connectorType,chainId:n.chainId,address:n.address}),i(r=>{let a=n;return {activeConnection:a,connections:{...r.connections,[a.connectorType]:a}}})):console.warn("Attempted to set activeConnection with incomplete data while activeConnection was undefined.");},switchConnection:async n=>{let t=o().connections[n];if(!t){console.warn(`No connection found for connector type: ${n}`);return}if(o().activeConnection?.connectorType!==n)try{let e=o().getAdapter(getAdapterFromConnectorType(n));e?.switchConnection&&await e.switchConnection(n),i(c=>produce(c,r=>{r.activeConnection=t;})),lastConnectedConnectorHelpers.setLastConnectedConnector({connectorType:t.connectorType,chainId:t.chainId,address:t.address});}catch(e){console.error("Failed to switch connection:",e);}},switchNetwork:async(n,t)=>{i({switchNetworkError:void 0});let e=t?o().connections[t]:o().activeConnection;if(e){let c=o().getAdapter(getAdapterFromConnectorType(e.connectorType));if(!c){i({switchNetworkError:normalizeError(new Error(`No adapter found for active connector type: ${e.connectorType}`))});return}try{await c.checkAndSwitchNetwork(n,e.chainId,o().updateActiveConnection);}catch(r){i({switchNetworkError:normalizeError(r)});}}},resetSwitchNetworkError:()=>i({switchNetworkError:void 0})}})}export{L as createSatelliteConnectStore};
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@tuwaio/satellite-core",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "private": false,
5
5
  "author": "Oleksandr Tkach",
6
6
  "license": "Apache-2.0",
7
- "description": "Core of the Satellite ecosystem for Web3 wallet interactions, providing a universal interface for connecting and interacting with various blockchain wallets.",
7
+ "description": "Tier 3 of the TUWA Ecosystem. Framework-agnostic core state store for tracking multi-chain connection lifecycles and active wallet sessions.",
8
8
  "main": "./dist/index.js",
9
9
  "module": "./dist/index.mjs",
10
10
  "types": "./dist/index.d.ts",
@@ -45,11 +45,11 @@
45
45
  "zustand": "5.x.x"
46
46
  },
47
47
  "devDependencies": {
48
- "@tuwaio/orbit-core": "^0.2.8",
49
- "immer": "^11.1.4",
48
+ "@tuwaio/orbit-core": "^0.2.12",
49
+ "immer": "^11.1.8",
50
50
  "tsup": "^8.5.1",
51
51
  "typescript": "^6.0.3",
52
- "zustand": "^5.0.12"
52
+ "zustand": "^5.0.14"
53
53
  },
54
54
  "scripts": {
55
55
  "start": "tsup src/index.ts --watch",