diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..564cff9c --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,10 @@ + + + + \ No newline at end of file diff --git a/docs/assets/navigation.js b/docs/assets/navigation.js index 8ae717a1..c41601c8 100644 --- a/docs/assets/navigation.js +++ b/docs/assets/navigation.js @@ -1 +1 @@ -window.navigationData = "data:application/octet-stream;base64,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" \ No newline at end of file +window.navigationData = "data:application/octet-stream;base64,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" \ No newline at end of file diff --git a/docs/assets/search.js b/docs/assets/search.js index 65949740..0d643a43 100644 --- a/docs/assets/search.js +++ b/docs/assets/search.js @@ -1 +1 @@ -window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file +window.searchData = "data:application/octet-stream;base64,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"; \ No newline at end of file diff --git a/docs/classes/ClientHandler.html b/docs/classes/ClientHandler.html index cb975455..9a934bf7 100644 --- a/docs/classes/ClientHandler.html +++ b/docs/classes/ClientHandler.html @@ -1,4 +1,4 @@ -ClientHandler | @jackallabs/jackal.js

Implements

Constructors

constructor +ClientHandler | @jackallabs/jackal.js

Implements

Constructors

  • Parameters

    • jklQuery: TJackalQueryClient
    • hostQuery: THostQueryClient
    • jklSigner: null | TJackalSigningClient
    • hostSigner: null | THostSigningClient
    • jklAddress: string
    • hostAddress: string
    • jklChainId: string
    • hostChainId: string
    • proofWindow: number
    • selectedWallet: string
    • details: IWalletDetails
    • networks: TSockets[]
    • gasMultiplier: number

    Returns ClientHandler

Properties

gasMultiplier: number
hostAddress: string
hostChainId: string
hostQuery: THostQueryClient
hostSigner: null | THostSigningClient
jklAddress: string
jklChainId: string
jklQuery: TJackalQueryClient
jklSigner: null | TJackalSigningClient
myContractAddress: null | string
myCosmwasm: null | IWasmHandler
myIcaAddress: null | string
networks: TSockets[]
proofWindow: number
selectedWallet: string

Methods

  • Retrieve asymmetric keypair public key from chain for specified jkl address.

    +

Constructors

  • Parameters

    • jklQuery: TJackalQueryClient
    • hostQuery: THostQueryClient
    • jklSigner: null | TJackalSigningClient
    • hostSigner: null | THostSigningClient
    • jklAddress: string
    • hostAddress: string
    • jklChainId: string
    • hostChainId: string
    • proofWindow: number
    • selectedWallet: string
    • details: IWalletDetails
    • networks: TSockets[]
    • gasMultiplier: number

    Returns ClientHandler

Properties

gasMultiplier: number
hostAddress: string
hostChainId: string
hostQuery: THostQueryClient
hostSigner: null | THostSigningClient
jklAddress: string
jklChainId: string
jklQuery: TJackalQueryClient
jklSigner: null | TJackalSigningClient
myContractAddress: null | string
myCosmwasm: null | IWasmHandler
myIcaAddress: null | string
networks: TSockets[]
proofWindow: number
selectedWallet: string

Methods

  • Retrieve asymmetric keypair public key from chain for specified jkl address.

    Parameters

    • address: string

      Jkl address to check.

    Returns Promise<string>

    • Target address' public key as hex value.
    -
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/classes/EncodingHandler.html b/docs/classes/EncodingHandler.html new file mode 100644 index 00000000..66aaaedd --- /dev/null +++ b/docs/classes/EncodingHandler.html @@ -0,0 +1,50 @@ +EncodingHandler | @jackallabs/jackal.js

Hierarchy (view full)

Constructors

Properties

hostAddress: string
hostSigner: THostSigningClient
jackalClient: IClientHandler
jackalSigner: TJackalSigningClient
jklAddress: string
proofInterval: number

Methods

  • Protected

    Parameters

    • contractAddress: string
    • execMsg: EncodeObject

    Returns EncodeObject

  • Protected

    Parameters

    • ulid: string
    • addViewers: string[]
    • removeViewers: string[]

    Returns Promise<EncodeObject>

  • Protected

    Parameters

    • ulid: string
    • link: string

    Returns Promise<EncodeObject>

  • Protected

    Parameters

    • ulid: string
    • index: number
    • addViewers: string[]
    • removeViewers: string[]

    Returns Promise<EncodeObject>

  • Protected

    Parameters

    • connectionIdA: string
    • connectionIdB: string
    • codeId: number
    • label: string

    Returns EncodeObject

  • Protected

    Parameters

    • contractAddress: string
    • execs: EncodeObject | EncodeObject[]

    Returns EncodeObject[]

\ No newline at end of file diff --git a/docs/classes/FileMetaHandler.html b/docs/classes/FileMetaHandler.html new file mode 100644 index 00000000..62f2c4bb --- /dev/null +++ b/docs/classes/FileMetaHandler.html @@ -0,0 +1,24 @@ +FileMetaHandler | @jackallabs/jackal.js

Implements

Constructors

Properties

description: string
fileMeta: IFileMeta
location: string
merkleHex: string
merkleMem: string
merkleRoot: Uint8Array
refIndex: number
sharerCount: number
thumbnail: string
ulid: string

Methods

\ No newline at end of file diff --git a/docs/classes/FiletreeReader.html b/docs/classes/FiletreeReader.html new file mode 100644 index 00000000..0770d6cd --- /dev/null +++ b/docs/classes/FiletreeReader.html @@ -0,0 +1,129 @@ +FiletreeReader | @jackallabs/jackal.js

Implements

Constructors

Properties

clientAddress: string
conversionQueue: string[]
defaultKeyPair: PrivateKey
directoriesByUlid: Record<string, Record<string, IChildMetaDataMap>>
directoryLeaves: Record<string, Record<string, IChildMetaDataMap>>
jackalClient: IClientHandler
jackalSigner: TJackalSigningClient
keyPair: PrivateKey
legacyMetaLeaves: Record<string, ILegacyFolderMetaData>
nullConversions: string[]
refCounts: Record<string, number>
sharerCounts: Record<string, number>
sharerRefs: Record<string, Record<string, number>>
sharers: Record<string, IFolderMetaData>
sharingLeaves: Record<string, IShareMetaData[]>
ulidLeaves: Record<string, Record<string, string>>
viewerLeaves: Record<string, Record<string, string>>
viewerShares: Record<string, string[]>
yellowpages: Record<string, Record<string, QueryFile>>

Methods

  • Protected

    Parameters

    • data: Files
    • isPublic: boolean
    • Optional linkKey: string

    Returns Promise<boolean>

  • Protected

    Parameters

    • trackingNumber: string
    • Optional editors: string[] = []

    Returns Promise<string>

  • Protected

    Parameters

    • path: string
    • ownerAddress: string
    • lookup: QueryFile
    • Optional linkKey: string

    Returns Promise<void>

  • Protected

    Parameters

    • path: string
    • ownerAddress: string
    • pointsTo: string

    Returns Promise<void>

  • Protected

    Parameters

    • path: string
    • ownerAddress: string
    • index: number
    • Optional linkKey: string

    Returns Promise<void>

  • Protected

    Parameters

    • path: string
    • ulid: string
    • Optional ownerAddress: string

    Returns void

  • Look up Filetree ulid by path.

    +

    Parameters

    • path: string

      Path of resource.

      +
    • Optional owner: string

      Optional owner in case of 3rd party owner.

      +

    Returns string

      +
    • Found ulid.
    • +
    +
\ No newline at end of file diff --git a/docs/classes/FolderMetaHandler.html b/docs/classes/FolderMetaHandler.html new file mode 100644 index 00000000..a4b0221e --- /dev/null +++ b/docs/classes/FolderMetaHandler.html @@ -0,0 +1,24 @@ +FolderMetaHandler | @jackallabs/jackal.js

Implements

Constructors

Properties

count: number
description: string
location: string
refIndex: number
sharerCount: number
ulid: string
whoAmI: string

Methods

\ No newline at end of file diff --git a/docs/classes/MnemonicSigner.html b/docs/classes/MnemonicSigner.html new file mode 100644 index 00000000..8f57b633 --- /dev/null +++ b/docs/classes/MnemonicSigner.html @@ -0,0 +1,7 @@ +MnemonicSigner | @jackallabs/jackal.js

Implements

Constructors

Properties

aminoSigner: OfflineAminoSigner
directSigner: OfflineDirectSigner

Methods

\ No newline at end of file diff --git a/docs/classes/MnemonicWallet.html b/docs/classes/MnemonicWallet.html index c671bb2d..b7446f3f 100644 --- a/docs/classes/MnemonicWallet.html +++ b/docs/classes/MnemonicWallet.html @@ -1,4 +1,4 @@ -MnemonicWallet | @jackallabs/jackal.js

Implements

Constructors

constructor +MnemonicWallet | @jackallabs/jackal.js

Implements

Constructors

Properties

Methods

getAddress @@ -6,16 +6,16 @@ signArbitrary init

Constructors

Properties

address: string
mergedSigner: TMergedSigner

Methods

Properties

address: string
mergedSigner: TMergedSigner

Methods

  • Generate signature used by ClientHandler to create session.

    Parameters

    • message: string

      Value to use as signature base.

    Returns Promise<StdSignature>

    • Resulting AminoSignResponse.signature.
    -
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/classes/NullMetaHandler.html b/docs/classes/NullMetaHandler.html new file mode 100644 index 00000000..158718e2 --- /dev/null +++ b/docs/classes/NullMetaHandler.html @@ -0,0 +1,14 @@ +NullMetaHandler | @jackallabs/jackal.js

Implements

Constructors

Properties

location: string
refIndex: number
ulid: string

Methods

\ No newline at end of file diff --git a/docs/classes/OracleHandler.html b/docs/classes/OracleHandler.html index 2af3aebe..2c9259d1 100644 --- a/docs/classes/OracleHandler.html +++ b/docs/classes/OracleHandler.html @@ -1,4 +1,4 @@ -OracleHandler | @jackallabs/jackal.js

Implements

Constructors

constructor +OracleHandler | @jackallabs/jackal.js

Implements

Constructors

Properties

Methods

Constructors

Properties

jackalClient: IClientHandler
signingClient: null | TJackalSigningClient

Methods

  • Create new oracle feed.

    +

Constructors

Properties

jackalClient: IClientHandler
signingClient: null | TJackalSigningClient

Methods

  • Retrieve data of all on-chain oracles.

    +

Returns Promise<DeliverTxResponse>

Returns Promise<TQueryAllFeedsResponseStrict>

Returns Promise<MFeed>

Returns EncodeObject

Returns EncodeObject

Returns Promise<DeliverTxResponse>

\ No newline at end of file +
\ No newline at end of file diff --git a/docs/classes/RnsHandler.html b/docs/classes/RnsHandler.html index 294a50df..538120d3 100644 --- a/docs/classes/RnsHandler.html +++ b/docs/classes/RnsHandler.html @@ -1,4 +1,4 @@ -RnsHandler | @jackallabs/jackal.js

Implements

Constructors

constructor +RnsHandler | @jackallabs/jackal.js

Implements

Constructors

Properties

jackalClient: IClientHandler
signingClient: null | TJackalSigningClient

Methods

  • Get all RNS names registered to user.

    +

Constructors

Properties

jackalClient: IClientHandler
signingClient: null | TJackalSigningClient

Methods

  • Get all RNS names registered to user.

    Parameters

    • Optional pagination: IPageRequest

      Optional values to fetch more than first 100 results.

    Returns Promise<TQueryListOwnedNamesResponseStrict>

    • Pagination and array of DName.
    -
  • Finds all currently registered RNS names.

    Parameters

    • Optional pagination: IPageRequest

      Optional values to fetch more than first 100 results.

    Returns Promise<TQueryAllNamesResponseStrict>

    • Pagination and array of DName.
    -
  • Get all RNS names registered to target address.

    +

Returns Promise<TQueryAllForSaleResponseStrict>

Returns Promise<Bids>

Returns Promise<TQueryAllBidsResponseStrict>

Returns Promise<Names>

Returns Promise<Forsale>

Returns Promise<Names>

Returns EncodeObject

Returns EncodeObject

Returns EncodeObject

Returns EncodeObject

Returns EncodeObject

Returns EncodeObject

Returns EncodeObject

Returns EncodeObject

Returns EncodeObject

Returns EncodeObject

Returns EncodeObject

Returns EncodeObject

\ No newline at end of file +
\ No newline at end of file diff --git a/docs/classes/RnsMetaHandler.html b/docs/classes/RnsMetaHandler.html new file mode 100644 index 00000000..16fe52ad --- /dev/null +++ b/docs/classes/RnsMetaHandler.html @@ -0,0 +1,12 @@ +RnsMetaHandler | @jackallabs/jackal.js

Implements

Constructors

Properties

avatar: string
bio: string
discord: string
extensions: any
telegram: string
thumbnail: string
twitter: string
website: string

Methods

\ No newline at end of file diff --git a/docs/classes/ShareMetaHandler.html b/docs/classes/ShareMetaHandler.html new file mode 100644 index 00000000..d8c72f25 --- /dev/null +++ b/docs/classes/ShareMetaHandler.html @@ -0,0 +1,19 @@ +ShareMetaHandler | @jackallabs/jackal.js

Implements

Constructors

Properties

isFile: boolean
location: string
name: string
owner: string
pointsTo: string
received: number
refIndex: number
ulid: string

Methods

\ No newline at end of file diff --git a/docs/classes/SharerMetaHandler.html b/docs/classes/SharerMetaHandler.html new file mode 100644 index 00000000..3980817b --- /dev/null +++ b/docs/classes/SharerMetaHandler.html @@ -0,0 +1,15 @@ +SharerMetaHandler | @jackallabs/jackal.js

Implements

Constructors

Properties

location: string
refIndex: number
sharer: string
ulid: string
when: number

Methods

\ No newline at end of file diff --git a/docs/classes/StorageHandler.html b/docs/classes/StorageHandler.html index 12d1767c..caa35596 100644 --- a/docs/classes/StorageHandler.html +++ b/docs/classes/StorageHandler.html @@ -1,4 +1,4 @@ -StorageHandler | @jackallabs/jackal.js

Hierarchy

  • EncodingHandler
    • StorageHandler

Implements

Constructors

constructor +StorageHandler | @jackallabs/jackal.js

Hierarchy (view full)

Implements

Constructors

Properties

Methods

assembleLocation @@ -24,27 +25,40 @@ beforeUnloadHandler buildConversion buyStoragePlan +checkAndInitSharing +checkAndUpcycle +checkIfUpcycle checkLocked checkNotifications +checkSharedTo cleanShutdown +clonePkgToMsgs +cloneShares +cloneUpload convert createExpiresValue createFolders deleteTargets +downloadByUlid downloadExternalFile downloadFile +downloadStaging encodeCreateNotification +encodeDeleteNotification encodeExecuteContract encodeFileTreeBaseFolder encodeFileTreeFile encodeFileTreeFileShare +encodeFileTreeFileShareLink encodeFileTreeFolder encodeFileTreeNull encodeFileTreeRef +encodeFileTreeRefShare encodeFileTreeShared -encodeFileTreeSharedFolder +encodeFileTreeSharerRef encodeInstantiateContract encodePostKey +encodeStorageCloneFile encodeStorageDeleteFile encodeStoragePostFile estimateStoragePlan @@ -55,9 +69,15 @@ fileDeleteToMsgs filetreeDeleteToMsgs findProviderIps +findUlid folderToMsgs +getAllProviders getAvailableProviders +getFileMetaData getFileParticulars +getFolderDetailsByUlid +getMetaDataByUlid +initCustomRoot initStorage initUlidHome instantiateToMsgs @@ -67,10 +87,10 @@ listChildFolderMetas listChildFolders loadDirectory -loadMyNotifications loadProviderPool loadProvidersFromChain loadShared +loadThumbnail makeCreateBaseFolderMsgs makeCreateFolderMsgs makeRenamePkg @@ -80,6 +100,7 @@ planStatus possibleRnsToAddress prepDelete +prepShare processAllQueues processPendingNotifications processPrivate @@ -95,19 +116,26 @@ readDirectoryContents readMustConvertStatus readSharing +receiveShareToMsgs registerPubKey removeFromQueue +removeShareRecord resetReader +runUpcycleQueue saveFolder -share -shareToMsgs -sharedFileToMsgs -sharedFolderToMsgs +sendShareToMsgs +sendUnshareToMsgs +shareDirect +shareLink +shareLinkToMsgs stageQueue storageEncodeFileTree +tidyReceivedNotifications ulidFolderToMsgs +unshare +upcycleBaseFolderToMsgs +upcycleFile upgradeSigner -uploadFile enableFullSigner init -

Constructors

Properties

fullSigner: boolean
hostAddress: string
hostSigner: THostSigningClient
jackalClient: IClientHandler
jackalSigner: TJackalSigningClient
jklAddress: string
keyPair: PrivateKey
mustConvert: boolean
path: string
proofInterval: number
providers: IProviderPool
rns: null | IRnsHandler
stagedUploads: Record<string, IStagedUploadPackage>
uploadQueue: IUploadPackage[]
uploadsInProgress: boolean

Methods

  • Protected

    Parameters

    • source: number
    • currentBlock: number

    Returns number

  • Protected

    Parameters

    • contractAddress: string
    • execMsg: EncodeObject

    Returns EncodeObject

  • Protected

    Parameters

    • path: string
    • additionalViewers: string[]

    Returns Promise<EncodeObject>

  • Protected

    Parameters

    • connectionIdA: string
    • connectionIdB: string
    • codeId: number
    • label: string

    Returns EncodeObject

  • Protected

    Parameters

    • key: string

    Returns EncodeObject

  • Protected

    Parameters

    • item: UnifiedFile

    Returns EncodeObject

  • Protected

    Parameters

    • contractAddress: string
    • execs: EncodeObject | EncodeObject[]

    Returns EncodeObject[]

\ No newline at end of file +

Constructors

Properties

fullSigner: boolean
hostAddress: string
hostSigner: THostSigningClient
jackalClient: IClientHandler
jackalSigner: TJackalSigningClient
jklAddress: string
keyPair: PrivateKey
mustConvert: boolean
notifications: INotificationRecord[]
path: string
proofInterval: number
providers: IProviderPool
rns: null | IRnsHandler
stagedUploads: Record<string, IStagedUploadPackage>
upcycleQueue: IWrappedEncodeObject[]
uploadQueue: IUploadPackage[]
uploadsInProgress: boolean

Methods

\ No newline at end of file diff --git a/docs/classes/WasmHandler.html b/docs/classes/WasmHandler.html index 95fe84de..2b0227e2 100644 --- a/docs/classes/WasmHandler.html +++ b/docs/classes/WasmHandler.html @@ -1,4 +1,4 @@ -WasmHandler | @jackallabs/jackal.js

Hierarchy

  • EncodingHandler
    • WasmHandler

Implements

Constructors

constructor +WasmHandler | @jackallabs/jackal.js

Hierarchy (view full)

Implements

Constructors

Properties

hostAddress: string
hostSigner: THostSigningClient
jackalClient: IClientHandler
jackalSigner: TJackalSigningClient
jklAddress: string
proofInterval: number

Methods

  • Protected

    Parameters

    • source: number
    • currentBlock: number

    Returns number

  • Protected

    Parameters

    • contractAddress: string
    • execMsg: EncodeObject

    Returns EncodeObject

  • Protected

    Parameters

    • path: string
    • additionalViewers: string[]

    Returns Promise<EncodeObject>

  • Protected

    Parameters

    • connectionIdA: string
    • connectionIdB: string
    • codeId: number
    • label: string

    Returns EncodeObject

  • Protected

    Parameters

    • key: string

    Returns EncodeObject

  • Protected

    Parameters

    • item: UnifiedFile

    Returns EncodeObject

  • Protected

    Parameters

    • contractAddress: string
    • execs: EncodeObject | EncodeObject[]

    Returns EncodeObject[]

  • Get Interchain wasm contract address.

    -

    Parameters

    • Optional index: number = 0

      Optional contract index, defaults to 0.

      +

Constructors

Properties

hostAddress: string
hostSigner: THostSigningClient
jackalClient: IClientHandler
jackalSigner: TJackalSigningClient
jklAddress: string
proofInterval: number

Methods

  • Instantiate a CosmWasm contract.

    -

    Parameters

    • connectionIdA: string
    • connectionIdB: string
    • codeId: number

    Returns Promise<DeliverTxResponse>

  • Instantiate an outpost contract.

    +

    Parameters

    • contractAddress: string
    • connectionIdA: string
    • connectionIdB: string

    Returns Promise<DeliverTxResponse>

  • Parameters

    • contractAddress: string
    • connectionIdA: string
    • connectionIdB: string

    Returns Promise<DeliverTxResponse>

  • Prep DEncodeObject array for processing by Interchain Accounts.

    Parameters

    • contract: string

      Target contract.

    • msgs: EncodeObject[]

      Array of messages.

    Returns EncodeObject[]

    • Processed array of wrapped messages.
    -
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/blockCountUntilTimestamp.html b/docs/functions/blockCountUntilTimestamp.html index 340a1be3..a6e5c0b4 100644 --- a/docs/functions/blockCountUntilTimestamp.html +++ b/docs/functions/blockCountUntilTimestamp.html @@ -3,4 +3,4 @@

Returns number

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/blockToDateFixed.html b/docs/functions/blockToDateFixed.html index d58b5ef7..5247fe48 100644 --- a/docs/functions/blockToDateFixed.html +++ b/docs/functions/blockToDateFixed.html @@ -3,4 +3,4 @@

Returns Date

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/deprecated.html b/docs/functions/deprecated.html index e37a8593..06114e00 100644 --- a/docs/functions/deprecated.html +++ b/docs/functions/deprecated.html @@ -5,4 +5,4 @@ -

Returns void

\ No newline at end of file +

Returns void

\ No newline at end of file diff --git a/docs/functions/estimateGas.html b/docs/functions/estimateGas.html index 46316c35..6a79dc5b 100644 --- a/docs/functions/estimateGas.html +++ b/docs/functions/estimateGas.html @@ -3,4 +3,4 @@

Returns number

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/extractFileMetaData.html b/docs/functions/extractFileMetaData.html index 284668f0..485e83b0 100644 --- a/docs/functions/extractFileMetaData.html +++ b/docs/functions/extractFileMetaData.html @@ -3,4 +3,4 @@

Returns IFileMeta

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/finalizeGas.html b/docs/functions/finalizeGas.html index 96f3324d..73609b32 100644 --- a/docs/functions/finalizeGas.html +++ b/docs/functions/finalizeGas.html @@ -5,4 +5,4 @@

Returns IFinalGas

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/findNestedContentsCount.html b/docs/functions/findNestedContentsCount.html deleted file mode 100644 index 21b84d43..00000000 --- a/docs/functions/findNestedContentsCount.html +++ /dev/null @@ -1,7 +0,0 @@ -findNestedContentsCount | @jackallabs/jackal.js

Function findNestedContentsCount

  • Find number of matching nested objects exist in tree.

    -

    Parameters

    • obj: ISharedMetaDataMap

      Nested object to explore.

      -
    • path: string[]

      Path within object to check.

      -

    Returns number

      -
    • Number of matches found.
    • -
    -
\ No newline at end of file diff --git a/docs/functions/findNestedSharedDepth.html b/docs/functions/findNestedSharedDepth.html deleted file mode 100644 index c8ccde82..00000000 --- a/docs/functions/findNestedSharedDepth.html +++ /dev/null @@ -1,7 +0,0 @@ -findNestedSharedDepth | @jackallabs/jackal.js

Function findNestedSharedDepth

  • Find minimum nested depth of match.

    -

    Parameters

    • obj: ISharedMetaDataMap

      Nested object to explore.

      -
    • path: string[]

      Path within object to check.

      -

    Returns number

      -
    • Depth of match.
    • -
    -
\ No newline at end of file diff --git a/docs/functions/hexToInt.html b/docs/functions/hexToInt.html index 7dde2ca4..8f8562cf 100644 --- a/docs/functions/hexToInt.html +++ b/docs/functions/hexToInt.html @@ -3,4 +3,4 @@

Returns number

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/intToHex.html b/docs/functions/intToHex.html index 1fbab904..fc4b0710 100644 --- a/docs/functions/intToHex.html +++ b/docs/functions/intToHex.html @@ -3,4 +3,4 @@

Returns string

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/isItPast.html b/docs/functions/isItPast.html index 189bc0c8..2f01d214 100644 --- a/docs/functions/isItPast.html +++ b/docs/functions/isItPast.html @@ -3,4 +3,4 @@

Returns boolean

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/isItPastDate.html b/docs/functions/isItPastDate.html index fa7d6b1b..f080b341 100644 --- a/docs/functions/isItPastDate.html +++ b/docs/functions/isItPastDate.html @@ -3,4 +3,4 @@

Returns boolean

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/makeConnectionBundles.html b/docs/functions/makeConnectionBundles.html index cd50976b..e8e2e145 100644 --- a/docs/functions/makeConnectionBundles.html +++ b/docs/functions/makeConnectionBundles.html @@ -1,10 +1,11 @@ -makeConnectionBundles | @jackallabs/jackal.js

Function makeConnectionBundles

  • Create connection bundle for use in jjs-protos.

    +makeConnectionBundles | @jackallabs/jackal.js

    Function makeConnectionBundles

    • Create connection bundle for use in jjs-protos.

      Parameters

      • networks: TSockets[]

        One or more networks to listen to.

      • feed: TxEvent[]

        Reference to array to capture events.

      • msgs: EncodeObject[]

        Messages to broadcast to chain.

      • addr: string

        Address of signer.

      • socketOverrides: TSocketSet

        Object of possible override values for sockets.

        +
      • Optional queryOverride: string

        Overrides generated query.

      Returns IIbcEngageBundle<TxEvent>[]

      • Broadcast result.
      -
    \ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/maybeMakeThumbnail.html b/docs/functions/maybeMakeThumbnail.html index 50c2e3aa..29bae7eb 100644 --- a/docs/functions/maybeMakeThumbnail.html +++ b/docs/functions/maybeMakeThumbnail.html @@ -3,4 +3,4 @@

Returns Promise<string>

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/prepDecompressionForAmino.html b/docs/functions/prepDecompressionForAmino.html index 9c545ac7..1e772b8e 100644 --- a/docs/functions/prepDecompressionForAmino.html +++ b/docs/functions/prepDecompressionForAmino.html @@ -3,4 +3,4 @@

Returns string

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/safeCompressData.html b/docs/functions/safeCompressData.html index 02f6ec96..61b833c7 100644 --- a/docs/functions/safeCompressData.html +++ b/docs/functions/safeCompressData.html @@ -3,4 +3,4 @@

Returns string

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/safeDecompressData.html b/docs/functions/safeDecompressData.html index 9c77882f..ad70c52f 100644 --- a/docs/functions/safeDecompressData.html +++ b/docs/functions/safeDecompressData.html @@ -3,4 +3,4 @@

Returns string

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/safeParseFileTree.html b/docs/functions/safeParseFileTree.html index 724eebc0..f0fceb00 100644 --- a/docs/functions/safeParseFileTree.html +++ b/docs/functions/safeParseFileTree.html @@ -1,3 +1,3 @@ safeParseFileTree | @jackallabs/jackal.js

Function safeParseFileTree

\ No newline at end of file +

Returns TMetaDataSets

\ No newline at end of file diff --git a/docs/functions/safeParseLegacyMerkles.html b/docs/functions/safeParseLegacyMerkles.html index 209fb01b..1e00b8d9 100644 --- a/docs/functions/safeParseLegacyMerkles.html +++ b/docs/functions/safeParseLegacyMerkles.html @@ -1,3 +1,3 @@ safeParseLegacyMerkles | @jackallabs/jackal.js

Function safeParseLegacyMerkles

\ No newline at end of file +

Returns IFileContents

\ No newline at end of file diff --git a/docs/functions/safeStringifyFileTree.html b/docs/functions/safeStringifyFileTree.html index 83067814..c2aceada 100644 --- a/docs/functions/safeStringifyFileTree.html +++ b/docs/functions/safeStringifyFileTree.html @@ -1,3 +1,3 @@ safeStringifyFileTree | @jackallabs/jackal.js

Function safeStringifyFileTree

  • Safely stringify FileTree contents for saving to chain.

    Parameters

    Returns string

\ No newline at end of file +

Returns string

\ No newline at end of file diff --git a/docs/functions/sanitizeCompressionForAmino.html b/docs/functions/sanitizeCompressionForAmino.html index 8451d3f3..d510f75f 100644 --- a/docs/functions/sanitizeCompressionForAmino.html +++ b/docs/functions/sanitizeCompressionForAmino.html @@ -3,4 +3,4 @@

Returns string

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/secondToMS.html b/docs/functions/secondToMS.html index c79a813c..ceaa6f31 100644 --- a/docs/functions/secondToMS.html +++ b/docs/functions/secondToMS.html @@ -1,3 +1,3 @@ secondToMS | @jackallabs/jackal.js

Function secondToMSPrivate

  • Private

    Convert number of seconds to number of milliseconds.

    Parameters

    • seconds: number

      Number of seconds to convert.

      -

    Returns number

\ No newline at end of file +

Returns number

\ No newline at end of file diff --git a/docs/functions/setDelay.html b/docs/functions/setDelay.html index bea58fa6..393dc09c 100644 --- a/docs/functions/setDelay.html +++ b/docs/functions/setDelay.html @@ -1,3 +1,3 @@ setDelay | @jackallabs/jackal.js
  • Set a timer.

    Parameters

    • seconds: number

      Duration of timer in ms.

      -

    Returns Promise<void>

\ No newline at end of file +

Returns Promise<void>

\ No newline at end of file diff --git a/docs/functions/shuffleArray.html b/docs/functions/shuffleArray.html index 15212fe4..e9fa9ba8 100644 --- a/docs/functions/shuffleArray.html +++ b/docs/functions/shuffleArray.html @@ -3,4 +3,4 @@

Returns T[]

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/signerNotEnabled.html b/docs/functions/signerNotEnabled.html index e3c5e129..c3a367bf 100644 --- a/docs/functions/signerNotEnabled.html +++ b/docs/functions/signerNotEnabled.html @@ -4,4 +4,4 @@

Returns string

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/stringToUint16Array.html b/docs/functions/stringToUint16Array.html index b251a1e3..4fb7b53f 100644 --- a/docs/functions/stringToUint16Array.html +++ b/docs/functions/stringToUint16Array.html @@ -3,4 +3,4 @@

Returns Uint16Array

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/stringToUint8Array.html b/docs/functions/stringToUint8Array.html index 60170f70..763d761f 100644 --- a/docs/functions/stringToUint8Array.html +++ b/docs/functions/stringToUint8Array.html @@ -3,4 +3,4 @@

Returns Uint8Array

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/tidyString.html b/docs/functions/tidyString.html index 551dcbf6..ea7c2fb2 100644 --- a/docs/functions/tidyString.html +++ b/docs/functions/tidyString.html @@ -5,4 +5,4 @@

Returns string

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/timestampToBlockHeight.html b/docs/functions/timestampToBlockHeight.html index 7c53dcbc..9385fc09 100644 --- a/docs/functions/timestampToBlockHeight.html +++ b/docs/functions/timestampToBlockHeight.html @@ -4,4 +4,4 @@

Returns number

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/uintArrayToString.html b/docs/functions/uintArrayToString.html index d5d06fd2..55c1c086 100644 --- a/docs/functions/uintArrayToString.html +++ b/docs/functions/uintArrayToString.html @@ -1,6 +1,6 @@ uintArrayToString | @jackallabs/jackal.js

Function uintArrayToStringPrivate

  • Private

    Safely converts Uint8Array, Uint16Array, or Uint32Array to string.

    -

    Parameters

    • buf: Uint8Array | Uint16Array | Uint32Array

      Data View to convert.

      +

      Parameters

      • buf: Uint16Array | Uint8Array | Uint32Array

        Data View to convert.

      Returns string

      • Converted result.
      -
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/unsafeCompressData.html b/docs/functions/unsafeCompressData.html index 5ace9d12..4258d3c0 100644 --- a/docs/functions/unsafeCompressData.html +++ b/docs/functions/unsafeCompressData.html @@ -3,4 +3,4 @@

Returns string

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/unsafeDecompressData.html b/docs/functions/unsafeDecompressData.html index bf16b602..9c366804 100644 --- a/docs/functions/unsafeDecompressData.html +++ b/docs/functions/unsafeDecompressData.html @@ -3,4 +3,4 @@

Returns string

-
\ No newline at end of file +
\ No newline at end of file diff --git a/docs/functions/warnError.html b/docs/functions/warnError.html index 146e069b..16938596 100644 --- a/docs/functions/warnError.html +++ b/docs/functions/warnError.html @@ -1,4 +1,4 @@ warnError | @jackallabs/jackal.js

Function warnErrorPrivate

  • Private

    Generic warning handler.

    Parameters

    • thing: string

      Name of code block with error. Example: "[ParentContext] functionName()".

    • err: any

      Error to warn.

      -

    Returns any

\ No newline at end of file +

Returns any

\ No newline at end of file diff --git a/docs/hierarchy.html b/docs/hierarchy.html index 6894988c..437c0b3f 100644 --- a/docs/hierarchy.html +++ b/docs/hierarchy.html @@ -1 +1 @@ -@jackallabs/jackal.js

@jackallabs/jackal.js

Class Hierarchy

\ No newline at end of file +@jackallabs/jackal.js

@jackallabs/jackal.js

Class Hierarchy

\ No newline at end of file diff --git a/docs/interfaces/IAcceptBidOptions.html b/docs/interfaces/IAcceptBidOptions.html index 3b761292..bfb470d6 100644 --- a/docs/interfaces/IAcceptBidOptions.html +++ b/docs/interfaces/IAcceptBidOptions.html @@ -1,8 +1,8 @@ IAcceptBidOptions | @jackallabs/jackal.js

Interface IAcceptBidOptions

IAcceptBidOptions

-
interface IAcceptBidOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    from: string;
    rns: string;
}

Properties

interface IAcceptBidOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    from: string;
    rns: string;
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
from: string

The Jackal address to accept the bid from.

-
rns: string

RNS to accept offer on.

-
\ No newline at end of file +

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
from: string

The Jackal address to accept the bid from.

+
rns: string

RNS to accept offer on.

+
\ No newline at end of file diff --git a/docs/interfaces/IAddSubRnsOptions.html b/docs/interfaces/IAddSubRnsOptions.html index bfa09c25..bb3ffe37 100644 --- a/docs/interfaces/IAddSubRnsOptions.html +++ b/docs/interfaces/IAddSubRnsOptions.html @@ -1,12 +1,12 @@ IAddSubRnsOptions | @jackallabs/jackal.js

Interface IAddSubRnsOptions

IAddSubRnsOptions

-
interface IAddSubRnsOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    data?: IRnsData;
    linkedWallet: string;
    rns: string;
    subRns: string;
}

Properties

interface IAddSubRnsOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    data?: INoCloneRnsMetaDataSource;
    linkedWallet: string;
    rns: string;
    subRns: string;
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
data?: IRnsData

Optional object to include in sub RNS data field.

-
linkedWallet: string

Jackal address to link new sub RNS to.

-
rns: string

RNS to transfer.

-
subRns: string

Sub RNS to create.

-
\ No newline at end of file +

Properties

broadcastOptions?: IBroadcastOptions
chain?: true

Optional object to include in sub RNS data field.

+
linkedWallet: string

Jackal address to link new sub RNS to.

+
rns: string

RNS to transfer.

+
subRns: string

Sub RNS to create.

+
\ No newline at end of file diff --git a/docs/interfaces/IAesBundle.html b/docs/interfaces/IAesBundle.html index f30f1e97..3984291c 100644 --- a/docs/interfaces/IAesBundle.html +++ b/docs/interfaces/IAesBundle.html @@ -1,3 +1,3 @@ -IAesBundle | @jackallabs/jackal.js
interface IAesBundle {
    iv: Uint8Array;
    key: CryptoKey;
}

Properties

iv +IAesBundle | @jackallabs/jackal.js
interface IAesBundle {
    iv: Uint8Array;
    key: CryptoKey;
}

Properties

Properties

iv: Uint8Array
key: CryptoKey
\ No newline at end of file +

Properties

iv: Uint8Array
key: CryptoKey
\ No newline at end of file diff --git a/docs/interfaces/IAvailableWallets.html b/docs/interfaces/IAvailableWallets.html index 5cdba225..5cd591b4 100644 --- a/docs/interfaces/IAvailableWallets.html +++ b/docs/interfaces/IAvailableWallets.html @@ -1,3 +1,3 @@ -IAvailableWallets | @jackallabs/jackal.js

Interface IAvailableWallets

interface IAvailableWallets {
    keplr: boolean;
    leap: boolean;
}

Properties

keplr +IAvailableWallets | @jackallabs/jackal.js

Interface IAvailableWallets

interface IAvailableWallets {
    keplr: boolean;
    leap: boolean;
}

Properties

Properties

keplr: boolean
leap: boolean
\ No newline at end of file +

Properties

keplr: boolean
leap: boolean
\ No newline at end of file diff --git a/docs/interfaces/IBaseMetaData.html b/docs/interfaces/IBaseMetaData.html index 84d6ebe2..61dd65ca 100644 --- a/docs/interfaces/IBaseMetaData.html +++ b/docs/interfaces/IBaseMetaData.html @@ -1,3 +1,3 @@ -IBaseMetaData | @jackallabs/jackal.js

Interface IBaseMetaData

interface IBaseMetaData {
    location: string;
    merkleHex: string;
}

Hierarchy (view full)

Properties

location +IBaseMetaData | @jackallabs/jackal.js

Interface IBaseMetaData

interface IBaseMetaData {
    location: string;
    merkleHex: string;
}

Hierarchy (view full)

Properties

Properties

location: string
merkleHex: string
\ No newline at end of file +

Properties

location: string
merkleHex: string
\ No newline at end of file diff --git a/docs/interfaces/IBidOptions.html b/docs/interfaces/IBidOptions.html index bba829e6..6ff22a26 100644 --- a/docs/interfaces/IBidOptions.html +++ b/docs/interfaces/IBidOptions.html @@ -1,8 +1,8 @@ IBidOptions | @jackallabs/jackal.js

IBidOptions

-
interface IBidOptions {
    bid: Coin;
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    rns: string;
}

Properties

bid +
interface IBidOptions {
    bid: Coin;
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    rns: string;
}

Properties

bid: Coin

Value of offer as DCoin instance.

-
broadcastOptions?: IBroadcastOptions
chain?: true
rns: string

RNS to submit offer on.

-
\ No newline at end of file +
broadcastOptions?: IBroadcastOptions
chain?: true
rns: string

RNS to submit offer on.

+
\ No newline at end of file diff --git a/docs/interfaces/IBlockTimeOptions.html b/docs/interfaces/IBlockTimeOptions.html index 792a0aa0..6ac25031 100644 --- a/docs/interfaces/IBlockTimeOptions.html +++ b/docs/interfaces/IBlockTimeOptions.html @@ -1,5 +1,5 @@ -IBlockTimeOptions | @jackallabs/jackal.js

Interface IBlockTimeOptions

interface IBlockTimeOptions {
    blockTime?: number;
    currentBlockHeight: number;
    rpcUrl?: string;
    targetBlockHeight: string | number;
}

Properties

blockTime? +IBlockTimeOptions | @jackallabs/jackal.js

Interface IBlockTimeOptions

interface IBlockTimeOptions {
    blockTime?: number;
    currentBlockHeight: number;
    rpcUrl?: string;
    targetBlockHeight: string | number;
}

Properties

blockTime?: number
currentBlockHeight: number
rpcUrl?: string
targetBlockHeight: string | number
\ No newline at end of file +

Properties

blockTime?: number
currentBlockHeight: number
rpcUrl?: string
targetBlockHeight: string | number
\ No newline at end of file diff --git a/docs/interfaces/IBroadcastOptions.html b/docs/interfaces/IBroadcastOptions.html index 20a78f93..be0fcce2 100644 --- a/docs/interfaces/IBroadcastOptions.html +++ b/docs/interfaces/IBroadcastOptions.html @@ -1,6 +1,8 @@ -IBroadcastOptions | @jackallabs/jackal.js

Interface IBroadcastOptions

interface IBroadcastOptions {
    broadcastTimeoutHeight?: bigint;
    gasOverride?: number;
    memo?: string;
    monitorTimeout?: number;
    socketOverrides?: TSocketSet;
}

Properties

broadcastTimeoutHeight? +IBroadcastOptions | @jackallabs/jackal.js

Interface IBroadcastOptions

interface IBroadcastOptions {
    broadcastTimeoutHeight?: bigint;
    callback?: (() => void);
    gasOverride?: number;
    memo?: string;
    monitorTimeout?: number;
    queryOverride?: string;
    socketOverrides?: TSocketSet;
}

Properties

broadcastTimeoutHeight?: bigint
gasOverride?: number
memo?: string
monitorTimeout?: number
socketOverrides?: TSocketSet
\ No newline at end of file +

Properties

broadcastTimeoutHeight?: bigint
callback?: (() => void)

Type declaration

    • (): void
    • Returns void

gasOverride?: number
memo?: string
monitorTimeout?: number
queryOverride?: string
socketOverrides?: TSocketSet
\ No newline at end of file diff --git a/docs/interfaces/IBroadcastOrChainOptions.html b/docs/interfaces/IBroadcastOrChainOptions.html index 86796309..259edb57 100644 --- a/docs/interfaces/IBroadcastOrChainOptions.html +++ b/docs/interfaces/IBroadcastOrChainOptions.html @@ -1,3 +1,3 @@ -IBroadcastOrChainOptions | @jackallabs/jackal.js

Interface IBroadcastOrChainOptions

interface IBroadcastOrChainOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
}

Properties

broadcastOptions? +IBroadcastOrChainOptions | @jackallabs/jackal.js

Interface IBroadcastOrChainOptions

interface IBroadcastOrChainOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
\ No newline at end of file +

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
\ No newline at end of file diff --git a/docs/interfaces/IBroadcastResults.html b/docs/interfaces/IBroadcastResults.html index a50127eb..a48b070c 100644 --- a/docs/interfaces/IBroadcastResults.html +++ b/docs/interfaces/IBroadcastResults.html @@ -1,5 +1,5 @@ -IBroadcastResults | @jackallabs/jackal.js

Interface IBroadcastResults

interface IBroadcastResults {
    error: boolean;
    errorText: string;
    txEvents: TxEvent[];
    txResponse: DeliverTxResponse;
}

Properties

error +IBroadcastResults | @jackallabs/jackal.js

Interface IBroadcastResults

interface IBroadcastResults {
    error: boolean;
    errorText: string;
    txEvents: TxEvent[];
    txResponse: DeliverTxResponse;
}

Properties

error: boolean
errorText: string
txEvents: TxEvent[]
txResponse: DeliverTxResponse
\ No newline at end of file +

Properties

error: boolean
errorText: string
txEvents: TxEvent[]
txResponse: DeliverTxResponse
\ No newline at end of file diff --git a/docs/interfaces/IBuyOptions.html b/docs/interfaces/IBuyOptions.html index 4f2f389e..2a596d6a 100644 --- a/docs/interfaces/IBuyOptions.html +++ b/docs/interfaces/IBuyOptions.html @@ -1,6 +1,6 @@ IBuyOptions | @jackallabs/jackal.js

IBuyOptions

-
interface IBuyOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    rns: string;
}

Properties

interface IBuyOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    rns: string;
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
rns: string

RNS to purchase.

-
\ No newline at end of file +

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
rns: string

RNS to purchase.

+
\ No newline at end of file diff --git a/docs/interfaces/IBuyStorageOptions.html b/docs/interfaces/IBuyStorageOptions.html index fc005b24..6da6f7ce 100644 --- a/docs/interfaces/IBuyStorageOptions.html +++ b/docs/interfaces/IBuyStorageOptions.html @@ -1,7 +1,7 @@ -IBuyStorageOptions | @jackallabs/jackal.js

Interface IBuyStorageOptions

interface IBuyStorageOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    days?: number;
    gb: number;
    receiver?: string;
    referrer?: string;
}

Properties

broadcastOptions? +IBuyStorageOptions | @jackallabs/jackal.js

Interface IBuyStorageOptions

interface IBuyStorageOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    days?: number;
    gb: number;
    receiver?: string;
    referrer?: string;
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
days?: number
gb: number
receiver?: string
referrer?: string
\ No newline at end of file +

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
days?: number
gb: number
receiver?: string
referrer?: string
\ No newline at end of file diff --git a/docs/interfaces/ICancelBidOptions.html b/docs/interfaces/ICancelBidOptions.html index f18cb692..84956e55 100644 --- a/docs/interfaces/ICancelBidOptions.html +++ b/docs/interfaces/ICancelBidOptions.html @@ -1,6 +1,6 @@ ICancelBidOptions | @jackallabs/jackal.js

Interface ICancelBidOptions

ICancelBidOptions

-
interface ICancelBidOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    rns: string;
}

Properties

interface ICancelBidOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    rns: string;
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
rns: string

RNS to retract offer from.

-
\ No newline at end of file +

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
rns: string

RNS to retract offer from.

+
\ No newline at end of file diff --git a/docs/interfaces/IChainConfig.html b/docs/interfaces/IChainConfig.html index 3202eb05..d073a354 100644 --- a/docs/interfaces/IChainConfig.html +++ b/docs/interfaces/IChainConfig.html @@ -1,4 +1,4 @@ -IChainConfig | @jackallabs/jackal.js

Interface IChainConfig

interface IChainConfig {
    bech32Config: {
        bech32PrefixAccAddr: string;
        bech32PrefixAccPub: string;
        bech32PrefixConsAddr: string;
        bech32PrefixConsPub: string;
        bech32PrefixValAddr: string;
        bech32PrefixValPub: string;
    };
    bip44: {
        coinType: number;
    };
    chainId: string;
    chainName: string;
    currencies: IChainCurrency[];
    features: string[];
    feeCurrencies: IChainCurrency[];
    rest: string;
    rpc: string;
    stakeCurrency: {
        coinDecimals: number;
        coinDenom: string;
        coinMinimalDenom: string;
    };
}

Properties

bech32Config +IChainConfig | @jackallabs/jackal.js

Interface IChainConfig

interface IChainConfig {
    bech32Config: {
        bech32PrefixAccAddr: string;
        bech32PrefixAccPub: string;
        bech32PrefixConsAddr: string;
        bech32PrefixConsPub: string;
        bech32PrefixValAddr: string;
        bech32PrefixValPub: string;
    };
    bip44: {
        coinType: number;
    };
    chainId: string;
    chainName: string;
    currencies: IChainCurrency[];
    features: string[];
    feeCurrencies: IChainCurrency[];
    rest: string;
    rpc: string;
    stakeCurrency: {
        coinDecimals: number;
        coinDenom: string;
        coinMinimalDenom: string;
    };
}

Properties

bech32Config: {
    bech32PrefixAccAddr: string;
    bech32PrefixAccPub: string;
    bech32PrefixConsAddr: string;
    bech32PrefixConsPub: string;
    bech32PrefixValAddr: string;
    bech32PrefixValPub: string;
}

Type declaration

  • bech32PrefixAccAddr: string
  • bech32PrefixAccPub: string
  • bech32PrefixConsAddr: string
  • bech32PrefixConsPub: string
  • bech32PrefixValAddr: string
  • bech32PrefixValPub: string
bip44: {
    coinType: number;
}

Type declaration

  • coinType: number
chainId: string
chainName: string
currencies: IChainCurrency[]
features: string[]
feeCurrencies: IChainCurrency[]
rest: string
rpc: string
stakeCurrency: {
    coinDecimals: number;
    coinDenom: string;
    coinMinimalDenom: string;
}

Type declaration

  • coinDecimals: number
  • coinDenom: string
  • coinMinimalDenom: string
\ No newline at end of file +

Properties

bech32Config: {
    bech32PrefixAccAddr: string;
    bech32PrefixAccPub: string;
    bech32PrefixConsAddr: string;
    bech32PrefixConsPub: string;
    bech32PrefixValAddr: string;
    bech32PrefixValPub: string;
}

Type declaration

  • bech32PrefixAccAddr: string
  • bech32PrefixAccPub: string
  • bech32PrefixConsAddr: string
  • bech32PrefixConsPub: string
  • bech32PrefixValAddr: string
  • bech32PrefixValPub: string
bip44: {
    coinType: number;
}

Type declaration

  • coinType: number
chainId: string
chainName: string
currencies: IChainCurrency[]
features: string[]
feeCurrencies: IChainCurrency[]
rest: string
rpc: string
stakeCurrency: {
    coinDecimals: number;
    coinDenom: string;
    coinMinimalDenom: string;
}

Type declaration

  • coinDecimals: number
  • coinDenom: string
  • coinMinimalDenom: string
\ No newline at end of file diff --git a/docs/interfaces/IChainCurrency.html b/docs/interfaces/IChainCurrency.html index c1a7685d..c76cd663 100644 --- a/docs/interfaces/IChainCurrency.html +++ b/docs/interfaces/IChainCurrency.html @@ -1,5 +1,5 @@ -IChainCurrency | @jackallabs/jackal.js

Interface IChainCurrency

interface IChainCurrency {
    coinDecimals: number;
    coinDenom: string;
    coinMinimalDenom: string;
    gasPriceStep?: {
        average: number;
        high: number;
        low: number;
    };
}

Properties

coinDecimals +IChainCurrency | @jackallabs/jackal.js

Interface IChainCurrency

interface IChainCurrency {
    coinDecimals: number;
    coinDenom: string;
    coinMinimalDenom: string;
    gasPriceStep?: {
        average: number;
        high: number;
        low: number;
    };
}

Properties

coinDecimals: number
coinDenom: string
coinMinimalDenom: string
gasPriceStep?: {
    average: number;
    high: number;
    low: number;
}

Type declaration

  • average: number
  • high: number
  • low: number
\ No newline at end of file +

Properties

coinDecimals: number
coinDenom: string
coinMinimalDenom: string
gasPriceStep?: {
    average: number;
    high: number;
    low: number;
}

Type declaration

  • average: number
  • high: number
  • low: number
\ No newline at end of file diff --git a/docs/interfaces/IChecks.html b/docs/interfaces/IChecks.html index 9a6a5a9b..143cadf0 100644 --- a/docs/interfaces/IChecks.html +++ b/docs/interfaces/IChecks.html @@ -1,4 +1,4 @@ -IChecks | @jackallabs/jackal.js
interface IChecks {
    bought?: true;
    exists?: true;
    keys?: true;
    mustConvert?: true;
    needsProviders?: true;
    noConvert?: true;
    shared?: true;
    signer?: true;
}

Properties

bought? +IChecks | @jackallabs/jackal.js
interface IChecks {
    bought?: true;
    exists?: true;
    keys?: true;
    mustConvert?: true;
    needsProviders?: true;
    noConvert?: true;
    shared?: true;
    signer?: true;
}

Properties

bought?: true
exists?: true
keys?: true
mustConvert?: true
needsProviders?: true
noConvert?: true
shared?: true
signer?: true
\ No newline at end of file +

Properties

bought?: true
exists?: true
keys?: true
mustConvert?: true
needsProviders?: true
noConvert?: true
shared?: true
signer?: true
\ No newline at end of file diff --git a/docs/interfaces/IChildMetaDataMap.html b/docs/interfaces/IChildMetaDataMap.html index 987f73c6..1a32fb61 100644 --- a/docs/interfaces/IChildMetaDataMap.html +++ b/docs/interfaces/IChildMetaDataMap.html @@ -1,4 +1,4 @@ -IChildMetaDataMap | @jackallabs/jackal.js

Interface IChildMetaDataMap

interface IChildMetaDataMap {
    files: TChildFileMetaDataMap;
    folders: TChildFolderMetaDataMap;
    nulls: TChildNullMetaDataMap;
}

Properties

files +IChildMetaDataMap | @jackallabs/jackal.js
\ No newline at end of file +

Properties

\ No newline at end of file diff --git a/docs/interfaces/IClientHandler.html b/docs/interfaces/IClientHandler.html index 4cd34525..4d22e17f 100644 --- a/docs/interfaces/IClientHandler.html +++ b/docs/interfaces/IClientHandler.html @@ -1,4 +1,4 @@ -IClientHandler | @jackallabs/jackal.js

Interface IClientHandler

interface IClientHandler {
    broadcastAndMonitorMsgs(wrappedMsgs, options?): Promise<IBroadcastResults>;
    createOracleHandler(): Promise<IOracleHandler>;
    createRnsHandler(): Promise<IRnsHandler>;
    createStorageHandler(): Promise<IStorageHandler>;
    createWasmStorageHandler(details?): Promise<IStorageHandler>;
    findPubKey(address): Promise<string>;
    getChainId(): string;
    getHostAddress(): string;
    getHostChainId(): string;
    getHostSigner(): null | THostSigningClient;
    getICAJackalAddress(): string;
    getIsLedger(): boolean;
    getJackalAddress(): string;
    getJackalBlockHeight(): Promise<number>;
    getJackalSigner(): null | TJackalSigningClient;
    getJklBalance(): Promise<Coin>;
    getProofWindow(): number;
    getQueries(): TQueryExtensions;
    getSelectedWallet(): string;
    getTxs(): ITxLibrary;
    getWalletDetails(): IWalletDetails;
    myPubKeyIsPublished(): Promise<boolean>;
    wasmIsConnected(): boolean;
}

Implemented by

Methods

broadcastAndMonitorMsgs +IClientHandler | @jackallabs/jackal.js

Interface IClientHandler

interface IClientHandler {
    broadcastAndMonitorMsgs(wrappedMsgs, options?): Promise<IBroadcastResults>;
    createOracleHandler(): Promise<IOracleHandler>;
    createRnsHandler(): Promise<IRnsHandler>;
    createStorageHandler(): Promise<IStorageHandler>;
    createWasmStorageHandler(details?): Promise<IStorageHandler>;
    findPubKey(address): Promise<string>;
    getChainId(): string;
    getHostAddress(): string;
    getHostChainId(): string;
    getHostNetworkBalance(address, denom): Promise<Coin>;
    getHostSigner(): null | THostSigningClient;
    getICAJackalAddress(): string;
    getIsLedger(): boolean;
    getJackalAddress(): string;
    getJackalBlockHeight(): Promise<number>;
    getJackalNetworkBalance(address): Promise<Coin>;
    getJackalSigner(): null | TJackalSigningClient;
    getJklBalance(): Promise<Coin>;
    getProofWindow(): number;
    getQueries(): TQueryExtensions;
    getSelectedWallet(): string;
    getTxs(): ITxLibrary;
    getWalletDetails(): IWalletDetails;
    ibcSend(address, amount, sourceChannel): Promise<DeliverTxResponse>;
    myPubKeyIsPublished(): Promise<boolean>;
    wasmIsConnected(): boolean;
}

Implemented by

Methods

\ No newline at end of file +

Methods

\ No newline at end of file diff --git a/docs/interfaces/IClientSetup.html b/docs/interfaces/IClientSetup.html index 04d14a69..6439a3d8 100644 --- a/docs/interfaces/IClientSetup.html +++ b/docs/interfaces/IClientSetup.html @@ -1,4 +1,4 @@ -IClientSetup | @jackallabs/jackal.js

Interface IClientSetup

interface IClientSetup {
    chainConfig?: IChainConfig;
    chainId?: string;
    endpoint?: string;
    gasMultiplier?: number;
    host?: {
        chainConfig: IChainConfig;
        chainId: string;
        endpoint: string;
    };
    mnemonic?: string;
    networks?: TSockets[];
    options?: SigningStargateClientOptions;
    selectedWallet?: TWalletExtensionNames;
}

Properties

chainConfig? +IClientSetup | @jackallabs/jackal.js

Interface IClientSetup

interface IClientSetup {
    chainConfig?: IChainConfig;
    chainId?: string;
    endpoint?: string;
    gasMultiplier?: number;
    host?: {
        chainConfig: IChainConfig;
        chainId: string;
        endpoint: string;
    };
    mnemonic?: string;
    networks?: TSockets[];
    options?: SigningStargateClientOptions;
    selectedWallet?: TWalletExtensionNames;
}

Properties

chainConfig?: IChainConfig
chainId?: string
endpoint?: string
gasMultiplier?: number
host?: {
    chainConfig: IChainConfig;
    chainId: string;
    endpoint: string;
}

Type declaration

mnemonic?: string
networks?: TSockets[]
selectedWallet?: TWalletExtensionNames
\ No newline at end of file +

Properties

chainConfig?: IChainConfig
chainId?: string
endpoint?: string
gasMultiplier?: number
host?: {
    chainConfig: IChainConfig;
    chainId: string;
    endpoint: string;
}

Type declaration

mnemonic?: string
networks?: TSockets[]
selectedWallet?: TWalletExtensionNames
\ No newline at end of file diff --git a/docs/interfaces/ICloneFileMetaDataSource.html b/docs/interfaces/ICloneFileMetaDataSource.html index 40b11180..ede55045 100644 --- a/docs/interfaces/ICloneFileMetaDataSource.html +++ b/docs/interfaces/ICloneFileMetaDataSource.html @@ -1,3 +1,3 @@ -ICloneFileMetaDataSource | @jackallabs/jackal.js

Interface ICloneFileMetaDataSource

interface ICloneFileMetaDataSource {
    clone: IFileMetaData;
    refIndex?: number;
}

Properties

clone +ICloneFileMetaDataSource | @jackallabs/jackal.js

Interface ICloneFileMetaDataSource

interface ICloneFileMetaDataSource {
    clone: IFileMetaData;
    refIndex?: number;
}

Properties

Properties

refIndex?: number
\ No newline at end of file +

Properties

refIndex?: number
\ No newline at end of file diff --git a/docs/interfaces/ICloneFolderMetaDataSource.html b/docs/interfaces/ICloneFolderMetaDataSource.html new file mode 100644 index 00000000..1fb84169 --- /dev/null +++ b/docs/interfaces/ICloneFolderMetaDataSource.html @@ -0,0 +1,4 @@ +ICloneFolderMetaDataSource | @jackallabs/jackal.js

Interface ICloneFolderMetaDataSource

interface ICloneFolderMetaDataSource {
    clone: IFolderMetaData;
    refIndex?: number;
    ulid: string;
}

Properties

Properties

refIndex?: number
ulid: string
\ No newline at end of file diff --git a/docs/interfaces/IClonePackage.html b/docs/interfaces/IClonePackage.html new file mode 100644 index 00000000..ffa67e9c --- /dev/null +++ b/docs/interfaces/IClonePackage.html @@ -0,0 +1,5 @@ +IClonePackage | @jackallabs/jackal.js

Interface IClonePackage

interface IClonePackage {
    aes?: IAesBundle;
    duration: number;
    meta: IFileMetaHandler;
    size: number;
}

Properties

Properties

duration: number
size: number
\ No newline at end of file diff --git a/docs/interfaces/ICloneRnsMetaDataSource.html b/docs/interfaces/ICloneRnsMetaDataSource.html new file mode 100644 index 00000000..f612bb3e --- /dev/null +++ b/docs/interfaces/ICloneRnsMetaDataSource.html @@ -0,0 +1,2 @@ +ICloneRnsMetaDataSource | @jackallabs/jackal.js

Interface ICloneRnsMetaDataSource

interface ICloneRnsMetaDataSource {
    clone: string;
}

Properties

Properties

clone: string
\ No newline at end of file diff --git a/docs/interfaces/ICloneSharesOptions.html b/docs/interfaces/ICloneSharesOptions.html new file mode 100644 index 00000000..d8190a6c --- /dev/null +++ b/docs/interfaces/ICloneSharesOptions.html @@ -0,0 +1,8 @@ +ICloneSharesOptions | @jackallabs/jackal.js

Interface ICloneSharesOptions

ICloneSharesOptions

+
interface ICloneSharesOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    destination: string;
    targets: IShareMetaData | IShareMetaData[];
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
destination: string

Folder to copy files into.

+

Shared File metas to clone from.

+
\ No newline at end of file diff --git a/docs/interfaces/ICloneUploadOptions.html b/docs/interfaces/ICloneUploadOptions.html new file mode 100644 index 00000000..a540e25c --- /dev/null +++ b/docs/interfaces/ICloneUploadOptions.html @@ -0,0 +1,10 @@ +ICloneUploadOptions | @jackallabs/jackal.js

Interface ICloneUploadOptions

ICloneUploadOptions

+
interface ICloneUploadOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    destination: string;
    sharer: string;
    targets: IFileMetaData | IFileMetaData[];
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
destination: string

Folder to copy files into.

+
sharer: string

Bech32 wallet address of source of targets.

+

Shared File metas to clone from.

+
\ No newline at end of file diff --git a/docs/interfaces/IContractInstantiateOptions.html b/docs/interfaces/IContractInstantiateOptions.html index 1a52233d..6fc646c3 100644 --- a/docs/interfaces/IContractInstantiateOptions.html +++ b/docs/interfaces/IContractInstantiateOptions.html @@ -1,12 +1,12 @@ IContractInstantiateOptions | @jackallabs/jackal.js

Interface IContractInstantiateOptions

The options of .instantiate() and .instantiate2() call. All properties are optional.

-
interface IContractInstantiateOptions {
    admin?: string;
    funds?: readonly Coin[];
    memo?: string;
}

Properties

interface IContractInstantiateOptions {
    admin?: string;
    funds?: readonly Coin[];
    memo?: string;
}

Properties

Properties

admin?: string

A bech32 encoded address of an admin account. Caution: an admin has the privilege to upgrade a contract. If this is not desired, do not set this value.

-
funds?: readonly Coin[]

The funds that are transferred from the sender to the newly created contract. +

funds?: readonly Coin[]

The funds that are transferred from the sender to the newly created contract. The funds are transferred as part of the message execution after the contract address is created and before the instantiation message is executed by the contract.

Only native tokens are supported.

-
memo?: string
\ No newline at end of file +
memo?: string
\ No newline at end of file diff --git a/docs/interfaces/IConversionFolderBundle.html b/docs/interfaces/IConversionFolderBundle.html index 945095d1..745b5659 100644 --- a/docs/interfaces/IConversionFolderBundle.html +++ b/docs/interfaces/IConversionFolderBundle.html @@ -1,3 +1,3 @@ -IConversionFolderBundle | @jackallabs/jackal.js

Interface IConversionFolderBundle

interface IConversionFolderBundle {
    handler: IFolderMetaHandler;
    msgs: IWrappedEncodeObject[];
}

Properties

handler +IConversionFolderBundle | @jackallabs/jackal.js

Interface IConversionFolderBundle

interface IConversionFolderBundle {
    handler: IFolderMetaHandler;
    msgs: IWrappedEncodeObject[];
}

Properties

Properties

\ No newline at end of file +

Properties

\ No newline at end of file diff --git a/docs/interfaces/IConversionNeededBundle.html b/docs/interfaces/IConversionNeededBundle.html index 1b064eeb..e0289f0f 100644 --- a/docs/interfaces/IConversionNeededBundle.html +++ b/docs/interfaces/IConversionNeededBundle.html @@ -1,3 +1,3 @@ -IConversionNeededBundle | @jackallabs/jackal.js

Interface IConversionNeededBundle

interface IConversionNeededBundle {
    metaData: ILegacyFolderMetaData;
    requiresConversion: true;
}

Properties

metaData +IConversionNeededBundle | @jackallabs/jackal.js

Interface IConversionNeededBundle

interface IConversionNeededBundle {
    metaData: ILegacyFolderMetaData;
    requiresConversion: true;
}

Properties

requiresConversion: true
\ No newline at end of file +

Properties

requiresConversion: true
\ No newline at end of file diff --git a/docs/interfaces/IConversionNotNeededBundle.html b/docs/interfaces/IConversionNotNeededBundle.html index 283ca823..c6bd8380 100644 --- a/docs/interfaces/IConversionNotNeededBundle.html +++ b/docs/interfaces/IConversionNotNeededBundle.html @@ -1,3 +1,3 @@ -IConversionNotNeededBundle | @jackallabs/jackal.js

Interface IConversionNotNeededBundle

interface IConversionNotNeededBundle {
    metaData: IFolderMetaData;
    requiresConversion: false;
}

Properties

metaData +IConversionNotNeededBundle | @jackallabs/jackal.js

Interface IConversionNotNeededBundle

interface IConversionNotNeededBundle {
    metaData: IFolderMetaData;
    requiresConversion: false;
}

Properties

metaData: IFolderMetaData
requiresConversion: false
\ No newline at end of file +

Properties

metaData: IFolderMetaData
requiresConversion: false
\ No newline at end of file diff --git a/docs/interfaces/ICreateFolderOptions.html b/docs/interfaces/ICreateFolderOptions.html index 5f893c99..d822bbe6 100644 --- a/docs/interfaces/ICreateFolderOptions.html +++ b/docs/interfaces/ICreateFolderOptions.html @@ -1,4 +1,4 @@ -ICreateFolderOptions | @jackallabs/jackal.js

Interface ICreateFolderOptions

interface ICreateFolderOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    names: string | string[];
}

Properties

broadcastOptions? +ICreateFolderOptions | @jackallabs/jackal.js

Interface ICreateFolderOptions

interface ICreateFolderOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    names: string | string[];
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
names: string | string[]
\ No newline at end of file +

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
names: string | string[]
\ No newline at end of file diff --git a/docs/interfaces/ICreateViewAccessOptions.html b/docs/interfaces/ICreateViewAccessOptions.html new file mode 100644 index 00000000..0af3f438 --- /dev/null +++ b/docs/interfaces/ICreateViewAccessOptions.html @@ -0,0 +1,7 @@ +ICreateViewAccessOptions | @jackallabs/jackal.js

Interface ICreateViewAccessOptions

ICreateViewAccessOptions

+
interface ICreateViewAccessOptions {
    aes?: IAesBundle;
    index?: number;
    trackingNumber: string;
    ulid?: string;
    viewers: TViewerSetAll;
}

Properties

index?: number
trackingNumber: string
ulid?: string
viewers: TViewerSetAll
\ No newline at end of file diff --git a/docs/interfaces/ICustomRootOptions.html b/docs/interfaces/ICustomRootOptions.html new file mode 100644 index 00000000..e4d25b18 --- /dev/null +++ b/docs/interfaces/ICustomRootOptions.html @@ -0,0 +1,4 @@ +ICustomRootOptions | @jackallabs/jackal.js

Interface ICustomRootOptions

interface ICustomRootOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    name: string;
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
name: string
\ No newline at end of file diff --git a/docs/interfaces/IDeleteTargetOptions.html b/docs/interfaces/IDeleteTargetOptions.html index d3ba43e8..d8ca64c1 100644 --- a/docs/interfaces/IDeleteTargetOptions.html +++ b/docs/interfaces/IDeleteTargetOptions.html @@ -1,4 +1,4 @@ -IDeleteTargetOptions | @jackallabs/jackal.js

Interface IDeleteTargetOptions

interface IDeleteTargetOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    targets: string | string[];
}

Properties

broadcastOptions? +IDeleteTargetOptions | @jackallabs/jackal.js

Interface IDeleteTargetOptions

interface IDeleteTargetOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    targets: string | string[];
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
targets: string | string[]
\ No newline at end of file +

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
targets: string | string[]
\ No newline at end of file diff --git a/docs/interfaces/IDelistOptions.html b/docs/interfaces/IDelistOptions.html index 84da99d1..6b4ebc7b 100644 --- a/docs/interfaces/IDelistOptions.html +++ b/docs/interfaces/IDelistOptions.html @@ -1,6 +1,6 @@ IDelistOptions | @jackallabs/jackal.js

Interface IDelistOptions

IDelistOptions

-
interface IDelistOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    rns: string;
}

Properties

interface IDelistOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    rns: string;
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
rns: string

RNS to remove.

-
\ No newline at end of file +

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
rns: string

RNS to remove.

+
\ No newline at end of file diff --git a/docs/interfaces/IDownloadByUlidOptions.html b/docs/interfaces/IDownloadByUlidOptions.html new file mode 100644 index 00000000..da138da8 --- /dev/null +++ b/docs/interfaces/IDownloadByUlidOptions.html @@ -0,0 +1,6 @@ +IDownloadByUlidOptions | @jackallabs/jackal.js

Interface IDownloadByUlidOptions

IDownloadByUlidOptions

+
interface IDownloadByUlidOptions {
    linkKey?: string;
    trackers: IDownloadTracker;
    ulid: string;
    userAddress: string;
}

Properties

linkKey?: string
ulid: string
userAddress: string
\ No newline at end of file diff --git a/docs/interfaces/IDownloadStagingOptionsWithPath.html b/docs/interfaces/IDownloadStagingOptionsWithPath.html new file mode 100644 index 00000000..7761f74a --- /dev/null +++ b/docs/interfaces/IDownloadStagingOptionsWithPath.html @@ -0,0 +1,6 @@ +IDownloadStagingOptionsWithPath | @jackallabs/jackal.js

Interface IDownloadStagingOptionsWithPath

interface IDownloadStagingOptionsWithPath {
    filePath: string;
    particulars: IFileParticulars;
    provider: string;
    trackers: IDownloadTracker;
    userAddress: string;
}

Properties

filePath: string
particulars: IFileParticulars
provider: string
userAddress: string
\ No newline at end of file diff --git a/docs/interfaces/IDownloadStagingOptionsWithUlid.html b/docs/interfaces/IDownloadStagingOptionsWithUlid.html new file mode 100644 index 00000000..43ac7379 --- /dev/null +++ b/docs/interfaces/IDownloadStagingOptionsWithUlid.html @@ -0,0 +1,7 @@ +IDownloadStagingOptionsWithUlid | @jackallabs/jackal.js

Interface IDownloadStagingOptionsWithUlid

interface IDownloadStagingOptionsWithUlid {
    linkKey?: string;
    particulars: IFileParticulars;
    provider: string;
    trackers: IDownloadTracker;
    ulid: string;
    userAddress: string;
}

Properties

linkKey?: string
particulars: IFileParticulars
provider: string
ulid: string
userAddress: string
\ No newline at end of file diff --git a/docs/interfaces/IDownloadTracker.html b/docs/interfaces/IDownloadTracker.html index a3d26af1..655a0ce5 100644 --- a/docs/interfaces/IDownloadTracker.html +++ b/docs/interfaces/IDownloadTracker.html @@ -1,3 +1,3 @@ -IDownloadTracker | @jackallabs/jackal.js

Interface IDownloadTracker

interface IDownloadTracker {
    chunks: Uint8Array[];
    progress: number;
}

Properties

chunks +IDownloadTracker | @jackallabs/jackal.js

Interface IDownloadTracker

interface IDownloadTracker {
    chunks: Uint8Array[];
    progress: number;
}

Properties

Properties

chunks: Uint8Array[]
progress: number
\ No newline at end of file +

Properties

chunks: Uint8Array[]
progress: number
\ No newline at end of file diff --git a/docs/interfaces/IEncodeExistingRefOptions.html b/docs/interfaces/IEncodeExistingRefOptions.html new file mode 100644 index 00000000..ccf0cdc6 --- /dev/null +++ b/docs/interfaces/IEncodeExistingRefOptions.html @@ -0,0 +1,6 @@ +IEncodeExistingRefOptions | @jackallabs/jackal.js

Interface IEncodeExistingRefOptions

interface IEncodeExistingRefOptions {
    location: TMerkleParentChild;
    ownerAddress?: string;
    ref: number;
    ulid: string;
    viewers: TViewerSetAll;
}

Properties

ownerAddress?: string
ref: number
ulid: string
viewers: TViewerSetAll
\ No newline at end of file diff --git a/docs/interfaces/IFileContents.html b/docs/interfaces/IFileContents.html index 99b634d8..de91099b 100644 --- a/docs/interfaces/IFileContents.html +++ b/docs/interfaces/IFileContents.html @@ -1,2 +1,2 @@ -IFileContents | @jackallabs/jackal.js

Interface IFileContents

interface IFileContents {
    legacyMerkles: Uint8Array[];
}

Properties

Properties

legacyMerkles: Uint8Array[]
\ No newline at end of file +IFileContents | @jackallabs/jackal.js

Interface IFileContents

interface IFileContents {
    legacyMerkles: Uint8Array[];
}

Properties

Properties

legacyMerkles: Uint8Array[]
\ No newline at end of file diff --git a/docs/interfaces/IFileDeletePackage.html b/docs/interfaces/IFileDeletePackage.html index ffb72ee3..9c619b19 100644 --- a/docs/interfaces/IFileDeletePackage.html +++ b/docs/interfaces/IFileDeletePackage.html @@ -1,4 +1,4 @@ -IFileDeletePackage | @jackallabs/jackal.js

Interface IFileDeletePackage

interface IFileDeletePackage {
    creator: string;
    merkle: Uint8Array;
    start: number;
}

Properties

creator +IFileDeletePackage | @jackallabs/jackal.js

Interface IFileDeletePackage

interface IFileDeletePackage {
    creator: string;
    merkle: Uint8Array;
    start: number;
}

Properties

Properties

creator: string
merkle: Uint8Array
start: number
\ No newline at end of file +

Properties

creator: string
merkle: Uint8Array
start: number
\ No newline at end of file diff --git a/docs/interfaces/IFileMeta.html b/docs/interfaces/IFileMeta.html index e0ec615a..a5c22866 100644 --- a/docs/interfaces/IFileMeta.html +++ b/docs/interfaces/IFileMeta.html @@ -1,5 +1,5 @@ -IFileMeta | @jackallabs/jackal.js
interface IFileMeta {
    lastModified: number;
    name: string;
    size: number;
    type: string;
}

Properties

lastModified +IFileMeta | @jackallabs/jackal.js
interface IFileMeta {
    lastModified: number;
    name: string;
    size: number;
    type: string;
}

Properties

lastModified: number
name: string
size: number
type: string
\ No newline at end of file +

Properties

lastModified: number
name: string
size: number
type: string
\ No newline at end of file diff --git a/docs/interfaces/IFileMetaData.html b/docs/interfaces/IFileMetaData.html index 51c6c337..d4c4c63b 100644 --- a/docs/interfaces/IFileMetaData.html +++ b/docs/interfaces/IFileMetaData.html @@ -1,10 +1,11 @@ -IFileMetaData | @jackallabs/jackal.js

Interface IFileMetaData

interface IFileMetaData {
    description: string;
    fileMeta: IFileMeta;
    location: string;
    merkleHex: string;
    merkleMem: string;
    merkleRoot: Uint8Array;
    metaDataType: "file";
    thumbnail: string;
    ulid: string;
}

Hierarchy (view full)

Properties

description +IFileMetaData | @jackallabs/jackal.js

Interface IFileMetaData

interface IFileMetaData {
    description: string;
    fileMeta: IFileMeta;
    location: string;
    merkleHex: string;
    merkleMem: string;
    merkleRoot: Uint8Array;
    metaDataType: "file";
    sharerCount?: string;
    thumbnail: string;
    ulid: string;
}

Hierarchy (view full)

Properties

description: string
fileMeta: IFileMeta
location: string
merkleHex: string
merkleMem: string
merkleRoot: Uint8Array
metaDataType: "file"
thumbnail: string
ulid: string
\ No newline at end of file +

Properties

description: string
fileMeta: IFileMeta
location: string
merkleHex: string
merkleMem: string
merkleRoot: Uint8Array
metaDataType: "file"
sharerCount?: string
thumbnail: string
ulid: string
\ No newline at end of file diff --git a/docs/interfaces/IFileMetaFoundationalData.html b/docs/interfaces/IFileMetaFoundationalData.html index ef3c1c4d..8026e5f3 100644 --- a/docs/interfaces/IFileMetaFoundationalData.html +++ b/docs/interfaces/IFileMetaFoundationalData.html @@ -1,10 +1,11 @@ -IFileMetaFoundationalData | @jackallabs/jackal.js

Interface IFileMetaFoundationalData

interface IFileMetaFoundationalData {
    description: string;
    fileMeta: IFileMeta;
    location: string;
    merkleHex: string;
    merkleMem: string;
    merkleRoot: Uint8Array;
    refIndex: number;
    thumbnail: string;
    ulid: string;
}

Properties

description +IFileMetaFoundationalData | @jackallabs/jackal.js

Interface IFileMetaFoundationalData

interface IFileMetaFoundationalData {
    description: string;
    fileMeta: IFileMeta;
    location: string;
    merkleHex: string;
    merkleMem: string;
    merkleRoot: Uint8Array;
    refIndex: number;
    sharerCount: number;
    thumbnail: string;
    ulid: string;
}

Properties

description: string
fileMeta: IFileMeta
location: string
merkleHex: string
merkleMem: string
merkleRoot: Uint8Array
refIndex: number
thumbnail: string
ulid: string
\ No newline at end of file +

Properties

description: string
fileMeta: IFileMeta
location: string
merkleHex: string
merkleMem: string
merkleRoot: Uint8Array
refIndex: number
sharerCount: number
thumbnail: string
ulid: string
\ No newline at end of file diff --git a/docs/interfaces/IFileMetaHandler.html b/docs/interfaces/IFileMetaHandler.html index 66b68032..83e5cb91 100644 --- a/docs/interfaces/IFileMetaHandler.html +++ b/docs/interfaces/IFileMetaHandler.html @@ -1,9 +1,12 @@ -IFileMetaHandler | @jackallabs/jackal.js

Interface IFileMetaHandler

interface IFileMetaHandler {
    export(): IFileMetaData;
    exportRef(): IRefMetaData;
    getLocation(): string;
    getRefIndex(): number;
    getRefString(): string;
    getUlid(): string;
    setLocation(location): void;
    setRefIndex(refIndex): void;
}

Hierarchy (view full)

Methods

export +IFileMetaHandler | @jackallabs/jackal.js

Interface IFileMetaHandler

interface IFileMetaHandler {
    addAndReturnSharerCount(value): number;
    export(): IFileMetaData;
    exportRef(): IRefMetaData;
    getLocation(): string;
    getRefIndex(): number;
    getRefString(): string;
    getSharerCount(): number;
    getUlid(): string;
    setLocation(location): void;
    setRefIndex(refIndex): void;
    setSharerCount(count): void;
}

Hierarchy (view full)

Implemented by

Methods

\ No newline at end of file +setSharerCount +

Methods

\ No newline at end of file diff --git a/docs/interfaces/IFileParticulars.html b/docs/interfaces/IFileParticulars.html index a56da745..4c6d4547 100644 --- a/docs/interfaces/IFileParticulars.html +++ b/docs/interfaces/IFileParticulars.html @@ -1,5 +1,5 @@ -IFileParticulars | @jackallabs/jackal.js

Interface IFileParticulars

interface IFileParticulars {
    fileMeta: IFileMeta;
    merkle: Uint8Array;
    merkleLocation: string;
    providerIps: string[];
}

Properties

fileMeta +IFileParticulars | @jackallabs/jackal.js

Interface IFileParticulars

interface IFileParticulars {
    fileMeta: IFileMeta;
    merkle: Uint8Array;
    merkleLocation: string;
    providerIps: string[];
}

Properties

fileMeta: IFileMeta
merkle: Uint8Array
merkleLocation: string
providerIps: string[]
\ No newline at end of file +

Properties

fileMeta: IFileMeta
merkle: Uint8Array
merkleLocation: string
providerIps: string[]
\ No newline at end of file diff --git a/docs/interfaces/IFileTreeOptions.html b/docs/interfaces/IFileTreeOptions.html index 59c4e111..906cd34e 100644 --- a/docs/interfaces/IFileTreeOptions.html +++ b/docs/interfaces/IFileTreeOptions.html @@ -1,3 +1,3 @@ -IFileTreeOptions | @jackallabs/jackal.js

Interface IFileTreeOptions

interface IFileTreeOptions {
    additionalViewers?: string[];
    aes?: IAesBundle;
}

Properties

additionalViewers? +IFileTreeOptions | @jackallabs/jackal.js

Interface IFileTreeOptions

interface IFileTreeOptions {
    additionalViewers?: string[];
    aes?: IAesBundle;
}

Properties

additionalViewers?: string[]
\ No newline at end of file +

Properties

additionalViewers?: string[]
\ No newline at end of file diff --git a/docs/interfaces/IFileTreePackage.html b/docs/interfaces/IFileTreePackage.html index 1dc722fb..1614de6a 100644 --- a/docs/interfaces/IFileTreePackage.html +++ b/docs/interfaces/IFileTreePackage.html @@ -1,3 +1,4 @@ -IFileTreePackage | @jackallabs/jackal.js

Interface IFileTreePackage

interface IFileTreePackage {
    aes?: IAesBundle;
    meta: TMetaHandler;
}

Properties

aes? +IFileTreePackage | @jackallabs/jackal.js

Interface IFileTreePackage

interface IFileTreePackage {
    aes?: IAesBundle;
    meta: TMetaHandler;
    update?: boolean;
}

Properties

Properties

\ No newline at end of file +update? +

Properties

update?: boolean
\ No newline at end of file diff --git a/docs/interfaces/IFileTreeReturnedFile.html b/docs/interfaces/IFileTreeReturnedFile.html index 25fa9df4..a15c115b 100644 --- a/docs/interfaces/IFileTreeReturnedFile.html +++ b/docs/interfaces/IFileTreeReturnedFile.html @@ -1,7 +1,2 @@ -IFileTreeReturnedFile | @jackallabs/jackal.js

Interface IFileTreeReturnedFile

interface IFileTreeReturnedFile {
    address: string;
    contents: IFileMetaData;
    editAccess: string;
    owner: string;
    trackingNumber: string;
    viewingAccess: string;
}

Hierarchy (view full)

Properties

address: string
contents: IFileMetaData
editAccess: string
owner: string
trackingNumber: string
viewingAccess: string
\ No newline at end of file +IFileTreeReturnedFile | @jackallabs/jackal.js

Interface IFileTreeReturnedFile

interface IFileTreeReturnedFile {
    contents: IFileMetaData;
}

Hierarchy (view full)

Properties

Properties

contents: IFileMetaData
\ No newline at end of file diff --git a/docs/interfaces/IFileTreeReturnedFolder.html b/docs/interfaces/IFileTreeReturnedFolder.html index df812d1b..d3183c14 100644 --- a/docs/interfaces/IFileTreeReturnedFolder.html +++ b/docs/interfaces/IFileTreeReturnedFolder.html @@ -1,7 +1,2 @@ -IFileTreeReturnedFolder | @jackallabs/jackal.js

Interface IFileTreeReturnedFolder

interface IFileTreeReturnedFolder {
    address: string;
    contents: IFolderMetaData;
    editAccess: string;
    owner: string;
    trackingNumber: string;
    viewingAccess: string;
}

Hierarchy (view full)

Properties

address: string
contents: IFolderMetaData
editAccess: string
owner: string
trackingNumber: string
viewingAccess: string
\ No newline at end of file +IFileTreeReturnedFolder | @jackallabs/jackal.js

Interface IFileTreeReturnedFolder

interface IFileTreeReturnedFolder {
    contents: IFolderMetaData;
}

Hierarchy (view full)

Properties

Properties

contents: IFolderMetaData
\ No newline at end of file diff --git a/docs/interfaces/IFileTreeReturnedNull.html b/docs/interfaces/IFileTreeReturnedNull.html index c3030ef3..ca7599df 100644 --- a/docs/interfaces/IFileTreeReturnedNull.html +++ b/docs/interfaces/IFileTreeReturnedNull.html @@ -1,7 +1,2 @@ -IFileTreeReturnedNull | @jackallabs/jackal.js

Interface IFileTreeReturnedNull

interface IFileTreeReturnedNull {
    address: string;
    contents: INullMetaData;
    editAccess: string;
    owner: string;
    trackingNumber: string;
    viewingAccess: string;
}

Hierarchy (view full)

Properties

address: string
contents: INullMetaData
editAccess: string
owner: string
trackingNumber: string
viewingAccess: string
\ No newline at end of file +IFileTreeReturnedNull | @jackallabs/jackal.js

Interface IFileTreeReturnedNull

interface IFileTreeReturnedNull {
    contents: INullMetaData;
}

Hierarchy (view full)

Properties

Properties

contents: INullMetaData
\ No newline at end of file diff --git a/docs/interfaces/IFileTreeStructure.html b/docs/interfaces/IFileTreeStructure.html index fc7bc8f2..7a906ec5 100644 --- a/docs/interfaces/IFileTreeStructure.html +++ b/docs/interfaces/IFileTreeStructure.html @@ -1,7 +1,2 @@ -IFileTreeStructure | @jackallabs/jackal.js

Interface IFileTreeStructure

interface IFileTreeStructure {
    address: string;
    contents: TChildMetaData;
    editAccess: string;
    owner: string;
    trackingNumber: string;
    viewingAccess: string;
}

Hierarchy (view full)

Properties

address: string
contents: TChildMetaData
editAccess: string
owner: string
trackingNumber: string
viewingAccess: string
\ No newline at end of file +IFileTreeStructure | @jackallabs/jackal.js

Interface IFileTreeStructure

interface IFileTreeStructure {
    contents: TChildMetaData;
}

Hierarchy (view full)

Properties

Properties

contents: TChildMetaData
\ No newline at end of file diff --git a/docs/interfaces/IFiletreeReader.html b/docs/interfaces/IFiletreeReader.html index f115f202..69099931 100644 --- a/docs/interfaces/IFiletreeReader.html +++ b/docs/interfaces/IFiletreeReader.html @@ -1,7 +1,11 @@ -IFiletreeReader | @jackallabs/jackal.js

Interface IFiletreeReader

interface IFiletreeReader {
    encodeExistingPostFile(path, location, additionalViewers): Promise<MsgPostFile>;
    encodePostFile(location, meta, options?): Promise<MsgPostFile>;
    encodeProvisionFileTree(): Promise<MsgProvisionFileTree>;
    findRefIndex(path): number;
    loadFolderMetaByPath(path): Promise<IFolderMetaData>;
    loadFolderMetaByUlid(ulid): Promise<IFolderMetaData>;
    loadFolderMetaHandler(path): Promise<IFolderMetaHandler>;
    loadFromLegacyMerkles(path, location, fileMeta): Promise<IFileMetaHandler>;
    loadKeysByPath(path, ownerAddress): Promise<IAesBundle>;
    loadKeysByUlid(ulid, ownerAddress): Promise<IAesBundle>;
    loadLegacyMeta(legacyMerkles, legacyPath): Promise<IFileMetaData>;
    loadMetaByExternalPath(path, ownerAddress): Promise<TMetaDataSets>;
    loadMetaByPath(path): Promise<TMetaDataSets>;
    loadMetaByUlid(ulid): Promise<TMetaDataSets>;
    loadRefMeta(ulid, ref): Promise<IRefMetaData | INullRefMetaData>;
    loadShareFolderMeta(path): Promise<IShareFolderMetaData>;
    loadShareMeta(path): Promise<IShareMetaData>;
    loadSharingFolder(ulid): Promise<ISharedMetaDataMap>;
    protectNotification(receiverAddress, aes): Promise<string>;
    readFolderContents(path, options?): Promise<IChildMetaDataMap>;
    readShareNotification(notificationData): Promise<INotificationRecord>;
    refCountIncrement(path): void;
    refCountRead(path): Promise<number>;
    refCountSet(path, value): void;
    setMetaViewers(path, additionalViewers): Promise<IReconstructedFileTree>;
    ulidLookup(path, owner?): string;
}

Methods

encodeExistingPostFile +IFiletreeReader | @jackallabs/jackal.js

Interface IFiletreeReader

interface IFiletreeReader {
    encodeExistingPostFile(ulid, location, viewers): Promise<MsgPostFile>;
    encodeExistingRef(options): Promise<MsgPostFile>;
    encodePostFile(location, meta, options?): Promise<MsgPostFile>;
    encodeProvisionFileTree(): Promise<MsgProvisionFileTree>;
    findRefIndex(path): number;
    getConversionQueueLength(): number;
    getConversions(): Promise<TConversionPair[]>;
    livenessCheck(ulid, ownerAddress): Promise<boolean>;
    loadFolderMetaByPath(path): Promise<IFolderMetaData>;
    loadFolderMetaByUlid(ulid): Promise<IFolderMetaData>;
    loadFolderMetaHandler(path): Promise<IFolderMetaHandler>;
    loadFromLegacyMerkles(path, location, fileMeta): Promise<IFileMetaHandler>;
    loadKeysByPath(path, ownerAddress): Promise<IAesBundle>;
    loadKeysByUlid(ulid, ownerAddress, linkKey?): Promise<IAesBundle>;
    loadLegacyMeta(legacyMerkles, legacyPath): Promise<IFileMetaData>;
    loadMetaByExternalPath(path, ownerAddress): Promise<TMetaDataSets>;
    loadMetaByExternalUlid(ulid, ownerAddress, linkKey?): Promise<TMetaDataSets>;
    loadMetaByPath(path): Promise<TMetaDataSets>;
    loadMetaByUlid(options): Promise<TMetaDataSets>;
    loadRefMeta(options): Promise<IRefMetaData | INullRefMetaData>;
    loadShareMeta(path): Promise<IShareMetaData>;
    loadSharerRefMeta(ulid, ref): Promise<ISharerRefMetaData | INullSharerRefMetaData>;
    protectNotification(receiverAddress, aes): Promise<string>;
    readFolderContents(path, options?): Promise<IChildMetaDataMap>;
    readShareNotification(notificationData): Promise<INotificationRecord>;
    readSharingRefCount(sharer?): Promise<[number, number]>;
    readViewerShares(ulid, index?): string[];
    refCountIncrement(path): void;
    refCountRead(path): Promise<number>;
    refCountSet(path, value): void;
    setContents(ulid, meta): Promise<IReconstructedFileTree>;
    setMetaViewers(options): Promise<IReconstructedFileTree>;
    sharerCountIncrement(ulid): void;
    sharerCountRead(ulid): Promise<number>;
    sharerCountSet(ulid, value): void;
    sharerRefRead(path, sharer): Promise<number>;
    sharersRead(path): Promise<string[]>;
    sharingLookup(options?): Promise<IFolderMetaData[] | IShareMetaData[]>;
    ulidLookup(path, owner?): string;
    updateExistingPostFile(ulid, location, meta): Promise<MsgPostFile>;
    viewerLookup(ulid, index?): Promise<Record<string, string>>;
    viewerSave(ulid, access, index?): void;
}

Implemented by

Methods

\ No newline at end of file +updateExistingPostFile +viewerLookup +viewerSave +

Methods

\ No newline at end of file diff --git a/docs/interfaces/IFinalGas.html b/docs/interfaces/IFinalGas.html index c182e9dd..46a1ab32 100644 --- a/docs/interfaces/IFinalGas.html +++ b/docs/interfaces/IFinalGas.html @@ -1,3 +1,3 @@ -IFinalGas | @jackallabs/jackal.js
interface IFinalGas {
    fee: IGasRate;
    msgs: EncodeObject[];
}

Properties

fee +IFinalGas | @jackallabs/jackal.js
interface IFinalGas {
    fee: IGasRate;
    msgs: EncodeObject[];
}

Properties

Properties

msgs: EncodeObject[]
\ No newline at end of file +

Properties

msgs: EncodeObject[]
\ No newline at end of file diff --git a/docs/interfaces/IFolderMetaData.html b/docs/interfaces/IFolderMetaData.html index 14fa4335..66f33a95 100644 --- a/docs/interfaces/IFolderMetaData.html +++ b/docs/interfaces/IFolderMetaData.html @@ -1,7 +1,8 @@ -IFolderMetaData | @jackallabs/jackal.js

Interface IFolderMetaData

interface IFolderMetaData {
    count: string;
    description: string;
    location: string;
    merkleHex: string;
    metaDataType: "folder";
    whoAmI: string;
}

Hierarchy (view full)

Properties

count +IFolderMetaData | @jackallabs/jackal.js

Interface IFolderMetaData

interface IFolderMetaData {
    count: string;
    description: string;
    location: string;
    merkleHex: string;
    metaDataType: "folder";
    sharerCount?: string;
    whoAmI: string;
}

Hierarchy (view full)

Properties

count: string
description: string
location: string
merkleHex: string
metaDataType: "folder"
whoAmI: string
\ No newline at end of file +

Properties

count: string
description: string
location: string
merkleHex: string
metaDataType: "folder"
sharerCount?: string
whoAmI: string
\ No newline at end of file diff --git a/docs/interfaces/IFolderMetaDataSource.html b/docs/interfaces/IFolderMetaDataSource.html deleted file mode 100644 index 352fe020..00000000 --- a/docs/interfaces/IFolderMetaDataSource.html +++ /dev/null @@ -1,7 +0,0 @@ -IFolderMetaDataSource | @jackallabs/jackal.js

Interface IFolderMetaDataSource

interface IFolderMetaDataSource {
    count: number;
    description?: string;
    location: string;
    name: string;
    refIndex?: number;
    ulid?: string;
}

Properties

count: number
description?: string
location: string
name: string
refIndex?: number
ulid?: string
\ No newline at end of file diff --git a/docs/interfaces/IFolderMetaFoundationalData.html b/docs/interfaces/IFolderMetaFoundationalData.html index 413f1c79..d254eaee 100644 --- a/docs/interfaces/IFolderMetaFoundationalData.html +++ b/docs/interfaces/IFolderMetaFoundationalData.html @@ -1,7 +1,8 @@ -IFolderMetaFoundationalData | @jackallabs/jackal.js

Interface IFolderMetaFoundationalData

interface IFolderMetaFoundationalData {
    count: number;
    description: string;
    location: string;
    refIndex: number;
    ulid: string;
    whoAmI: string;
}

Properties

count +IFolderMetaFoundationalData | @jackallabs/jackal.js

Interface IFolderMetaFoundationalData

interface IFolderMetaFoundationalData {
    count: number;
    description: string;
    location: string;
    refIndex: number;
    sharerCount: number;
    ulid: string;
    whoAmI: string;
}

Properties

count: number
description: string
location: string
refIndex: number
ulid: string
whoAmI: string
\ No newline at end of file +

Properties

count: number
description: string
location: string
refIndex: number
sharerCount: number
ulid: string
whoAmI: string
\ No newline at end of file diff --git a/docs/interfaces/IFolderMetaHandler.html b/docs/interfaces/IFolderMetaHandler.html index 7727bcba..12acbb69 100644 --- a/docs/interfaces/IFolderMetaHandler.html +++ b/docs/interfaces/IFolderMetaHandler.html @@ -1,12 +1,15 @@ -IFolderMetaHandler | @jackallabs/jackal.js

Interface IFolderMetaHandler

interface IFolderMetaHandler {
    addAndReturnCount(value): number;
    export(): IFolderMetaData;
    exportRef(): IRefMetaData;
    getCount(): number;
    getLocation(): string;
    getRefIndex(): number;
    getRefString(): string;
    getUlid(): string;
    setCount(count): void;
    setLocation(location): void;
    setRefIndex(refIndex): void;
}

Hierarchy (view full)

Methods

addAndReturnCount +IFolderMetaHandler | @jackallabs/jackal.js

Interface IFolderMetaHandler

interface IFolderMetaHandler {
    addAndReturnCount(value): number;
    addAndReturnSharerCount(value): number;
    export(): IFolderMetaData;
    exportRef(): IRefMetaData;
    getCount(): number;
    getLocation(): string;
    getRefIndex(): number;
    getRefString(): string;
    getSharerCount(): number;
    getUlid(): string;
    setCount(count): void;
    setLocation(location): void;
    setRefIndex(refIndex): void;
    setSharerCount(count): void;
}

Hierarchy (view full)

Implemented by

Methods

\ No newline at end of file +setSharerCount +

Methods

\ No newline at end of file diff --git a/docs/interfaces/IGasRate.html b/docs/interfaces/IGasRate.html index 3ac1dda0..ca8bd406 100644 --- a/docs/interfaces/IGasRate.html +++ b/docs/interfaces/IGasRate.html @@ -1,3 +1,3 @@ -IGasRate | @jackallabs/jackal.js
interface IGasRate {
    amount: Coin[];
    gas: string;
}

Properties

amount +IGasRate | @jackallabs/jackal.js
interface IGasRate {
    amount: Coin[];
    gas: string;
}

Properties

Properties

amount: Coin[]
gas: string
\ No newline at end of file +

Properties

amount: Coin[]
gas: string
\ No newline at end of file diff --git a/docs/interfaces/ILegacyFolderMetaData.html b/docs/interfaces/ILegacyFolderMetaData.html index 82a0f254..c66f3cb8 100644 --- a/docs/interfaces/ILegacyFolderMetaData.html +++ b/docs/interfaces/ILegacyFolderMetaData.html @@ -1,7 +1,7 @@ -ILegacyFolderMetaData | @jackallabs/jackal.js

Interface ILegacyFolderMetaData

interface ILegacyFolderMetaData {
    dirChildren: string[];
    fileChildren: Record<string, IFileMeta>;
    metaDataType: undefined;
    whereAmI: string;
    whoAmI: string;
    whoOwnsMe: string;
}

Properties

dirChildren +ILegacyFolderMetaData | @jackallabs/jackal.js

Interface ILegacyFolderMetaData

interface ILegacyFolderMetaData {
    dirChildren: string[];
    fileChildren: Record<string, IFileMeta>;
    metaDataType: undefined;
    whereAmI: string;
    whoAmI: string;
    whoOwnsMe: string;
}

Properties

dirChildren: string[]
fileChildren: Record<string, IFileMeta>
metaDataType: undefined
whereAmI: string
whoAmI: string
whoOwnsMe: string
\ No newline at end of file +

Properties

dirChildren: string[]
fileChildren: Record<string, IFileMeta>
metaDataType: undefined
whereAmI: string
whoAmI: string
whoOwnsMe: string
\ No newline at end of file diff --git a/docs/interfaces/IListOptions.html b/docs/interfaces/IListOptions.html index c647395e..a8e8e90d 100644 --- a/docs/interfaces/IListOptions.html +++ b/docs/interfaces/IListOptions.html @@ -1,8 +1,8 @@ IListOptions | @jackallabs/jackal.js

Interface IListOptions

IListOptions

-
interface IListOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    price: Coin;
    rns: string;
}

Properties

interface IListOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    price: Coin;
    rns: string;
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
price: Coin

Value to buy as DCoin instance.

-
rns: string

RNS to list on market.

-
\ No newline at end of file +

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
price: Coin

Value to buy as DCoin instance.

+
rns: string

RNS to list on market.

+
\ No newline at end of file diff --git a/docs/interfaces/ILoadMetaOptions.html b/docs/interfaces/ILoadMetaOptions.html new file mode 100644 index 00000000..54f47be7 --- /dev/null +++ b/docs/interfaces/ILoadMetaOptions.html @@ -0,0 +1,6 @@ +ILoadMetaOptions | @jackallabs/jackal.js

Interface ILoadMetaOptions

IListOptions

+
interface ILoadMetaOptions {
    file: Files;
    legacyPath?: [string, string];
    linkKey?: string;
    ulid: string;
}

Properties

Properties

file: Files
legacyPath?: [string, string]
linkKey?: string
ulid: string
\ No newline at end of file diff --git a/docs/interfaces/ILoadRefMetaOptions.html b/docs/interfaces/ILoadRefMetaOptions.html new file mode 100644 index 00000000..a113f196 --- /dev/null +++ b/docs/interfaces/ILoadRefMetaOptions.html @@ -0,0 +1,5 @@ +ILoadRefMetaOptions | @jackallabs/jackal.js

Interface ILoadRefMetaOptions

interface ILoadRefMetaOptions {
    linkKey?: string;
    ownerAddress?: string;
    ref: number;
    ulid: string;
}

Properties

linkKey?: string
ownerAddress?: string
ref: number
ulid: string
\ No newline at end of file diff --git a/docs/interfaces/ILoadThumbnailOptionsWithPath.html b/docs/interfaces/ILoadThumbnailOptionsWithPath.html new file mode 100644 index 00000000..7a0a6587 --- /dev/null +++ b/docs/interfaces/ILoadThumbnailOptionsWithPath.html @@ -0,0 +1,6 @@ +ILoadThumbnailOptionsWithPath | @jackallabs/jackal.js

Interface ILoadThumbnailOptionsWithPath

ILoadThumbnailOptionsWithPath

+
interface ILoadThumbnailOptionsWithPath {
    ulid: string;
    userAddress: string;
}

Properties

Properties

ulid: string

The ulid of the File Meta.

+
userAddress: string

The Jackal address owning the data.

+
\ No newline at end of file diff --git a/docs/interfaces/ILoadThumbnailOptionsWithUlid.html b/docs/interfaces/ILoadThumbnailOptionsWithUlid.html new file mode 100644 index 00000000..7bb24c7e --- /dev/null +++ b/docs/interfaces/ILoadThumbnailOptionsWithUlid.html @@ -0,0 +1,6 @@ +ILoadThumbnailOptionsWithUlid | @jackallabs/jackal.js

Interface ILoadThumbnailOptionsWithUlid

ILoadThumbnailOptionsWithUlid

+
interface ILoadThumbnailOptionsWithUlid {
    filePath: string;
    userAddress: string;
}

Properties

Properties

filePath: string

The path to the File Meta.

+
userAddress: string

The Jackal address owning the data.

+
\ No newline at end of file diff --git a/docs/interfaces/IMetaDataByUlidOptions.html b/docs/interfaces/IMetaDataByUlidOptions.html new file mode 100644 index 00000000..b728606d --- /dev/null +++ b/docs/interfaces/IMetaDataByUlidOptions.html @@ -0,0 +1,8 @@ +IMetaDataByUlidOptions | @jackallabs/jackal.js

Interface IMetaDataByUlidOptions

IMetaDataByUlidOptions

+
interface IMetaDataByUlidOptions {
    linkKey?: string;
    ulid: string;
    userAddress?: string;
}

Properties

Properties

linkKey?: string

The key to unlock the data if this was shared via link.

+
ulid: string

The ulid of the data.

+
userAddress?: string

The Jackal address owning the data.

+
\ No newline at end of file diff --git a/docs/interfaces/IMnemonicSigner.html b/docs/interfaces/IMnemonicSigner.html new file mode 100644 index 00000000..70bf5817 --- /dev/null +++ b/docs/interfaces/IMnemonicSigner.html @@ -0,0 +1,9 @@ +IMnemonicSigner | @jackallabs/jackal.js

Interface IMnemonicSigner

interface IMnemonicSigner {
    signAmino: ((signerAddress, signDoc) => Promise<AminoSignResponse>);
    signDirect: ((signerAddress, signDoc) => Promise<DirectSignResponse>);
    getAccounts(): Promise<readonly AccountData[]>;
}

Hierarchy

  • TMergedSigner
    • IMnemonicSigner

Implemented by

Properties

Methods

Properties

signAmino: ((signerAddress, signDoc) => Promise<AminoSignResponse>)

Request signature from whichever key corresponds to provided bech32-encoded address. Rejects if not enabled.

+

The signer implementation may offer the user the ability to override parts of the signDoc. It must +return the doc that was signed in the response.

+

Type declaration

    • (signerAddress, signDoc): Promise<AminoSignResponse>
    • Parameters

      • signerAddress: string

        The address of the account that should sign the transaction

        +
      • signDoc: StdSignDoc

        The content that should be signed

        +

      Returns Promise<AminoSignResponse>

signDirect: ((signerAddress, signDoc) => Promise<DirectSignResponse>)

Type declaration

    • (signerAddress, signDoc): Promise<DirectSignResponse>
    • Parameters

      • signerAddress: string
      • signDoc: SignDoc

      Returns Promise<DirectSignResponse>

Methods

\ No newline at end of file diff --git a/docs/interfaces/IMnemonicWallet.html b/docs/interfaces/IMnemonicWallet.html index 8c5b26f0..56904eee 100644 --- a/docs/interfaces/IMnemonicWallet.html +++ b/docs/interfaces/IMnemonicWallet.html @@ -1,4 +1,4 @@ -IMnemonicWallet | @jackallabs/jackal.js

Interface IMnemonicWallet

interface IMnemonicWallet {
    getAddress(): string;
    getOfflineSigner(): TMergedSigner;
    signArbitrary(address, message): Promise<StdSignature>;
}

Implemented by

Methods

getAddress +IMnemonicWallet | @jackallabs/jackal.js

Interface IMnemonicWallet

interface IMnemonicWallet {
    getAddress(): string;
    getOfflineSigner(): TMergedSigner;
    signArbitrary(address, message): Promise<StdSignature>;
}

Implemented by

Methods

\ No newline at end of file +

Methods

\ No newline at end of file diff --git a/docs/interfaces/IMoveRenameResourceOptions.html b/docs/interfaces/IMoveRenameResourceOptions.html index 06baf85a..5b92ad19 100644 --- a/docs/interfaces/IMoveRenameResourceOptions.html +++ b/docs/interfaces/IMoveRenameResourceOptions.html @@ -1,5 +1,5 @@ -IMoveRenameResourceOptions | @jackallabs/jackal.js

Interface IMoveRenameResourceOptions

interface IMoveRenameResourceOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    finish: string;
    start: string;
}

Properties

broadcastOptions? +IMoveRenameResourceOptions | @jackallabs/jackal.js

Interface IMoveRenameResourceOptions

interface IMoveRenameResourceOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    finish: string;
    start: string;
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
finish: string
start: string
\ No newline at end of file +

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
finish: string
start: string
\ No newline at end of file diff --git a/docs/interfaces/IMoveRenameTarget.html b/docs/interfaces/IMoveRenameTarget.html index 32d2f829..a680f7f3 100644 --- a/docs/interfaces/IMoveRenameTarget.html +++ b/docs/interfaces/IMoveRenameTarget.html @@ -1,6 +1,6 @@ -IMoveRenameTarget | @jackallabs/jackal.js

Interface IMoveRenameTarget

interface IMoveRenameTarget {
    file?: IFileMetaData;
    folder?: IFolderMetaData;
    location?: string;
    name: string;
    ref: number;
}

Properties

file? +IMoveRenameTarget | @jackallabs/jackal.js

Interface IMoveRenameTarget

interface IMoveRenameTarget {
    file?: IFileMetaData;
    folder?: IFolderMetaData;
    location?: string;
    name: string;
    ref: number;
}

Properties

location?: string
name: string
ref: number
\ No newline at end of file +

Properties

location?: string
name: string
ref: number
\ No newline at end of file diff --git a/docs/interfaces/INameWithMeta.html b/docs/interfaces/INameWithMeta.html new file mode 100644 index 00000000..60d051ac --- /dev/null +++ b/docs/interfaces/INameWithMeta.html @@ -0,0 +1,3 @@ +INameWithMeta | @jackallabs/jackal.js

Interface INameWithMeta

interface INameWithMeta {
    data: IRnsMetaData;
    subdomains: INameWithMeta[];
}

Hierarchy

  • Omit<Omit<DName, "subdomains">, "data">
    • INameWithMeta

Properties

Properties

subdomains: INameWithMeta[]
\ No newline at end of file diff --git a/docs/interfaces/INoCloneFileMetaDataSource.html b/docs/interfaces/INoCloneFileMetaDataSource.html index c565a4c3..24320da4 100644 --- a/docs/interfaces/INoCloneFileMetaDataSource.html +++ b/docs/interfaces/INoCloneFileMetaDataSource.html @@ -1,9 +1,10 @@ -INoCloneFileMetaDataSource | @jackallabs/jackal.js

Interface INoCloneFileMetaDataSource

interface INoCloneFileMetaDataSource {
    description?: string;
    file?: File;
    fileMeta: IFileMeta;
    legacyMerkles?: Uint8Array[];
    location: string;
    refIndex?: number;
    thumbnail?: string;
    ulid?: string;
}

Properties

description? +INoCloneFileMetaDataSource | @jackallabs/jackal.js

Interface INoCloneFileMetaDataSource

interface INoCloneFileMetaDataSource {
    description?: string;
    file?: File;
    fileMeta: IFileMeta;
    legacyMerkles?: Uint8Array[];
    location: string;
    refIndex?: number;
    sharerCount?: number;
    thumbnail?: string;
    ulid?: string;
}

Properties

description?: string
file?: File
fileMeta: IFileMeta
legacyMerkles?: Uint8Array[]
location: string
refIndex?: number
thumbnail?: string
ulid?: string
\ No newline at end of file +

Properties

description?: string
file?: File
fileMeta: IFileMeta
legacyMerkles?: Uint8Array[]
location: string
refIndex?: number
sharerCount?: number
thumbnail?: string
ulid?: string
\ No newline at end of file diff --git a/docs/interfaces/INoCloneFolderMetaDataSource.html b/docs/interfaces/INoCloneFolderMetaDataSource.html new file mode 100644 index 00000000..563b7653 --- /dev/null +++ b/docs/interfaces/INoCloneFolderMetaDataSource.html @@ -0,0 +1,8 @@ +INoCloneFolderMetaDataSource | @jackallabs/jackal.js

Interface INoCloneFolderMetaDataSource

interface INoCloneFolderMetaDataSource {
    count: number;
    description?: string;
    location: string;
    name: string;
    refIndex?: number;
    sharerCount?: number;
    ulid?: string;
}

Properties

count: number
description?: string
location: string
name: string
refIndex?: number
sharerCount?: number
ulid?: string
\ No newline at end of file diff --git a/docs/interfaces/INoCloneRnsMetaDataSource.html b/docs/interfaces/INoCloneRnsMetaDataSource.html new file mode 100644 index 00000000..3f7172ea --- /dev/null +++ b/docs/interfaces/INoCloneRnsMetaDataSource.html @@ -0,0 +1,9 @@ +INoCloneRnsMetaDataSource | @jackallabs/jackal.js

Interface INoCloneRnsMetaDataSource

interface INoCloneRnsMetaDataSource {
    avatar?: string;
    bio?: string;
    discord?: string;
    extensions?: any;
    telegram?: string;
    thumbnail?: string;
    twitter?: string;
    website?: string;
}

Properties

avatar?: string
bio?: string
discord?: string
extensions?: any
telegram?: string
thumbnail?: string
twitter?: string
website?: string
\ No newline at end of file diff --git a/docs/interfaces/INotification.html b/docs/interfaces/INotification.html index bf14e6a2..85e95f13 100644 --- a/docs/interfaces/INotification.html +++ b/docs/interfaces/INotification.html @@ -1,2 +1,2 @@ -INotification | @jackallabs/jackal.js

Interface INotification

interface INotification {
    msg: string;
}

Hierarchy (view full)

Properties

msg -

Properties

msg: string
\ No newline at end of file +INotification | @jackallabs/jackal.js

Interface INotification

interface INotification {
    msg: string;
}

Hierarchy (view full)

Properties

msg +

Properties

msg: string
\ No newline at end of file diff --git a/docs/interfaces/INotificationDeletePackage.html b/docs/interfaces/INotificationDeletePackage.html new file mode 100644 index 00000000..34628ce1 --- /dev/null +++ b/docs/interfaces/INotificationDeletePackage.html @@ -0,0 +1,3 @@ +INotificationDeletePackage | @jackallabs/jackal.js

Interface INotificationDeletePackage

interface INotificationDeletePackage {
    from: string;
    time: number;
}

Properties

Properties

from: string
time: number
\ No newline at end of file diff --git a/docs/interfaces/INotificationPackage.html b/docs/interfaces/INotificationPackage.html index 573f006c..1420daa0 100644 --- a/docs/interfaces/INotificationPackage.html +++ b/docs/interfaces/INotificationPackage.html @@ -1,5 +1,5 @@ -INotificationPackage | @jackallabs/jackal.js

Interface INotificationPackage

interface INotificationPackage {
    isFile: boolean;
    isPrivate: boolean;
    path: string;
    receiver: string;
}

Properties

isFile +INotificationPackage | @jackallabs/jackal.js

Interface INotificationPackage

interface INotificationPackage {
    contents: string;
    isPrivate: boolean;
    msg: string;
    receiver: string;
}

Properties

isFile: boolean
isPrivate: boolean
path: string
receiver: string
\ No newline at end of file +

Properties

contents: string
isPrivate: boolean
msg: string
receiver: string
\ No newline at end of file diff --git a/docs/interfaces/INotificationRecord.html b/docs/interfaces/INotificationRecord.html index 8f0eadab..68b86e97 100644 --- a/docs/interfaces/INotificationRecord.html +++ b/docs/interfaces/INotificationRecord.html @@ -1,4 +1,5 @@ -INotificationRecord | @jackallabs/jackal.js

Interface INotificationRecord

interface INotificationRecord {
    msg: string;
    receiver: string;
    sender: string;
}

Hierarchy (view full)

Properties

msg +INotificationRecord | @jackallabs/jackal.js

Interface INotificationRecord

interface INotificationRecord {
    msg: string;
    receiver: string;
    sender: string;
    time: number;
}

Hierarchy (view full)

Properties

Properties

msg: string
receiver: string
sender: string
\ No newline at end of file +time +

Properties

msg: string
receiver: string
sender: string
time: number
\ No newline at end of file diff --git a/docs/interfaces/INullMetaData.html b/docs/interfaces/INullMetaData.html index ec96bf66..f8c43659 100644 --- a/docs/interfaces/INullMetaData.html +++ b/docs/interfaces/INullMetaData.html @@ -1,5 +1,5 @@ -INullMetaData | @jackallabs/jackal.js

Interface INullMetaData

interface INullMetaData {
    location: string;
    merkleHex: string;
    metaDataType: "null";
    removed: true;
}

Hierarchy (view full)

Properties

location +INullMetaData | @jackallabs/jackal.js

Interface INullMetaData

interface INullMetaData {
    location: string;
    merkleHex: string;
    metaDataType: "null";
    removed: true;
}

Hierarchy (view full)

Properties

location: string
merkleHex: string
metaDataType: "null"
removed: true
\ No newline at end of file +

Properties

location: string
merkleHex: string
metaDataType: "null"
removed: true
\ No newline at end of file diff --git a/docs/interfaces/INullMetaDataSource.html b/docs/interfaces/INullMetaDataSource.html index d620625f..2933002b 100644 --- a/docs/interfaces/INullMetaDataSource.html +++ b/docs/interfaces/INullMetaDataSource.html @@ -1,4 +1,4 @@ -INullMetaDataSource | @jackallabs/jackal.js

Interface INullMetaDataSource

interface INullMetaDataSource {
    location: string;
    refIndex: number;
    ulid: string;
}

Hierarchy (view full)

Properties

location +INullMetaDataSource | @jackallabs/jackal.js

Interface INullMetaDataSource

interface INullMetaDataSource {
    location: string;
    refIndex: number;
    ulid: string;
}

Hierarchy (view full)

Properties

Properties

location: string
refIndex: number
ulid: string
\ No newline at end of file +

Properties

location: string
refIndex: number
ulid: string
\ No newline at end of file diff --git a/docs/interfaces/INullMetaFoundationalData.html b/docs/interfaces/INullMetaFoundationalData.html index 799ad8b9..0884a740 100644 --- a/docs/interfaces/INullMetaFoundationalData.html +++ b/docs/interfaces/INullMetaFoundationalData.html @@ -1,4 +1,4 @@ -INullMetaFoundationalData | @jackallabs/jackal.js

Interface INullMetaFoundationalData

interface INullMetaFoundationalData {
    location: string;
    refIndex: number;
    ulid: string;
}

Hierarchy (view full)

Properties

location +INullMetaFoundationalData | @jackallabs/jackal.js

Interface INullMetaFoundationalData

interface INullMetaFoundationalData {
    location: string;
    refIndex: number;
    ulid: string;
}

Hierarchy (view full)

Properties

Properties

location: string
refIndex: number
ulid: string
\ No newline at end of file +

Properties

location: string
refIndex: number
ulid: string
\ No newline at end of file diff --git a/docs/interfaces/INullMetaHandler.html b/docs/interfaces/INullMetaHandler.html index 545b80f7..d7f2fa50 100644 --- a/docs/interfaces/INullMetaHandler.html +++ b/docs/interfaces/INullMetaHandler.html @@ -1,8 +1,9 @@ -INullMetaHandler | @jackallabs/jackal.js

Interface INullMetaHandler

interface INullMetaHandler {
    export(): INullMetaData;
    exportRef(): INullRefMetaData;
    getLocation(): string;
    getRefIndex(): number;
    getRefString(): string;
    getSelf(): string;
    setRefIndex(refIndex): void;
}

Hierarchy (view full)

Methods

export +INullMetaHandler | @jackallabs/jackal.js

Interface INullMetaHandler

interface INullMetaHandler {
    export(): INullMetaData;
    exportRef(): INullRefMetaData;
    exportSharerRef(): INullSharerRefMetaData;
    getLocation(): string;
    getRefIndex(): number;
    getRefString(): string;
    getSelf(): string;
    setRefIndex(refIndex): void;
}

Hierarchy (view full)

Implemented by

Methods

\ No newline at end of file +

Methods

\ No newline at end of file diff --git a/docs/interfaces/INullRefMetaData.html b/docs/interfaces/INullRefMetaData.html index e93f1a30..2a456313 100644 --- a/docs/interfaces/INullRefMetaData.html +++ b/docs/interfaces/INullRefMetaData.html @@ -1,5 +1,5 @@ -INullRefMetaData | @jackallabs/jackal.js

Interface INullRefMetaData

interface INullRefMetaData {
    location: string;
    merkleHex: string;
    metaDataType: "nullref";
    pointsTo: string;
}

Hierarchy

Properties

location +INullRefMetaData | @jackallabs/jackal.js

Interface INullRefMetaData

interface INullRefMetaData {
    location: string;
    merkleHex: string;
    metaDataType: "nullref";
    pointsTo: string;
}

Hierarchy

Properties

location: string
merkleHex: string
metaDataType: "nullref"
pointsTo: string
\ No newline at end of file +

Properties

location: string
merkleHex: string
metaDataType: "nullref"
pointsTo: string
\ No newline at end of file diff --git a/docs/interfaces/INullSharerRefMetaData.html b/docs/interfaces/INullSharerRefMetaData.html new file mode 100644 index 00000000..ca55422a --- /dev/null +++ b/docs/interfaces/INullSharerRefMetaData.html @@ -0,0 +1,8 @@ +INullSharerRefMetaData | @jackallabs/jackal.js

Interface INullSharerRefMetaData

interface INullSharerRefMetaData {
    location: string;
    merkleHex: string;
    metaDataType: "nullsharerref";
    pointsTo: string;
    sharer: string;
    type: TSharerType;
    when: number;
}

Hierarchy

Properties

location: string
merkleHex: string
metaDataType: "nullsharerref"
pointsTo: string
sharer: string
when: number
\ No newline at end of file diff --git a/docs/interfaces/IOracleHandler.html b/docs/interfaces/IOracleHandler.html index 3ec3ecb7..a56ca20d 100644 --- a/docs/interfaces/IOracleHandler.html +++ b/docs/interfaces/IOracleHandler.html @@ -1,5 +1,5 @@ -IOracleHandler | @jackallabs/jackal.js

Interface IOracleHandler

interface IOracleHandler {
    createFeed(oracleName): Promise<DeliverTxResponse>;
    getAllFeeds(pagination?): Promise<TQueryAllFeedsResponseStrict>;
    getFeed(name): Promise<MFeed>;
    pushToFeed(oracleName, data): Promise<DeliverTxResponse>;
}

Implemented by

Methods

createFeed +IOracleHandler | @jackallabs/jackal.js

Interface IOracleHandler

interface IOracleHandler {
    createFeed(oracleName): Promise<DeliverTxResponse>;
    getAllFeeds(pagination?): Promise<TQueryAllFeedsResponseStrict>;
    getFeed(name): Promise<MFeed>;
    pushToFeed(oracleName, data): Promise<DeliverTxResponse>;
}

Implemented by

Methods

\ No newline at end of file +

Methods

\ No newline at end of file diff --git a/docs/interfaces/IPageRequest.html b/docs/interfaces/IPageRequest.html index 96c7f0a1..ea2650a8 100644 --- a/docs/interfaces/IPageRequest.html +++ b/docs/interfaces/IPageRequest.html @@ -1,6 +1,6 @@ -IPageRequest | @jackallabs/jackal.js

Interface IPageRequest

interface IPageRequest {
    countTotal: boolean;
    key: Uint8Array;
    limit: number;
    offset: number;
    reverse: boolean;
}

Properties

countTotal +IPageRequest | @jackallabs/jackal.js

Interface IPageRequest

interface IPageRequest {
    countTotal: boolean;
    key: Uint8Array;
    limit: number;
    offset: number;
    reverse: boolean;
}

Properties

countTotal: boolean
key: Uint8Array
limit: number
offset: number
reverse: boolean
\ No newline at end of file +

Properties

countTotal: boolean
key: Uint8Array
limit: number
offset: number
reverse: boolean
\ No newline at end of file diff --git a/docs/interfaces/IPathToLookupOptions.html b/docs/interfaces/IPathToLookupOptions.html new file mode 100644 index 00000000..7be6f81f --- /dev/null +++ b/docs/interfaces/IPathToLookupOptions.html @@ -0,0 +1,4 @@ +IPathToLookupOptions | @jackallabs/jackal.js

Interface IPathToLookupOptions

interface IPathToLookupOptions {
    linkKey?: string;
    owner?: string;
    path: string;
}

Properties

Properties

linkKey?: string
owner?: string
path: string
\ No newline at end of file diff --git a/docs/interfaces/IPrivateNotification.html b/docs/interfaces/IPrivateNotification.html index 019d3dd6..e1ca3bfd 100644 --- a/docs/interfaces/IPrivateNotification.html +++ b/docs/interfaces/IPrivateNotification.html @@ -1,4 +1,4 @@ -IPrivateNotification | @jackallabs/jackal.js

Interface IPrivateNotification

interface IPrivateNotification {
    keys: string;
    msg: string;
    private: true;
}

Hierarchy (view full)

Properties

keys +IPrivateNotification | @jackallabs/jackal.js

Interface IPrivateNotification

interface IPrivateNotification {
    keys: string;
    msg: string;
    private: true;
}

Hierarchy (view full)

Properties

Properties

keys: string
msg: string
private: true
\ No newline at end of file +

Properties

keys: string
msg: string
private: true
\ No newline at end of file diff --git a/docs/interfaces/IProviderIpSet.html b/docs/interfaces/IProviderIpSet.html index f32fd95f..b5678c58 100644 --- a/docs/interfaces/IProviderIpSet.html +++ b/docs/interfaces/IProviderIpSet.html @@ -1 +1 @@ -IProviderIpSet | @jackallabs/jackal.js

Interface IProviderIpSet

interface IProviderIpSet {}

Hierarchy

  • Record<string, string>
    • IProviderIpSet
\ No newline at end of file +IProviderIpSet | @jackallabs/jackal.js

Interface IProviderIpSet

interface IProviderIpSet {}

Hierarchy

  • Record<string, string>
    • IProviderIpSet
\ No newline at end of file diff --git a/docs/interfaces/IProviderPool.html b/docs/interfaces/IProviderPool.html index 545c6868..81e19d20 100644 --- a/docs/interfaces/IProviderPool.html +++ b/docs/interfaces/IProviderPool.html @@ -1 +1 @@ -IProviderPool | @jackallabs/jackal.js

Interface IProviderPool

interface IProviderPool {}

Hierarchy

\ No newline at end of file +IProviderPool | @jackallabs/jackal.js

Interface IProviderPool

interface IProviderPool {}

Hierarchy

\ No newline at end of file diff --git a/docs/interfaces/IProviderStatusResponse.html b/docs/interfaces/IProviderStatusResponse.html new file mode 100644 index 00000000..87bf48f3 --- /dev/null +++ b/docs/interfaces/IProviderStatusResponse.html @@ -0,0 +1,6 @@ +IProviderStatusResponse | @jackallabs/jackal.js

Interface IProviderStatusResponse

interface IProviderStatusResponse {
    cid: string;
    merkle: ArrayBuffer;
    owner: string;
    progress: number;
    start: number;
}

Properties

Properties

cid: string
merkle: ArrayBuffer
owner: string
progress: number
start: number
\ No newline at end of file diff --git a/docs/interfaces/IProviderTraits.html b/docs/interfaces/IProviderTraits.html index 8b3534a8..d46aa9c2 100644 --- a/docs/interfaces/IProviderTraits.html +++ b/docs/interfaces/IProviderTraits.html @@ -1,3 +1,3 @@ -IProviderTraits | @jackallabs/jackal.js

Interface IProviderTraits

interface IProviderTraits {
    failures: number;
    ip: string;
}

Properties

failures +IProviderTraits | @jackallabs/jackal.js

Interface IProviderTraits

interface IProviderTraits {
    failures: number;
    ip: string;
}

Properties

Properties

failures: number
ip: string
\ No newline at end of file +

Properties

failures: number
ip: string
\ No newline at end of file diff --git a/docs/interfaces/IProviderUploadResponse.html b/docs/interfaces/IProviderUploadResponse.html index 043abdb9..18cbf7b6 100644 --- a/docs/interfaces/IProviderUploadResponse.html +++ b/docs/interfaces/IProviderUploadResponse.html @@ -1,4 +1,5 @@ -IProviderUploadResponse | @jackallabs/jackal.js

Interface IProviderUploadResponse

interface IProviderUploadResponse {
    merkle: ArrayBuffer;
    owner: string;
    start: number;
}

Properties

merkle +IProviderUploadResponse | @jackallabs/jackal.js

Interface IProviderUploadResponse

interface IProviderUploadResponse {
    cid?: string;
    merkle: ArrayBuffer;
    owner: string;
    start: number;
}

Properties

Properties

merkle: ArrayBuffer
owner: string
start: number
\ No newline at end of file +

Properties

cid?: string
merkle: ArrayBuffer
owner: string
start: number
\ No newline at end of file diff --git a/docs/interfaces/IProviderUploadV2Response.html b/docs/interfaces/IProviderUploadV2Response.html new file mode 100644 index 00000000..4cd982e8 --- /dev/null +++ b/docs/interfaces/IProviderUploadV2Response.html @@ -0,0 +1,2 @@ +IProviderUploadV2Response | @jackallabs/jackal.js

Interface IProviderUploadV2Response

interface IProviderUploadV2Response {
    job_id: string;
}

Properties

Properties

job_id: string
\ No newline at end of file diff --git a/docs/interfaces/IReadFolderContentOptions.html b/docs/interfaces/IReadFolderContentOptions.html index a0b22472..b903fe8e 100644 --- a/docs/interfaces/IReadFolderContentOptions.html +++ b/docs/interfaces/IReadFolderContentOptions.html @@ -1,4 +1,5 @@ -IReadFolderContentOptions | @jackallabs/jackal.js

Interface IReadFolderContentOptions

interface IReadFolderContentOptions {
    owner?: string;
    path?: string;
    refresh?: true;
}

Properties

owner? +IReadFolderContentOptions | @jackallabs/jackal.js

Interface IReadFolderContentOptions

interface IReadFolderContentOptions {
    linkKey?: string;
    owner?: string;
    path?: string;
    refresh?: true;
}

Properties

owner?: string
path?: string
refresh?: true
\ No newline at end of file +

Properties

linkKey?: string
owner?: string
path?: string
refresh?: true
\ No newline at end of file diff --git a/docs/interfaces/IReconstructedFileTree.html b/docs/interfaces/IReconstructedFileTree.html index 2f23eeba..7604d7bf 100644 --- a/docs/interfaces/IReconstructedFileTree.html +++ b/docs/interfaces/IReconstructedFileTree.html @@ -1,5 +1,5 @@ -IReconstructedFileTree | @jackallabs/jackal.js

Interface IReconstructedFileTree

interface IReconstructedFileTree {
    contents: string;
    editors: string;
    trackingNumber: string;
    viewers: string;
}

Properties

contents +IReconstructedFileTree | @jackallabs/jackal.js

Interface IReconstructedFileTree

interface IReconstructedFileTree {
    contents: string;
    editors: string;
    trackingNumber: string;
    viewers: string;
}

Properties

contents: string
editors: string
trackingNumber: string
viewers: string
\ No newline at end of file +

Properties

contents: string
editors: string
trackingNumber: string
viewers: string
\ No newline at end of file diff --git a/docs/interfaces/IRefMetaData.html b/docs/interfaces/IRefMetaData.html index 5b7bc470..e0032fd6 100644 --- a/docs/interfaces/IRefMetaData.html +++ b/docs/interfaces/IRefMetaData.html @@ -1,5 +1,5 @@ -IRefMetaData | @jackallabs/jackal.js

Interface IRefMetaData

interface IRefMetaData {
    location: string;
    merkleHex: string;
    metaDataType: "ref";
    pointsTo: string;
}

Hierarchy (view full)

Properties

location +IRefMetaData | @jackallabs/jackal.js

Interface IRefMetaData

interface IRefMetaData {
    location: string;
    merkleHex: string;
    metaDataType: "ref";
    pointsTo: string;
}

Hierarchy (view full)

Properties

location: string
merkleHex: string
metaDataType: "ref"
pointsTo: string
\ No newline at end of file +

Properties

location: string
merkleHex: string
metaDataType: "ref"
pointsTo: string
\ No newline at end of file diff --git a/docs/interfaces/IRefMetaHandler.html b/docs/interfaces/IRefMetaHandler.html index 754585aa..a4bc3ad6 100644 --- a/docs/interfaces/IRefMetaHandler.html +++ b/docs/interfaces/IRefMetaHandler.html @@ -1,4 +1,4 @@ -IRefMetaHandler | @jackallabs/jackal.js

Interface IRefMetaHandler

interface IRefMetaHandler {
    getRefIndex(): number;
    getRefString(): string;
    setRefIndex(refIndex): void;
}

Hierarchy (view full)

Methods

getRefIndex +IRefMetaHandler | @jackallabs/jackal.js

Interface IRefMetaHandler

interface IRefMetaHandler {
    getRefIndex(): number;
    getRefString(): string;
    setRefIndex(refIndex): void;
}

Hierarchy (view full)

Methods

\ No newline at end of file +

Methods

\ No newline at end of file diff --git a/docs/interfaces/IRegisterOptions.html b/docs/interfaces/IRegisterOptions.html index b0d51bf3..205bb482 100644 --- a/docs/interfaces/IRegisterOptions.html +++ b/docs/interfaces/IRegisterOptions.html @@ -1,12 +1,12 @@ IRegisterOptions | @jackallabs/jackal.js

Interface IRegisterOptions

IRegisterOptions

-
interface IRegisterOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    data?: IRnsData;
    rns: string;
    setAsPrimary?: boolean;
    yearsToRegister: number;
}

Properties

interface IRegisterOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    data?: INoCloneRnsMetaDataSource;
    rns: string;
    setAsPrimary?: boolean;
    yearsToRegister: number;
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
data?: IRnsData

Optional object to include in data field.

-
rns: string

RNS address to register.

-
setAsPrimary?: boolean

Optional flag to set as primary RNS.

-
yearsToRegister: number

Duration to register for in years.

-
\ No newline at end of file +

Properties

broadcastOptions?: IBroadcastOptions
chain?: true

Optional object to include in data field.

+
rns: string

RNS address to register.

+
setAsPrimary?: boolean

Optional flag to set as primary RNS.

+
yearsToRegister: number

Duration to register for in years.

+
\ No newline at end of file diff --git a/docs/interfaces/IRemoveShareRecordOptions.html b/docs/interfaces/IRemoveShareRecordOptions.html new file mode 100644 index 00000000..31f5b874 --- /dev/null +++ b/docs/interfaces/IRemoveShareRecordOptions.html @@ -0,0 +1,6 @@ +IRemoveShareRecordOptions | @jackallabs/jackal.js

Interface IRemoveShareRecordOptions

IRemoveShareRecordOptions

+
interface IRemoveShareRecordOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    record: IShareMetaData;
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true

Share meta data to remove.

+
\ No newline at end of file diff --git a/docs/interfaces/IRemoveSubRnsOptions.html b/docs/interfaces/IRemoveSubRnsOptions.html index 9cb69506..91501da4 100644 --- a/docs/interfaces/IRemoveSubRnsOptions.html +++ b/docs/interfaces/IRemoveSubRnsOptions.html @@ -1,6 +1,6 @@ IRemoveSubRnsOptions | @jackallabs/jackal.js

Interface IRemoveSubRnsOptions

IRemoveSubRnsOptions

-
interface IRemoveSubRnsOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    rns: string;
}

Properties

interface IRemoveSubRnsOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    rns: string;
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
rns: string

Full RNS to remove.

-
\ No newline at end of file +

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
rns: string

Full RNS to remove.

+
\ No newline at end of file diff --git a/docs/interfaces/IRnsData.html b/docs/interfaces/IRnsData.html index ef7b16b7..872445cd 100644 --- a/docs/interfaces/IRnsData.html +++ b/docs/interfaces/IRnsData.html @@ -1,4 +1,4 @@ -IRnsData | @jackallabs/jackal.js
interface IRnsData {
    notes?: string;
    twitter?: string;
    website?: string;
}

Properties

notes? +IRnsData | @jackallabs/jackal.js
interface IRnsData {
    notes?: string;
    twitter?: string;
    website?: string;
}

Properties

notes?: string
twitter?: string
website?: string
\ No newline at end of file +

Properties

notes?: string
twitter?: string
website?: string
\ No newline at end of file diff --git a/docs/interfaces/IRnsHandler.html b/docs/interfaces/IRnsHandler.html index ef6d3d24..b20d35d2 100644 --- a/docs/interfaces/IRnsHandler.html +++ b/docs/interfaces/IRnsHandler.html @@ -1,4 +1,4 @@ -IRnsHandler | @jackallabs/jackal.js
interface IRnsHandler {
    acceptBid(options): Promise<IWrappedEncodeObject[]>;
    activate(options?): Promise<IWrappedEncodeObject[]>;
    addSubRns(options): Promise<IWrappedEncodeObject[]>;
    bid(options): Promise<IWrappedEncodeObject[]>;
    buy(options): Promise<IWrappedEncodeObject[]>;
    cancelBid(options): Promise<IWrappedEncodeObject[]>;
    delist(options): Promise<IWrappedEncodeObject[]>;
    getAllMyNames(pagination?): Promise<TQueryListOwnedNamesResponseStrict>;
    getAllNames(pagination?): Promise<TQueryAllNamesResponseStrict>;
    getAllNamesForSale(pagination?): Promise<TQueryAllForSaleResponseStrict>;
    getAllNamesInWallet(address, pagination?): Promise<TQueryListOwnedNamesResponseStrict>;
    getBidForSingleName(name): Promise<Bids>;
    getBidsForAllNames(pagination?): Promise<TQueryAllBidsResponseStrict>;
    getNameDetails(name): Promise<Names>;
    getNameForSale(name): Promise<Forsale>;
    getPrimaryName(address?): Promise<Names>;
    list(options): Promise<IWrappedEncodeObject[]>;
    register(options): Promise<IWrappedEncodeObject[]>;
    removeSubRns(options): Promise<IWrappedEncodeObject[]>;
    rnsToAddress(name, prefix?): Promise<string>;
    transfer(options): Promise<IWrappedEncodeObject[]>;
    update(options): Promise<IWrappedEncodeObject[]>;
}

Implemented by

Methods

acceptBid +IRnsHandler | @jackallabs/jackal.js
interface IRnsHandler {
    acceptBid(options): Promise<IWrappedEncodeObject[]>;
    activate(options?): Promise<IWrappedEncodeObject[]>;
    addSubRns(options): Promise<IWrappedEncodeObject[]>;
    bid(options): Promise<IWrappedEncodeObject[]>;
    buy(options): Promise<IWrappedEncodeObject[]>;
    cancelBid(options): Promise<IWrappedEncodeObject[]>;
    delist(options): Promise<IWrappedEncodeObject[]>;
    getAllMyNames(pagination?): Promise<TQueryListOwnedNamesResponseStrict>;
    getAllNames(pagination?): Promise<TQueryAllNamesResponseStrict>;
    getAllNamesForSale(pagination?): Promise<TQueryAllForSaleResponseStrict>;
    getAllNamesInWallet(address, pagination?): Promise<TQueryListOwnedNamesResponseStrict>;
    getBidForSingleName(name): Promise<Bids>;
    getBidsForAllNames(pagination?): Promise<TQueryAllBidsResponseStrict>;
    getNameDetails(name): Promise<Names>;
    getNameForSale(name): Promise<Forsale>;
    getNameMetaDetails(name): Promise<INameWithMeta>;
    getPrimaryName(address?): Promise<Names>;
    list(options): Promise<IWrappedEncodeObject[]>;
    possibleRnsToJklAddress(name): Promise<string>;
    register(options): Promise<IWrappedEncodeObject[]>;
    removeSubRns(options): Promise<IWrappedEncodeObject[]>;
    rnsToAddress(name, prefix?): Promise<string>;
    setNewPrimary(options): Promise<IWrappedEncodeObject[]>;
    transfer(options): Promise<IWrappedEncodeObject[]>;
    update(options): Promise<IWrappedEncodeObject[]>;
}

Implemented by

Methods

\ No newline at end of file +

Methods

\ No newline at end of file diff --git a/docs/interfaces/IRnsMetaData.html b/docs/interfaces/IRnsMetaData.html new file mode 100644 index 00000000..94aea44d --- /dev/null +++ b/docs/interfaces/IRnsMetaData.html @@ -0,0 +1,10 @@ +IRnsMetaData | @jackallabs/jackal.js

Interface IRnsMetaData

interface IRnsMetaData {
    avatar: string;
    bio: string;
    discord: string;
    extensions: any;
    metaDataType: "rns";
    telegram: string;
    thumbnail: string;
    twitter: string;
    website: string;
}

Hierarchy (view full)

Properties

avatar: string
bio: string
discord: string
extensions: any
metaDataType: "rns"
telegram: string
thumbnail: string
twitter: string
website: string
\ No newline at end of file diff --git a/docs/interfaces/IRnsMetaFoundationalData.html b/docs/interfaces/IRnsMetaFoundationalData.html new file mode 100644 index 00000000..627d899d --- /dev/null +++ b/docs/interfaces/IRnsMetaFoundationalData.html @@ -0,0 +1,9 @@ +IRnsMetaFoundationalData | @jackallabs/jackal.js

Interface IRnsMetaFoundationalData

interface IRnsMetaFoundationalData {
    avatar: string;
    bio: string;
    discord: string;
    extensions: any;
    telegram: string;
    thumbnail: string;
    twitter: string;
    website: string;
}

Hierarchy (view full)

Properties

avatar: string
bio: string
discord: string
extensions: any
telegram: string
thumbnail: string
twitter: string
website: string
\ No newline at end of file diff --git a/docs/interfaces/IRnsMetaHandler.html b/docs/interfaces/IRnsMetaHandler.html new file mode 100644 index 00000000..ab7bb6d9 --- /dev/null +++ b/docs/interfaces/IRnsMetaHandler.html @@ -0,0 +1,2 @@ +IRnsMetaHandler | @jackallabs/jackal.js

Interface IRnsMetaHandler

interface IRnsMetaHandler {
    export(): IRnsMetaData;
}

Implemented by

Methods

Methods

\ No newline at end of file diff --git a/docs/interfaces/IRootLookupMetaData.html b/docs/interfaces/IRootLookupMetaData.html index ef3e6621..f2f9b5f9 100644 --- a/docs/interfaces/IRootLookupMetaData.html +++ b/docs/interfaces/IRootLookupMetaData.html @@ -1,3 +1,3 @@ -IRootLookupMetaData | @jackallabs/jackal.js

Interface IRootLookupMetaData

interface IRootLookupMetaData {
    metaDataType: "rootlookup";
    ulid: string;
}

Properties

metaDataType +IRootLookupMetaData | @jackallabs/jackal.js

Interface IRootLookupMetaData

interface IRootLookupMetaData {
    metaDataType: "rootlookup";
    ulid: string;
}

Properties

Properties

metaDataType: "rootlookup"
ulid: string
\ No newline at end of file +

Properties

metaDataType: "rootlookup"
ulid: string
\ No newline at end of file diff --git a/docs/interfaces/ISetMetaViewersPath.html b/docs/interfaces/ISetMetaViewersPath.html new file mode 100644 index 00000000..317322f6 --- /dev/null +++ b/docs/interfaces/ISetMetaViewersPath.html @@ -0,0 +1,6 @@ +ISetMetaViewersPath | @jackallabs/jackal.js

Interface ISetMetaViewersPath

ISetMetaViewersPath

+

Param: path

Path of resource.

+

Param: viewers

Object with properties of if update or overwrite is needed.

+
interface ISetMetaViewersPath {
    path: string;
    viewers: TViewerSetAll;
}

Properties

Properties

path: string
viewers: TViewerSetAll
\ No newline at end of file diff --git a/docs/interfaces/ISetMetaViewersUlid.html b/docs/interfaces/ISetMetaViewersUlid.html new file mode 100644 index 00000000..87bdcb66 --- /dev/null +++ b/docs/interfaces/ISetMetaViewersUlid.html @@ -0,0 +1,6 @@ +ISetMetaViewersUlid | @jackallabs/jackal.js

Interface ISetMetaViewersUlid

ISetMetaViewersUlid

+

Param: ulid

Ulid of resource.

+

Param: viewers

Object with properties of if update or overwrite is needed.

+
interface ISetMetaViewersUlid {
    ulid: string;
    viewers: TViewerSetAll;
}

Properties

Properties

ulid: string
viewers: TViewerSetAll
\ No newline at end of file diff --git a/docs/interfaces/ISetNewPrimaryOptions.html b/docs/interfaces/ISetNewPrimaryOptions.html index 1b3a1a03..ad28ce7c 100644 --- a/docs/interfaces/ISetNewPrimaryOptions.html +++ b/docs/interfaces/ISetNewPrimaryOptions.html @@ -1,6 +1,6 @@ ISetNewPrimaryOptions | @jackallabs/jackal.js

Interface ISetNewPrimaryOptions

ISetNewPrimaryOptions

-
interface ISetNewPrimaryOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    rns: string;
}

Properties

interface ISetNewPrimaryOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    rns: string;
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
rns: string

RNS to set as primary.

-
\ No newline at end of file +

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
rns: string

RNS to set as primary.

+
\ No newline at end of file diff --git a/docs/interfaces/IShareDirectPackage.html b/docs/interfaces/IShareDirectPackage.html new file mode 100644 index 00000000..26bd44ef --- /dev/null +++ b/docs/interfaces/IShareDirectPackage.html @@ -0,0 +1,5 @@ +IShareDirectPackage | @jackallabs/jackal.js

Interface IShareDirectPackage

interface IShareDirectPackage {
    isFile: boolean;
    isPrivate: boolean;
    path: string;
    receiver: string;
}

Properties

Properties

isFile: boolean
isPrivate: boolean
path: string
receiver: string
\ No newline at end of file diff --git a/docs/interfaces/IShareFolderMetaData.html b/docs/interfaces/IShareFolderMetaData.html deleted file mode 100644 index a64580bc..00000000 --- a/docs/interfaces/IShareFolderMetaData.html +++ /dev/null @@ -1,8 +0,0 @@ -IShareFolderMetaData | @jackallabs/jackal.js

Interface IShareFolderMetaData

interface IShareFolderMetaData {
    count: string;
    description: string;
    location: string;
    merkleHex: string;
    metaDataType: "sharefolder";
    pointsTo: string;
    whoAmI: string;
}

Hierarchy

Properties

count: string
description: string
location: string
merkleHex: string
metaDataType: "sharefolder"
pointsTo: string
whoAmI: string
\ No newline at end of file diff --git a/docs/interfaces/IShareFolderMetaHandler.html b/docs/interfaces/IShareFolderMetaHandler.html deleted file mode 100644 index 469ce624..00000000 --- a/docs/interfaces/IShareFolderMetaHandler.html +++ /dev/null @@ -1,9 +0,0 @@ -IShareFolderMetaHandler | @jackallabs/jackal.js

Interface IShareFolderMetaHandler

interface IShareFolderMetaHandler {
    addAndReturnCount(value): number;
    export(): IShareFolderMetaData;
    getCount(): number;
    getLocation(): string;
    getRefIndex(): number;
    getRefString(): string;
    getUlid(): string;
    setRefIndex(refIndex): void;
}

Hierarchy (view full)

Methods

\ No newline at end of file diff --git a/docs/interfaces/IShareLinkDetails.html b/docs/interfaces/IShareLinkDetails.html new file mode 100644 index 00000000..9fd2bda2 --- /dev/null +++ b/docs/interfaces/IShareLinkDetails.html @@ -0,0 +1,3 @@ +IShareLinkDetails | @jackallabs/jackal.js

Interface IShareLinkDetails

interface IShareLinkDetails {
    isFolder: boolean;
    linkKey: string;
}

Properties

Properties

isFolder: boolean
linkKey: string
\ No newline at end of file diff --git a/docs/interfaces/IShareLinkOptions.html b/docs/interfaces/IShareLinkOptions.html new file mode 100644 index 00000000..4435a8aa --- /dev/null +++ b/docs/interfaces/IShareLinkOptions.html @@ -0,0 +1,6 @@ +IShareLinkOptions | @jackallabs/jackal.js

Interface IShareLinkOptions

IShareLinkOptions

+
interface IShareLinkOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    paths: string | string[];
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
paths: string | string[]

Paths of files to create sharing links for.

+
\ No newline at end of file diff --git a/docs/interfaces/IShareLinkPackage.html b/docs/interfaces/IShareLinkPackage.html new file mode 100644 index 00000000..49b057fb --- /dev/null +++ b/docs/interfaces/IShareLinkPackage.html @@ -0,0 +1,4 @@ +IShareLinkPackage | @jackallabs/jackal.js

Interface IShareLinkPackage

interface IShareLinkPackage {
    isFile: boolean;
    link: string;
    path: string;
}

Properties

Properties

isFile: boolean
link: string
path: string
\ No newline at end of file diff --git a/docs/interfaces/IShareLinks.html b/docs/interfaces/IShareLinks.html new file mode 100644 index 00000000..deeaca1c --- /dev/null +++ b/docs/interfaces/IShareLinks.html @@ -0,0 +1,3 @@ +IShareLinks | @jackallabs/jackal.js
interface IShareLinks {
    links: Record<string, IShareLinkDetails>;
    msgs: IWrappedEncodeObject[];
}

Properties

Properties

links: Record<string, IShareLinkDetails>
\ No newline at end of file diff --git a/docs/interfaces/IShareMetaData.html b/docs/interfaces/IShareMetaData.html index 805526d2..7dcc1280 100644 --- a/docs/interfaces/IShareMetaData.html +++ b/docs/interfaces/IShareMetaData.html @@ -1,7 +1,10 @@ -IShareMetaData | @jackallabs/jackal.js

Interface IShareMetaData

interface IShareMetaData {
    label: string;
    location: string;
    merkleHex: string;
    metaDataType: "share";
    owner: string;
    pointsTo: string;
}

Hierarchy

Properties

label -location +IShareMetaData | @jackallabs/jackal.js

Interface IShareMetaData

interface IShareMetaData {
    isFile: boolean;
    location: string;
    merkleHex: string;
    metaDataType: "share";
    name: string;
    owner: string;
    pointsTo: string;
    received: number;
    ulid: string;
}

Hierarchy

Properties

label: string
location: string
merkleHex: string
metaDataType: "share"
owner: string
pointsTo: string
\ No newline at end of file +pointsTo +received +ulid +

Properties

isFile: boolean
location: string
merkleHex: string
metaDataType: "share"
name: string
owner: string
pointsTo: string
received: number
ulid: string
\ No newline at end of file diff --git a/docs/interfaces/IShareMetaDataSource.html b/docs/interfaces/IShareMetaDataSource.html index be726d2d..5cf5c4db 100644 --- a/docs/interfaces/IShareMetaDataSource.html +++ b/docs/interfaces/IShareMetaDataSource.html @@ -1,7 +1,9 @@ -IShareMetaDataSource | @jackallabs/jackal.js

Interface IShareMetaDataSource

interface IShareMetaDataSource {
    label: string;
    location: string;
    owner: string;
    pointsTo: string;
    refIndex?: number;
    ulid?: string;
}

Properties

label +IShareMetaDataSource | @jackallabs/jackal.js

Interface IShareMetaDataSource

interface IShareMetaDataSource {
    isFile: boolean;
    location: string;
    name: string;
    owner: string;
    pointsTo: string;
    received: number;
    refIndex?: number;
    ulid?: string;
}

Properties

label: string
location: string
owner: string
pointsTo: string
refIndex?: number
ulid?: string
\ No newline at end of file +

Properties

isFile: boolean
location: string
name: string
owner: string
pointsTo: string
received: number
refIndex?: number
ulid?: string
\ No newline at end of file diff --git a/docs/interfaces/IShareMetaFoundationalData.html b/docs/interfaces/IShareMetaFoundationalData.html index 035c231d..ac8e588b 100644 --- a/docs/interfaces/IShareMetaFoundationalData.html +++ b/docs/interfaces/IShareMetaFoundationalData.html @@ -1,7 +1,9 @@ -IShareMetaFoundationalData | @jackallabs/jackal.js

Interface IShareMetaFoundationalData

interface IShareMetaFoundationalData {
    label: string;
    location: string;
    owner: string;
    pointsTo: string;
    refIndex: number;
    ulid: string;
}

Properties

label +IShareMetaFoundationalData | @jackallabs/jackal.js

Interface IShareMetaFoundationalData

interface IShareMetaFoundationalData {
    isFile: boolean;
    location: string;
    name: string;
    owner: string;
    pointsTo: string;
    received: number;
    refIndex: number;
    ulid: string;
}

Properties

label: string
location: string
owner: string
pointsTo: string
refIndex: number
ulid: string
\ No newline at end of file +

Properties

isFile: boolean
location: string
name: string
owner: string
pointsTo: string
received: number
refIndex: number
ulid: string
\ No newline at end of file diff --git a/docs/interfaces/IShareMetaHandler.html b/docs/interfaces/IShareMetaHandler.html index f7bb3802..eeeb4f2a 100644 --- a/docs/interfaces/IShareMetaHandler.html +++ b/docs/interfaces/IShareMetaHandler.html @@ -1,10 +1,9 @@ -IShareMetaHandler | @jackallabs/jackal.js

Interface IShareMetaHandler

interface IShareMetaHandler {
    export(): IShareMetaData;
    exportRef(): IShareRefMetaData;
    getLabel(): string;
    getLocation(): string;
    getRefIndex(): number;
    getRefString(): string;
    getUlid(): string;
    setLabel(label): void;
    setRefIndex(refIndex): void;
}

Hierarchy (view full)

Methods

export +IShareMetaHandler | @jackallabs/jackal.js

Interface IShareMetaHandler

interface IShareMetaHandler {
    export(): IShareMetaData;
    exportRef(): IRefMetaData;
    getIsFile(): boolean;
    getLocation(): string;
    getRefIndex(): number;
    getRefString(): string;
    getUlid(): string;
    setRefIndex(refIndex): void;
}

Hierarchy (view full)

Implemented by

Methods

\ No newline at end of file +

Methods

\ No newline at end of file diff --git a/docs/interfaces/IShareOptions.html b/docs/interfaces/IShareOptions.html index bc5a3e32..03eebe90 100644 --- a/docs/interfaces/IShareOptions.html +++ b/docs/interfaces/IShareOptions.html @@ -1,5 +1,5 @@ -IShareOptions | @jackallabs/jackal.js

Interface IShareOptions

interface IShareOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    paths: string | string[];
    receiver: string;
}

Properties

broadcastOptions? +IShareOptions | @jackallabs/jackal.js

Interface IShareOptions

interface IShareOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    paths: string | string[];
    receiver: string;
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
paths: string | string[]
receiver: string
\ No newline at end of file +

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
paths: string | string[]
receiver: string
\ No newline at end of file diff --git a/docs/interfaces/IShareRefMetaData.html b/docs/interfaces/IShareRefMetaData.html deleted file mode 100644 index 519b1429..00000000 --- a/docs/interfaces/IShareRefMetaData.html +++ /dev/null @@ -1,5 +0,0 @@ -IShareRefMetaData | @jackallabs/jackal.js

Interface IShareRefMetaData

interface IShareRefMetaData {
    location: string;
    merkleHex: string;
    metaDataType: "shareref";
    pointsTo: string;
}

Hierarchy

Properties

location: string
merkleHex: string
metaDataType: "shareref"
pointsTo: string
\ No newline at end of file diff --git a/docs/interfaces/IShareResults.html b/docs/interfaces/IShareResults.html new file mode 100644 index 00000000..f2e2ecc1 --- /dev/null +++ b/docs/interfaces/IShareResults.html @@ -0,0 +1,3 @@ +IShareResults | @jackallabs/jackal.js

Interface IShareResults

interface IShareResults {
    isFolder: boolean;
    msgs: IWrappedEncodeObject[];
}

Properties

Properties

isFolder: boolean
\ No newline at end of file diff --git a/docs/interfaces/ISharedFolderMetaDataSource.html b/docs/interfaces/ISharedFolderMetaDataSource.html deleted file mode 100644 index 297291a2..00000000 --- a/docs/interfaces/ISharedFolderMetaDataSource.html +++ /dev/null @@ -1,6 +0,0 @@ -ISharedFolderMetaDataSource | @jackallabs/jackal.js

Interface ISharedFolderMetaDataSource

interface ISharedFolderMetaDataSource {
    count: number;
    location: string;
    name: string;
    refIndex?: number;
    ulid?: string;
}

Properties

count: number
location: string
name: string
refIndex?: number
ulid?: string
\ No newline at end of file diff --git a/docs/interfaces/ISharedFolderMetaFoundationalData.html b/docs/interfaces/ISharedFolderMetaFoundationalData.html deleted file mode 100644 index e05e9376..00000000 --- a/docs/interfaces/ISharedFolderMetaFoundationalData.html +++ /dev/null @@ -1,6 +0,0 @@ -ISharedFolderMetaFoundationalData | @jackallabs/jackal.js

Interface ISharedFolderMetaFoundationalData

interface ISharedFolderMetaFoundationalData {
    count: number;
    location: string;
    refIndex: number;
    ulid: string;
    whoAmI: string;
}

Properties

count: number
location: string
refIndex: number
ulid: string
whoAmI: string
\ No newline at end of file diff --git a/docs/interfaces/ISharedMetaDataMap.html b/docs/interfaces/ISharedMetaDataMap.html deleted file mode 100644 index 5e884afc..00000000 --- a/docs/interfaces/ISharedMetaDataMap.html +++ /dev/null @@ -1 +0,0 @@ -ISharedMetaDataMap | @jackallabs/jackal.js

Interface ISharedMetaDataMap

interface ISharedMetaDataMap {}

Hierarchy

\ No newline at end of file diff --git a/docs/interfaces/ISharedUpdater.html b/docs/interfaces/ISharedUpdater.html deleted file mode 100644 index 6f6140c8..00000000 --- a/docs/interfaces/ISharedUpdater.html +++ /dev/null @@ -1,3 +0,0 @@ -ISharedUpdater | @jackallabs/jackal.js

Interface ISharedUpdater

interface ISharedUpdater {
    digest(): Promise<void>;
    fetchNotifications(): Promise<number>;
}

Methods

\ No newline at end of file diff --git a/docs/interfaces/ISharerMetaDataSource.html b/docs/interfaces/ISharerMetaDataSource.html new file mode 100644 index 00000000..e3090fd9 --- /dev/null +++ b/docs/interfaces/ISharerMetaDataSource.html @@ -0,0 +1,6 @@ +ISharerMetaDataSource | @jackallabs/jackal.js

Interface ISharerMetaDataSource

interface ISharerMetaDataSource {
    location: string;
    refIndex?: number;
    sharer: string;
    type?: TSharerType;
    ulid?: string;
}

Properties

location: string
refIndex?: number
sharer: string
ulid?: string
\ No newline at end of file diff --git a/docs/interfaces/ISharerMetaFoundationalData.html b/docs/interfaces/ISharerMetaFoundationalData.html new file mode 100644 index 00000000..f38a3cf1 --- /dev/null +++ b/docs/interfaces/ISharerMetaFoundationalData.html @@ -0,0 +1,7 @@ +ISharerMetaFoundationalData | @jackallabs/jackal.js

Interface ISharerMetaFoundationalData

interface ISharerMetaFoundationalData {
    location: string;
    refIndex: number;
    sharer: string;
    type: TSharerType;
    ulid: string;
    when: number;
}

Properties

location: string
refIndex: number
sharer: string
ulid: string
when: number
\ No newline at end of file diff --git a/docs/interfaces/ISharerMetaHandler.html b/docs/interfaces/ISharerMetaHandler.html new file mode 100644 index 00000000..a4ffe781 --- /dev/null +++ b/docs/interfaces/ISharerMetaHandler.html @@ -0,0 +1,7 @@ +ISharerMetaHandler | @jackallabs/jackal.js

Interface ISharerMetaHandler

interface ISharerMetaHandler {
    exportSharerRef(): ISharerRefMetaData;
    getLocation(): string;
    getRefIndex(): number;
    getRefString(): string;
    getUlid(): string;
    setRefIndex(refIndex): void;
}

Hierarchy (view full)

Implemented by

Methods

\ No newline at end of file diff --git a/docs/interfaces/ISharerRefMetaData.html b/docs/interfaces/ISharerRefMetaData.html new file mode 100644 index 00000000..69186f35 --- /dev/null +++ b/docs/interfaces/ISharerRefMetaData.html @@ -0,0 +1,8 @@ +ISharerRefMetaData | @jackallabs/jackal.js

Interface ISharerRefMetaData

interface ISharerRefMetaData {
    location: string;
    merkleHex: string;
    metaDataType: "sharerref";
    pointsTo: string;
    sharer: string;
    type: TSharerType;
    when: number;
}

Hierarchy

Properties

location: string
merkleHex: string
metaDataType: "sharerref"
pointsTo: string
sharer: string
when: number
\ No newline at end of file diff --git a/docs/interfaces/ISharingLookupOptions.html b/docs/interfaces/ISharingLookupOptions.html new file mode 100644 index 00000000..07d1c411 --- /dev/null +++ b/docs/interfaces/ISharingLookupOptions.html @@ -0,0 +1,6 @@ +ISharingLookupOptions | @jackallabs/jackal.js

Interface ISharingLookupOptions

ISharingLookupOptions

+
interface ISharingLookupOptions {
    refresh?: true;
    sharer?: string;
}

Properties

Properties

refresh?: true

If the Sharing list should be refreshed.

+
sharer?: string

JKL address to find list of shared resources.

+
\ No newline at end of file diff --git a/docs/interfaces/ISignDoc.html b/docs/interfaces/ISignDoc.html new file mode 100644 index 00000000..dc9e950f --- /dev/null +++ b/docs/interfaces/ISignDoc.html @@ -0,0 +1,5 @@ +ISignDoc | @jackallabs/jackal.js
interface ISignDoc {
    accountNumber: bigint;
    authInfoBytes: Uint8Array;
    bodyBytes: Uint8Array;
    chainId: string;
}

Properties

accountNumber: bigint
authInfoBytes: Uint8Array
bodyBytes: Uint8Array
chainId: string
\ No newline at end of file diff --git a/docs/interfaces/ISocketConfig.html b/docs/interfaces/ISocketConfig.html index 887f580d..0dddb4ac 100644 --- a/docs/interfaces/ISocketConfig.html +++ b/docs/interfaces/ISocketConfig.html @@ -1,4 +1,4 @@ -ISocketConfig | @jackallabs/jackal.js

Interface ISocketConfig

interface ISocketConfig {
    chainId: string;
    endpoint: string;
    gasMultiplier: number;
}

Properties

chainId +ISocketConfig | @jackallabs/jackal.js

Interface ISocketConfig

interface ISocketConfig {
    chainId: string;
    endpoint: string;
    gasMultiplier: number;
}

Properties

chainId: string
endpoint: string
gasMultiplier: number
\ No newline at end of file +

Properties

chainId: string
endpoint: string
gasMultiplier: number
\ No newline at end of file diff --git a/docs/interfaces/IStagedUploadPackage.html b/docs/interfaces/IStagedUploadPackage.html index 65a74948..c0f74e3f 100644 --- a/docs/interfaces/IStagedUploadPackage.html +++ b/docs/interfaces/IStagedUploadPackage.html @@ -1,4 +1,4 @@ -IStagedUploadPackage | @jackallabs/jackal.js

Interface IStagedUploadPackage

interface IStagedUploadPackage {
    children: IChildMetaDataMap;
    folderMeta: IFolderMetaHandler;
    queue: IUploadPackage[];
}

Properties

children +IStagedUploadPackage | @jackallabs/jackal.js

Interface IStagedUploadPackage

interface IStagedUploadPackage {
    children: IChildMetaDataMap;
    folderMeta: IFolderMetaHandler;
    queue: IUploadPackage[];
}

Properties

folderMeta: IFolderMetaHandler
\ No newline at end of file +

Properties

folderMeta: IFolderMetaHandler
\ No newline at end of file diff --git a/docs/interfaces/IStorageHandler.html b/docs/interfaces/IStorageHandler.html index b883aaf5..0ae3c529 100644 --- a/docs/interfaces/IStorageHandler.html +++ b/docs/interfaces/IStorageHandler.html @@ -1,14 +1,26 @@ -IStorageHandler | @jackallabs/jackal.js

Interface IStorageHandler

interface IStorageHandler {
    checkNotifications(): Promise<number>;
    cleanShutdown(): void;
    convert(options?): Promise<IWrappedEncodeObject[]>;
    createFolders(options): Promise<IWrappedEncodeObject[]>;
    deleteTargets(options): Promise<IWrappedEncodeObject[]>;
    downloadExternalFile(userAddress, filePath, trackers): Promise<File>;
    downloadFile(filePath, trackers): Promise<File>;
    estimateStoragePlan(options): Promise<number>;
    findProviderIps(providers): Promise<IProviderIpSet>;
    getAvailableProviders(): Promise<string[]>;
    getFileParticulars(filePath): Promise<IFileParticulars>;
    initStorage(options?): Promise<any>;
    listChildFileMetas(): IFileMetaData[];
    listChildFiles(): string[];
    listChildFolderMetas(): IFolderMetaData[];
    listChildFolders(): string[];
    loadDirectory(options?): Promise<void>;
    loadProviderPool(providers?): Promise<void>;
    loadShared(): Promise<void>;
    moveRenameResource(options): Promise<IWrappedEncodeObject[]>;
    planStatus(): Promise<IStorageStatus>;
    processAllQueues(options?): Promise<void>;
    processPendingNotifications(): Promise<TSharedRootMetaDataMap>;
    purchaseStoragePlan(options): Promise<any>;
    queuePrivate(toQueue, duration?): Promise<number>;
    queuePublic(toQueue, duration?): Promise<number>;
    readActivePath(): string;
    readChildCount(): number;
    readCurrentLocation(): string;
    readCurrentQueue(): string[];
    readCurrentUlid(): string;
    readDirectoryContents(path, options?): Promise<IChildMetaDataMap>;
    readMustConvertStatus(): boolean;
    readSharing(): TSharedRootMetaDataMap;
    registerPubKey(options?): Promise<IWrappedEncodeObject[]>;
    removeFromQueue(name): void;
    saveFolder(bundle): Promise<IWrappedEncodeObject[]>;
    share(options): Promise<IWrappedEncodeObject[]>;
    upgradeSigner(): Promise<void>;
}

Implemented by

Methods

checkNotifications +IStorageHandler | @jackallabs/jackal.js

Interface IStorageHandler

interface IStorageHandler {
    checkAndInitSharing(options?): Promise<IWrappedEncodeObject[]>;
    checkAndUpcycle(options?): Promise<void>;
    checkIfUpcycle(): boolean;
    checkNotifications(): Promise<number>;
    checkSharedTo(path): Promise<string[]>;
    cleanShutdown(): void;
    cloneShares(options): Promise<IWrappedEncodeObject[]>;
    cloneUpload(options): Promise<IWrappedEncodeObject[]>;
    convert(options?): Promise<IWrappedEncodeObject[]>;
    createFolders(options): Promise<IWrappedEncodeObject[]>;
    deleteTargets(options): Promise<IWrappedEncodeObject[]>;
    downloadByUlid(options): Promise<File>;
    downloadExternalFile(userAddress, filePath, trackers): Promise<File>;
    downloadFile(filePath, trackers): Promise<File>;
    estimateStoragePlan(options): Promise<number>;
    findProviderIps(providers): Promise<IProviderIpSet>;
    findUlid(path, address?): string;
    getAvailableProviders(): Promise<string[]>;
    getFileMetaData(filePath, address?): Promise<IFileMetaData>;
    getFileParticulars(filePath): Promise<IFileParticulars>;
    getFolderDetailsByUlid(options): Promise<IChildMetaDataMap>;
    getMetaDataByUlid(options): Promise<TMetaDataSets>;
    initCustomRoot(options): Promise<IWrappedEncodeObject[]>;
    initStorage(options?): Promise<IWrappedEncodeObject[]>;
    listChildFileMetas(): IFileMetaData[];
    listChildFiles(): string[];
    listChildFolderMetas(): IFolderMetaData[];
    listChildFolders(): string[];
    loadDirectory(options?): Promise<void>;
    loadProviderPool(providers?): Promise<void>;
    loadShared(): Promise<void>;
    loadThumbnail(options): Promise<string>;
    moveRenameResource(options): Promise<IWrappedEncodeObject[]>;
    planStatus(): Promise<IStorageStatus>;
    processAllQueues(options?): Promise<void>;
    processPendingNotifications(options?): Promise<IWrappedEncodeObject[]>;
    purchaseStoragePlan(options): Promise<any>;
    queuePrivate(toQueue, duration?): Promise<number>;
    queuePublic(toQueue, duration?): Promise<number>;
    readActivePath(): string;
    readChildCount(): number;
    readCurrentLocation(): string;
    readCurrentQueue(): string[];
    readCurrentUlid(): string;
    readDirectoryContents(path, options?): Promise<IChildMetaDataMap>;
    readMustConvertStatus(): boolean;
    readSharing(sharer?): Promise<IFolderMetaData[] | IShareMetaData[]>;
    registerPubKey(options?): Promise<IWrappedEncodeObject[]>;
    removeFromQueue(name): void;
    removeShareRecord(options): Promise<IWrappedEncodeObject[]>;
    runUpcycleQueue(options?): Promise<void>;
    saveFolder(bundle): Promise<IWrappedEncodeObject[]>;
    shareDirect(options): Promise<IWrappedEncodeObject[]>;
    shareLink(options): Promise<IShareLinks>;
    unshare(options): Promise<IWrappedEncodeObject[]>;
    upgradeSigner(): Promise<void>;
}

Implemented by

Methods

\ No newline at end of file +

Methods

\ No newline at end of file diff --git a/docs/interfaces/IStorageOptions.html b/docs/interfaces/IStorageOptions.html index 8243afb9..5594cd79 100644 --- a/docs/interfaces/IStorageOptions.html +++ b/docs/interfaces/IStorageOptions.html @@ -1,5 +1,5 @@ -IStorageOptions | @jackallabs/jackal.js

Interface IStorageOptions

interface IStorageOptions {
    accountAddress?: string;
    path?: string;
    rns?: IRnsHandler;
    setFullSigner?: boolean;
}

Properties

accountAddress? +IStorageOptions | @jackallabs/jackal.js

Interface IStorageOptions

interface IStorageOptions {
    accountAddress?: string;
    path?: string;
    rns?: IRnsHandler;
    setFullSigner?: boolean;
}

Properties

accountAddress?: string
path?: string
setFullSigner?: boolean
\ No newline at end of file +

Properties

accountAddress?: string
path?: string
setFullSigner?: boolean
\ No newline at end of file diff --git a/docs/interfaces/IStorageStatus.html b/docs/interfaces/IStorageStatus.html index 841fe4bc..589f2f4a 100644 --- a/docs/interfaces/IStorageStatus.html +++ b/docs/interfaces/IStorageStatus.html @@ -1,3 +1,3 @@ -IStorageStatus | @jackallabs/jackal.js

Interface IStorageStatus

interface IStorageStatus {
    active: boolean;
    info: MStoragePaymentInfo;
}

Properties

active +IStorageStatus | @jackallabs/jackal.js

Interface IStorageStatus

interface IStorageStatus {
    active: boolean;
    info: MStoragePaymentInfo;
}

Properties

Properties

active: boolean
info: MStoragePaymentInfo
\ No newline at end of file +

Properties

active: boolean
info: MStoragePaymentInfo
\ No newline at end of file diff --git a/docs/interfaces/ITransferOptions.html b/docs/interfaces/ITransferOptions.html index 07e12c9c..1c6fd329 100644 --- a/docs/interfaces/ITransferOptions.html +++ b/docs/interfaces/ITransferOptions.html @@ -1,8 +1,8 @@ ITransferOptions | @jackallabs/jackal.js

Interface ITransferOptions

ITransferOptions

-
interface ITransferOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    receiver: string;
    rns: string;
}

Properties

interface ITransferOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    receiver: string;
    rns: string;
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
receiver: string

Jackal address to transfer to.

-
rns: string

RNS to transfer.

-
\ No newline at end of file +

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
receiver: string

Jackal address to transfer to.

+
rns: string

RNS to transfer.

+
\ No newline at end of file diff --git a/docs/interfaces/IUnshareOptions.html b/docs/interfaces/IUnshareOptions.html new file mode 100644 index 00000000..a1fd2a6a --- /dev/null +++ b/docs/interfaces/IUnshareOptions.html @@ -0,0 +1,5 @@ +IUnshareOptions | @jackallabs/jackal.js

Interface IUnshareOptions

interface IUnshareOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    paths: string | string[];
    receivers: string[];
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
paths: string | string[]
receivers: string[]
\ No newline at end of file diff --git a/docs/interfaces/IUnsharePackage.html b/docs/interfaces/IUnsharePackage.html new file mode 100644 index 00000000..a98c5a86 --- /dev/null +++ b/docs/interfaces/IUnsharePackage.html @@ -0,0 +1,3 @@ +IUnsharePackage | @jackallabs/jackal.js

Interface IUnsharePackage

interface IUnsharePackage {
    path: string;
    removed: string[];
}

Properties

Properties

path: string
removed: string[]
\ No newline at end of file diff --git a/docs/interfaces/IUpdateOptions.html b/docs/interfaces/IUpdateOptions.html index 06327324..af8f6030 100644 --- a/docs/interfaces/IUpdateOptions.html +++ b/docs/interfaces/IUpdateOptions.html @@ -1,8 +1,8 @@ IUpdateOptions | @jackallabs/jackal.js

Interface IUpdateOptions

IUpdateOptions

-
interface IUpdateOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    data?: IRnsData;
    rns: string;
}

Properties

interface IUpdateOptions {
    broadcastOptions?: IBroadcastOptions;
    chain?: true;
    data?: INoCloneRnsMetaDataSource;
    rns: string;
}

Properties

broadcastOptions?: IBroadcastOptions
chain?: true
data?: IRnsData

Optional object to replace existing contents of data field.

-
rns: string

RNS address to update.

-
\ No newline at end of file +

Properties

broadcastOptions?: IBroadcastOptions
chain?: true

Optional object to replace existing contents of data field.

+
rns: string

RNS address to update.

+
\ No newline at end of file diff --git a/docs/interfaces/IUploadDetails.html b/docs/interfaces/IUploadDetails.html new file mode 100644 index 00000000..5ec38762 --- /dev/null +++ b/docs/interfaces/IUploadDetails.html @@ -0,0 +1,4 @@ +IUploadDetails | @jackallabs/jackal.js

Interface IUploadDetails

interface IUploadDetails {
    file: File;
    merkle: string;
    uploadHeight: number;
}

Properties

Properties

file: File
merkle: string
uploadHeight: number
\ No newline at end of file diff --git a/docs/interfaces/IUploadHandler.html b/docs/interfaces/IUploadHandler.html new file mode 100644 index 00000000..4113d52b --- /dev/null +++ b/docs/interfaces/IUploadHandler.html @@ -0,0 +1,4 @@ +IUploadHandler | @jackallabs/jackal.js

Interface IUploadHandler

interface IUploadHandler {
    startQueue(): void;
    stopQueue(): void;
    upload(details, existing, copies): Promise<IProviderUploadResponse>;
}

Methods

\ No newline at end of file diff --git a/docs/interfaces/IUploadPackage.html b/docs/interfaces/IUploadPackage.html index 372e1ed6..1344fe75 100644 --- a/docs/interfaces/IUploadPackage.html +++ b/docs/interfaces/IUploadPackage.html @@ -1,5 +1,5 @@ -IUploadPackage | @jackallabs/jackal.js

Interface IUploadPackage

interface IUploadPackage {
    aes?: IAesBundle;
    duration: number;
    file: File;
    meta: IFileMetaHandler;
}

Properties

aes? +IUploadPackage | @jackallabs/jackal.js

Interface IUploadPackage

interface IUploadPackage {
    aes?: IAesBundle;
    duration: number;
    file: File;
    meta: IFileMetaHandler;
}

Properties

Properties

duration: number
file: File
\ No newline at end of file +

Properties

duration: number
file: File
\ No newline at end of file diff --git a/docs/interfaces/IViewerSetAddRemove.html b/docs/interfaces/IViewerSetAddRemove.html new file mode 100644 index 00000000..dfc4bbe4 --- /dev/null +++ b/docs/interfaces/IViewerSetAddRemove.html @@ -0,0 +1,6 @@ +IViewerSetAddRemove | @jackallabs/jackal.js

Interface IViewerSetAddRemove

IViewerSetAddRemove

+

Param: add

Array of wallet addresses.

+

Param: remove

Array of wallet addresses.

+
interface IViewerSetAddRemove {
    add?: string[];
    remove?: string[];
}

Properties

Properties

add?: string[]
remove?: string[]
\ No newline at end of file diff --git a/docs/interfaces/IViewerSetOverwrite.html b/docs/interfaces/IViewerSetOverwrite.html new file mode 100644 index 00000000..62e98500 --- /dev/null +++ b/docs/interfaces/IViewerSetOverwrite.html @@ -0,0 +1,4 @@ +IViewerSetOverwrite | @jackallabs/jackal.js

Interface IViewerSetOverwrite

IViewerSetOverwrite

+

Param: overwrite

Array of wallet addresses.

+
interface IViewerSetOverwrite {
    overwrite: string[];
}

Properties

Properties

overwrite: string[]
\ No newline at end of file diff --git a/docs/interfaces/IWalletDetails.html b/docs/interfaces/IWalletDetails.html index c1b510d7..ce34cffb 100644 --- a/docs/interfaces/IWalletDetails.html +++ b/docs/interfaces/IWalletDetails.html @@ -1,8 +1,8 @@ -IWalletDetails | @jackallabs/jackal.js

Interface IWalletDetails

interface IWalletDetails {
    address: Uint8Array;
    algo: string;
    bech32Address: string;
    isKeystone?: boolean;
    isNanoLedger: boolean;
    name: string;
    pubKey: Uint8Array;
}

Properties

address +IWalletDetails | @jackallabs/jackal.js

Interface IWalletDetails

interface IWalletDetails {
    address: Uint8Array;
    algo: string;
    bech32Address: string;
    isKeystone?: boolean;
    isNanoLedger: boolean;
    name: string;
    pubKey: Uint8Array;
}

Properties

address: Uint8Array
algo: string
bech32Address: string
isKeystone?: boolean
isNanoLedger: boolean
name: string
pubKey: Uint8Array
\ No newline at end of file +

Properties

address: Uint8Array
algo: string
bech32Address: string
isKeystone?: boolean
isNanoLedger: boolean
name: string
pubKey: Uint8Array
\ No newline at end of file diff --git a/docs/interfaces/IWasmDetails.html b/docs/interfaces/IWasmDetails.html index fc391319..fc8e1676 100644 --- a/docs/interfaces/IWasmDetails.html +++ b/docs/interfaces/IWasmDetails.html @@ -1,5 +1,4 @@ -IWasmDetails | @jackallabs/jackal.js

Interface IWasmDetails

interface IWasmDetails {
    addressIndex?: number;
    codeId?: number;
    connIdA?: string;
    connIdB?: string;
}

Properties

addressIndex? -codeId? -connIdA? +IWasmDetails | @jackallabs/jackal.js

Interface IWasmDetails

interface IWasmDetails {
    connIdA?: string;
    connIdB?: string;
    contract?: string;
}

Properties

Properties

addressIndex?: number
codeId?: number
connIdA?: string
connIdB?: string
\ No newline at end of file +contract? +

Properties

connIdA?: string
connIdB?: string
contract?: string
\ No newline at end of file diff --git a/docs/interfaces/IWasmHandler.html b/docs/interfaces/IWasmHandler.html index 52314c56..1b1b69e5 100644 --- a/docs/interfaces/IWasmHandler.html +++ b/docs/interfaces/IWasmHandler.html @@ -1,6 +1,8 @@ -IWasmHandler | @jackallabs/jackal.js

Interface IWasmHandler

interface IWasmHandler {
    getICAContractAddress(index?): Promise<string>;
    getICAJackalAddress(): Promise<string>;
    getJackalAddressFromContract(contractAddress): Promise<string>;
    instantiateICA(connectionIdA, connectionIdB, codeId): Promise<DeliverTxResponse>;
    wrapEncodeObjectsForBroadcast(contract, msgs): EncodeObject[];
}

Implemented by

Methods

getICAContractAddress +IWasmHandler | @jackallabs/jackal.js

Interface IWasmHandler

interface IWasmHandler {
    getContractChannelState(contractAddress): Promise<string>;
    getICAContractAddress(contractAddress): Promise<string>;
    getICAJackalAddress(contractAddress): Promise<string>;
    getJackalAddressFromContract(contractAddress): Promise<string>;
    instantiateICA(contractAddress, connectionIdA, connectionIdB): Promise<DeliverTxResponse>;
    reOpenChannel(contractAddress, connectionIdA, connectionIdB): Promise<DeliverTxResponse>;
    wrapEncodeObjectsForBroadcast(contract, msgs): EncodeObject[];
}

Implemented by

Methods

  • Parameters

    • connectionIdA: string
    • connectionIdB: string
    • codeId: number

    Returns Promise<DeliverTxResponse>

\ No newline at end of file +

Methods

  • Parameters

    • contractAddress: string
    • connectionIdA: string
    • connectionIdB: string

    Returns Promise<DeliverTxResponse>

  • Parameters

    • contractAddress: string
    • connectionIdA: string
    • connectionIdB: string

    Returns Promise<DeliverTxResponse>

\ No newline at end of file diff --git a/docs/interfaces/IWrappedEncodeObject.html b/docs/interfaces/IWrappedEncodeObject.html index 474fc029..ae9c0a7b 100644 --- a/docs/interfaces/IWrappedEncodeObject.html +++ b/docs/interfaces/IWrappedEncodeObject.html @@ -1,5 +1,5 @@ -IWrappedEncodeObject | @jackallabs/jackal.js

Interface IWrappedEncodeObject

interface IWrappedEncodeObject {
    encodedObject: EncodeObject;
    file?: File;
    merkle?: string;
    modifier: number;
}

Properties

encodedObject +IWrappedEncodeObject | @jackallabs/jackal.js

Interface IWrappedEncodeObject

interface IWrappedEncodeObject {
    encodedObject: EncodeObject;
    file?: File;
    merkle?: string;
    modifier: number;
}

Properties

encodedObject: EncodeObject
file?: File
merkle?: string
modifier: number
\ No newline at end of file +

Properties

encodedObject: EncodeObject
file?: File
merkle?: string
modifier: number
\ No newline at end of file diff --git a/docs/modules.html b/docs/modules.html index 311fa386..7a72853f 100644 --- a/docs/modules.html +++ b/docs/modules.html @@ -1,7 +1,16 @@ @jackallabs/jackal.js

@jackallabs/jackal.js

Index

Classes

Interfaces

IAcceptBidOptions @@ -24,14 +33,25 @@ IClientHandler IClientSetup ICloneFileMetaDataSource +ICloneFolderMetaDataSource +IClonePackage +ICloneRnsMetaDataSource +ICloneSharesOptions +ICloneUploadOptions IContractInstantiateOptions IConversionFolderBundle IConversionNeededBundle IConversionNotNeededBundle ICreateFolderOptions +ICreateViewAccessOptions +ICustomRootOptions IDeleteTargetOptions IDelistOptions +IDownloadByUlidOptions +IDownloadStagingOptionsWithPath +IDownloadStagingOptionsWithUlid IDownloadTracker +IEncodeExistingRefOptions IFileContents IFileDeletePackage IFileMeta @@ -48,17 +68,26 @@ IFiletreeReader IFinalGas IFolderMetaData -IFolderMetaDataSource IFolderMetaFoundationalData IFolderMetaHandler IGasRate ILegacyFolderMetaData IListOptions +ILoadMetaOptions +ILoadRefMetaOptions +ILoadThumbnailOptionsWithPath +ILoadThumbnailOptionsWithUlid +IMetaDataByUlidOptions +IMnemonicSigner IMnemonicWallet IMoveRenameResourceOptions IMoveRenameTarget +INameWithMeta INoCloneFileMetaDataSource +INoCloneFolderMetaDataSource +INoCloneRnsMetaDataSource INotification +INotificationDeletePackage INotificationPackage INotificationRecord INullMetaData @@ -66,43 +95,64 @@ INullMetaFoundationalData INullMetaHandler INullRefMetaData +INullSharerRefMetaData IOracleHandler IPageRequest +IPathToLookupOptions IPrivateNotification IProviderIpSet IProviderPool +IProviderStatusResponse IProviderTraits IProviderUploadResponse +IProviderUploadV2Response IReadFolderContentOptions IReconstructedFileTree IRefMetaData IRefMetaHandler IRegisterOptions +IRemoveShareRecordOptions IRemoveSubRnsOptions IRnsData IRnsHandler +IRnsMetaData +IRnsMetaFoundationalData +IRnsMetaHandler IRootLookupMetaData +ISetMetaViewersPath +ISetMetaViewersUlid ISetNewPrimaryOptions -IShareFolderMetaData -IShareFolderMetaHandler +IShareDirectPackage +IShareLinkDetails +IShareLinkOptions +IShareLinkPackage +IShareLinks IShareMetaData IShareMetaDataSource IShareMetaFoundationalData IShareMetaHandler IShareOptions -IShareRefMetaData -ISharedFolderMetaDataSource -ISharedFolderMetaFoundationalData -ISharedMetaDataMap -ISharedUpdater +IShareResults +ISharerMetaDataSource +ISharerMetaFoundationalData +ISharerMetaHandler +ISharerRefMetaData +ISharingLookupOptions +ISignDoc ISocketConfig IStagedUploadPackage IStorageHandler IStorageOptions IStorageStatus ITransferOptions +IUnshareOptions +IUnsharePackage IUpdateOptions +IUploadDetails +IUploadHandler IUploadPackage +IViewerSetAddRemove +IViewerSetOverwrite IWalletDetails IWasmDetails IWasmHandler @@ -113,22 +163,37 @@ TChildFolderMetaDataMap TChildMetaData TChildNullMetaDataMap +TConversionFile +TConversionFolder +TConversionNull +TConversionPair +TConversionRoot TConversionStatusBundle +TCycleRequired +TDownloadStagingOptions +TExtractedViewAccess TFileMetaDataSource +TFolderMetaDataSource TFoundationalMetaData +TFullSignerState +TLoadThumbnailOptions TLoadedFolder TMergedMetaData +TMergedProviderResponse TMerkleChild TMerkleParent TMerkleParentChild TMetaDataSets TMetaDataTypes TMetaHandler -TSharedMetaData -TSharedRootMetaDataMap +TRnsMetaDataSource +TSetMetaViewersOptions +TSharePackage +TSharerType TSocketSet TSockets TTidyStringModes +TViewerSetAll TWalletExtensionNames TWalletExtensions

Variables

sharedPath @@ -138,8 +203,6 @@ estimateGas extractFileMetaData finalizeGas -findNestedContentsCount -findNestedSharedDepth hexToInt intToHex isItPast diff --git a/docs/types/TAddressPrefix.html b/docs/types/TAddressPrefix.html index 5f454f7e..dd94b954 100644 --- a/docs/types/TAddressPrefix.html +++ b/docs/types/TAddressPrefix.html @@ -1 +1 @@ -TAddressPrefix | @jackallabs/jackal.js

Type alias TAddressPrefix

TAddressPrefix: "jkl" | "akash" | "archway" | "atom" | "axelar" | "bcna" | "celestia" | "chihuahua" | "cre" | "decentr" | "juno" | "kyve" | "kujira" | "neutron" | "noble" | "omniflix" | "osmo" | "qwoyn" | "stars" | "stride"
\ No newline at end of file +TAddressPrefix | @jackallabs/jackal.js

Type alias TAddressPrefix

TAddressPrefix: "jkl" | "akash" | "archway" | "atom" | "axelar" | "bcna" | "celestia" | "chihuahua" | "cre" | "decentr" | "juno" | "kyve" | "kujira" | "neutron" | "noble" | "omniflix" | "osmo" | "qwoyn" | "stars" | "stride"
\ No newline at end of file diff --git a/docs/types/TChildFileMetaDataMap.html b/docs/types/TChildFileMetaDataMap.html index ff7aeb74..585d25bc 100644 --- a/docs/types/TChildFileMetaDataMap.html +++ b/docs/types/TChildFileMetaDataMap.html @@ -1 +1 @@ -TChildFileMetaDataMap | @jackallabs/jackal.js

Type alias TChildFileMetaDataMap

TChildFileMetaDataMap: Record<number, IFileMetaData>
\ No newline at end of file +TChildFileMetaDataMap | @jackallabs/jackal.js

Type alias TChildFileMetaDataMap

TChildFileMetaDataMap: Record<number, IFileMetaData>
\ No newline at end of file diff --git a/docs/types/TChildFolderMetaDataMap.html b/docs/types/TChildFolderMetaDataMap.html index bae9d33e..889e6c7b 100644 --- a/docs/types/TChildFolderMetaDataMap.html +++ b/docs/types/TChildFolderMetaDataMap.html @@ -1 +1 @@ -TChildFolderMetaDataMap | @jackallabs/jackal.js

Type alias TChildFolderMetaDataMap

TChildFolderMetaDataMap: Record<number, IFolderMetaData>
\ No newline at end of file +TChildFolderMetaDataMap | @jackallabs/jackal.js

Type alias TChildFolderMetaDataMap

TChildFolderMetaDataMap: Record<number, IFolderMetaData>
\ No newline at end of file diff --git a/docs/types/TChildMetaData.html b/docs/types/TChildMetaData.html index 205c3f63..3fdc4603 100644 --- a/docs/types/TChildMetaData.html +++ b/docs/types/TChildMetaData.html @@ -1 +1 @@ -TChildMetaData | @jackallabs/jackal.js
\ No newline at end of file +TChildMetaData | @jackallabs/jackal.js
\ No newline at end of file diff --git a/docs/types/TChildNullMetaDataMap.html b/docs/types/TChildNullMetaDataMap.html index deeaad89..2e9a6318 100644 --- a/docs/types/TChildNullMetaDataMap.html +++ b/docs/types/TChildNullMetaDataMap.html @@ -1 +1 @@ -TChildNullMetaDataMap | @jackallabs/jackal.js

Type alias TChildNullMetaDataMap

TChildNullMetaDataMap: Record<number, INullMetaHandler>
\ No newline at end of file +TChildNullMetaDataMap | @jackallabs/jackal.js

Type alias TChildNullMetaDataMap

TChildNullMetaDataMap: Record<number, INullMetaHandler>
\ No newline at end of file diff --git a/docs/types/TConversionFile.html b/docs/types/TConversionFile.html new file mode 100644 index 00000000..f775e163 --- /dev/null +++ b/docs/types/TConversionFile.html @@ -0,0 +1 @@ +TConversionFile | @jackallabs/jackal.js

Type alias TConversionFile

TConversionFile: ["file", FileMetaHandler]
\ No newline at end of file diff --git a/docs/types/TConversionFolder.html b/docs/types/TConversionFolder.html new file mode 100644 index 00000000..e2de5e8f --- /dev/null +++ b/docs/types/TConversionFolder.html @@ -0,0 +1 @@ +TConversionFolder | @jackallabs/jackal.js

Type alias TConversionFolder

TConversionFolder: ["folder", FolderMetaHandler]
\ No newline at end of file diff --git a/docs/types/TConversionNull.html b/docs/types/TConversionNull.html new file mode 100644 index 00000000..68fbfc34 --- /dev/null +++ b/docs/types/TConversionNull.html @@ -0,0 +1 @@ +TConversionNull | @jackallabs/jackal.js

Type alias TConversionNull

TConversionNull: ["null", NullMetaHandler]
\ No newline at end of file diff --git a/docs/types/TConversionPair.html b/docs/types/TConversionPair.html new file mode 100644 index 00000000..37840ae5 --- /dev/null +++ b/docs/types/TConversionPair.html @@ -0,0 +1 @@ +TConversionPair | @jackallabs/jackal.js
\ No newline at end of file diff --git a/docs/types/TConversionRoot.html b/docs/types/TConversionRoot.html new file mode 100644 index 00000000..1e890fc3 --- /dev/null +++ b/docs/types/TConversionRoot.html @@ -0,0 +1 @@ +TConversionRoot | @jackallabs/jackal.js

Type alias TConversionRoot

TConversionRoot: ["rootlookup", FolderMetaHandler]
\ No newline at end of file diff --git a/docs/types/TConversionStatusBundle.html b/docs/types/TConversionStatusBundle.html index 9046e139..1aa0675e 100644 --- a/docs/types/TConversionStatusBundle.html +++ b/docs/types/TConversionStatusBundle.html @@ -1 +1 @@ -TConversionStatusBundle | @jackallabs/jackal.js
\ No newline at end of file +TConversionStatusBundle | @jackallabs/jackal.js
\ No newline at end of file diff --git a/docs/types/TCycleRequired.html b/docs/types/TCycleRequired.html new file mode 100644 index 00000000..7ed2d4a6 --- /dev/null +++ b/docs/types/TCycleRequired.html @@ -0,0 +1 @@ +TCycleRequired | @jackallabs/jackal.js

Type alias TCycleRequired

TCycleRequired: boolean
\ No newline at end of file diff --git a/docs/types/TDownloadStagingOptions.html b/docs/types/TDownloadStagingOptions.html new file mode 100644 index 00000000..1dd558c0 --- /dev/null +++ b/docs/types/TDownloadStagingOptions.html @@ -0,0 +1 @@ +TDownloadStagingOptions | @jackallabs/jackal.js
\ No newline at end of file diff --git a/docs/types/TExtractedViewAccess.html b/docs/types/TExtractedViewAccess.html new file mode 100644 index 00000000..5f1f0cd9 --- /dev/null +++ b/docs/types/TExtractedViewAccess.html @@ -0,0 +1 @@ +TExtractedViewAccess | @jackallabs/jackal.js

Type alias TExtractedViewAccess

TExtractedViewAccess: [IAesBundle, TCycleRequired]
\ No newline at end of file diff --git a/docs/types/TFileMetaDataSource.html b/docs/types/TFileMetaDataSource.html index 500a6001..7b181d0b 100644 --- a/docs/types/TFileMetaDataSource.html +++ b/docs/types/TFileMetaDataSource.html @@ -1 +1 @@ -TFileMetaDataSource | @jackallabs/jackal.js
\ No newline at end of file +TFileMetaDataSource | @jackallabs/jackal.js
\ No newline at end of file diff --git a/docs/types/TFolderMetaDataSource.html b/docs/types/TFolderMetaDataSource.html new file mode 100644 index 00000000..04ceed72 --- /dev/null +++ b/docs/types/TFolderMetaDataSource.html @@ -0,0 +1 @@ +TFolderMetaDataSource | @jackallabs/jackal.js
\ No newline at end of file diff --git a/docs/types/TFoundationalMetaData.html b/docs/types/TFoundationalMetaData.html index 7a2926c0..a979b99f 100644 --- a/docs/types/TFoundationalMetaData.html +++ b/docs/types/TFoundationalMetaData.html @@ -1 +1 @@ -TFoundationalMetaData | @jackallabs/jackal.js

Type alias TFoundationalMetaData

TFoundationalMetaData: Omit<TMergedMetaData, "metaDataType">
\ No newline at end of file +TFoundationalMetaData | @jackallabs/jackal.js

Type alias TFoundationalMetaData

TFoundationalMetaData: Omit<TMergedMetaData, "metaDataType">
\ No newline at end of file diff --git a/docs/types/TFullSignerState.html b/docs/types/TFullSignerState.html new file mode 100644 index 00000000..6eca6ddd --- /dev/null +++ b/docs/types/TFullSignerState.html @@ -0,0 +1 @@ +TFullSignerState | @jackallabs/jackal.js

Type alias TFullSignerState

TFullSignerState: [PrivateKey, boolean]
\ No newline at end of file diff --git a/docs/types/TSharedMetaData.html b/docs/types/TLoadThumbnailOptions.html similarity index 54% rename from docs/types/TSharedMetaData.html rename to docs/types/TLoadThumbnailOptions.html index 7be5bdab..9cfb753a 100644 --- a/docs/types/TSharedMetaData.html +++ b/docs/types/TLoadThumbnailOptions.html @@ -1 +1 @@ -TSharedMetaData | @jackallabs/jackal.js
\ No newline at end of file +TLoadThumbnailOptions | @jackallabs/jackal.js
\ No newline at end of file diff --git a/docs/types/TLoadedFolder.html b/docs/types/TLoadedFolder.html index 54a912fe..d79d3ddc 100644 --- a/docs/types/TLoadedFolder.html +++ b/docs/types/TLoadedFolder.html @@ -1 +1 @@ -TLoadedFolder | @jackallabs/jackal.js

Type alias TLoadedFolder

TLoadedFolder: [number, IChildMetaDataMap, boolean]
\ No newline at end of file +TLoadedFolder | @jackallabs/jackal.js

Type alias TLoadedFolder

TLoadedFolder: [number, IChildMetaDataMap, boolean]
\ No newline at end of file diff --git a/docs/types/TMergedMetaData.html b/docs/types/TMergedMetaData.html index b58fc914..7fd66370 100644 --- a/docs/types/TMergedMetaData.html +++ b/docs/types/TMergedMetaData.html @@ -1 +1 @@ -TMergedMetaData | @jackallabs/jackal.js
\ No newline at end of file +TMergedMetaData | @jackallabs/jackal.js
\ No newline at end of file diff --git a/docs/types/TMergedProviderResponse.html b/docs/types/TMergedProviderResponse.html new file mode 100644 index 00000000..66464ef9 --- /dev/null +++ b/docs/types/TMergedProviderResponse.html @@ -0,0 +1 @@ +TMergedProviderResponse | @jackallabs/jackal.js
\ No newline at end of file diff --git a/docs/types/TMerkleChild.html b/docs/types/TMerkleChild.html index ed835380..eebf7a31 100644 --- a/docs/types/TMerkleChild.html +++ b/docs/types/TMerkleChild.html @@ -1 +1 @@ -TMerkleChild | @jackallabs/jackal.js

Type alias TMerkleChild

TMerkleChild: string
\ No newline at end of file +TMerkleChild | @jackallabs/jackal.js

Type alias TMerkleChild

TMerkleChild: string
\ No newline at end of file diff --git a/docs/types/TMerkleParent.html b/docs/types/TMerkleParent.html index 2903cd23..190651b9 100644 --- a/docs/types/TMerkleParent.html +++ b/docs/types/TMerkleParent.html @@ -1 +1 @@ -TMerkleParent | @jackallabs/jackal.js

Type alias TMerkleParent

TMerkleParent: string
\ No newline at end of file +TMerkleParent | @jackallabs/jackal.js

Type alias TMerkleParent

TMerkleParent: string
\ No newline at end of file diff --git a/docs/types/TMerkleParentChild.html b/docs/types/TMerkleParentChild.html index 9fd851bd..871b622a 100644 --- a/docs/types/TMerkleParentChild.html +++ b/docs/types/TMerkleParentChild.html @@ -1 +1 @@ -TMerkleParentChild | @jackallabs/jackal.js

Type alias TMerkleParentChild

TMerkleParentChild: [TMerkleParent, TMerkleChild]
\ No newline at end of file +TMerkleParentChild | @jackallabs/jackal.js

Type alias TMerkleParentChild

TMerkleParentChild: [TMerkleParent, TMerkleChild]
\ No newline at end of file diff --git a/docs/types/TMetaDataSets.html b/docs/types/TMetaDataSets.html index e47d4fb4..3569fde5 100644 --- a/docs/types/TMetaDataSets.html +++ b/docs/types/TMetaDataSets.html @@ -1 +1 @@ -TMetaDataSets | @jackallabs/jackal.js
\ No newline at end of file +TMetaDataSets | @jackallabs/jackal.js
\ No newline at end of file diff --git a/docs/types/TMetaDataTypes.html b/docs/types/TMetaDataTypes.html index 83577e5e..26e1c993 100644 --- a/docs/types/TMetaDataTypes.html +++ b/docs/types/TMetaDataTypes.html @@ -1 +1 @@ -TMetaDataTypes | @jackallabs/jackal.js

Type alias TMetaDataTypes

TMetaDataTypes: "folder" | "file" | "ref" | "null" | "nullref" | "share" | "shareref" | "sharefolder"
\ No newline at end of file +TMetaDataTypes | @jackallabs/jackal.js

Type alias TMetaDataTypes

TMetaDataTypes: "folder" | "file" | "ref" | "null" | "nullref" | "nullsharerref" | "share" | "sharerref" | "rootlookup"
\ No newline at end of file diff --git a/docs/types/TMetaHandler.html b/docs/types/TMetaHandler.html index a312ce71..70fad076 100644 --- a/docs/types/TMetaHandler.html +++ b/docs/types/TMetaHandler.html @@ -1 +1 @@ -TMetaHandler | @jackallabs/jackal.js
\ No newline at end of file +TMetaHandler | @jackallabs/jackal.js
\ No newline at end of file diff --git a/docs/types/TRnsMetaDataSource.html b/docs/types/TRnsMetaDataSource.html new file mode 100644 index 00000000..c9c9575d --- /dev/null +++ b/docs/types/TRnsMetaDataSource.html @@ -0,0 +1 @@ +TRnsMetaDataSource | @jackallabs/jackal.js
\ No newline at end of file diff --git a/docs/types/TSetMetaViewersOptions.html b/docs/types/TSetMetaViewersOptions.html new file mode 100644 index 00000000..56a74f6c --- /dev/null +++ b/docs/types/TSetMetaViewersOptions.html @@ -0,0 +1 @@ +TSetMetaViewersOptions | @jackallabs/jackal.js
\ No newline at end of file diff --git a/docs/types/TSharePackage.html b/docs/types/TSharePackage.html new file mode 100644 index 00000000..54fea6fc --- /dev/null +++ b/docs/types/TSharePackage.html @@ -0,0 +1 @@ +TSharePackage | @jackallabs/jackal.js
\ No newline at end of file diff --git a/docs/types/TSharedRootMetaDataMap.html b/docs/types/TSharedRootMetaDataMap.html deleted file mode 100644 index cb4f1fa1..00000000 --- a/docs/types/TSharedRootMetaDataMap.html +++ /dev/null @@ -1 +0,0 @@ -TSharedRootMetaDataMap | @jackallabs/jackal.js

Type alias TSharedRootMetaDataMap

TSharedRootMetaDataMap: Record<string, ISharedMetaDataMap>
\ No newline at end of file diff --git a/docs/types/TSharerType.html b/docs/types/TSharerType.html new file mode 100644 index 00000000..b561bd0e --- /dev/null +++ b/docs/types/TSharerType.html @@ -0,0 +1 @@ +TSharerType | @jackallabs/jackal.js

Type alias TSharerType

TSharerType: "link" | "user" | "null"
\ No newline at end of file diff --git a/docs/types/TSocketSet.html b/docs/types/TSocketSet.html index 7c56fdd8..f43136f9 100644 --- a/docs/types/TSocketSet.html +++ b/docs/types/TSocketSet.html @@ -1 +1 @@ -TSocketSet | @jackallabs/jackal.js

Type alias TSocketSet

TSocketSet: Record<TSockets, ISocketConfig>
\ No newline at end of file +TSocketSet | @jackallabs/jackal.js

Type alias TSocketSet

TSocketSet: Record<TSockets, ISocketConfig>
\ No newline at end of file diff --git a/docs/types/TSockets.html b/docs/types/TSockets.html index b98ed171..650dd86b 100644 --- a/docs/types/TSockets.html +++ b/docs/types/TSockets.html @@ -1 +1 @@ -TSockets | @jackallabs/jackal.js
TSockets: "jackal" | "jackaltest" | "jackalv4" | "jackallocal" | "archway" | "archwaytest" | "wasm"
\ No newline at end of file +TSockets | @jackallabs/jackal.js
TSockets: "jackal" | "jackaltest" | "jackallocal" | "archway" | "archwaytest" | "wasm"
\ No newline at end of file diff --git a/docs/types/TTidyStringModes.html b/docs/types/TTidyStringModes.html index f20de4f8..7934a8b7 100644 --- a/docs/types/TTidyStringModes.html +++ b/docs/types/TTidyStringModes.html @@ -1 +1 @@ -TTidyStringModes | @jackallabs/jackal.js

Type alias TTidyStringModes

TTidyStringModes: "start" | "end" | "both"
\ No newline at end of file +TTidyStringModes | @jackallabs/jackal.js

Type alias TTidyStringModes

TTidyStringModes: "start" | "end" | "both"
\ No newline at end of file diff --git a/docs/types/TViewerSetAll.html b/docs/types/TViewerSetAll.html new file mode 100644 index 00000000..052cffee --- /dev/null +++ b/docs/types/TViewerSetAll.html @@ -0,0 +1 @@ +TViewerSetAll | @jackallabs/jackal.js
\ No newline at end of file diff --git a/docs/types/TWalletExtensionNames.html b/docs/types/TWalletExtensionNames.html index 667ef9f5..18f3917d 100644 --- a/docs/types/TWalletExtensionNames.html +++ b/docs/types/TWalletExtensionNames.html @@ -1 +1 @@ -TWalletExtensionNames | @jackallabs/jackal.js

Type alias TWalletExtensionNames

TWalletExtensionNames: "keplr" | "leap" | "mnemonic"
\ No newline at end of file +TWalletExtensionNames | @jackallabs/jackal.js

Type alias TWalletExtensionNames

TWalletExtensionNames: "keplr" | "leap" | "mnemonic"
\ No newline at end of file diff --git a/docs/types/TWalletExtensions.html b/docs/types/TWalletExtensions.html index 2adece33..05a1079c 100644 --- a/docs/types/TWalletExtensions.html +++ b/docs/types/TWalletExtensions.html @@ -1 +1 @@ -TWalletExtensions | @jackallabs/jackal.js

Type alias TWalletExtensions

TWalletExtensions: Keplr | Leap | IMnemonicWallet
\ No newline at end of file +TWalletExtensions | @jackallabs/jackal.js

Type alias TWalletExtensions

TWalletExtensions: Keplr | Leap | IMnemonicWallet
\ No newline at end of file diff --git a/docs/variables/sharedPath.html b/docs/variables/sharedPath.html index 0275ee0f..bfc4e1ac 100644 --- a/docs/variables/sharedPath.html +++ b/docs/variables/sharedPath.html @@ -1 +1 @@ -sharedPath | @jackallabs/jackal.js

Variable sharedPathConst

sharedPath: "dashboard_sharedfiles" = 'dashboard_sharedfiles'
\ No newline at end of file +sharedPath | @jackallabs/jackal.js

Variable sharedPathConst

sharedPath: "dashboard_sharedfiles" = 'dashboard_sharedfiles'
\ No newline at end of file diff --git a/package-lock.json b/package-lock.json index acf62389..6746cee2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,26 +1,26 @@ { "name": "@jackallabs/jackal.js", - "version": "3.3.3", + "version": "3.6.5", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@jackallabs/jackal.js", - "version": "3.3.3", + "version": "3.6.5", "license": "MIT", "dependencies": { - "@cosmjs/proto-signing": "^0.31.3", - "@cosmjs/stargate": "^0.32.2", - "@jackallabs/bech32": "^1.2.0", - "@jackallabs/dogwood-tree": "^1.0.1", - "@jackallabs/jackal.js-protos": "2.3.0", + "@cosmjs/proto-signing": "^0.32.3", + "@cosmjs/stargate": "^0.32.3", + "@jackallabs/bech32": "^1.2.1", + "@jackallabs/browserify-aes": "^11.2.0-CCM.1", + "@jackallabs/dogwood-tree": "^1.1.0", + "@jackallabs/jackal.js-protos": "2.4.1", "@karnthis/plzsu": "^1.0.0", "@keplr-wallet/types": "^0.12.44", - "browserify-aes": "^1.2.0", "browserify-des": "^1.0.2", "browserify-sign": "^4.2.2", "create-hash": "^1.2.0", - "eciesjs": "^0.4.2", + "eciesjs": "^0.4.11", "for-each": "^0.3.3", "ripemd160": "^2.0.2", "ulid": "^2.3.0" @@ -29,33 +29,36 @@ "@btmills/prettier": "3.0.3", "@rollup/plugin-commonjs": "^25.0.7", "@rollup/plugin-typescript": "^11.1.5", + "@types/node": "^22.9.0", "@typescript-eslint/eslint-plugin": "^6.10.0", "@typescript-eslint/parser": "^6.10.0", - "@vitest/coverage-v8": "0.34.6", + "@vitest/browser": "^3.0.7", "eslint": "8.53.0", "eslint-config-prettier": "9.0.0", "rollup-plugin-typescript-paths": "^1.4.0", "tslib": "^2.6.2", "typedoc": "^0.25.3", "typescript": "^5.2.2", - "vite": "^5.1.5", + "vite": "^6.2.0", "vite-plugin-dts": "^4.0.3", - "vite-plugin-node-polyfills": "^0.17.0", + "vite-plugin-node-polyfills": "^0.23.0", "vite-tsconfig-paths": "^4.2.1", - "vitest": "0.34.6" + "vitest": "^3.0.7" } }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { @@ -68,10 +71,11 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -91,6 +95,19 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/runtime": { + "version": "7.27.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", + "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/types": { "version": "7.25.2", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", @@ -105,12 +122,6 @@ "node": ">=6.9.0" } }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, "node_modules/@btmills/prettier": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@btmills/prettier/-/prettier-3.0.3.tgz", @@ -126,6 +137,37 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/@bundled-es-modules/cookie": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/cookie/-/cookie-2.0.1.tgz", + "integrity": "sha512-8o+5fRPLNbjbdGRRmJj3h6Hh1AQJf2dk3qQ/5ZFb+PXkRNiSoMGGUKlsgLfrxneb72axVJyIYji64E2+nNfYyw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cookie": "^0.7.2" + } + }, + "node_modules/@bundled-es-modules/statuses": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz", + "integrity": "sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg==", + "dev": true, + "license": "ISC", + "dependencies": { + "statuses": "^2.0.1" + } + }, + "node_modules/@bundled-es-modules/tough-cookie": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz", + "integrity": "sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@types/tough-cookie": "^4.0.5", + "tough-cookie": "^4.1.4" + } + }, "node_modules/@confio/ics23": { "version": "0.6.8", "resolved": "https://registry.npmjs.org/@confio/ics23/-/ics23-0.6.8.tgz", @@ -136,24 +178,24 @@ } }, "node_modules/@cosmjs/amino": { - "version": "0.31.3", - "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.31.3.tgz", - "integrity": "sha512-36emtUq895sPRX8PTSOnG+lhJDCVyIcE0Tr5ct59sUbgQiI14y43vj/4WAlJ/utSOxy+Zhj9wxcs4AZfu0BHsw==", + "version": "0.32.4", + "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.32.4.tgz", + "integrity": "sha512-zKYOt6hPy8obIFtLie/xtygCkH9ZROiQ12UHfKsOkWaZfPQUvVbtgmu6R4Kn1tFLI/SRkw7eqhaogmW/3NYu/Q==", "dependencies": { - "@cosmjs/crypto": "^0.31.3", - "@cosmjs/encoding": "^0.31.3", - "@cosmjs/math": "^0.31.3", - "@cosmjs/utils": "^0.31.3" + "@cosmjs/crypto": "^0.32.4", + "@cosmjs/encoding": "^0.32.4", + "@cosmjs/math": "^0.32.4", + "@cosmjs/utils": "^0.32.4" } }, "node_modules/@cosmjs/crypto": { - "version": "0.31.3", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.31.3.tgz", - "integrity": "sha512-vRbvM9ZKR2017TO73dtJ50KxoGcFzKtKI7C8iO302BQ5p+DuB+AirUg1952UpSoLfv5ki9O416MFANNg8UN/EQ==", + "version": "0.32.4", + "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.4.tgz", + "integrity": "sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw==", "dependencies": { - "@cosmjs/encoding": "^0.31.3", - "@cosmjs/math": "^0.31.3", - "@cosmjs/utils": "^0.31.3", + "@cosmjs/encoding": "^0.32.4", + "@cosmjs/math": "^0.32.4", + "@cosmjs/utils": "^0.32.4", "@noble/hashes": "^1", "bn.js": "^5.2.0", "elliptic": "^6.5.4", @@ -161,9 +203,9 @@ } }, "node_modules/@cosmjs/encoding": { - "version": "0.31.3", - "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.31.3.tgz", - "integrity": "sha512-6IRtG0fiVYwyP7n+8e54uTx2pLYijO48V3t9TLiROERm5aUAIzIlz6Wp0NYaI5he9nh1lcEGJ1lkquVKFw3sUg==", + "version": "0.32.4", + "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.4.tgz", + "integrity": "sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw==", "dependencies": { "base64-js": "^1.3.0", "bech32": "^1.1.4", @@ -183,6 +225,7 @@ "version": "0.27.1", "resolved": "https://registry.npmjs.org/@cosmjs/launchpad/-/launchpad-0.27.1.tgz", "integrity": "sha512-DcFwGD/z5PK8CzO2sojDxa+Be9EIEtRZb2YawgVnw2Ht/p5FlNv+OVo8qlishpBdalXEN7FvQ1dVeDFEe9TuJw==", + "license": "Apache-2.0", "dependencies": { "@cosmjs/amino": "0.27.1", "@cosmjs/crypto": "0.27.1", @@ -197,6 +240,7 @@ "version": "0.27.1", "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.27.1.tgz", "integrity": "sha512-w56ar/nK9+qlvWDpBPRmD0Blk2wfkkLqRi1COs1x7Ll1LF0AtkIBUjbRKplENLbNovK0T3h+w8bHiFm+GBGQOA==", + "license": "Apache-2.0", "dependencies": { "@cosmjs/crypto": "0.27.1", "@cosmjs/encoding": "0.27.1", @@ -208,6 +252,7 @@ "version": "0.27.1", "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.27.1.tgz", "integrity": "sha512-vbcxwSt99tIYJg8Spp00wc3zx72qx+pY3ozGuBN8gAvySnagK9dQ/jHwtWQWdammmdD6oW+75WfIHZ+gNa+Ybg==", + "license": "Apache-2.0", "dependencies": { "@cosmjs/encoding": "0.27.1", "@cosmjs/math": "0.27.1", @@ -225,6 +270,7 @@ "version": "0.27.1", "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.27.1.tgz", "integrity": "sha512-rayLsA0ojHeniaRfWWcqSsrE/T1rl1gl0OXVNtXlPwLJifKBeLEefGbOUiAQaT0wgJ8VNGBazVtAZBpJidfDhw==", + "license": "Apache-2.0", "dependencies": { "base64-js": "^1.3.0", "bech32": "^1.1.4", @@ -235,6 +281,7 @@ "version": "0.27.1", "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.27.1.tgz", "integrity": "sha512-cHWVjmfIjtRc7f80n7x+J5k8pe+vTVTQ0lA82tIxUgqUvgS6rogPP/TmGtTiZ4+NxWxd11DUISY6gVpr18/VNQ==", + "license": "Apache-2.0", "dependencies": { "bn.js": "^5.2.0" } @@ -242,12 +289,14 @@ "node_modules/@cosmjs/launchpad/node_modules/@cosmjs/utils": { "version": "0.27.1", "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.27.1.tgz", - "integrity": "sha512-VG7QPDiMUzVPxRdJahDV8PXxVdnuAHiIuG56hldV4yPnOz/si/DLNd7VAUUA5923b6jS1Hhev0Hr6AhEkcxBMg==" + "integrity": "sha512-VG7QPDiMUzVPxRdJahDV8PXxVdnuAHiIuG56hldV4yPnOz/si/DLNd7VAUUA5923b6jS1Hhev0Hr6AhEkcxBMg==", + "license": "Apache-2.0" }, "node_modules/@cosmjs/launchpad/node_modules/axios": { "version": "0.21.4", "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.14.0" } @@ -255,30 +304,35 @@ "node_modules/@cosmjs/launchpad/node_modules/js-sha3": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.8.0.tgz", - "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==" + "integrity": "sha512-gF1cRrHhIzNfToc802P800N8PpXS+evLLXfsVpowqmAFR9uwbi89WvXg2QspOmXL8QL86J4T1EpFu+yUkwJY3Q==", + "license": "MIT" }, "node_modules/@cosmjs/math": { - "version": "0.31.3", - "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.31.3.tgz", - "integrity": "sha512-kZ2C6glA5HDb9hLz1WrftAjqdTBb3fWQsRR+Us2HsjAYdeE6M3VdXMsYCP5M3yiihal1WDwAY2U7HmfJw7Uh4A==", + "version": "0.32.4", + "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.4.tgz", + "integrity": "sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw==", "dependencies": { "bn.js": "^5.2.0" } }, "node_modules/@cosmjs/proto-signing": { - "version": "0.31.3", - "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.31.3.tgz", - "integrity": "sha512-24+10/cGl6lLS4VCrGTCJeDRPQTn1K5JfknzXzDIHOx8THR31JxA7/HV5eWGHqWgAbudA7ccdSvEK08lEHHtLA==", - "dependencies": { - "@cosmjs/amino": "^0.31.3", - "@cosmjs/crypto": "^0.31.3", - "@cosmjs/encoding": "^0.31.3", - "@cosmjs/math": "^0.31.3", - "@cosmjs/utils": "^0.31.3", - "cosmjs-types": "^0.8.0", - "long": "^4.0.0" + "version": "0.32.4", + "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.32.4.tgz", + "integrity": "sha512-QdyQDbezvdRI4xxSlyM1rSVBO2st5sqtbEIl3IX03uJ7YiZIQHyv6vaHVf1V4mapusCqguiHJzm4N4gsFdLBbQ==", + "dependencies": { + "@cosmjs/amino": "^0.32.4", + "@cosmjs/crypto": "^0.32.4", + "@cosmjs/encoding": "^0.32.4", + "@cosmjs/math": "^0.32.4", + "@cosmjs/utils": "^0.32.4", + "cosmjs-types": "^0.9.0" } }, + "node_modules/@cosmjs/proto-signing/node_modules/cosmjs-types": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.9.0.tgz", + "integrity": "sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ==" + }, "node_modules/@cosmjs/socket": { "version": "0.32.3", "resolved": "https://registry.npmjs.org/@cosmjs/socket/-/socket-0.32.3.tgz", @@ -307,67 +361,6 @@ "xstream": "^11.14.0" } }, - "node_modules/@cosmjs/stargate/node_modules/@cosmjs/amino": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.32.3.tgz", - "integrity": "sha512-G4zXl+dJbqrz1sSJ56H/25l5NJEk/pAPIr8piAHgbXYw88OdAOlpA26PQvk2IbSN/rRgVbvlLTNgX2tzz1dyUA==", - "dependencies": { - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3" - } - }, - "node_modules/@cosmjs/stargate/node_modules/@cosmjs/crypto": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.3.tgz", - "integrity": "sha512-niQOWJHUtlJm2GG4F00yGT7sGPKxfUwz+2qQ30uO/E3p58gOusTcH2qjiJNVxb8vScYJhFYFqpm/OA/mVqoUGQ==", - "dependencies": { - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "@noble/hashes": "^1", - "bn.js": "^5.2.0", - "elliptic": "^6.5.4", - "libsodium-wrappers-sumo": "^0.7.11" - } - }, - "node_modules/@cosmjs/stargate/node_modules/@cosmjs/encoding": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.3.tgz", - "integrity": "sha512-p4KF7hhv8jBQX3MkB3Defuhz/W0l3PwWVYU2vkVuBJ13bJcXyhU9nJjiMkaIv+XP+W2QgRceqNNgFUC5chNR7w==", - "dependencies": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" - } - }, - "node_modules/@cosmjs/stargate/node_modules/@cosmjs/math": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.3.tgz", - "integrity": "sha512-amumUtZs8hCCnV+lSBaJIiZkGabQm22QGg/IotYrhcmoOEOjt82n7hMNlNXRs7V6WLMidGrGYcswB5zcmp0Meg==", - "dependencies": { - "bn.js": "^5.2.0" - } - }, - "node_modules/@cosmjs/stargate/node_modules/@cosmjs/proto-signing": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.32.3.tgz", - "integrity": "sha512-kSZ0ZUY0DwcRT0NcIn2HkadH4NKlwjfZgbLj1ABwh/4l0RgeT84QCscZCu63tJYq3K6auwqTiZSZERwlO4/nbg==", - "dependencies": { - "@cosmjs/amino": "^0.32.3", - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "cosmjs-types": "^0.9.0" - } - }, - "node_modules/@cosmjs/stargate/node_modules/@cosmjs/utils": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.3.tgz", - "integrity": "sha512-WCZK4yksj2hBDz4w7xFZQTRZQ/RJhBX26uFHmmQFIcNUUVAihrLO+RerqJgk0dZqC42wstM9pEUQGtPmLcIYvg==" - }, "node_modules/@cosmjs/stargate/node_modules/cosmjs-types": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.9.0.tgz", @@ -398,391 +391,447 @@ "xstream": "^11.14.0" } }, - "node_modules/@cosmjs/tendermint-rpc/node_modules/@cosmjs/crypto": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.3.tgz", - "integrity": "sha512-niQOWJHUtlJm2GG4F00yGT7sGPKxfUwz+2qQ30uO/E3p58gOusTcH2qjiJNVxb8vScYJhFYFqpm/OA/mVqoUGQ==", - "dependencies": { - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "@noble/hashes": "^1", - "bn.js": "^5.2.0", - "elliptic": "^6.5.4", - "libsodium-wrappers-sumo": "^0.7.11" - } - }, - "node_modules/@cosmjs/tendermint-rpc/node_modules/@cosmjs/encoding": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.3.tgz", - "integrity": "sha512-p4KF7hhv8jBQX3MkB3Defuhz/W0l3PwWVYU2vkVuBJ13bJcXyhU9nJjiMkaIv+XP+W2QgRceqNNgFUC5chNR7w==", - "dependencies": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" - } + "node_modules/@cosmjs/utils": { + "version": "0.32.4", + "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.4.tgz", + "integrity": "sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w==" }, - "node_modules/@cosmjs/tendermint-rpc/node_modules/@cosmjs/math": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.3.tgz", - "integrity": "sha512-amumUtZs8hCCnV+lSBaJIiZkGabQm22QGg/IotYrhcmoOEOjt82n7hMNlNXRs7V6WLMidGrGYcswB5zcmp0Meg==", - "dependencies": { - "bn.js": "^5.2.0" + "node_modules/@ecies/ciphers": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@ecies/ciphers/-/ciphers-0.2.1.tgz", + "integrity": "sha512-ezMihhjW24VNK/2qQR7lH8xCQY24nk0XHF/kwJ1OuiiY5iEwQXOcKVSy47fSoHPRG8gVGXcK5SgtONDk5xMwtQ==", + "engines": { + "bun": ">=1", + "deno": ">=2", + "node": ">=16" + }, + "peerDependencies": { + "@noble/ciphers": "^1.0.0" } }, - "node_modules/@cosmjs/tendermint-rpc/node_modules/@cosmjs/utils": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.3.tgz", - "integrity": "sha512-WCZK4yksj2hBDz4w7xFZQTRZQ/RJhBX26uFHmmQFIcNUUVAihrLO+RerqJgk0dZqC42wstM9pEUQGtPmLcIYvg==" - }, - "node_modules/@cosmjs/utils": { - "version": "0.31.3", - "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.31.3.tgz", - "integrity": "sha512-VBhAgzrrYdIe0O5IbKRqwszbQa7ZyQLx9nEQuHQ3HUplQW7P44COG/ye2n6AzCudtqxmwdX7nyX8ta1J07GoqA==" - }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.0.tgz", + "integrity": "sha512-O7vun9Sf8DFjH2UtqK8Ku3LkquL9SZL8OLY1T5NZkA34+wG3OQF7cl4Ql8vdNzM6fzBbYfLaiRLIOZ+2FOCgBQ==", "cpu": [ "ppc64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.0.tgz", + "integrity": "sha512-PTyWCYYiU0+1eJKmw21lWtC+d08JDZPQ5g+kFyxP0V+es6VPPSUhM6zk8iImp2jbV6GwjX4pap0JFbUQN65X1g==", "cpu": [ "arm" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.0.tgz", + "integrity": "sha512-grvv8WncGjDSyUBjN9yHXNt+cq0snxXbDxy5pJtzMKGmmpPxeAmAhWxXI+01lU5rwZomDgD3kJwulEnhTRUd6g==", "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.0.tgz", + "integrity": "sha512-m/ix7SfKG5buCnxasr52+LI78SQ+wgdENi9CqyCXwjVR2X4Jkz+BpC3le3AoBPYTC9NHklwngVXvbJ9/Akhrfg==", "cpu": [ "x64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.0.tgz", + "integrity": "sha512-mVwdUb5SRkPayVadIOI78K7aAnPamoeFR2bT5nszFUZ9P8UpK4ratOdYbZZXYSqPKMHfS1wdHCJk1P1EZpRdvw==", "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.0.tgz", + "integrity": "sha512-DgDaYsPWFTS4S3nWpFcMn/33ZZwAAeAFKNHNa1QN0rI4pUjgqf0f7ONmXf6d22tqTY+H9FNdgeaAa+YIFUn2Rg==", "cpu": [ "x64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.0.tgz", + "integrity": "sha512-VN4ocxy6dxefN1MepBx/iD1dH5K8qNtNe227I0mnTRjry8tj5MRk4zprLEdG8WPyAPb93/e4pSgi1SoHdgOa4w==", "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.0.tgz", + "integrity": "sha512-mrSgt7lCh07FY+hDD1TxiTyIHyttn6vnjesnPoVDNmDfOmggTLXRv8Id5fNZey1gl/V2dyVK1VXXqVsQIiAk+A==", "cpu": [ "x64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.0.tgz", + "integrity": "sha512-vkB3IYj2IDo3g9xX7HqhPYxVkNQe8qTK55fraQyTzTX/fxaDtXiEnavv9geOsonh2Fd2RMB+i5cbhu2zMNWJwg==", "cpu": [ "arm" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.0.tgz", + "integrity": "sha512-9QAQjTWNDM/Vk2bgBl17yWuZxZNQIF0OUUuPZRKoDtqF2k4EtYbpyiG5/Dk7nqeK6kIJWPYldkOcBqjXjrUlmg==", "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.0.tgz", + "integrity": "sha512-43ET5bHbphBegyeqLb7I1eYn2P/JYGNmzzdidq/w0T8E2SsYL1U6un2NFROFRg1JZLTzdCoRomg8Rvf9M6W6Gg==", "cpu": [ "ia32" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.0.tgz", + "integrity": "sha512-fC95c/xyNFueMhClxJmeRIj2yrSMdDfmqJnyOY4ZqsALkDrrKJfIg5NTMSzVBr5YW1jf+l7/cndBfP3MSDpoHw==", "cpu": [ "loong64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.0.tgz", + "integrity": "sha512-nkAMFju7KDW73T1DdH7glcyIptm95a7Le8irTQNO/qtkoyypZAnjchQgooFUDQhNAy4iu08N79W4T4pMBwhPwQ==", "cpu": [ "mips64el" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.0.tgz", + "integrity": "sha512-NhyOejdhRGS8Iwv+KKR2zTq2PpysF9XqY+Zk77vQHqNbo/PwZCzB5/h7VGuREZm1fixhs4Q/qWRSi5zmAiO4Fw==", "cpu": [ "ppc64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.0.tgz", + "integrity": "sha512-5S/rbP5OY+GHLC5qXp1y/Mx//e92L1YDqkiBbO9TQOvuFXM+iDqUNG5XopAnXoRH3FjIUDkeGcY1cgNvnXp/kA==", "cpu": [ "riscv64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.0.tgz", + "integrity": "sha512-XM2BFsEBz0Fw37V0zU4CXfcfuACMrppsMFKdYY2WuTS3yi8O1nFOhil/xhKTmE1nPmVyvQJjJivgDT+xh8pXJA==", "cpu": [ "s390x" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", - "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.0.tgz", + "integrity": "sha512-9yl91rHw/cpwMCNytUDxwj2XjFpxML0y9HAOH9pNVQDpQrBxHy01Dx+vaMu0N1CKa/RzBD2hB4u//nfc+Sd3Cw==", "cpu": [ "x64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.0.tgz", + "integrity": "sha512-RuG4PSMPFfrkH6UwCAqBzauBWTygTvb1nxWasEJooGSJ/NwRw7b2HOwyRTQIU97Hq37l3npXoZGYMy3b3xYvPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.0.tgz", + "integrity": "sha512-jl+qisSB5jk01N5f7sPCsBENCOlPiS/xptD5yxOx2oqQfyourJwIKLRA2yqWdifj3owQZCL2sn6o08dBzZGQzA==", "cpu": [ "x64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.0.tgz", + "integrity": "sha512-21sUNbq2r84YE+SJDfaQRvdgznTD8Xc0oc3p3iW/a1EVWeNj/SdUCbm5U0itZPQYRuRTW20fPMWMpcrciH2EJw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.0.tgz", + "integrity": "sha512-2gwwriSMPcCFRlPlKx3zLQhfN/2WjJ2NSlg5TKLQOJdV0mSxIcYNTMhk3H3ulL/cak+Xj0lY1Ym9ysDV1igceg==", "cpu": [ "x64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.0.tgz", + "integrity": "sha512-bxI7ThgLzPrPz484/S9jLlvUAHYMzy6I0XiU1ZMeAEOBcS0VePBFxh1JjTQt3Xiat5b6Oh4x7UC7IwKQKIJRIg==", "cpu": [ "x64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.0.tgz", + "integrity": "sha512-ZUAc2YK6JW89xTbXvftxdnYy3m4iHIkDtK3CLce8wg8M2L+YZhIvO1DKpxrd0Yr59AeNNkTiic9YLf6FTtXWMw==", "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.0.tgz", + "integrity": "sha512-eSNxISBu8XweVEWG31/JzjkIGbGIJN/TrRoiSVZwZ6pkC6VX4Im/WV2cz559/TXLcYbcrDN8JtKgd9DJVIo8GA==", "cpu": [ "ia32" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.0.tgz", + "integrity": "sha512-ZENoHJBxA20C2zFzh6AI4fT6RraMzjYw4xKWemRTRmRVtN9c5DcH9r/f2ihEkMjOW5eGgrwCslG/+Y/3bL+DHQ==", "cpu": [ "x64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { @@ -918,110 +967,131 @@ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "node_modules/@inquirer/confirm": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.6.tgz", + "integrity": "sha512-6ZXYK3M1XmaVBZX6FCfChgtponnL0R6I7k8Nu+kaoNkT828FVZTcca1MqmWQipaW2oNREQl5AaPCUOOCVNdRMw==", "dev": true, + "license": "MIT", + "dependencies": { + "@inquirer/core": "^10.1.7", + "@inquirer/type": "^3.0.4" + }, "engines": { - "node": ">=8" + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@jackallabs/banshee": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@jackallabs/banshee/-/banshee-1.0.1.tgz", - "integrity": "sha512-ouhmRnjUK1JDoB2+wcEadUnsTm0y5obslTZyotzGXzfxHi5G8RWtfUuDAC2VQFWP6pbFkv+lJRZUXWyGnXXvTA==", + "node_modules/@inquirer/core": { + "version": "10.1.7", + "resolved": "https://registry.npmjs.org/@inquirer/core/-/core-10.1.7.tgz", + "integrity": "sha512-AA9CQhlrt6ZgiSy6qoAigiA1izOa751ugX6ioSjqgJ+/Gd+tEN/TORk5sUYNjXuHWfW0r1n/a6ak4u/NqHHrtA==", + "dev": true, + "license": "MIT", "dependencies": { - "@cosmjs/amino": "^0.32.3", - "@cosmjs/launchpad": "^0.27.1", - "@cosmjs/proto-signing": "^0.32.3", - "@cosmjs/stargate": "^0.32.3", - "@cosmjs/tendermint-rpc": "^0.32.3" + "@inquirer/figures": "^1.0.10", + "@inquirer/type": "^3.0.4", + "ansi-escapes": "^4.3.2", + "cli-width": "^4.1.0", + "mute-stream": "^2.0.0", + "signal-exit": "^4.1.0", + "wrap-ansi": "^6.2.0", + "yoctocolors-cjs": "^2.1.2" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@jackallabs/banshee/node_modules/@cosmjs/amino": { - "version": "0.32.4", - "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.32.4.tgz", - "integrity": "sha512-zKYOt6hPy8obIFtLie/xtygCkH9ZROiQ12UHfKsOkWaZfPQUvVbtgmu6R4Kn1tFLI/SRkw7eqhaogmW/3NYu/Q==", - "dependencies": { - "@cosmjs/crypto": "^0.32.4", - "@cosmjs/encoding": "^0.32.4", - "@cosmjs/math": "^0.32.4", - "@cosmjs/utils": "^0.32.4" + "node_modules/@inquirer/figures": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.10.tgz", + "integrity": "sha512-Ey6176gZmeqZuY/W/nZiUyvmb1/qInjcpiZjXWi6nON+nxJpD1bxtSoBxNliGISae32n6OwbY+TSXPZ1CfS4bw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" } }, - "node_modules/@jackallabs/banshee/node_modules/@cosmjs/crypto": { - "version": "0.32.4", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.4.tgz", - "integrity": "sha512-zicjGU051LF1V9v7bp8p7ovq+VyC91xlaHdsFOTo2oVry3KQikp8L/81RkXmUIT8FxMwdx1T7DmFwVQikcSDIw==", - "dependencies": { - "@cosmjs/encoding": "^0.32.4", - "@cosmjs/math": "^0.32.4", - "@cosmjs/utils": "^0.32.4", - "@noble/hashes": "^1", - "bn.js": "^5.2.0", - "elliptic": "^6.5.4", - "libsodium-wrappers-sumo": "^0.7.11" + "node_modules/@inquirer/type": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@inquirer/type/-/type-3.0.4.tgz", + "integrity": "sha512-2MNFrDY8jkFYc9Il9DgLsHhMzuHnOYM1+CUYVWbzu9oT0hC7V7EcYvdCKeoll/Fcci04A+ERZ9wcc7cQ8lTkIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@jackallabs/banshee/node_modules/@cosmjs/encoding": { - "version": "0.32.4", - "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.4.tgz", - "integrity": "sha512-tjvaEy6ZGxJchiizzTn7HVRiyTg1i4CObRRaTRPknm5EalE13SV+TCHq38gIDfyUeden4fCuaBVEdBR5+ti7Hw==", + "node_modules/@jackallabs/banshee": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@jackallabs/banshee/-/banshee-1.0.5.tgz", + "integrity": "sha512-+Zk33psRJ99SPmbQgua5eCCaLxdgramjzGBrYqY+HvL46MwgZEnskxAKorQvnsULaOOxzsfAngj8aXdvERPjJA==", + "license": "MIT", "dependencies": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" + "@cosmjs/amino": "^0.32.3", + "@cosmjs/launchpad": "^0.27.1", + "@cosmjs/proto-signing": "^0.32.3", + "@cosmjs/stargate": "^0.32.3", + "@cosmjs/tendermint-rpc": "^0.32.3" } }, - "node_modules/@jackallabs/banshee/node_modules/@cosmjs/math": { - "version": "0.32.4", - "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.4.tgz", - "integrity": "sha512-++dqq2TJkoB8zsPVYCvrt88oJWsy1vMOuSOKcdlnXuOA/ASheTJuYy4+oZlTQ3Fr8eALDLGGPhJI02W2HyAQaw==", - "dependencies": { - "bn.js": "^5.2.0" - } + "node_modules/@jackallabs/bech32": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jackallabs/bech32/-/bech32-1.2.1.tgz", + "integrity": "sha512-wSGAOJilTjNtr1XQFHjVj6RA+octfSKjMDDF+uqVlCpvfo+8vCwS1oHHjNCmLsddSca0KP+O7AG5DKUEPFey6g==", + "license": "MIT" }, - "node_modules/@jackallabs/banshee/node_modules/@cosmjs/proto-signing": { - "version": "0.32.4", - "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.32.4.tgz", - "integrity": "sha512-QdyQDbezvdRI4xxSlyM1rSVBO2st5sqtbEIl3IX03uJ7YiZIQHyv6vaHVf1V4mapusCqguiHJzm4N4gsFdLBbQ==", + "node_modules/@jackallabs/browserify-aes": { + "version": "11.2.0-CCM.1", + "resolved": "https://registry.npmjs.org/@jackallabs/browserify-aes/-/browserify-aes-11.2.0-CCM.1.tgz", + "integrity": "sha512-bEBpsg8Zzg0E7vw2930FDLl7ClBMq0NRVKRzc8MvrGt7OOpbJjMOr+JFOCWR+8cID2ozaDtJfEfmKcH9aRYAxA==", "dependencies": { - "@cosmjs/amino": "^0.32.4", - "@cosmjs/crypto": "^0.32.4", - "@cosmjs/encoding": "^0.32.4", - "@cosmjs/math": "^0.32.4", - "@cosmjs/utils": "^0.32.4", - "cosmjs-types": "^0.9.0" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1", + "timing-safe-equal": "^1.0.0" } }, - "node_modules/@jackallabs/banshee/node_modules/@cosmjs/utils": { - "version": "0.32.4", - "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.4.tgz", - "integrity": "sha512-D1Yc+Zy8oL/hkUkFUL/bwxvuDBzRGpc4cF7/SkdhxX4iHpSLgdOuTt1mhCh9+kl6NQREy9t7SYZ6xeW5gFe60w==" - }, - "node_modules/@jackallabs/banshee/node_modules/cosmjs-types": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.9.0.tgz", - "integrity": "sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ==" - }, - "node_modules/@jackallabs/bech32": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@jackallabs/bech32/-/bech32-1.2.0.tgz", - "integrity": "sha512-gomqRlcr6uSvER6vkNzFn6QNsV3/5MSKeXD+/n6of2tFnAzL2pAnYI6gNBBwShHEA4U6FqTmGHj72lnPzI65LA==" - }, "node_modules/@jackallabs/dogwood-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@jackallabs/dogwood-tree/-/dogwood-tree-1.0.1.tgz", - "integrity": "sha512-fxnwtmNyaaPA0OR/VmiWX3N+Q54K+PFF1YPrklJqq3fi30Hnxvw+NcwNOPXEFDWKB4n/XQGoYjroJgb+eRziHg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jackallabs/dogwood-tree/-/dogwood-tree-1.1.0.tgz", + "integrity": "sha512-snGiF4Q+bC9cXRdcZC1SGT30AAO0Vk0RveZjHv1i2bmdEM3HF5uIo152yJE1XK2kervGYKa+UBaocWM0tuvKtA==", + "license": "MIT", "dependencies": { "js-sha3": "^0.9.2" } }, "node_modules/@jackallabs/jackal.js-protos": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@jackallabs/jackal.js-protos/-/jackal.js-protos-2.3.0.tgz", - "integrity": "sha512-3fw8nmYfkxIzBWMzhvrWO14yxeoxEznCyon/F4l18+J4/yunKXPdvOYmsY0seTmv0hwdWl+UtToxIAqEYBi5zw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@jackallabs/jackal.js-protos/-/jackal.js-protos-2.4.1.tgz", + "integrity": "sha512-QY5nPJZjrnt/l1Zc0i4fP0nEzh4/SfOoui5cLstUu5EUQe1wxprvxrdzT8iAWRQPLLvBQ9qFCLYDFC6tXN/SNA==", + "license": "MIT", "dependencies": { "@cosmjs/amino": "^0.32.3", "@cosmjs/encoding": "^0.32.3", @@ -1031,90 +1101,19 @@ "@cosmjs/stargate": "^0.32.3", "@cosmjs/tendermint-rpc": "^0.32.3", "@cosmjs/utils": "^0.32.3", - "@jackallabs/banshee": "1.0.1", + "@jackallabs/banshee": "1.0.5", + "@jackallabs/protobufjs": "^7.4.0-patch.1", "cosmjs-types": "^0.8.0", "grpc-web": "^1.5.0", - "protobufjs": "^7.2.5", - "ts-proto": "^1.164.0", - "vite-plugin-node-polyfills": "^0.17.0" - } - }, - "node_modules/@jackallabs/jackal.js-protos/node_modules/@cosmjs/amino": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/amino/-/amino-0.32.3.tgz", - "integrity": "sha512-G4zXl+dJbqrz1sSJ56H/25l5NJEk/pAPIr8piAHgbXYw88OdAOlpA26PQvk2IbSN/rRgVbvlLTNgX2tzz1dyUA==", - "dependencies": { - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3" - } - }, - "node_modules/@jackallabs/jackal.js-protos/node_modules/@cosmjs/crypto": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/crypto/-/crypto-0.32.3.tgz", - "integrity": "sha512-niQOWJHUtlJm2GG4F00yGT7sGPKxfUwz+2qQ30uO/E3p58gOusTcH2qjiJNVxb8vScYJhFYFqpm/OA/mVqoUGQ==", - "dependencies": { - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "@noble/hashes": "^1", - "bn.js": "^5.2.0", - "elliptic": "^6.5.4", - "libsodium-wrappers-sumo": "^0.7.11" - } - }, - "node_modules/@jackallabs/jackal.js-protos/node_modules/@cosmjs/encoding": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/encoding/-/encoding-0.32.3.tgz", - "integrity": "sha512-p4KF7hhv8jBQX3MkB3Defuhz/W0l3PwWVYU2vkVuBJ13bJcXyhU9nJjiMkaIv+XP+W2QgRceqNNgFUC5chNR7w==", - "dependencies": { - "base64-js": "^1.3.0", - "bech32": "^1.1.4", - "readonly-date": "^1.0.0" - } - }, - "node_modules/@jackallabs/jackal.js-protos/node_modules/@cosmjs/math": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/math/-/math-0.32.3.tgz", - "integrity": "sha512-amumUtZs8hCCnV+lSBaJIiZkGabQm22QGg/IotYrhcmoOEOjt82n7hMNlNXRs7V6WLMidGrGYcswB5zcmp0Meg==", - "dependencies": { - "bn.js": "^5.2.0" - } - }, - "node_modules/@jackallabs/jackal.js-protos/node_modules/@cosmjs/proto-signing": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/proto-signing/-/proto-signing-0.32.3.tgz", - "integrity": "sha512-kSZ0ZUY0DwcRT0NcIn2HkadH4NKlwjfZgbLj1ABwh/4l0RgeT84QCscZCu63tJYq3K6auwqTiZSZERwlO4/nbg==", - "dependencies": { - "@cosmjs/amino": "^0.32.3", - "@cosmjs/crypto": "^0.32.3", - "@cosmjs/encoding": "^0.32.3", - "@cosmjs/math": "^0.32.3", - "@cosmjs/utils": "^0.32.3", - "cosmjs-types": "^0.9.0" + "ts-proto": "^1.164.0" } }, - "node_modules/@jackallabs/jackal.js-protos/node_modules/@cosmjs/proto-signing/node_modules/cosmjs-types": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/cosmjs-types/-/cosmjs-types-0.9.0.tgz", - "integrity": "sha512-MN/yUe6mkJwHnCFfsNPeCfXVhyxHYW6c/xDUzrSbBycYzw++XvWDMJArXp2pLdgD6FQ8DW79vkPjeNKVrXaHeQ==" - }, - "node_modules/@jackallabs/jackal.js-protos/node_modules/@cosmjs/utils": { - "version": "0.32.3", - "resolved": "https://registry.npmjs.org/@cosmjs/utils/-/utils-0.32.3.tgz", - "integrity": "sha512-WCZK4yksj2hBDz4w7xFZQTRZQ/RJhBX26uFHmmQFIcNUUVAihrLO+RerqJgk0dZqC42wstM9pEUQGtPmLcIYvg==" - }, - "node_modules/@jackallabs/jackal.js-protos/node_modules/long": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", - "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" - }, - "node_modules/@jackallabs/jackal.js-protos/node_modules/protobufjs": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.3.0.tgz", - "integrity": "sha512-YWD03n3shzV9ImZRX3ccbjqLxj7NokGN0V/ESiBV5xWqrommYHYiihuIyavq03pWSGqlyvYUFmfoMKd+1rPA/g==", + "node_modules/@jackallabs/protobufjs": { + "version": "7.4.0-patch.1", + "resolved": "https://registry.npmjs.org/@jackallabs/protobufjs/-/protobufjs-7.4.0-patch.1.tgz", + "integrity": "sha512-ACM190ahvbOaYuXwaHN+Hj6Yitfb0eFAfe1GkBuptE3c7KWW9K4ccGKZ39ww2AsYb5TBEvMWJyUMVFrP1m60KA==", "hasInstallScript": true, + "license": "BSD-3-Clause", "dependencies": { "@protobufjs/aspromise": "^1.1.2", "@protobufjs/base64": "^1.1.2", @@ -1133,64 +1132,17 @@ "node": ">=12.0.0" } }, - "node_modules/@jest/schemas": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", - "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", - "dev": true, - "dependencies": { - "@sinclair/typebox": "^0.27.8" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } + "node_modules/@jackallabs/protobufjs/node_modules/long": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/long/-/long-5.3.1.tgz", + "integrity": "sha512-ka87Jz3gcx/I7Hal94xaN2tZEOPoUOEVftkQqZx2EeQRN7LGdfLlI3FvZ+7WDplm+vK2Urx9ULrvSowtdCieng==", + "license": "Apache-2.0" }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true }, "node_modules/@karnthis/plzsu": { "version": "1.0.0", @@ -1333,31 +1285,55 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/@mswjs/interceptors": { + "version": "0.37.6", + "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.37.6.tgz", + "integrity": "sha512-wK+5pLK5XFmgtH3aQ2YVvA3HohS3xqV/OxuVOdNx9Wpnz7VE/fnC+e1A7ln6LFYeck7gOJ/dsZV6OLplOtAJ2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/logger": "^0.3.0", + "@open-draft/until": "^2.0.0", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "strict-event-emitter": "^0.5.1" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/@noble/ciphers": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-0.4.1.tgz", - "integrity": "sha512-QCOA9cgf3Rc33owG0AYBB9wszz+Ul2kramWN8tXG44Gyciud/tbkEqvxRF/IpqQaBpRBNi9f4jdNxqB2CQCIXg==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.0.0.tgz", + "integrity": "sha512-wH5EHOmLi0rEazphPbecAzmjd12I6/Yv/SiHdkA9LSycsQk7RuuTp7am5/o62qYr0RScE7Pc9icXGBbsr6cesA==", + "engines": { + "node": "^14.21.3 || >=16" + }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/curves": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz", - "integrity": "sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@noble/curves/-/curves-1.6.0.tgz", + "integrity": "sha512-TlaHRXDehJuRNR9TfZDNQ45mMEd5dwUwmicsafcIX4SsNiqnCHKjE/1alYPd/lDRVhxdhUAlv8uEhMCI5zjIJQ==", "dependencies": { - "@noble/hashes": "1.4.0" + "@noble/hashes": "1.5.0" + }, + "engines": { + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/@noble/hashes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", - "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.5.0.tgz", + "integrity": "sha512-1j6kQFb7QRru7eKN3ZDvRcP13rugwdxZqCjbiAVZfIJwgj2A65UmT4TgARXGlXgnRkORLTDTrO19ZErt7+QXgA==", "engines": { - "node": ">= 16" + "node": "^14.21.3 || >=16" }, "funding": { "url": "https://paulmillr.com/funding/" @@ -1398,6 +1374,38 @@ "node": ">= 8" } }, + "node_modules/@open-draft/deferred-promise": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz", + "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@open-draft/logger": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz", + "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-node-process": "^1.2.0", + "outvariant": "^1.4.0" + } + }, + "node_modules/@open-draft/until": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz", + "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.28", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", + "dev": true, + "license": "MIT" + }, "node_modules/@protobufjs/aspromise": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", @@ -1481,6 +1489,8 @@ "version": "5.0.5", "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", + "dev": true, + "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "estree-walker": "^2.0.2", @@ -1528,6 +1538,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", @@ -1546,192 +1557,266 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", - "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.34.9.tgz", + "integrity": "sha512-qZdlImWXur0CFakn2BJ2znJOdqYZKiedEPEVNTBrpfPjc/YuTGcaYZcdmNFTkUj3DU0ZM/AElcM8Ybww3xVLzA==", "cpu": [ "arm" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", - "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.34.9.tgz", + "integrity": "sha512-4KW7P53h6HtJf5Y608T1ISKvNIYLWRKMvfnG0c44M6In4DQVU58HZFEVhWINDZKp7FZps98G3gxwC1sb0wXUUg==", "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", - "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.34.9.tgz", + "integrity": "sha512-0CY3/K54slrzLDjOA7TOjN1NuLKERBgk9nY5V34mhmuu673YNb+7ghaDUs6N0ujXR7fz5XaS5Aa6d2TNxZd0OQ==", "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", - "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.34.9.tgz", + "integrity": "sha512-eOojSEAi/acnsJVYRxnMkPFqcxSMFfrw7r2iD9Q32SGkb/Q9FpUY1UlAu1DH9T7j++gZ0lHjnm4OyH2vCI7l7Q==", "cpu": [ "x64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.34.9.tgz", + "integrity": "sha512-2lzjQPJbN5UnHm7bHIUKFMulGTQwdvOkouJDpPysJS+QFBGDJqcfh+CxxtG23Ik/9tEvnebQiylYoazFMAgrYw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.34.9.tgz", + "integrity": "sha512-SLl0hi2Ah2H7xQYd6Qaiu01kFPzQ+hqvdYSoOtHYg/zCIFs6t8sV95kaoqjzjFwuYQLtOI0RZre/Ke0nPaQV+g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", - "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.34.9.tgz", + "integrity": "sha512-88I+D3TeKItrw+Y/2ud4Tw0+3CxQ2kLgu3QvrogZ0OfkmX/DEppehus7L3TS2Q4lpB+hYyxhkQiYPJ6Mf5/dPg==", "cpu": [ "arm" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", - "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.34.9.tgz", + "integrity": "sha512-3qyfWljSFHi9zH0KgtEPG4cBXHDFhwD8kwg6xLfHQ0IWuH9crp005GfoUUh/6w9/FWGBwEHg3lxK1iHRN1MFlA==", "cpu": [ "arm" ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.34.9.tgz", + "integrity": "sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", - "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.34.9.tgz", + "integrity": "sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==", "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", - "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.34.9.tgz", + "integrity": "sha512-dRAgTfDsn0TE0HI6cmo13hemKpVHOEyeciGtvlBTkpx/F65kTvShtY/EVyZEIfxFkV5JJTuQ9tP5HGBS0hfxIg==", "cpu": [ - "arm64" + "loong64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", - "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.34.9.tgz", + "integrity": "sha512-PHcNOAEhkoMSQtMf+rJofwisZqaU8iQ8EaSps58f5HYll9EAY5BSErCZ8qBDMVbq88h4UxaNPlbrKqfWP8RfJA==", "cpu": [ "ppc64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", - "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.34.9.tgz", + "integrity": "sha512-Z2i0Uy5G96KBYKjeQFKbbsB54xFOL5/y1P5wNBsbXB8yE+At3oh0DVMjQVzCJRJSfReiB2tX8T6HUFZ2k8iaKg==", "cpu": [ "riscv64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", - "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.34.9.tgz", + "integrity": "sha512-U+5SwTMoeYXoDzJX5dhDTxRltSrIax8KWwfaaYcynuJw8mT33W7oOgz0a+AaXtGuvhzTr2tVKh5UO8GVANTxyQ==", "cpu": [ "s390x" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", - "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.34.9.tgz", + "integrity": "sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==", "cpu": [ "x64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", - "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.34.9.tgz", + "integrity": "sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==", "cpu": [ "x64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", - "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.34.9.tgz", + "integrity": "sha512-z4mQK9dAN6byRA/vsSgQiPeuO63wdiDxZ9yg9iyX2QTzKuQM7T4xlBoeUP/J8uiFkqxkcWndWi+W7bXdPbt27Q==", "cpu": [ "arm64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", - "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.34.9.tgz", + "integrity": "sha512-KB48mPtaoHy1AwDNkAJfHXvHp24H0ryZog28spEs0V48l3H1fr4i37tiyHsgKZJnCmvxsbATdZGBpbmxTE3a9w==", "cpu": [ "ia32" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", - "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.34.9.tgz", + "integrity": "sha512-AyleYRPU7+rgkMWbEh71fQlrzRfeP6SyMnRf9XX4fCdDPAJumdSBqYEcWPMzVQ4ScAl7E4oFfK0GUVn77xSwbw==", "cpu": [ "x64" ], + "dev": true, + "license": "MIT", "optional": true, "os": [ "win32" @@ -1876,11 +1961,39 @@ "sprintf-js": "~1.0.2" } }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", - "dev": true + "node_modules/@testing-library/dom": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.0.tgz", + "integrity": "sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.3.0", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.6.1", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.6.1.tgz", + "integrity": "sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } }, "node_modules/@types/argparse": { "version": "1.0.38", @@ -1888,31 +2001,26 @@ "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", "dev": true }, - "node_modules/@types/chai": { - "version": "4.3.16", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.16.tgz", - "integrity": "sha512-PatH4iOdyh3MyWtmHVFXLWCCIhUbopaltqddG9BzB+gMIzee2MJrvd+jouii9Z3wzQJruGWAm7WOMjgfG8hQlQ==", - "dev": true + "node_modules/@types/aria-query": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", + "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", + "dev": true, + "license": "MIT" }, - "node_modules/@types/chai-subset": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.5.tgz", - "integrity": "sha512-c2mPnw+xHtXDoHmdtcCXGwyLMiauiAyxWMzhGpqHC4nqI/Y5G2XhTampslK2rb59kpcuHon03UH8W6iYUzw88A==", + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", "dev": true, - "dependencies": { - "@types/chai": "*" - } + "license": "MIT" }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/json-schema": { "version": "7.0.15", @@ -1926,11 +2034,11 @@ "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" }, "node_modules/@types/node": { - "version": "20.12.12", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", - "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", + "version": "22.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz", + "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==", "dependencies": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.8" } }, "node_modules/@types/semver": { @@ -1939,6 +2047,20 @@ "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, + "node_modules/@types/statuses": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.5.tgz", + "integrity": "sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz", + "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==", + "dev": true, + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "6.21.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz", @@ -2135,121 +2257,197 @@ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", "dev": true }, - "node_modules/@vitest/coverage-v8": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-0.34.6.tgz", - "integrity": "sha512-fivy/OK2d/EsJFoEoxHFEnNGTg+MmdZBAVK9Ka4qhXR2K3J0DS08vcGVwzDtXSuUMabLv4KtPcpSKkcMXFDViw==", + "node_modules/@vitest/browser": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/browser/-/browser-3.0.7.tgz", + "integrity": "sha512-TDzZtnbe37KZLSLhvlO1pUkeRSRzW3rOhPLsshX8agGoPELMlG7EvS4z9GfsdaCxsP7oWLBJpFjNJwLS458Bzg==", "dev": true, + "license": "MIT", "dependencies": { - "@ampproject/remapping": "^2.2.1", - "@bcoe/v8-coverage": "^0.2.3", - "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.1", - "istanbul-lib-source-maps": "^4.0.1", - "istanbul-reports": "^3.1.5", - "magic-string": "^0.30.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3", - "test-exclude": "^6.0.0", - "v8-to-istanbul": "^9.1.0" + "@testing-library/dom": "^10.4.0", + "@testing-library/user-event": "^14.6.1", + "@vitest/mocker": "3.0.7", + "@vitest/utils": "3.0.7", + "magic-string": "^0.30.17", + "msw": "^2.7.3", + "sirv": "^3.0.1", + "tinyrainbow": "^2.0.0", + "ws": "^8.18.1" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "vitest": ">=0.32.0 <1" + "playwright": "*", + "vitest": "3.0.7", + "webdriverio": "^7.0.0 || ^8.0.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, + "node_modules/@vitest/browser/node_modules/ws": { + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/@vitest/expect": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.6.tgz", - "integrity": "sha512-QUzKpUQRc1qC7qdGo7rMK3AkETI7w18gTCUrsNnyjjJKYiuUB9+TQK3QnR1unhCnWRC0AbKv2omLGQDF/mIjOw==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-3.0.7.tgz", + "integrity": "sha512-QP25f+YJhzPfHrHfYHtvRn+uvkCFCqFtW9CktfBxmB+25QqWsx7VB2As6f4GmwllHLDhXNHvqedwhvMmSnNmjw==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/spy": "0.34.6", - "@vitest/utils": "0.34.6", - "chai": "^4.3.10" + "@vitest/spy": "3.0.7", + "@vitest/utils": "3.0.7", + "chai": "^5.2.0", + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/runner": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.6.tgz", - "integrity": "sha512-1CUQgtJSLF47NnhN+F9X2ycxUP0kLHQ/JWvNHbeBfwW8CzEGgeskzNnHDyv1ieKTltuR6sdIHV+nmR6kPxQqzQ==", + "node_modules/@vitest/mocker": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-3.0.7.tgz", + "integrity": "sha512-qui+3BLz9Eonx4EAuR/i+QlCX6AUZ35taDQgwGkK/Tw6/WgwodSrjN1X2xf69IA/643ZX5zNKIn2svvtZDrs4w==", "dev": true, + "license": "MIT", "dependencies": { - "@vitest/utils": "0.34.6", - "p-limit": "^4.0.0", - "pathe": "^1.1.1" + "@vitest/spy": "3.0.7", + "estree-walker": "^3.0.3", + "magic-string": "^0.30.17" }, "funding": { "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "msw": "^2.4.9", + "vite": "^5.0.0 || ^6.0.0" + }, + "peerDependenciesMeta": { + "msw": { + "optional": true + }, + "vite": { + "optional": true + } } }, - "node_modules/@vitest/runner/node_modules/p-limit": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", - "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, + "license": "MIT", "dependencies": { - "yocto-queue": "^1.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "@types/estree": "^1.0.0" + } + }, + "node_modules/@vitest/pretty-format": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-3.0.7.tgz", + "integrity": "sha512-CiRY0BViD/V8uwuEzz9Yapyao+M9M008/9oMOSQydwbwb+CMokEq3XVaF3XK/VWaOK0Jm9z7ENhybg70Gtxsmg==", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, - "node_modules/@vitest/runner/node_modules/yocto-queue": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", - "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "node_modules/@vitest/runner": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-3.0.7.tgz", + "integrity": "sha512-WeEl38Z0S2ZcuRTeyYqaZtm4e26tq6ZFqh5y8YD9YxfWuu0OFiGFUbnxNynwLjNRHPsXyee2M9tV7YxOTPZl2g==", "dev": true, - "engines": { - "node": ">=12.20" + "license": "MIT", + "dependencies": { + "@vitest/utils": "3.0.7", + "pathe": "^2.0.3" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/runner/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, "node_modules/@vitest/snapshot": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.6.tgz", - "integrity": "sha512-B3OZqYn6k4VaN011D+ve+AA4whM4QkcwcrwaKwAbyyvS/NB1hCWjFIBQxAQQSQir9/RtyAAGuq+4RJmbn2dH4w==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-3.0.7.tgz", + "integrity": "sha512-eqTUryJWQN0Rtf5yqCGTQWsCFOQe4eNz5Twsu21xYEcnFJtMU5XvmG0vgebhdLlrHQTSq5p8vWHJIeJQV8ovsA==", "dev": true, + "license": "MIT", "dependencies": { - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "pretty-format": "^29.5.0" + "@vitest/pretty-format": "3.0.7", + "magic-string": "^0.30.17", + "pathe": "^2.0.3" }, "funding": { "url": "https://opencollective.com/vitest" } }, + "node_modules/@vitest/snapshot/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, "node_modules/@vitest/spy": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.6.tgz", - "integrity": "sha512-xaCvneSaeBw/cz8ySmF7ZwGvL0lBjfvqc1LpQ/vcdHEvpLn3Ff1vAvjw+CoGn0802l++5L/pxb7whwcWAw+DUQ==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-3.0.7.tgz", + "integrity": "sha512-4T4WcsibB0B6hrKdAZTM37ekuyFZt2cGbEGd2+L0P8ov15J1/HUsUaqkXEQPNAWr4BtPPe1gI+FYfMHhEKfR8w==", "dev": true, + "license": "MIT", "dependencies": { - "tinyspy": "^2.1.1" + "tinyspy": "^3.0.2" }, "funding": { "url": "https://opencollective.com/vitest" } }, "node_modules/@vitest/utils": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.6.tgz", - "integrity": "sha512-IG5aDD8S6zlvloDsnzHw0Ut5xczlF+kv2BOTo+iXfPr54Yhi5qbVOgGB1hZaVq4iJ4C/MZ2J0y15IlsV/ZcI0A==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-3.0.7.tgz", + "integrity": "sha512-xePVpCRfooFX3rANQjwoditoXgWb1MaFbzmGuPP59MK6i13mrnDw/yEIyJudLeW6/38mCNcwCiJIGmpDPibAIg==", "dev": true, + "license": "MIT", "dependencies": { - "diff-sequences": "^29.4.3", - "loupe": "^2.3.6", - "pretty-format": "^29.5.0" + "@vitest/pretty-format": "3.0.7", + "loupe": "^3.1.3", + "tinyrainbow": "^2.0.0" }, "funding": { "url": "https://opencollective.com/vitest" @@ -2365,15 +2563,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", - "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2429,6 +2618,35 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", @@ -2465,6 +2683,16 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "dequal": "^2.0.3" + } + }, "node_modules/array-union": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", @@ -2493,6 +2721,8 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", + "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.2", "is-nan": "^1.3.2", @@ -2502,12 +2732,13 @@ } }, "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz", + "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==", "dev": true, + "license": "MIT", "engines": { - "node": "*" + "node": ">=12" } }, "node_modules/asynckit": { @@ -2519,6 +2750,8 @@ "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dev": true, + "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, @@ -2530,9 +2763,10 @@ } }, "node_modules/axios": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.4.tgz", - "integrity": "sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==", + "version": "1.8.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz", + "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==", + "license": "MIT", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -2573,6 +2807,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/bip39/-/bip39-3.1.0.tgz", "integrity": "sha512-c9kiwdk45Do5GL0vJMe7tS95VjCii65mYAH7DfWl3uW8AVzXKQVUm64i3hzVybBDMp9r7j9iNxR85+ul8MdN/A==", + "license": "ISC", "dependencies": { "@noble/hashes": "^1.2.0" } @@ -2612,6 +2847,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", + "dev": true, + "license": "MIT", "dependencies": { "resolve": "^1.17.0" } @@ -2620,6 +2857,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "license": "MIT", "dependencies": { "buffer-xor": "^1.0.3", "cipher-base": "^1.0.0", @@ -2633,6 +2871,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "license": "MIT", "dependencies": { "browserify-aes": "^1.0.4", "browserify-des": "^1.0.0", @@ -2683,6 +2923,8 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "license": "MIT", "dependencies": { "pako": "~1.0.5" } @@ -2691,6 +2933,7 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, "funding": [ { "type": "github", @@ -2705,35 +2948,12 @@ "url": "https://feross.org/support" } ], + "license": "MIT", "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, - "node_modules/buffer-polyfill": { - "name": "buffer", - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/buffer-xor": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", @@ -2742,27 +2962,62 @@ "node_modules/builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", + "dev": true, + "license": "MIT" }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", + "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", + "dev": true, + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "set-function-length": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" @@ -2792,21 +3047,20 @@ } }, "node_modules/chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-5.2.0.tgz", + "integrity": "sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==", "dev": true, + "license": "MIT", "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.3", - "deep-eql": "^4.1.3", - "get-func-name": "^2.0.2", - "loupe": "^2.3.6", - "pathval": "^1.1.1", - "type-detect": "^4.0.8" + "assertion-error": "^2.0.1", + "check-error": "^2.1.1", + "deep-eql": "^5.0.1", + "loupe": "^3.1.0", + "pathval": "^2.0.0" }, "engines": { - "node": ">=4" + "node": ">=12" } }, "node_modules/chalk": { @@ -2826,15 +3080,13 @@ } }, "node_modules/check-error": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", - "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-2.1.1.tgz", + "integrity": "sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==", "dev": true, - "dependencies": { - "get-func-name": "^2.0.2" - }, + "license": "MIT", "engines": { - "node": "*" + "node": ">= 16" } }, "node_modules/cipher-base": { @@ -2842,8 +3094,51 @@ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, + "node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/color-convert": { @@ -2908,18 +3203,25 @@ "node_modules/console-browserify": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==" + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true }, "node_modules/constants-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==" + "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", + "dev": true, + "license": "MIT" }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "node_modules/cookie": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, "node_modules/core-util-is": { "version": "1.0.3", @@ -2939,15 +3241,19 @@ "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "elliptic": "^6.5.3" } }, "node_modules/create-ecdh/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "dev": true, + "license": "MIT" }, "node_modules/create-hash": { "version": "1.2.0", @@ -2977,12 +3283,14 @@ "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "dependencies": { "path-key": "^3.1.0", @@ -2994,24 +3302,30 @@ } }, "node_modules/crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", + "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", + "dev": true, + "license": "MIT", "dependencies": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" }, "engines": { - "node": "*" + "node": ">= 0.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/de-indent": { @@ -3021,12 +3335,13 @@ "dev": true }, "node_modules/debug": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", - "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3038,13 +3353,11 @@ } }, "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-5.0.2.tgz", + "integrity": "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==", "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, + "license": "MIT", "engines": { "node": ">=6" } @@ -3095,6 +3408,16 @@ "node": ">=0.4.0" } }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/des.js": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", @@ -3115,19 +3438,12 @@ "node": ">=0.10" } }, - "node_modules/diff-sequences": { - "version": "29.6.3", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", - "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", - "dev": true, - "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" - } - }, "node_modules/diffie-hellman": { "version": "5.0.3", "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "miller-rabin": "^4.0.0", @@ -3135,9 +3451,11 @@ } }, "node_modules/diffie-hellman/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "dev": true, + "license": "MIT" }, "node_modules/dir-glob": { "version": "3.0.1", @@ -3163,10 +3481,19 @@ "node": ">=6.0.0" } }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", + "dev": true, + "license": "MIT" + }, "node_modules/domain-browser": { - "version": "4.23.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.23.0.tgz", - "integrity": "sha512-ArzcM/II1wCCujdCNyQjXrAFwS4mrLh4C7DZWlaI8mdh7h3BfKdNd3bKXITfl2PT9FtfQqaGvhi1vPRQPimjGA==", + "version": "4.22.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-4.22.0.tgz", + "integrity": "sha512-IGBwjF7tNk3cwypFNH/7bfzBcgSCbaMOD3GsaY1AU/JRrnHnYgEM0+9kQt52iZxjNsjBtJYtao146V+f8jFZNw==", + "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -3182,23 +3509,41 @@ "detect-libc": "^1.0.3" } }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/eciesjs": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.6.tgz", - "integrity": "sha512-t0qLzGVKeATAA6X19hIeToxBVG8yvn/be/4XyJvTCBD53m2CK22cgzk+WW+pNYjEw5FGWZLNFoJte8lyZS/A/w==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/eciesjs/-/eciesjs-0.4.11.tgz", + "integrity": "sha512-SmUG449n1w1YGvJD9R30tBGvpxTxA0cnn0rfvpFIBvmezfIhagLjsH2JG8HBHOLS8slXsPh48II7IDUTH/J3Mg==", "dependencies": { - "@noble/ciphers": "^0.4.0", - "@noble/curves": "^1.2.0", - "@noble/hashes": "^1.3.2" + "@ecies/ciphers": "^0.2.1", + "@noble/ciphers": "^1.0.0", + "@noble/curves": "^1.6.0", + "@noble/hashes": "^1.5.0" }, "engines": { - "node": ">=16.0.0" + "bun": ">=1", + "deno": ">=2", + "node": ">=16" } }, "node_modules/elliptic": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", - "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dependencies": { "bn.js": "^4.11.9", "brorand": "^1.1.0", @@ -3214,6 +3559,13 @@ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", @@ -3227,12 +3579,10 @@ } }, "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", "engines": { "node": ">= 0.4" } @@ -3245,41 +3595,75 @@ "node": ">= 0.4" } }, + "node_modules/es-module-lexer": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.6.0.tgz", + "integrity": "sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/esbuild": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", - "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "version": "0.25.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.0.tgz", + "integrity": "sha512-BXq5mqc8ltbaN34cDqWuYKyNhX8D/Z0J1xdtdQ8UcIIIyJyz+ZMKUt58tF3SrZ85jcfN/PZYhjR5uDQAYNVbuw==", + "dev": true, "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.5", - "@esbuild/android-arm": "0.21.5", - "@esbuild/android-arm64": "0.21.5", - "@esbuild/android-x64": "0.21.5", - "@esbuild/darwin-arm64": "0.21.5", - "@esbuild/darwin-x64": "0.21.5", - "@esbuild/freebsd-arm64": "0.21.5", - "@esbuild/freebsd-x64": "0.21.5", - "@esbuild/linux-arm": "0.21.5", - "@esbuild/linux-arm64": "0.21.5", - "@esbuild/linux-ia32": "0.21.5", - "@esbuild/linux-loong64": "0.21.5", - "@esbuild/linux-mips64el": "0.21.5", - "@esbuild/linux-ppc64": "0.21.5", - "@esbuild/linux-riscv64": "0.21.5", - "@esbuild/linux-s390x": "0.21.5", - "@esbuild/linux-x64": "0.21.5", - "@esbuild/netbsd-x64": "0.21.5", - "@esbuild/openbsd-x64": "0.21.5", - "@esbuild/sunos-x64": "0.21.5", - "@esbuild/win32-arm64": "0.21.5", - "@esbuild/win32-ia32": "0.21.5", - "@esbuild/win32-x64": "0.21.5" + "@esbuild/aix-ppc64": "0.25.0", + "@esbuild/android-arm": "0.25.0", + "@esbuild/android-arm64": "0.25.0", + "@esbuild/android-x64": "0.25.0", + "@esbuild/darwin-arm64": "0.25.0", + "@esbuild/darwin-x64": "0.25.0", + "@esbuild/freebsd-arm64": "0.25.0", + "@esbuild/freebsd-x64": "0.25.0", + "@esbuild/linux-arm": "0.25.0", + "@esbuild/linux-arm64": "0.25.0", + "@esbuild/linux-ia32": "0.25.0", + "@esbuild/linux-loong64": "0.25.0", + "@esbuild/linux-mips64el": "0.25.0", + "@esbuild/linux-ppc64": "0.25.0", + "@esbuild/linux-riscv64": "0.25.0", + "@esbuild/linux-s390x": "0.25.0", + "@esbuild/linux-x64": "0.25.0", + "@esbuild/netbsd-arm64": "0.25.0", + "@esbuild/netbsd-x64": "0.25.0", + "@esbuild/openbsd-arm64": "0.25.0", + "@esbuild/openbsd-x64": "0.25.0", + "@esbuild/sunos-x64": "0.25.0", + "@esbuild/win32-arm64": "0.25.0", + "@esbuild/win32-ia32": "0.25.0", + "@esbuild/win32-x64": "0.25.0" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" } }, "node_modules/escape-string-regexp": { @@ -3464,7 +3848,8 @@ "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true }, "node_modules/esutils": { "version": "2.0.3", @@ -3479,6 +3864,8 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -3492,6 +3879,16 @@ "safe-buffer": "^5.1.1" } }, + "node_modules/expect-type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.2.0.tgz", + "integrity": "sha512-80F22aiJ3GLyVnS/B3HzgR6RelZVumzj9jkL0Rhz4h0xYbNW9PjlQz5h3J/SShErbXBc295vseR4/MIbVmUbeA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -3580,6 +3977,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -3675,6 +4073,7 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -3688,29 +4087,38 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-func-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", - "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, + "license": "ISC", "engines": { - "node": "*" + "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "dev": true, + "license": "MIT", "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -3719,6 +4127,20 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/glob": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", @@ -3819,11 +4241,12 @@ "dev": true }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3841,6 +4264,16 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, + "node_modules/graphql": { + "version": "16.10.0", + "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.10.0.tgz", + "integrity": "sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" + } + }, "node_modules/grpc-web": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/grpc-web/-/grpc-web-1.5.0.tgz", @@ -3866,21 +4299,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -3892,6 +4316,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "dev": true, + "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, @@ -3927,6 +4353,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, "dependencies": { "function-bind": "^1.1.2" }, @@ -3943,6 +4370,13 @@ "he": "bin/he" } }, + "node_modules/headers-polyfill": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.3.tgz", + "integrity": "sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ==", + "dev": true, + "license": "MIT" + }, "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -3953,21 +4387,18 @@ "minimalistic-crypto-utils": "^1.0.1" } }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true - }, "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==" + "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", + "dev": true, + "license": "MIT" }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, "funding": [ { "type": "github", @@ -3981,7 +4412,8 @@ "type": "consulting", "url": "https://feross.org/support" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/ignore": { "version": "5.3.1", @@ -4042,12 +4474,14 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", + "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", + "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.2", + "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4071,6 +4505,7 @@ "version": "2.13.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, "dependencies": { "hasown": "^2.0.0" }, @@ -4087,12 +4522,27 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", + "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", + "dev": true, + "license": "MIT", "dependencies": { - "has-tostringtag": "^1.0.0" + "call-bound": "^1.0.3", + "get-proto": "^1.0.0", + "has-tostringtag": "^1.0.2", + "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" @@ -4117,6 +4567,8 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", "integrity": "sha512-E+zBKpQ2t6MEo1VsonYmluk9NxGrbzpeeLC2xIViuO2EjU2xsXsBPwTr3Ykv9l08UYEVEdWeRZNouaZqF6RN0w==", + "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3" @@ -4128,6 +4580,13 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-node-process": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz", + "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==", + "dev": true, + "license": "MIT" + }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -4155,12 +4614,33 @@ "@types/estree": "*" } }, + "node_modules/is-regex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", + "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "gopd": "^1.2.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-typed-array": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz", - "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", + "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", + "dev": true, + "license": "MIT", "dependencies": { - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" @@ -4184,6 +4664,8 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/isomorphic-timers-promises/-/isomorphic-timers-promises-1.0.1.tgz", "integrity": "sha512-u4sej9B1LPSxTGKB/HiuzvEQnXH0ECYkSVQU39koSwmFAxhlEAFl9RdTvLv4TOTQUgBS5O3O5fwUxk6byBZ+IQ==", + "dev": true, + "license": "MIT", "engines": { "node": ">=10" } @@ -4196,56 +4678,6 @@ "ws": "*" } }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", - "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", - "dev": true, - "dependencies": { - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0", - "source-map": "^0.6.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-reports": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", - "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", - "dev": true, - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", @@ -4257,6 +4689,13 @@ "resolved": "https://registry.npmjs.org/js-sha3/-/js-sha3-0.9.3.tgz", "integrity": "sha512-BcJPCQeLg6WjEx3FE591wVAevlli8lxsxm9/FzV4HXkV49TmBH38Yvrpce6fjbADGMKFrBMGTqrVz3qPIZ88Gg==" }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -4333,7 +4772,8 @@ "node_modules/libsodium": { "version": "0.7.15", "resolved": "https://registry.npmjs.org/libsodium/-/libsodium-0.7.15.tgz", - "integrity": "sha512-sZwRknt/tUpE2AwzHq3jEyUU5uvIZHtSssktXq7owd++3CSgn8RGrv6UZJJBpP7+iBghBqe7Z06/2M31rI2NKw==" + "integrity": "sha512-sZwRknt/tUpE2AwzHq3jEyUU5uvIZHtSssktXq7owd++3CSgn8RGrv6UZJJBpP7+iBghBqe7Z06/2M31rI2NKw==", + "license": "ISC" }, "node_modules/libsodium-sumo": { "version": "0.7.13", @@ -4344,6 +4784,7 @@ "version": "0.7.15", "resolved": "https://registry.npmjs.org/libsodium-wrappers/-/libsodium-wrappers-0.7.15.tgz", "integrity": "sha512-E4anqJQwcfiC6+Yrl01C1m8p99wEhLmJSs0VQqST66SbQXXBoaJY0pF4BNjRYa/sOQAxx6lXAaAFIlx+15tXJQ==", + "license": "ISC", "dependencies": { "libsodium": "^0.7.15" } @@ -4356,22 +4797,11 @@ "libsodium-sumo": "^0.7.13" } }, - "node_modules/local-pkg": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", - "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -4400,13 +4830,11 @@ "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" }, "node_modules/loupe": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", - "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-3.1.3.tgz", + "integrity": "sha512-kkIp7XSkP78ZxJEsSxW3712C6teJVoeHHwgo9zJ380de7IYyJ2ISlxojcH2pC5OFLewESmnRi/+XCDIEEVyoug==", "dev": true, - "dependencies": { - "get-func-name": "^2.0.1" - } + "license": "MIT" }, "node_modules/lru-cache": { "version": "6.0.0", @@ -4426,27 +4854,24 @@ "integrity": "sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==", "dev": true }, - "node_modules/magic-string": { - "version": "0.30.11", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.11.tgz", - "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "dev": true, + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" } }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, + "license": "MIT", "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/marked": { @@ -4461,6 +4886,16 @@ "node": ">= 12" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/md5.js": { "version": "1.3.5", "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", @@ -4497,6 +4932,8 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.0.0", "brorand": "^1.0.1" @@ -4506,9 +4943,11 @@ } }, "node_modules/miller-rabin/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "dev": true, + "license": "MIT" }, "node_modules/mime-db": { "version": "1.52.0", @@ -4566,11 +5005,80 @@ "ufo": "^1.5.3" } }, + "node_modules/mrmime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz", + "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/msw": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/msw/-/msw-2.7.3.tgz", + "integrity": "sha512-+mycXv8l2fEAjFZ5sjrtjJDmm2ceKGjrNbBr1durRg6VkU9fNUE/gsmQ51hWbHqs+l35W1iM+ZsmOD9Fd6lspw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "@bundled-es-modules/cookie": "^2.0.1", + "@bundled-es-modules/statuses": "^1.0.1", + "@bundled-es-modules/tough-cookie": "^0.1.6", + "@inquirer/confirm": "^5.0.0", + "@mswjs/interceptors": "^0.37.0", + "@open-draft/deferred-promise": "^2.2.0", + "@open-draft/until": "^2.1.0", + "@types/cookie": "^0.6.0", + "@types/statuses": "^2.0.4", + "graphql": "^16.8.1", + "headers-polyfill": "^4.0.2", + "is-node-process": "^1.2.0", + "outvariant": "^1.4.3", + "path-to-regexp": "^6.3.0", + "picocolors": "^1.1.1", + "strict-event-emitter": "^0.5.1", + "type-fest": "^4.26.1", + "yargs": "^17.7.2" + }, + "bin": { + "msw": "cli/index.js" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mswjs" + }, + "peerDependencies": { + "typescript": ">= 4.8.x" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/msw/node_modules/type-fest": { + "version": "4.36.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.36.0.tgz", + "integrity": "sha512-3T/PUdKTCnkUmhQU6FFJEHsLwadsRegktX3TNHk+2JJB9HlA8gp1/VXblXVDI93kSnXF2rdPx0GMbHtJIV2LPg==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/muggle-string": { "version": "0.4.1", @@ -4578,16 +5086,28 @@ "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", "dev": true }, + "node_modules/mute-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz", + "integrity": "sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -4602,9 +5122,11 @@ "dev": true }, "node_modules/node-stdlib-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/node-stdlib-browser/-/node-stdlib-browser-1.2.0.tgz", - "integrity": "sha512-VSjFxUhRhkyed8AtLwSCkMrJRfQ3e2lGtG3sP6FEgaLKBBbxM/dLfjRe1+iLhjvyLFW3tBQ8+c0pcOtXGbAZJg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-stdlib-browser/-/node-stdlib-browser-1.3.1.tgz", + "integrity": "sha512-X75ZN8DCLftGM5iKwoYLA3rjnrAEs97MkzvSd4q2746Tgpg8b8XWiBGiBG4ZpgcAqBgtgPHTiAc8ZMCvZuikDw==", + "dev": true, + "license": "MIT", "dependencies": { "assert": "^2.0.0", "browser-resolve": "^2.0.0", @@ -4613,8 +5135,8 @@ "console-browserify": "^1.1.0", "constants-browserify": "^1.0.0", "create-require": "^1.1.1", - "crypto-browserify": "^3.11.0", - "domain-browser": "^4.22.0", + "crypto-browserify": "^3.12.1", + "domain-browser": "4.22.0", "events": "^3.0.0", "https-browserify": "^1.0.0", "isomorphic-timers-promises": "^1.0.1", @@ -4630,7 +5152,7 @@ "string_decoder": "^1.0.0", "timers-browserify": "^2.0.4", "tty-browserify": "0.0.1", - "url": "^0.11.0", + "url": "^0.11.4", "util": "^0.12.4", "vm-browserify": "^1.0.1" }, @@ -4641,12 +5163,16 @@ "node_modules/node-stdlib-browser/node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true, + "license": "MIT" }, "node_modules/node-stdlib-browser/node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -4657,9 +5183,14 @@ } }, "node_modules/object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -4668,6 +5199,8 @@ "version": "1.1.6", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dev": true, + "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1" @@ -4688,13 +5221,17 @@ } }, "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", + "version": "4.1.7", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", + "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", + "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", + "es-object-atoms": "^1.0.0", + "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { @@ -4733,12 +5270,22 @@ "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==" + "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/outvariant": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz", + "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==", + "dev": true, + "license": "MIT" }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -4753,6 +5300,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -4766,7 +5314,9 @@ "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true, + "license": "(MIT AND Zlib)" }, "node_modules/parent-module": { "version": "1.0.1", @@ -4799,12 +5349,14 @@ "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, "engines": { "node": ">=8" } @@ -4830,7 +5382,15 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", @@ -4848,12 +5408,13 @@ "dev": true }, "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-2.0.0.tgz", + "integrity": "sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==", "dev": true, + "license": "MIT", "engines": { - "node": "*" + "node": ">= 14.16" } }, "node_modules/pbkdf2": { @@ -4872,14 +5433,17 @@ } }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, "engines": { "node": ">=8.6" }, @@ -4891,6 +5455,8 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-5.0.0.tgz", "integrity": "sha512-NPE8TDbzl/3YQYY7CSS228s3g2ollTFnc+Qi3tqmqJp9Vg2ovUpixcJEo2HJScN2Ez+kEaal6y70c0ehqJBJeA==", + "dev": true, + "license": "MIT", "dependencies": { "find-up": "^5.0.0" }, @@ -4910,17 +5476,20 @@ } }, "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", + "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", + "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", + "dev": true, "funding": [ { "type": "opencollective", @@ -4935,9 +5504,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "nanoid": "^3.3.8", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -4954,17 +5524,18 @@ } }, "node_modules/pretty-format": { - "version": "29.7.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", - "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jest/schemas": "^29.6.3", + "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", - "react-is": "^18.0.0" + "react-is": "^17.0.1" }, "engines": { - "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { @@ -4972,6 +5543,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -4983,6 +5555,8 @@ "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6.0" } @@ -5022,10 +5596,25 @@ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, + "node_modules/psl": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dev": true, + "license": "MIT", + "dependencies": { + "punycode": "^2.3.1" + }, + "funding": { + "url": "https://github.com/sponsors/lupomontero" + } + }, "node_modules/public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "license": "MIT", "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", @@ -5036,9 +5625,11 @@ } }, "node_modules/public-encrypt/node_modules/bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==" + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", + "dev": true, + "license": "MIT" }, "node_modules/punycode": { "version": "2.3.1", @@ -5050,11 +5641,13 @@ } }, "node_modules/qs": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", - "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -5067,10 +5660,18 @@ "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", + "dev": true, "engines": { "node": ">=0.4.x" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true, + "license": "MIT" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -5103,16 +5704,19 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "license": "MIT", "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" } }, "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true, + "license": "MIT" }, "node_modules/readable-stream": { "version": "2.3.8", @@ -5138,6 +5742,23 @@ "resolved": "https://registry.npmjs.org/readonly-date/-/readonly-date-1.0.0.tgz", "integrity": "sha512-tMKIV7hlk0h4mO3JTmmVuIlJVXjKk3Sep9Bf5OH0O+758ruuVkUy2J9SttDLm91IEX/WHlXPSpxMGjPj4beMIQ==" }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "dev": true, + "license": "MIT" + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -5147,10 +5768,18 @@ "node": ">=0.10.0" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "dev": true, + "license": "MIT" + }, "node_modules/resolve": { "version": "1.22.8", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", @@ -5249,11 +5878,13 @@ } }, "node_modules/rollup": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", - "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", + "version": "4.34.9", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.34.9.tgz", + "integrity": "sha512-nF5XYqWWp9hx/LrpC8sZvvvmq0TeTjQgaZHYmAgwysT9nh8sWnZhBnM8ZyVbbJFIQBLwHDNoMqsBZBbUo4U8sQ==", + "dev": true, + "license": "MIT", "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.6" }, "bin": { "rollup": "dist/bin/rollup" @@ -5263,22 +5894,25 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.22.4", - "@rollup/rollup-android-arm64": "4.22.4", - "@rollup/rollup-darwin-arm64": "4.22.4", - "@rollup/rollup-darwin-x64": "4.22.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", - "@rollup/rollup-linux-arm-musleabihf": "4.22.4", - "@rollup/rollup-linux-arm64-gnu": "4.22.4", - "@rollup/rollup-linux-arm64-musl": "4.22.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", - "@rollup/rollup-linux-riscv64-gnu": "4.22.4", - "@rollup/rollup-linux-s390x-gnu": "4.22.4", - "@rollup/rollup-linux-x64-gnu": "4.22.4", - "@rollup/rollup-linux-x64-musl": "4.22.4", - "@rollup/rollup-win32-arm64-msvc": "4.22.4", - "@rollup/rollup-win32-ia32-msvc": "4.22.4", - "@rollup/rollup-win32-x64-msvc": "4.22.4", + "@rollup/rollup-android-arm-eabi": "4.34.9", + "@rollup/rollup-android-arm64": "4.34.9", + "@rollup/rollup-darwin-arm64": "4.34.9", + "@rollup/rollup-darwin-x64": "4.34.9", + "@rollup/rollup-freebsd-arm64": "4.34.9", + "@rollup/rollup-freebsd-x64": "4.34.9", + "@rollup/rollup-linux-arm-gnueabihf": "4.34.9", + "@rollup/rollup-linux-arm-musleabihf": "4.34.9", + "@rollup/rollup-linux-arm64-gnu": "4.34.9", + "@rollup/rollup-linux-arm64-musl": "4.34.9", + "@rollup/rollup-linux-loongarch64-gnu": "4.34.9", + "@rollup/rollup-linux-powerpc64le-gnu": "4.34.9", + "@rollup/rollup-linux-riscv64-gnu": "4.34.9", + "@rollup/rollup-linux-s390x-gnu": "4.34.9", + "@rollup/rollup-linux-x64-gnu": "4.34.9", + "@rollup/rollup-linux-x64-musl": "4.34.9", + "@rollup/rollup-win32-arm64-msvc": "4.34.9", + "@rollup/rollup-win32-ia32-msvc": "4.34.9", + "@rollup/rollup-win32-x64-msvc": "4.34.9", "fsevents": "~2.3.2" } }, @@ -5333,6 +5967,24 @@ } ] }, + "node_modules/safe-regex-test": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", + "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "is-regex": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", @@ -5349,6 +6001,8 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dev": true, + "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", @@ -5364,7 +6018,9 @@ "node_modules/setimmediate": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==" + "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", + "dev": true, + "license": "MIT" }, "node_modules/sha.js": { "version": "2.4.11", @@ -5412,14 +6068,73 @@ } }, "node_modules/side-channel": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", - "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.7", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" @@ -5432,7 +6147,36 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true + "dev": true, + "license": "ISC" + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sirv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.1.tgz", + "integrity": "sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } }, "node_modules/slash": { "version": "3.0.0", @@ -5456,6 +6200,7 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, "engines": { "node": ">=0.10.0" } @@ -5470,18 +6215,32 @@ "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.1.tgz", + "integrity": "sha512-vj5lIj3Mwf9D79hBkltk5qmkFI+biIKWS2IBxEyEU3AX1tUf7AoL8nSazCOiiqQsGKIq01SClsKEzweu34uwvA==", + "dev": true, + "license": "MIT" }, "node_modules/stream-browserify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-3.0.0.tgz", "integrity": "sha512-H73RAHsVBapbim0tU2JwwOiXUj+fikfiaoYAKHF3VJfA0pe2BCzkhAHBlLG6REzE+2WNZcxOXjK7lkso+9euLA==", + "dev": true, + "license": "MIT", "dependencies": { "inherits": "~2.0.4", "readable-stream": "^3.5.0" @@ -5491,6 +6250,8 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -5504,6 +6265,8 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", + "dev": true, + "license": "MIT", "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", @@ -5515,6 +6278,8 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -5524,6 +6289,13 @@ "node": ">= 6" } }, + "node_modules/strict-event-emitter": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz", + "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==", + "dev": true, + "license": "MIT" + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -5543,7 +6315,22 @@ "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, "engines": { - "node": ">=0.6.19" + "node": ">=0.6.19" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, "node_modules/strip-ansi": { @@ -5570,18 +6357,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-literal": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", - "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", - "dev": true, - "dependencies": { - "acorn": "^8.10.0" - }, - "funding": { - "url": "https://github.com/sponsors/antfu" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -5598,6 +6373,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, "engines": { "node": ">= 0.4" }, @@ -5613,99 +6389,115 @@ "node": ">=0.10" } }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", "dev": true, + "license": "MIT", "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" + "setimmediate": "^1.0.4" }, "engines": { - "node": ">=8" + "node": ">=0.6.0" } }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "node_modules/timing-safe-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/timing-safe-equal/-/timing-safe-equal-1.0.0.tgz", + "integrity": "sha512-anJOzi3Tdj8nmVWzLCObzb9G991eF8T2TuuChcZt6v0im6wgv5jS1GTxDrtbFJcacVNQQkiGUCyuc8hImWORXg==" + }, + "node_modules/tinybench": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz", + "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==", "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } + "license": "MIT" }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "node_modules/tinyexec": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", + "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.12", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.12.tgz", + "integrity": "sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==", + "dev": true, + "license": "MIT", "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "fdir": "^6.4.3", + "picomatch": "^4.0.2" }, "engines": { - "node": "*" + "node": ">=12.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/SuperchupuDev" } }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" }, - "engines": { - "node": "*" + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/timers-browserify": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", - "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", - "dependencies": { - "setimmediate": "^1.0.4" - }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", "engines": { - "node": ">=0.6.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/tinybench": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.8.0.tgz", - "integrity": "sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==", - "dev": true - }, "node_modules/tinypool": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz", - "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + } + }, + "node_modules/tinyrainbow": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-2.0.0.tgz", + "integrity": "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } }, "node_modules/tinyspy": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.2.1.tgz", - "integrity": "sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-3.0.2.tgz", + "integrity": "sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=14.0.0" } @@ -5731,6 +6523,42 @@ "node": ">=8.0" } }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/ts-api-utils": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", @@ -5859,7 +6687,9 @@ "node_modules/tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==" + "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", + "dev": true, + "license": "MIT" }, "node_modules/type-check": { "version": "0.4.0", @@ -5873,15 +6703,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -5943,9 +6764,9 @@ } }, "node_modules/undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==" }, "node_modules/universalify": { "version": "0.1.2", @@ -5966,23 +6787,43 @@ } }, "node_modules/url": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", - "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", + "dev": true, + "license": "MIT", "dependencies": { "punycode": "^1.4.1", - "qs": "^6.11.2" + "qs": "^6.12.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, "node_modules/url/node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true, + "license": "MIT" }, "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dev": true, + "license": "MIT", "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", @@ -5996,34 +6837,25 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "node_modules/v8-to-istanbul": { - "version": "9.2.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", - "integrity": "sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, "node_modules/vite": { - "version": "5.4.7", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.7.tgz", - "integrity": "sha512-5l2zxqMEPVENgvzTuBpHer2awaetimj2BGkhBPdnwKbPNOlHsODU+oiazEZzLK7KhAnOrO+XGYJYn4ZlUhDtDQ==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.1.tgz", + "integrity": "sha512-kkzzkqtMESYklo96HKKPE5KKLkC1amlsqt+RjFMlX2AvbRB/0wghap19NdBxxwGZ+h/C6DLCrcEphPIItlGrRQ==", + "dev": true, + "license": "MIT", "dependencies": { - "esbuild": "^0.21.3", - "postcss": "^8.4.43", - "rollup": "^4.20.0" + "esbuild": "^0.25.0", + "fdir": "^6.4.3", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.12" }, "bin": { "vite": "bin/vite.js" }, "engines": { - "node": "^18.0.0 || >=20.0.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://github.com/vitejs/vite?sponsor=1" @@ -6032,19 +6864,25 @@ "fsevents": "~2.3.3" }, "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", "less": "*", "lightningcss": "^1.21.0", "sass": "*", "sass-embedded": "*", "stylus": "*", "sugarss": "*", - "terser": "^5.4.0" + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, + "jiti": { + "optional": true + }, "less": { "optional": true }, @@ -6065,32 +6903,45 @@ }, "terser": { "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true } } }, "node_modules/vite-node": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.6.tgz", - "integrity": "sha512-nlBMJ9x6n7/Amaz6F3zJ97EBwR2FkzhBRxF5e+jE6LA3yi6Wtc2lyTij1OnDMIr34v5g/tVQtsVAzhT0jc5ygA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-3.0.7.tgz", + "integrity": "sha512-2fX0QwX4GkkkpULXdT1Pf4q0tC1i1lFOyseKoonavXUNlQ77KpW2XqBGGNIm/J4Ows4KxgGJzDguYVPKwG/n5A==", "dev": true, + "license": "MIT", "dependencies": { "cac": "^6.7.14", - "debug": "^4.3.4", - "mlly": "^1.4.0", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "vite": "^3.0.0 || ^4.0.0 || ^5.0.0-0" + "debug": "^4.4.0", + "es-module-lexer": "^1.6.0", + "pathe": "^2.0.3", + "vite": "^5.0.0 || ^6.0.0" }, "bin": { "vite-node": "vite-node.mjs" }, "engines": { - "node": ">=v14.18.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://opencollective.com/vitest" } }, + "node_modules/vite-node/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, "node_modules/vite-plugin-dts": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/vite-plugin-dts/-/vite-plugin-dts-4.0.3.tgz", @@ -6138,20 +6989,20 @@ } }, "node_modules/vite-plugin-node-polyfills": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.17.0.tgz", - "integrity": "sha512-iPmPn7376e5u6QvoTSJa16hf5Q0DFwHFXJk2uYpsNlmI3JdPms7hWyh55o+OysJ5jo9J5XPhLC9sMOYifwFd1w==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/vite-plugin-node-polyfills/-/vite-plugin-node-polyfills-0.23.0.tgz", + "integrity": "sha512-4n+Ys+2bKHQohPBKigFlndwWQ5fFKwaGY6muNDMTb0fSQLyBzS+jjUNRZG9sKF0S/Go4ApG6LFnUGopjkILg3w==", + "dev": true, + "license": "MIT", "dependencies": { "@rollup/plugin-inject": "^5.0.5", - "buffer-polyfill": "npm:buffer@^6.0.3", - "node-stdlib-browser": "^1.2.0", - "process": "^0.11.10" + "node-stdlib-browser": "^1.2.0" }, "funding": { "url": "https://github.com/sponsors/davidmyersdev" }, "peerDependencies": { - "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" + "vite": "^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "node_modules/vite-tsconfig-paths": { @@ -6173,87 +7024,117 @@ } } }, + "node_modules/vite/node_modules/fdir": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", + "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/vitest": { - "version": "0.34.6", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.6.tgz", - "integrity": "sha512-+5CALsOvbNKnS+ZHMXtuUC7nL8/7F1F2DnHGjSsszX8zCjWSSviphCb/NuS9Nzf4Q03KyyDRBAXhF/8lffME4Q==", - "dev": true, - "dependencies": { - "@types/chai": "^4.3.5", - "@types/chai-subset": "^1.3.3", - "@types/node": "*", - "@vitest/expect": "0.34.6", - "@vitest/runner": "0.34.6", - "@vitest/snapshot": "0.34.6", - "@vitest/spy": "0.34.6", - "@vitest/utils": "0.34.6", - "acorn": "^8.9.0", - "acorn-walk": "^8.2.0", - "cac": "^6.7.14", - "chai": "^4.3.10", - "debug": "^4.3.4", - "local-pkg": "^0.4.3", - "magic-string": "^0.30.1", - "pathe": "^1.1.1", - "picocolors": "^1.0.0", - "std-env": "^3.3.3", - "strip-literal": "^1.0.1", - "tinybench": "^2.5.0", - "tinypool": "^0.7.0", - "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0", - "vite-node": "0.34.6", - "why-is-node-running": "^2.2.2" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-3.0.7.tgz", + "integrity": "sha512-IP7gPK3LS3Fvn44x30X1dM9vtawm0aesAa2yBIZ9vQf+qB69NXC5776+Qmcr7ohUXIQuLhk7xQR0aSUIDPqavg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@vitest/expect": "3.0.7", + "@vitest/mocker": "3.0.7", + "@vitest/pretty-format": "^3.0.7", + "@vitest/runner": "3.0.7", + "@vitest/snapshot": "3.0.7", + "@vitest/spy": "3.0.7", + "@vitest/utils": "3.0.7", + "chai": "^5.2.0", + "debug": "^4.4.0", + "expect-type": "^1.1.0", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "std-env": "^3.8.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinypool": "^1.0.2", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0", + "vite-node": "3.0.7", + "why-is-node-running": "^2.3.0" }, "bin": { "vitest": "vitest.mjs" }, "engines": { - "node": ">=v14.18.0" + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { "@edge-runtime/vm": "*", - "@vitest/browser": "*", - "@vitest/ui": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.0.7", + "@vitest/ui": "3.0.7", "happy-dom": "*", - "jsdom": "*", - "playwright": "*", - "safaridriver": "*", - "webdriverio": "*" + "jsdom": "*" }, "peerDependenciesMeta": { "@edge-runtime/vm": { "optional": true }, - "@vitest/browser": { - "optional": true - }, - "@vitest/ui": { + "@types/debug": { "optional": true }, - "happy-dom": { + "@types/node": { "optional": true }, - "jsdom": { + "@vitest/browser": { "optional": true }, - "playwright": { + "@vitest/ui": { "optional": true }, - "safaridriver": { + "happy-dom": { "optional": true }, - "webdriverio": { + "jsdom": { "optional": true } } }, + "node_modules/vitest/node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==" + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true, + "license": "MIT" }, "node_modules/vscode-oniguruma": { "version": "1.7.0", @@ -6306,14 +7187,17 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", + "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", + "dev": true, + "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", + "call-bind": "^1.0.8", + "call-bound": "^1.0.3", "for-each": "^0.3.3", - "gopd": "^1.0.1", + "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { @@ -6324,10 +7208,11 @@ } }, "node_modules/why-is-node-running": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", - "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", + "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", "dev": true, + "license": "MIT", "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" @@ -6348,6 +7233,21 @@ "node": ">=0.10.0" } }, + "node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -6387,26 +7287,81 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true, + "license": "MIT", "engines": { "node": ">=0.4" } }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "dev": true }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/yoctocolors-cjs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz", + "integrity": "sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } diff --git a/package.json b/package.json index 9f9c114b..7baa48d7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@jackallabs/jackal.js", - "version": "3.3.3", + "version": "3.6.5", "description": "Javascript library for interacting with the Jackal Chain", "keywords": [ "jackal", @@ -9,20 +9,27 @@ "exports": { ".": { "import": { - "types": "./dist/index.d.mts", - "default": "./dist/index.es.js" + "types": "./dist/index.d.ts", + "default": "./dist/index.esm.js" + }, + "require": { + "types": "./dist/index.d.ts", + "default": "./dist/index.cjs.js" } } }, "types": "./dist/index.d.ts", - "module": "./dist/index.es.js", + "module": "./dist/index.esm.js", "files": [ "dist" ], "scripts": { "build": "tsc && vite build", "packit": "npm run build && npm pack --pack-destination packs", - "gen-docs": "npx typedoc" + "gen-docs": "npx typedoc", + "test": "vitest", + "test:watch": "vitest --watch", + "test:browser": "vitest --workspace=vitest.workspace.ts" }, "contributors": [ { @@ -57,18 +64,18 @@ }, "homepage": "https://github.com/JackalLabs/jackal.js/#README", "dependencies": { - "@cosmjs/proto-signing": "^0.31.3", - "@cosmjs/stargate": "^0.32.2", - "@jackallabs/bech32": "^1.2.0", - "@jackallabs/dogwood-tree": "^1.0.1", - "@jackallabs/jackal.js-protos": "2.3.0", + "@cosmjs/proto-signing": "^0.32.3", + "@cosmjs/stargate": "^0.32.3", + "@jackallabs/bech32": "^1.2.1", + "@jackallabs/browserify-aes": "^11.2.0-CCM.1", + "@jackallabs/dogwood-tree": "^1.1.0", + "@jackallabs/jackal.js-protos": "2.4.1", "@karnthis/plzsu": "^1.0.0", "@keplr-wallet/types": "^0.12.44", - "browserify-aes": "^1.2.0", "browserify-des": "^1.0.2", "browserify-sign": "^4.2.2", "create-hash": "^1.2.0", - "eciesjs": "^0.4.2", + "eciesjs": "^0.4.11", "for-each": "^0.3.3", "ripemd160": "^2.0.2", "ulid": "^2.3.0" @@ -77,19 +84,20 @@ "@btmills/prettier": "3.0.3", "@rollup/plugin-commonjs": "^25.0.7", "@rollup/plugin-typescript": "^11.1.5", + "@types/node": "^22.9.0", "@typescript-eslint/eslint-plugin": "^6.10.0", "@typescript-eslint/parser": "^6.10.0", - "@vitest/coverage-v8": "0.34.6", + "@vitest/browser": "^3.0.7", "eslint": "8.53.0", "eslint-config-prettier": "9.0.0", "rollup-plugin-typescript-paths": "^1.4.0", "tslib": "^2.6.2", "typedoc": "^0.25.3", "typescript": "^5.2.2", - "vite": "^5.1.5", + "vite": "^6.2.0", "vite-plugin-dts": "^4.0.3", - "vite-plugin-node-polyfills": "^0.17.0", + "vite-plugin-node-polyfills": "^0.23.0", "vite-tsconfig-paths": "^4.2.1", - "vitest": "0.34.6" + "vitest": "^3.0.7" } } diff --git a/src/classes/clientHandler.ts b/src/classes/clientHandler.ts index 30ad2ffc..b5f1e890 100644 --- a/src/classes/clientHandler.ts +++ b/src/classes/clientHandler.ts @@ -33,6 +33,7 @@ import { IWrappedEncodeObject, } from '@/interfaces' import { TSockets, TSocketSet } from '@/types' +import { DeliverTxResponse, StdFee } from '@cosmjs/stargate' export class ClientHandler implements IClientHandler { protected readonly jklQuery: TJackalQueryClient @@ -207,6 +208,12 @@ export class ClientHandler implements IClientHandler { jklAddress = wallet.getAddress() hostSigner = jklSigner hostAddress = jklAddress + + if (typeof window === 'undefined') { + global.mnemonicWallet = wallet + } else { + window.mnemonicWallet = wallet + } } break default: @@ -269,7 +276,8 @@ export class ClientHandler implements IClientHandler { */ async createStorageHandler (): Promise { try { - return await StorageHandler.init(this) + const rns = await this.createRnsHandler() + return await StorageHandler.init(this, { rns }) } catch (err) { throw warnError('clientHandler createStorageHandler()', err) } @@ -277,29 +285,51 @@ export class ClientHandler implements IClientHandler { /** * Create Wasm Handler session, defaults to Archway. - * @returns {Promise} + * @param {IWasmDetails} [details] + * @returns {Promise} */ async createWasmStorageHandler (details: IWasmDetails = {}): Promise { try { const { - addressIndex = 1, - codeId = 546, connIdA = 'connection-18', connIdB = 'connection-50', + contract = 'archway1meqkgwa8nef3d49wuleu2m092q4mtkespal39vd280yy6nj5lhhqllu4kn', } = details this.myCosmwasm = await WasmHandler.init(this) - this.myContractAddress = await this.myCosmwasm.getICAContractAddress(addressIndex) - if (!this.myContractAddress) { + const ica = await this.myCosmwasm.getICAContractAddress(contract).catch(err => { + console.warn('can\'t get ica', err) + }) + console.log('ICA: ', ica) + if (ica) { + console.log('Set ICA correctly') + this.myContractAddress = ica + } else { + console.log('Failed to set ICA') await this.myCosmwasm.instantiateICA( + contract, connIdA, connIdB, - codeId, ) - this.myContractAddress = await this.myCosmwasm.getICAContractAddress(addressIndex) + await new Promise(r => setTimeout(r, 5000)) + this.myContractAddress = await this.myCosmwasm.getICAContractAddress(contract) } + console.log(this.myContractAddress) this.myIcaAddress = await this.myCosmwasm.getJackalAddressFromContract( this.myContractAddress, ) + const state = await this.myCosmwasm.getContractChannelState( + this.myContractAddress, + ) + console.log('State: ', state) + if (state === 'STATE_CLOSED') { + console.log('needs to re-open channel') + await this.myCosmwasm.reOpenChannel( + contract, + connIdA, + connIdB, + ) + } + return await StorageHandler.init(this, { accountAddress: this.myIcaAddress, }) @@ -384,18 +414,21 @@ export class ClientHandler implements IClientHandler { /** * * @returns {Promise} - * @protected */ async getJackalBlockHeight (): Promise { if (!this.jklSigner) { throw new Error(signerNotEnabled('ClientHandler', 'getJackalBlockHeight')) } - return await this.jklSigner.getHeight() + try { + return await this.jklSigner.getHeight() + } catch (err) { + throw warnError('clientHandler getJackalBlockHeight()', err) + } } /** * - * @returns {TJackalSigningClient} + * @returns {TJackalSigningClient | null} */ getJackalSigner (): TJackalSigningClient | null { return this.jklSigner @@ -403,7 +436,7 @@ export class ClientHandler implements IClientHandler { /** * - * @returns {TJackalSigningClient} + * @returns {THostSigningClient | null} */ getHostSigner (): THostSigningClient | null { return this.hostSigner @@ -433,17 +466,68 @@ export class ClientHandler implements IClientHandler { * @returns {Promise} */ async getJklBalance (): Promise { + try { + return await this.getJackalNetworkBalance(this.getICAJackalAddress()) + } catch (err) { + throw warnError('clientHandler getJklBalance()', err) + } + } + + /** + * + * @param {string} address + * @param {DCoin} amount + * @param {string} sourceChannel + * @returns {Promise} + */ + async ibcSend (address: string, amount: DCoin, sourceChannel: string): Promise { + if (!this.hostSigner) { + throw new Error(signerNotEnabled('ClientHandler', 'ibcSend')) + } + try { + const fee: DCoin = { amount: '35774392000000000', denom: 'aarch' } + const standardFee: StdFee = { amount: [fee], gas: '200000' } + + return await this.hostSigner.sendIbcTokens(this.hostAddress, address, amount, 'transfer', sourceChannel, undefined, Date.now() * 1000 * 1000 + 2 * 60 * 60 * 1000 * 1000 * 1000, standardFee, undefined) + } catch (err) { + throw warnError('clientHandler ibcSend()', err) + } + } + + /** + * + * @param {string} address + * @returns {Promise} + */ + async getJackalNetworkBalance (address: string): Promise { if (!this.jklSigner) { - throw new Error(signerNotEnabled('ClientHandler', 'getJklBalance')) + throw new Error(signerNotEnabled('ClientHandler', 'getJackalNetworkBalance')) } try { const res = await this.jklQuery.queries.bank.balance({ - address: this.getICAJackalAddress(), + address, denom: 'ujkl', }) return res.balance as DCoin } catch (err) { - throw warnError('clientHandler getJklBalance()', err) + throw warnError('clientHandler getJackalNetworkBalance()', err) + } + } + + /** + * + * @param {string} address + * @param {string} denom + * @returns {Promise} + */ + async getHostNetworkBalance (address: string, denom: string): Promise { + if (!this.hostQuery) { + throw new Error(signerNotEnabled('ClientHandler', 'getHostNetworkBalance')) + } + try { + return await this.hostQuery.getBalance(address, denom) + } catch (err) { + throw warnError('clientHandler getHostNetworkBalance()', err) } } @@ -484,7 +568,7 @@ export class ClientHandler implements IClientHandler { * Returns true if ICA address has been set by wasm signer. * @returns {boolean} */ - wasmIsConnected(): boolean { + wasmIsConnected (): boolean { return this.getICAJackalAddress() !== this.jklAddress } @@ -544,6 +628,7 @@ export class ClientHandler implements IClientHandler { broadcastTimeoutHeight, monitorTimeout = 30, socketOverrides = {} as TSocketSet, + queryOverride, } = options const events: TxEvent[] = [] const ready: IWrappedEncodeObject[] = @@ -557,6 +642,7 @@ export class ClientHandler implements IClientHandler { msgs, this.myIcaAddress || this.hostAddress, socketOverrides, + queryOverride, ) console.log('connectionBundles:', connectionBundles) @@ -580,28 +666,35 @@ export class ClientHandler implements IClientHandler { let rejected = false const broadcastTimeout = setTimeout(async () => { rejected = true - reject({ - error: true, - errorText: 'Event Timeout', - txResponse: await broadcastResult, - txEvents: events, - }) + try { + reject({ + error: true, + errorText: 'Event Timeout', + txResponse: await broadcastResult, + txEvents: events, + }) + } catch (err) { + console.error(err) + } + }, monitorTimeout * 1000) while (!eventsAreFinished && !rejected) { - // console.log('waiting') await setDelay(0.5) eventsAreFinished = events.length >= 1 } if (eventsAreFinished) { clearTimeout(broadcastTimeout) - // console.log('resolving') - resolve({ - error: false, - errorText: '', - txResponse: await broadcastResult, - txEvents: events, - }) + try { + resolve({ + error: false, + errorText: '', + txResponse: await broadcastResult, + txEvents: events, + }) + } catch (err) { + console.error(err) + } } })() }) diff --git a/src/classes/encodingHandler.ts b/src/classes/encodingHandler.ts index b590e482..e6e37735 100644 --- a/src/classes/encodingHandler.ts +++ b/src/classes/encodingHandler.ts @@ -1,11 +1,12 @@ -import { merkleParentAndChild, merkleParentAndIndex } from '@/utils/hash' -import { stringToUint8Array, timestampToBlockHeight } from '@/utils/converters' +import { merkleParentAndChild, merkleParentAndIndex, stringToShaHex } from '@/utils/hash' +import { intToHex, stringToUint8Array, timestampToBlockHeight } from '@/utils/converters' import { formatShareNotification } from '@/utils/notifications' import { cryptString, genAesBundle } from '@/utils/crypt' import { warnError } from '@/utils/misc' import { DEncodeObject, DMsgCreateNotification, + DMsgDeleteNotification, DMsgExecuteContract, DMsgInstantiateContract, DMsgPostKey, @@ -18,25 +19,29 @@ import { } from '@jackallabs/jackal.js-protos' import { IClientHandler, + IClonePackage, IFileDeletePackage, IFileMetaHandler, IFileTreeOptions, IFileTreePackage, IFiletreeReader, IFolderMetaHandler, + INotificationDeletePackage, INotificationPackage, INullMetaHandler, IRootLookupMetaData, - IShareFolderMetaHandler, + IShareDirectPackage, + IShareLinkPackage, IShareMetaHandler, + ISharerMetaHandler, + IUnsharePackage, IUploadPackage, IWrappedEncodeObject, } from '@/interfaces' import type { TMerkleParentChild, TMetaDataSets } from '@/types' import { CosmosMsgForEmpty, ExecuteMsg, InstantiateMsg } from '@/types/StorageOutpost.client.types' import { PrivateKey } from 'eciesjs' -import { FiletreeReader } from '@/classes/filetreeReader' -import { FolderMetaHandler } from '@/classes/metaHandlers' +import { FiletreeReader, FolderMetaHandler, NullMetaHandler, SharerMetaHandler } from '@/classes' export class EncodingHandler { protected readonly jackalClient: IClientHandler @@ -53,6 +58,7 @@ export class EncodingHandler { jackalSigner: TJackalSigningClient, hostSigner: THostSigningClient, keyPair: PrivateKey, + defaultKeyPair: PrivateKey, accountAddress?: string, ) { this.jackalClient = client @@ -66,6 +72,7 @@ export class EncodingHandler { client, jackalSigner, keyPair, + defaultKeyPair, client.getICAJackalAddress(), ) } @@ -73,13 +80,18 @@ export class EncodingHandler { /** * * @param {PrivateKey} keyPair + * @returns {Promise} * @protected */ - protected resetReader (keyPair: PrivateKey): void { + protected async resetReader (keyPair: PrivateKey): Promise { + let dummyKey = await stringToShaHex('') + let defaultKeyPair = PrivateKey.fromHex(dummyKey) + this.reader = new FiletreeReader( this.jackalClient, this.jackalSigner, keyPair, + defaultKeyPair, this.jackalClient.getICAJackalAddress(), ) } @@ -224,7 +236,7 @@ export class EncodingHandler { */ protected encodePostKey (key: string): DEncodeObject { const forKey: DMsgPostKey = { - creator: this.hostAddress, + creator: this.jackalClient.getICAJackalAddress(), key, } return this.jackalSigner.txLibrary.fileTree.msgPostKey(forKey) @@ -254,6 +266,23 @@ export class EncodingHandler { return this.jackalSigner.txLibrary.storage.msgPostFile(forStorage) } + protected encodeStorageCloneFile ( + pkg: IClonePackage, + currentBlock: number, + ): DEncodeObject { + const forStorage: DMsgStoragePostFile = { + creator: this.jklAddress, + merkle: pkg.meta.export().merkleRoot, + fileSize: pkg.size, + proofInterval: this.proofInterval, + proofType: 0, + maxProofs: 3, + expires: this.createExpiresValue(pkg.duration, currentBlock), + note: JSON.stringify({}), + } + return this.jackalSigner.txLibrary.storage.msgPostFile(forStorage) + } + /** * * @param {DUnifiedFile} item @@ -302,12 +331,12 @@ export class EncodingHandler { * @protected */ protected async encodeFileTreeFile ( - pkg: IUploadPackage, + pkg: IUploadPackage | IClonePackage, ): Promise { try { const meta = pkg.meta.export() const parentAndChild = await merkleParentAndChild( - `s/ulid/${pkg.meta.getUlid()}`, + `s/ulid/${meta.ulid}`, ) return await this.storageEncodeFileTree(parentAndChild, meta, { aes: pkg.aes }) } catch (err) { @@ -317,21 +346,52 @@ export class EncodingHandler { /** * - * @param {string} path - * @param {string[]} additionalViewers + * @param {string} ulid + * @param {number} index + * @param {string[]} addViewers + * @param {string[]} removeViewers + * @returns {Promise} + * @protected + */ + protected async encodeFileTreeRefShare ( + ulid: string, + index: number, + addViewers: string[], + removeViewers: string[], + ): Promise { + try { + const parentAndChild = await merkleParentAndIndex(`s/ulid/${ulid}`, intToHex(index)) + const forFileTree = await this.reader.encodeExistingRef({ + location: parentAndChild, + ref: index, + ulid, + viewers: { add: addViewers, remove: removeViewers }, + }) + return this.jackalClient.getTxs().fileTree.msgPostFile(forFileTree) + } catch (err) { + throw warnError('encodingHandler encodeFileTreeFileShare()', err) + } + } + + /** + * + * @param {string} ulid + * @param {string[]} addViewers + * @param {string[]} removeViewers * @returns {Promise} * @protected */ protected async encodeFileTreeFileShare ( - path: string, - additionalViewers: string[], + ulid: string, + addViewers: string[], + removeViewers: string[], ): Promise { try { - const parentAndChild = await merkleParentAndChild(path) + const parentAndChild = await merkleParentAndChild(`s/ulid/${ulid}`) const forFileTree = await this.reader.encodeExistingPostFile( - path, + ulid, parentAndChild, - additionalViewers, + { add: addViewers, remove: removeViewers }, ) return this.jackalClient.getTxs().fileTree.msgPostFile(forFileTree) } catch (err) { @@ -339,6 +399,30 @@ export class EncodingHandler { } } + /** + * + * @param {string} ulid + * @param {string} link + * @returns {Promise} + * @protected + */ + protected async encodeFileTreeFileShareLink ( + ulid: string, + link: string, + ): Promise { + try { + const parentAndChild = await merkleParentAndChild(`s/ulid/${ulid}`) + const forFileTree = await this.reader.encodeExistingPostFile( + ulid, + parentAndChild, + { add: [link] }, + ) + return this.jackalClient.getTxs().fileTree.msgPostFile(forFileTree) + } catch (err) { + throw warnError('encodingHandler encodeFileTreeFileShareLink()', err) + } + } + /** * * @param {IFileTreePackage} pkg @@ -377,10 +461,17 @@ export class EncodingHandler { try { const mH = pkg.meta as IFolderMetaHandler const meta = mH.export() - // console.log('saving:', meta.whoAmI) - const parentAndChild = await merkleParentAndChild(`s/ulid/${mH.getUlid()}`) - return await this.storageEncodeFileTree(parentAndChild, meta, { aes: pkg.aes }) + if (pkg.update) { + const forFileTree = await this.reader.updateExistingPostFile( + mH.getUlid(), + parentAndChild, + meta, + ) + return this.jackalClient.getTxs().fileTree.msgPostFile(forFileTree) + } else { + return await this.storageEncodeFileTree(parentAndChild, meta, { aes: pkg.aes }) + } } catch (err) { throw warnError('encodingHandler encodeFileTreeFolder()', err) } @@ -398,36 +489,13 @@ export class EncodingHandler { try { const mH = pkg.meta as IShareMetaHandler const meta = mH.export() - const parentAndChild = await merkleParentAndChild(meta.location) + const parentAndChild = await merkleParentAndChild(`s/ulid/${mH.getUlid()}`) return await this.storageEncodeFileTree(parentAndChild, meta, { aes: pkg.aes }) } catch (err) { throw warnError('encodingHandler encodeFileTreeShared()', err) } } - /** - * - * @param {IFileTreePackage} pkg - * @returns {Promise} - * @protected - */ - protected async encodeFileTreeSharedFolder ( - pkg: IFileTreePackage, - ): Promise { - try { - const mH = pkg.meta as IShareFolderMetaHandler - const meta = mH.export() - const parentAndChild = await merkleParentAndIndex( - mH.getLocation(), - mH.getRefString(), - ) - return await this.storageEncodeFileTree(parentAndChild, meta, { aes: pkg.aes }) - } catch (err) { - throw warnError('encodingHandler encodeFileTreeSharedFolder()', err) - } - - } - /** * * @param {IFileTreePackage} pkg @@ -472,7 +540,25 @@ export class EncodingHandler { } catch (err) { throw warnError('encodingHandler encodeFileTreeRef()', err) } + } + /** + * + * @param {IFileTreePackage} pkg + * @returns {Promise} + * @protected + */ + protected async encodeFileTreeSharerRef ( + pkg: IFileTreePackage, + ): Promise { + try { + const mH = pkg.meta as ISharerMetaHandler + const meta = mH.exportSharerRef() + const parentAndChild = await merkleParentAndChild(meta.location) + return await this.storageEncodeFileTree(parentAndChild, meta, { aes: pkg.aes }) + } catch (err) { + throw warnError('encodingHandler encodeFileTreeSharerRef()', err) + } } /** @@ -485,13 +571,12 @@ export class EncodingHandler { pkg: INotificationPackage, ): Promise { try { - const { isPrivate, receiver, path, isFile } = pkg - const base = formatShareNotification(path, isFile) - let contents = JSON.stringify(base) + const { isPrivate, receiver, msg } = pkg + let { contents } = pkg if (isPrivate) { const aes = await genAesBundle() const keys = await this.reader.protectNotification(receiver, aes) - const encMsg = await cryptString(base.msg, aes, 'encrypt', false) + const encMsg = await cryptString(msg, aes, 'encrypt', false) contents = JSON.stringify({ private: true, keys, @@ -512,6 +597,52 @@ export class EncodingHandler { } } + /** + * + * @param {INotificationDeletePackage} pkg + * @returns {Promise} + * @protected + */ + protected async encodeDeleteNotification ( + pkg: INotificationDeletePackage, + ): Promise { + try { + const { from, time } = pkg + const data: DMsgDeleteNotification = { + creator: this.jklAddress, + from, + time, + } + return this.jackalSigner.txLibrary.notifications.msgDeleteNotification( + data, + ) + } catch (err) { + throw warnError('storageHandler encodeDeleteNotification()', err) + } + } + + /** + * + * @param {IFileTreePackage} pkg + * @returns {Promise} + * @protected + */ + protected async upcycleBaseFolderToMsgs ( + pkg: IFileTreePackage, + ): Promise { + try { + const fileTreeBaseFolder = this.encodeFileTreeBaseFolder(pkg) + return [ + { + encodedObject: await fileTreeBaseFolder, + modifier: 0, + }, + ] + } catch (err) { + throw warnError('storageHandler upcycleBaseFolderToMsgs()', err) + } + } + /** * * @param {IFileTreePackage} pkg @@ -576,6 +707,7 @@ export class EncodingHandler { pkg: IFileTreePackage, ): Promise { try { + pkg.update = true const fileTreeFolder = this.encodeFileTreeFolder(pkg) return [ { @@ -625,15 +757,15 @@ export class EncodingHandler { * @returns {Promise} * @protected */ - protected async sharedFolderToMsgs ( + protected async filetreeDeleteToMsgs ( pkg: IFileTreePackage, ): Promise { try { - const fileTreeFolder = this.encodeFileTreeFolder(pkg) - const ref = this.encodeFileTreeSharedFolder(pkg) + const fileTreeNull = this.encodeFileTreeNull(pkg) + const ref = this.encodeFileTreeRef(pkg) return [ { - encodedObject: await fileTreeFolder, + encodedObject: await fileTreeNull, modifier: 0, }, { @@ -642,107 +774,87 @@ export class EncodingHandler { }, ] } catch (err) { - throw warnError('storageHandler sharedFolderToMsgs()', err) + throw warnError('storageHandler filetreeDeleteToMsgs()', err) } } /** * - * @param {IFileTreePackage} pkg - * @returns {Promise} + * @param {IFileDeletePackage} filePkg + * @returns {IWrappedEncodeObject[]} * @protected */ - protected async sharedFileToMsgs ( - pkg: IFileTreePackage, - ): Promise { + protected fileDeleteToMsgs ( + filePkg: IFileDeletePackage, + ): IWrappedEncodeObject[] { try { - const fileTreeShared = this.encodeFileTreeShared(pkg) - const ref = this.encodeFileTreeRef(pkg) return [ { - encodedObject: await fileTreeShared, - modifier: 0, - }, - { - encodedObject: await ref, + encodedObject: + this.jackalSigner.txLibrary.storage.msgDeleteFile(filePkg), modifier: 0, }, ] } catch (err) { - throw warnError('storageHandler sharedFileToMsgs()', err) + throw warnError('storageHandler fileDeleteToMsgs()', err) } } /** * - * @param {IFileTreePackage} pkg + * @param {IUploadPackage} pkg + * @param {number} blockHeight * @returns {Promise} * @protected */ - protected async filetreeDeleteToMsgs ( - pkg: IFileTreePackage, + protected async pkgToMsgs ( + pkg: IUploadPackage, + blockHeight: number, ): Promise { try { - const fileTreeNull = this.encodeFileTreeNull(pkg) + const storageFile = this.encodeStoragePostFile(pkg, blockHeight) + const fileTreeFile = this.encodeFileTreeFile(pkg) const ref = this.encodeFileTreeRef(pkg) return [ { - encodedObject: await fileTreeNull, + encodedObject: storageFile, modifier: 0, + file: pkg.file, + merkle: pkg.meta.export().merkleHex, }, { - encodedObject: await ref, + encodedObject: await fileTreeFile, modifier: 0, }, - ] - } catch (err) { - throw warnError('storageHandler filetreeDeleteToMsgs()', err) - } - } - - /** - * - * @param {IFileDeletePackage} filePkg - * @returns {IWrappedEncodeObject[]} - * @protected - */ - protected fileDeleteToMsgs ( - filePkg: IFileDeletePackage, - ): IWrappedEncodeObject[] { - try { - return [ { - encodedObject: - this.jackalSigner.txLibrary.storage.msgDeleteFile(filePkg), + encodedObject: await ref, modifier: 0, }, ] } catch (err) { - throw warnError('storageHandler fileDeleteToMsgs()', err) + throw warnError('storageHandler pkgToMsgs()', err) } } /** * - * @param {IUploadPackage} pkg + * @param {IClonePackage} pkg * @param {number} blockHeight * @returns {Promise} * @protected */ - protected async pkgToMsgs ( - pkg: IUploadPackage, + protected async clonePkgToMsgs ( + pkg: IClonePackage, blockHeight: number, ): Promise { try { - const storageFile = this.encodeStoragePostFile(pkg, blockHeight) + const storageFile = this.encodeStorageCloneFile(pkg, blockHeight) const fileTreeFile = this.encodeFileTreeFile(pkg) const ref = this.encodeFileTreeRef(pkg) return [ { encodedObject: storageFile, modifier: 0, - file: pkg.file, - merkle: pkg.meta.export().merkleHex, }, { encodedObject: await fileTreeFile, @@ -758,6 +870,12 @@ export class EncodingHandler { } } + /** + * + * @param {IFileTreePackage} pkg + * @returns {Promise} + * @protected + */ protected async movePkgToMsgs ( pkg: IFileTreePackage, ): Promise { @@ -854,6 +972,7 @@ export class EncodingHandler { pkg: IFileTreePackage, ): Promise { try { + pkg.update = true const fileTreeFile = this.encodeFileTreeFolder(pkg) return [ { @@ -868,30 +987,216 @@ export class EncodingHandler { /** * - * @param {INotificationPackage} pkg + * @param {IShareLinkPackage} pkg + * @returns {Promise} + * @protected + */ + protected async shareLinkToMsgs ( + pkg: IShareLinkPackage, + ): Promise { + try { + const refs = [] + const id = this.reader.ulidLookup(pkg.path) + const sharerCount = await this.reader.sharerCountRead(id) + const share = this.encodeFileTreeFileShareLink(id, pkg.link) + if (!pkg.isFile) { + const count = await this.reader.refCountRead(pkg.path) + for (let i = 0; i < count; i++) { + const local = this.encodeFileTreeRefShare(id, i, [pkg.link], []) + refs.push(local) + } + } + const sharerPkg = { + meta: await SharerMetaHandler.create({ + location: id, + sharer: pkg.link, + type: 'link', + refIndex: sharerCount, + }), + aes: await genAesBundle(), + } + this.reader.sharerCountIncrement(id) + const sharerRef = this.encodeFileTreeSharerRef(sharerPkg) + const final = [ + { + encodedObject: await share, + modifier: 0, + }, + { + encodedObject: await sharerRef, + modifier: 0, + }, + ] + for (let one of refs) { + final.push({ + encodedObject: await one, + modifier: 0, + }) + } + return final + } catch (err) { + throw warnError('storageHandler shareLinkToMsgs()', err) + } + } + + /** + * + * @param {IShareDirectPackage} pkg * @param {string[]} [additionalViewers] * @returns {Promise} * @protected */ - protected async shareToMsgs ( - pkg: INotificationPackage, + protected async sendShareToMsgs ( + pkg: IShareDirectPackage, additionalViewers: string[] = [], ): Promise { try { - const share = this.encodeFileTreeFileShare(pkg.path, additionalViewers) - const notification = this.encodeCreateNotification(pkg) - return [ + const refs = [] + const id = this.reader.ulidLookup(pkg.path) + const sharerCount = await this.reader.sharerCountRead(id) + const name = pkg.path.split('/').slice(-1)[0] + const baseNoti = formatShareNotification(id, name, pkg.isFile) + const share = this.encodeFileTreeFileShare(id, additionalViewers, []) + if (!pkg.isFile) { + const count = await this.reader.refCountRead(pkg.path) + for (let i = 0; i < count; i++) { + const local = this.encodeFileTreeRefShare(id, i, additionalViewers, []) + refs.push(local) + } + } + const sharerPkg = { + meta: await SharerMetaHandler.create({ + location: id, + sharer: pkg.receiver, + refIndex: sharerCount, + }), + aes: await genAesBundle(), + } + this.reader.sharerCountIncrement(id) + const sharerRef = this.encodeFileTreeSharerRef(sharerPkg) + const notification = this.encodeCreateNotification({ + isPrivate: pkg.isPrivate, + receiver: pkg.receiver, + msg: baseNoti.msg, + contents: JSON.stringify(baseNoti), + }) + const final = [ { encodedObject: await share, modifier: 0, }, + { + encodedObject: await sharerRef, + modifier: 0, + }, { encodedObject: await notification, modifier: 0, }, ] + for (let one of refs) { + final.push({ + encodedObject: await one, + modifier: 0, + }) + } + return final + } catch (err) { + throw warnError('storageHandler sendShareToMsgs()', err) + } + } + + /** + * + * @param {IUnsharePackage} pkg + * @returns {Promise} + * @protected + */ + protected async sendUnshareToMsgs (pkg: IUnsharePackage): Promise { + try { + const sharerUpdates = [] + const id = this.reader.ulidLookup(pkg.path) + const share = this.encodeFileTreeFileShare(id, [], pkg.removed) + const meta = await this.reader.loadMetaByPath(pkg.path) + if ('location' in meta) { + const location = meta.location.split('/').slice(-1)[0] + for (let one of pkg.removed) { + const refIndex = await this.reader.sharerRefRead(pkg.path, one) + const nullMeta = await NullMetaHandler.create({ + location, + refIndex, + ulid: id, + }) + const ref = this.encodeFileTreeSharerRef({ meta: nullMeta, aes: await genAesBundle() }) + sharerUpdates.push(ref) + } + } else { + throw new Error('Invalid Meta') + } + const final = [ + { + encodedObject: await share, + modifier: 0, + }, + ] + for (let one of sharerUpdates) { + final.push({ + encodedObject: await one, + modifier: 0, + }) + } + return final + } catch (err) { + throw warnError('storageHandler sendUnshareToMsgs()', err) + } + } + + /** + * + * @param {IFileTreePackage} pkg + * @returns {Promise} + * @protected + */ + protected async receiveShareToMsgs ( + pkg: IFileTreePackage, + ): Promise { + try { + const fileTreeShared = this.encodeFileTreeShared(pkg) + const ref = this.encodeFileTreeRef(pkg) + return [ + { + encodedObject: await fileTreeShared, + modifier: 0, + }, + { + encodedObject: await ref, + modifier: 0, + }, + ] + } catch (err) { + throw warnError('storageHandler receiveShareToMsgs()', err) + } + } + + /** + * + * @param {INotificationDeletePackage} pkg + * @returns {Promise} + * @protected + */ + protected async tidyReceivedNotifications ( + pkg: INotificationDeletePackage, + ): Promise { + try { + const delNotification = this.encodeDeleteNotification(pkg) + return [ + { + encodedObject: await delNotification, + modifier: 0, + }, + ] } catch (err) { - throw warnError('storageHandler shareToMsgs()', err) + throw warnError('storageHandler tidyReceivedNotifications()', err) } } diff --git a/src/classes/filetreeReader.ts b/src/classes/filetreeReader.ts index 026a3709..972538b1 100644 --- a/src/classes/filetreeReader.ts +++ b/src/classes/filetreeReader.ts @@ -2,6 +2,8 @@ import { IAesBundle, IChildMetaDataMap, IClientHandler, + ICreateViewAccessOptions, + IEncodeExistingRefOptions, IFileMeta, IFileMetaData, IFileMetaHandler, @@ -10,16 +12,22 @@ import { IFolderMetaData, IFolderMetaHandler, ILegacyFolderMetaData, + ILoadMetaOptions, + ILoadRefMetaOptions, + IMetaDataByUlidOptions, INotificationRecord, INullRefMetaData, + INullSharerRefMetaData, + IPathToLookupOptions, IPrivateNotification, IReadFolderContentOptions, IReconstructedFileTree, IRefMetaData, - IRootLookupMetaData, - ISharedMetaDataMap, - IShareFolderMetaData, IShareMetaData, + ISharerRefMetaData, + ISharingLookupOptions, + IViewerSetAddRemove, + TSetMetaViewersOptions, } from '@/interfaces' import type { PrivateKey } from 'eciesjs' import type { @@ -34,60 +42,135 @@ import { warnError } from '@/utils/misc' import { hashAndHex, hashAndHexOwner, hashAndHexUserAccess, merklePath, merklePathPlusIndex } from '@/utils/hash' import { hexToInt, + intToHex, prepDecompressionForAmino, safeDecompressData, safeParseFileTree, safeParseLegacyMerkles, safeStringifyFileTree, } from '@/utils/converters' -import { aesToString, compressEncryptString, cryptString, genAesBundle, stringToAes } from '@/utils/crypt' -import type { TMerkleParentChild, TMetaDataSets } from '@/types' +import { + aesToString, + compressEncryptString, + cryptString, + genAesBundle, + linkPrivateKey, + stringToAes, +} from '@/utils/crypt' +import { TConversionPair, TExtractedViewAccess, TMerkleParentChild, TMetaDataSets } from '@/types' import { FileMetaHandler, FolderMetaHandler, NullMetaHandler } from '@/classes/metaHandlers' export class FiletreeReader implements IFiletreeReader { protected readonly jackalClient: IClientHandler protected readonly jackalSigner: TJackalSigningClient protected readonly keyPair: PrivateKey + protected readonly defaultKeyPair: PrivateKey protected readonly clientAddress: string protected ulidLeaves: Record> + protected sharerRefs: Record> + protected sharers: Record + protected sharingLeaves: Record + protected viewerLeaves: Record> + protected viewerShares: Record protected directoryLeaves: Record> + protected directoriesByUlid: Record> protected yellowpages: Record> protected legacyMetaLeaves: Record protected refCounts: Record + protected sharerCounts: Record + protected conversionQueue: string[] + protected nullConversions: string[] constructor ( jackalClient: IClientHandler, jackalSigner: TJackalSigningClient, keyPair: PrivateKey, + defaultKeyPair: PrivateKey, ownerAddress: string, ) { this.jackalClient = jackalClient this.jackalSigner = jackalSigner this.keyPair = keyPair + this.defaultKeyPair = defaultKeyPair this.clientAddress = ownerAddress this.ulidLeaves = {} this.ulidLeaves[ownerAddress] = {} + this.sharerRefs = {} + this.sharers = {} + this.sharingLeaves = {} + this.viewerLeaves = {} + this.viewerShares = {} this.directoryLeaves = {} this.directoryLeaves[ownerAddress] = {} + this.directoriesByUlid = {} + this.directoriesByUlid[ownerAddress] = {} this.yellowpages = {} this.yellowpages[ownerAddress] = {} this.legacyMetaLeaves = {} this.refCounts = {} + this.sharerCounts = {} + this.conversionQueue = [] + this.nullConversions = [] + } + + /** + * + * @param {string} path + * @returns {Promise} + */ + async sharersRead (path: string): Promise { + try { + return await this.loadSharerRefs(path) + } catch (err) { + throw warnError('filetreeReader sharersRead()', err) + } } + /** + * + * @param {string} path + * @param {string} sharer + * @returns {Promise} + */ + async sharerRefRead (path: string, sharer: string): Promise { + try { + await this.loadSharerRefs(path) + if (sharer in this.sharerRefs[path]) { + return this.sharerRefs[path][sharer] + } else { + throw new Error('Invalid Ref') + } + } catch (err) { + throw warnError('filetreeReader sharerRefRead()', err) + } + } + + /** + * + * @param {string} path + * @returns {Promise} + */ async refCountRead (path: string): Promise { - if (path in this.refCounts) { - return this.refCounts[path] - } else { - const meta = await this.loadFolderMetaByPath(path) - const count = hexToInt(meta.count) - this.refCountSet(path, count) - return count + try { + if (path in this.refCounts) { + return this.refCounts[path] + } else { + const meta = await this.loadFolderMetaByPath(path) + const count = hexToInt(meta.count) + this.refCountSet(path, count) + return count + } + } catch (err) { + throw warnError('filetreeReader refCountRead()', err) } } + /** + * + * @param {string} path + */ refCountIncrement (path: string): void { if (this.refCounts[path]) { this.refCounts[path]++ @@ -96,12 +179,293 @@ export class FiletreeReader implements IFiletreeReader { } } + /** + * + * @param {string} path + * @param {number} value + */ refCountSet (path: string, value: number): void { if (!this.refCounts[path]) { this.refCounts[path] = value } } + /** + * + * @param {string} [sharer] + * @returns {Promise<[number, number]>} + */ + async readSharingRefCount (sharer?: string): Promise<[number, number]> { + try { + if (!sharer) { + try { + const count = await this.refCountRead('Shared') + return [0, count] + } catch { + this.refCountSet('Shared', 0) + return [1, 0] + } + } else { + const target = `Shared/${sharer}` + try { + const targetCount = await this.refCountRead(target) + return [0, targetCount] + } catch { + try { + await this.refCountRead('Shared') + this.refCountSet(target, 0) + return [2, 0] + } catch { + this.refCountSet('Shared', 0) + this.refCountSet(target, 0) + return [1, 0] + } + } + } + } catch (err) { + throw warnError('filetreeReader readSharingRefCount()', err) + } + } + + /** + * + * @param {string} ulid + * @returns {Promise} + */ + async sharerCountRead (ulid: string): Promise { + try { + if (ulid in this.sharerCounts) { + return this.sharerCounts[ulid] + } else { + let meta = await this.loadMetaByUlid({ ulid }) + if (meta.metaDataType === 'folder' || meta.metaDataType === 'file') { + meta = meta as IFolderMetaData | IFileMetaData + const count = hexToInt(meta.sharerCount || '') + this.sharerCountSet(ulid, count) + return count + } else { + throw new Error('Invalid meta type') + } + } + } catch (err) { + throw warnError('filetreeReader sharerCountRead()', err) + } + } + + /** + * + * @param {string} ulid + */ + sharerCountIncrement (ulid: string): void { + if (this.sharerCounts[ulid]) { + this.sharerCounts[ulid]++ + } else { + this.sharerCounts[ulid] = 1 + } + } + + /** + * + * @param {string} ulid + * @param {number} value + */ + sharerCountSet (ulid: string, value: number): void { + if (!this.sharerCounts[ulid]) { + this.sharerCounts[ulid] = value + } + } + + /** + * + * @returns {number} + */ + getConversionQueueLength (): number { + return this.conversionQueue.length + } + + /** + * + * @returns {Promise} + */ + async getConversions (): Promise { + try { + const final: TConversionPair[] = [] + for (let ulid of this.conversionQueue) { + if (ulid === '-1') { + continue + } + const meta = await this.loadMetaByUlid({ ulid }) + + if (meta.metaDataType === 'file') { + const parent = meta.location.split('/').slice(-1)[0] + const { files } = this.readDirectoryLeafByUlid(parent) + for (let index of Object.keys(files)) { + if (files[Number(index)].fileMeta.name === meta.fileMeta.name) { + const refIndex = Number(index) + const handler = await FileMetaHandler.create({ clone: meta, refIndex }) + final.push([meta.metaDataType, handler]) + break + } + } + } else if (meta.metaDataType === 'null') { + const parent = meta.location.split('/').slice(-1)[0] + if (this.nullConversions.includes(parent)) { + const handler = await NullMetaHandler.create({ + location: parent, + refIndex: -1, + ulid, + }) + final.push([meta.metaDataType, handler]) + } else { + this.nullConversions.push(parent) + const { nulls } = this.readDirectoryLeafByUlid(parent) + for (let index of Object.keys(nulls)) { + const handler = await NullMetaHandler.create({ + location: parent, + refIndex: Number(index), + ulid, + }) + final.push([meta.metaDataType, handler]) + } + } + } else if (meta.metaDataType === 'folder') { + const parent = meta.location.split('/').slice(-1)[0] + if (parent.length < 26) { + const handler = await FolderMetaHandler.create({ + count: hexToInt(meta.count), + description: meta.description, + location: meta.whoAmI, + name: meta.whoAmI, + refIndex: 0, + ulid, + }) + final.push([meta.metaDataType, handler]) + } else { + const { folders } = this.readDirectoryLeafByUlid(parent) + for (let index of Object.keys(folders)) { + if (folders[Number(index)].whoAmI === meta.whoAmI) { + const refIndex = Number(index) + const handler = await FolderMetaHandler.create({ + count: hexToInt(meta.count), + description: meta.description, + location: parent, + name: meta.whoAmI, + refIndex, + ulid, + }) + final.push([meta.metaDataType, handler]) + break + } + } + } + + } else if (meta.metaDataType === 'rootlookup') { + const handler = await FolderMetaHandler.create({ + count: 0, + location: 'ulid', + name: 'Home', + ulid: meta.ulid, + }) + final.push([meta.metaDataType, handler]) + } + } + this.conversionQueue = [] + this.nullConversions = [] + return final + } catch (err) { + throw warnError('filetreeReader getConversions()', err) + } + } + + /** + * + * @param {ISharingLookupOptions} [options] + * @returns {Promise} + */ + async sharingLookup (options: ISharingLookupOptions = {}): Promise { + try { + if (!options.sharer) { + let sharers = Object.values(this.sharers) + if (options.refresh || sharers.length === 0) { + await this.pathToLookup({ path: 'Shared' }) + return Object.values(this.sharers) + } else { + return sharers + } + } else { + if (options.refresh) { + await this.sharingToLookup(options.sharer) + } + if (this.sharingLeaves[`Shared/${options.sharer}`]) { + return this.sharingLeaves[`Shared/${options.sharer}`] + } else { + throw new Error('No Sharer Found') + } + } + } catch (err) { + throw warnError('filetreeReader sharingLookup()', err) + } + } + + /** + * + * @param {string} ulid + * @param {number} [index] + * @returns {string[]} + */ + readViewerShares (ulid: string, index?: number): string[] { + const reference = (typeof index !== 'undefined') ? `${ulid}/${intToHex(index)}` : ulid + if (this.viewerShares[reference]) { + return this.viewerShares[reference] + } else { + throw warnError('filetreeReader readViewerShares()', new Error('Not Found')) + } + } + + /** + * + * @param {string} ulid + * @param {Record} access + * @param {number} [index] + */ + viewerSave (ulid: string, access: Record, index?: number): void { + const reference = (typeof index !== 'undefined') ? `${ulid}/${intToHex(index)}` : ulid + this.viewerLeaves[reference] = access + } + + /** + * + * @param {string} ulid + * @param {number} [index] + * @returns {Promise>} + */ + async viewerLookup (ulid: string, index?: number): Promise> { + try { + const reference = (typeof index !== 'undefined') ? `${ulid}/${intToHex(index)}` : ulid + if (!this.viewerLeaves[reference]) { + let hexAddress + if (typeof index !== 'undefined') { + hexAddress = await merklePathPlusIndex(`s/ulid/${ulid}`, index) + } else { + hexAddress = await merklePath(`s/ulid/${ulid}`) + } + const lookup = { + address: hexAddress, + ownerAddress: await hashAndHexOwner(hexAddress, this.clientAddress), + } + const { file } = await this.jackalSigner.queries.fileTree.file(lookup) + const viewAccess: Record = JSON.parse(file.viewingAccess) + await this.loadSharedWith(ulid, index) + this.viewerSave(reference, viewAccess) + return viewAccess + } else { + return this.viewerLeaves[reference] + } + } catch (err) { + throw warnError('filetreeReader viewerLookup()', err) + } + } + /** * Look up Filetree ulid by path. * @param {string} path - Path of resource. @@ -126,7 +490,7 @@ export class FiletreeReader implements IFiletreeReader { const segments = path.split('/') const parentPath = segments.slice(0, -1).join('/') const target = segments.slice(-1)[0] - const details = this.directoryLeaves[this.clientAddress][parentPath] + const details = this.readDirectoryLeafByPath(parentPath) for (let index of Object.keys(details.folders)) { const ref = Number(index) @@ -152,21 +516,21 @@ export class FiletreeReader implements IFiletreeReader { * @returns {IChildMetaDataMap} - Contents structure. */ async readFolderContents (path: string, options: IReadFolderContentOptions = {}): Promise { - // console.log(path) const { owner = this.clientAddress, refresh = false, + linkKey, } = options - // console.log(options) - // console.log(this.directoryLeaves[owner]) - // console.log(this.yellowpages[owner]) - try { - if (this.directoryLeaves[owner][path] && !refresh) { - return this.directoryLeaves[owner][path] + if (this.directoryLeaves[owner] && this.directoryLeaves[owner][path] && !refresh) { + return this.readDirectoryLeafByPath(path, owner) } else { - await this.pathToLookupPostProcess(path, owner, this.yellowpages[owner][path]) - return this.directoryLeaves[owner][path] + if (!this.yellowpages[owner] || !this.yellowpages[owner][path]) { + await this.pathToLookup({ linkKey, owner, path }) + } else { + await this.pathToLookupPostProcess(path, owner, this.yellowpages[owner][path], linkKey) + } + return this.readDirectoryLeafByPath(path, owner) } } catch (err) { throw warnError('filetreeReader readFolderContents()', err) @@ -180,9 +544,10 @@ export class FiletreeReader implements IFiletreeReader { */ async loadFolderMetaByPath (path: string): Promise { try { - const lookup = await this.pathToLookup(path) + const lookup = await this.pathToLookup({ path }) const { file } = await this.jackalSigner.queries.fileTree.file(lookup) - return await this.loadFolderMeta(file) + const id = this.ulidLookup(path) + return await this.loadFolderMeta(file, id) } catch (err) { throw warnError('filetreeReader loadFolderMetaByPath()', err) } @@ -204,7 +569,7 @@ export class FiletreeReader implements IFiletreeReader { ), } const { file } = await this.jackalSigner.queries.fileTree.file(lookup) - return await this.loadFolderMeta(file) + return await this.loadFolderMeta(file, ulid) } catch (err) { throw warnError('filetreeReader loadFolderMetaByUlid()', err) } @@ -217,7 +582,7 @@ export class FiletreeReader implements IFiletreeReader { */ async loadFolderMetaHandler (path: string): Promise { try { - const lookup = await this.pathToLookup(path) + const lookup = await this.pathToLookup({ path }) // console.log("lookup:", lookup) const { file } = await this.jackalSigner.queries.fileTree.file(lookup) // console.log("File: ", file) @@ -225,9 +590,13 @@ export class FiletreeReader implements IFiletreeReader { const isCleartext = contents.includes('metaDataType') const access = await this.checkViewAuthorization(file, isCleartext) if (access) { - const parsed = !isCleartext - ? await this.decryptAndParseContents(file) - : safeParseFileTree(contents) + let parsed + if (!isCleartext) { + const id = this.ulidLookup(path) + parsed = await this.decryptAndParseContents(file, id) + } else { + parsed = safeParseFileTree(contents) + } if (parsed.metaDataType === 'folder') { const { count, description, location, whoAmI } = parsed return await FolderMetaHandler.create({ @@ -249,22 +618,26 @@ export class FiletreeReader implements IFiletreeReader { } /** - * Look up sharing folder meta data. + * Look up sharing meta data. * @param {string} path - Path of resource. - * @returns {Promise} + * @returns {Promise} */ - async loadShareFolderMeta (path: string): Promise { + async loadShareMeta (path: string): Promise { try { - const lookup = await this.pathToLookup(path) + const lookup = await this.pathToLookup({ path }) const { file } = await this.jackalSigner.queries.fileTree.file(lookup) const { contents } = file const isCleartext = contents.includes('metaDataType') const access = await this.checkViewAuthorization(file, isCleartext) if (access) { - const parsed = !isCleartext - ? await this.decryptAndParseContents(file) - : safeParseFileTree(contents) - if (parsed.metaDataType === 'sharefolder') { + let parsed + if (!isCleartext) { + const id = this.ulidLookup(path) + parsed = await this.decryptAndParseContents(file, id) + } else { + parsed = safeParseFileTree(contents) + } + if (parsed.metaDataType === 'share') { return parsed } else { throw new Error('Invalid Meta') @@ -273,57 +646,54 @@ export class FiletreeReader implements IFiletreeReader { throw new Error('Not Authorized') } } catch (err) { - throw warnError('filetreeReader loadShareFolderMeta()', err) + throw warnError('filetreeReader loadShareMeta()', err) } } /** - * Look up sharing meta data. - * @param {string} path - Path of resource. - * @returns {Promise} + * Look up ref meta data by ulid. + * @param {ILoadRefMetaOptions} options + * @returns {Promise} */ - async loadShareMeta (path: string): Promise { + async loadRefMeta (options: ILoadRefMetaOptions): Promise { try { - const lookup = await this.pathToLookup(path) - const { file } = await this.jackalSigner.queries.fileTree.file(lookup) - const { contents } = file - const isCleartext = contents.includes('metaDataType') - const access = await this.checkViewAuthorization(file, isCleartext) - if (access) { - const parsed = !isCleartext - ? await this.decryptAndParseContents(file) - : safeParseFileTree(contents) - if (parsed.metaDataType === 'share') { - return parsed - } else { - throw new Error('Invalid Meta') - } - } else { - throw new Error('Not Authorized') + const { + ref, + ulid, + linkKey, + ownerAddress = this.clientAddress, + } = options + const hexAddress = await merklePathPlusIndex(`s/ulid/${ulid}`, ref) + const lookup = { + address: hexAddress, + ownerAddress: await hashAndHexOwner(hexAddress, ownerAddress), } + const { file } = await this.jackalSigner.queries.fileTree.file(lookup) + const meta = await this.loadMeta({ file, linkKey, ulid: '-1' }) + return (meta.metaDataType === 'ref') ? meta as IRefMetaData : meta as INullRefMetaData } catch (err) { - throw warnError('filetreeReader loadShareMeta()', err) + throw warnError('filetreeReader loadRefMeta()', err) } } /** - * Look up ref meta data by ulid. + * * @param {string} ulid * @param {number} ref - * @returns {Promise} + * @returns {Promise} */ - async loadRefMeta (ulid: string, ref: number): Promise { + async loadSharerRefMeta (ulid: string, ref: number): Promise { try { - const hexAddress = await merklePathPlusIndex(`s/ulid/${ulid}`, ref) + const hexAddress = await merklePath(`s/ulid/${ulid}/s-${intToHex(ref)}`) const lookup = { address: hexAddress, ownerAddress: await hashAndHexOwner(hexAddress, this.clientAddress), } const { file } = await this.jackalSigner.queries.fileTree.file(lookup) - const meta = await this.loadMeta(file) - return (meta.metaDataType === 'ref') ? meta as IRefMetaData : meta as INullRefMetaData + const meta = await this.loadMeta({ file, ulid: '-1' }) + return (meta.metaDataType === 'sharerref') ? meta as ISharerRefMetaData : meta as INullSharerRefMetaData } catch (err) { - throw warnError('filetreeReader loadRefMeta()', err) + throw warnError('filetreeReader loadSharerRefMeta()', err) } } @@ -357,19 +727,24 @@ export class FiletreeReader implements IFiletreeReader { } /** - * Look up meta data by ulid. - * @param {string} ulid + * + * @param {IMetaDataByUlidOptions} options * @returns {Promise} */ - async loadMetaByUlid (ulid: string): Promise { + async loadMetaByUlid (options: IMetaDataByUlidOptions): Promise { try { + const { + ulid, + userAddress = this.clientAddress, + linkKey, + } = options const hexAddress = await merklePath(`s/ulid/${ulid}`) const lookup = { address: hexAddress, - ownerAddress: await hashAndHexOwner(hexAddress, this.clientAddress), + ownerAddress: await hashAndHexOwner(hexAddress, userAddress), } const { file } = await this.jackalSigner.queries.fileTree.file(lookup) - return await this.loadMeta(file) + return await this.loadMeta({ file, linkKey, ulid }) } catch (err) { throw warnError('filetreeReader loadMetaByUlid()', err) } @@ -381,7 +756,11 @@ export class FiletreeReader implements IFiletreeReader { * @returns {Promise} */ async loadMetaByPath (path: string): Promise { - return await this.loadMetaByExternalPath(path, this.clientAddress) + try { + return await this.loadMetaByExternalPath(path, this.clientAddress) + } catch (err) { + throw warnError('filetreeReader loadMetaByPath()', err) + } } /** @@ -395,21 +774,45 @@ export class FiletreeReader implements IFiletreeReader { ownerAddress: string, ): Promise { try { - const lookup = await this.pathToLookup(path, ownerAddress) + const lookup = await this.pathToLookup({ owner: ownerAddress, path }) const { file } = await this.jackalSigner.queries.fileTree.file(lookup) - const pathSet = path.split('/') const legacyPath: [string, string] = [ pathSet.slice(0, -1).join('/'), pathSet.slice(-1)[0], ] - - return await this.loadMeta(file, legacyPath) + const id = this.ulidLookup(path, ownerAddress) + return await this.loadMeta({ file, ulid: id, legacyPath }) } catch (err) { throw warnError('filetreeReader loadMetaByExternalPath()', err) } } + /** + * + * @param {string} ulid + * @param {string} ownerAddress + * @param {string} [linkKey] + * @returns {Promise} + */ + async loadMetaByExternalUlid ( + ulid: string, + ownerAddress: string, + linkKey?: string, + ): Promise { + try { + const hexAddress = await merklePath(`s/ulid/${ulid}`) + const lookup = { + address: hexAddress, + ownerAddress: await hashAndHexOwner(hexAddress, ownerAddress), + } + const { file } = await this.jackalSigner.queries.fileTree.file(lookup) + return await this.loadMeta({ file, ulid, linkKey }) + } catch (err) { + throw warnError('filetreeReader loadMetaByExternalUlid()', err) + } + } + /** * Look up file meta data handler for legacy file. * @param {string} path - Path of resource. @@ -423,7 +826,7 @@ export class FiletreeReader implements IFiletreeReader { fileMeta: IFileMeta, ): Promise { try { - const lookup = await this.pathToLookup(path) + const lookup = await this.pathToLookup({ path }) const { file } = await this.jackalSigner.queries.fileTree.file(lookup) const { contents } = file const access = await this.checkViewAuthorization(file, false) @@ -445,43 +848,91 @@ export class FiletreeReader implements IFiletreeReader { /** * Write list of authorized readers of Filetree data. - * @param {string} path - Path of resource. - * @param {string[]} additionalViewers - Array of wallet addresses. + * @param {TSetMetaViewersOptions} options * @returns {Promise} */ - async setMetaViewers ( - path: string, - additionalViewers: string[], - ): Promise { + async setMetaViewers (options: TSetMetaViewersOptions): Promise { try { - const allViewers = [this.clientAddress, ...additionalViewers] - const lookup = await this.pathToLookup(path) + let lookup, curr, ulid + if ('path' in options) { + curr = options.path + ulid = this.ulidLookup(options.path) + lookup = await this.pathToLookup({ path: options.path }) + } else { + const hexAddress = await merklePath(`s/ulid/${options.ulid}`) + curr = options.ulid + ulid = options.ulid + lookup = { + address: hexAddress, + ownerAddress: await hashAndHexOwner(hexAddress, this.clientAddress), + } + } const { file } = await this.jackalSigner.queries.fileTree.file(lookup) - const { contents, trackingNumber } = file + let { contents, trackingNumber } = file const isCleartext = contents.includes('metaDataType') const access = await this.checkViewAuthorization(file, isCleartext) + if (access) { if (isCleartext) { + if (ulid in this.sharerCounts) { + const working = JSON.parse(contents) + let mH + if ('count' in working) { + mH = await FolderMetaHandler.create({ clone: working, ulid }) + } else { + mH = await FileMetaHandler.create({ clone: working }) + } + const sharers = await this.sharerCountRead(ulid) + mH.setSharerCount(sharers) + const ready = mH.export() + contents = JSON.stringify(ready) + } return { contents, - viewers: await this.createViewAccess(trackingNumber, allViewers), + viewers: await this.createViewAccess({ trackingNumber, viewers: options.viewers, ulid }), editors: await this.createEditAccess(trackingNumber), trackingNumber, } } else if (contents.length > 0) { const aes = await this.extractViewAccess(file) + if (aes[1]) { + throw new Error('Requires rekey') + } + if (ulid in this.sharerCounts) { + const safeContents = prepDecompressionForAmino(contents) + let decrypted = await cryptString(safeContents, aes[0], 'decrypt') + if (decrypted.startsWith('jklpc')) { + decrypted = safeDecompressData(decrypted) + } + const working = safeParseFileTree(decrypted) + let mH + if ('count' in working) { + mH = await FolderMetaHandler.create({ clone: working, ulid }) + } else { + mH = await FileMetaHandler.create({ clone: working as IFileMetaData }) + } + const sharers = await this.sharerCountRead(ulid) + mH.setSharerCount(sharers) + const ready = JSON.stringify(mH.export()) + contents = await compressEncryptString( + ready, + aes[0], + this.jackalClient.getIsLedger(), + ) + } return { contents, - viewers: await this.createViewAccess( + viewers: await this.createViewAccess({ trackingNumber, - allViewers, - aes, - ), + viewers: options.viewers, + aes: aes[0], + ulid, + }), editors: await this.createEditAccess(trackingNumber), trackingNumber, } } else { - throw new Error(`Empty contents for ${path}`) + throw new Error(`Empty contents for ${curr}`) } } else { throw new Error('Not Authorized') @@ -491,6 +942,54 @@ export class FiletreeReader implements IFiletreeReader { } } + async setContents (ulid: string, meta: TMetaDataSets): Promise { + try { + let lookup + const hexAddress = await merklePath(`s/ulid/${ulid}`) + lookup = { + address: hexAddress, + ownerAddress: await hashAndHexOwner(hexAddress, this.clientAddress), + } + const { file } = await this.jackalSigner.queries.fileTree.file(lookup) + let { contents, viewingAccess, editAccess, trackingNumber } = file + const isCleartext = contents.includes('metaDataType') + const access = await this.checkViewAuthorization(file, isCleartext) + if (access) { + if (isCleartext) { + return { + contents: JSON.stringify(meta), + viewers: viewingAccess, + editors: editAccess, + trackingNumber, + } + } else if (contents.length > 0) { + const aes = await this.extractViewAccess(file) + if (aes[1]) { + throw new Error('Requires rekey') + } + const ready = JSON.stringify(meta) + contents = await compressEncryptString( + ready, + aes[0], + this.jackalClient.getIsLedger(), + ) + return { + contents, + viewers: viewingAccess, + editors: editAccess, + trackingNumber, + } + } else { + throw new Error(`Empty contents for ${ulid}`) + } + } else { + throw new Error('Not Authorized') + } + } catch (err) { + throw warnError('filetreeReader setContents()', err) + } + } + /** * Look up AES keys for Filetree item by path. * @param {string} path - Path of resource. @@ -502,9 +1001,10 @@ export class FiletreeReader implements IFiletreeReader { ownerAddress: string, ): Promise { try { - const lookup = await this.pathToLookup(path, ownerAddress) + const lookup = await this.pathToLookup({ owner: ownerAddress, path }) const { file } = await this.jackalSigner.queries.fileTree.file(lookup) - return await this.extractViewAccess(file) + const aes = await this.extractViewAccess(file) + return aes[0] } catch (err) { throw warnError('filetreeReader loadKeysByPath()', err) } @@ -514,11 +1014,13 @@ export class FiletreeReader implements IFiletreeReader { * Look up AES keys for Filetree item by ulid. * @param {string} ulid - Ulid of resource. * @param {string} ownerAddress - Owner of resource. + * @param {string} [linkKey] - Key to unlock link shared data. * @returns {Promise} */ async loadKeysByUlid ( ulid: string, ownerAddress: string, + linkKey?: string, ): Promise { try { const hexAddress = await merklePath(`s/ulid/${ulid}`) @@ -527,12 +1029,44 @@ export class FiletreeReader implements IFiletreeReader { ownerAddress: await hashAndHexOwner(hexAddress, ownerAddress), } const { file } = await this.jackalSigner.queries.fileTree.file(lookup) - return await this.extractViewAccess(file) + const aes = await this.extractViewAccess(file, linkKey) + return aes[0] } catch (err) { throw warnError('filetreeReader loadKeysByUlid()', err) } } + /** + * + * @param {string} ulid + * @param {string} ownerAddress + * @returns {Promise} + */ + async livenessCheck (ulid: string, ownerAddress: string): Promise { + try { + const hexAddress = await merklePath(`s/ulid/${ulid}`) + const lookup = { + address: hexAddress, + ownerAddress: await hashAndHexOwner(hexAddress, ownerAddress), + } + const { file } = await this.jackalSigner.queries.fileTree.file(lookup) + let ready + try { + ready = await this.loadMeta({ file, ulid: '-1' }) + } catch { + ready = {} + } + const accepted = ['file', 'folder'] + if (ready.metaDataType && accepted.includes(ready.metaDataType)) { + return true + } else { + return false + } + } catch (err) { + throw warnError('filetreeReader livenessCheck()', err) + } + } + /** * * @returns {Promise} @@ -540,17 +1074,12 @@ export class FiletreeReader implements IFiletreeReader { async encodeProvisionFileTree (): Promise { try { const trackingNumber = crypto.randomUUID() - const forFileTree: DMsgProvisionFileTree = { + return { creator: this.clientAddress, - viewers: await this.createViewAccess(trackingNumber, [ - this.clientAddress, - ]), - editors: await this.createEditAccess(trackingNumber, [ - this.clientAddress, - ]), + viewers: await this.createViewAccess({ trackingNumber, viewers: { overwrite: [] } }), + editors: await this.createEditAccess(trackingNumber), trackingNumber: trackingNumber, } - return forFileTree } catch (err) { throw warnError('filetreeReader encodeProvisionFileTree()', err) } @@ -571,8 +1100,6 @@ export class FiletreeReader implements IFiletreeReader { try { const { additionalViewers = [], aes = null } = options const [hashParent, hashChild] = location - const allViewers = [this.clientAddress, ...additionalViewers] - const forFileTree: DMsgFileTreePostFile = { creator: this.clientAddress, account: await hashAndHex(this.clientAddress), @@ -591,19 +1118,19 @@ export class FiletreeReader implements IFiletreeReader { aes, this.jackalClient.getIsLedger(), ) - forFileTree.viewers = await this.createViewAccess( + forFileTree.viewers = await this.createViewAccess({ trackingNumber, - allViewers, + viewers: { overwrite: additionalViewers }, aes, - ) + }) forFileTree.editors = await this.createEditAccess(trackingNumber) forFileTree.trackingNumber = trackingNumber } else { forFileTree.contents = stringedMeta - forFileTree.viewers = await this.createViewAccess( + forFileTree.viewers = await this.createViewAccess({ trackingNumber, - allViewers, - ) + viewers: { overwrite: additionalViewers }, + }) forFileTree.editors = await this.createEditAccess(trackingNumber) forFileTree.trackingNumber = trackingNumber } @@ -615,19 +1142,19 @@ export class FiletreeReader implements IFiletreeReader { /** * - * @param {string} path + * @param {string} ulid * @param {TMerkleParentChild} location - * @param {string[]} additionalViewers + * @param {IViewerSetAddRemove} viewers * @returns {Promise} */ async encodeExistingPostFile ( - path: string, + ulid: string, location: TMerkleParentChild, - additionalViewers: string[], + viewers: IViewerSetAddRemove, ): Promise { try { const [hashParent, hashChild] = location - const ready = await this.setMetaViewers(path, additionalViewers) + const ready = await this.setMetaViewers({ ulid, viewers }) return { creator: this.clientAddress, account: await hashAndHex(this.clientAddress), @@ -640,6 +1167,93 @@ export class FiletreeReader implements IFiletreeReader { } } + async updateExistingPostFile ( + ulid: string, + location: TMerkleParentChild, + meta: TMetaDataSets, + ): Promise { + try { + const [hashParent, hashChild] = location + const ready = await this.setContents(ulid, meta) + return { + creator: this.clientAddress, + account: await hashAndHex(this.clientAddress), + hashParent, + hashChild, + ...ready, + } + } catch (err) { + throw warnError('filetreeReader updateExistingPostFile()', err) + } + } + + /** + * + * @param {IEncodeExistingRefOptions} options + * @returns {Promise} + */ + async encodeExistingRef (options: IEncodeExistingRefOptions): Promise { + try { + const { + location: [hashParent, hashChild], + ref, + ulid, + viewers, + ownerAddress = this.clientAddress, + } = options + const hexAddress = await merklePathPlusIndex(`s/ulid/${ulid}`, ref) + const lookup = { + address: hexAddress, + ownerAddress: await hashAndHexOwner(hexAddress, ownerAddress), + } + const { file } = await this.jackalSigner.queries.fileTree.file(lookup) + let { contents, trackingNumber } = file + const isCleartext = contents.includes('metaDataType') + const access = await this.checkViewAuthorization(file, isCleartext) + let ready + if (access) { + if (isCleartext) { + ready = { + contents, + viewers: await this.createViewAccess({ trackingNumber, viewers, index: ref, ulid }), + editors: await this.createEditAccess(trackingNumber), + trackingNumber, + } + } else if (contents.length > 0) { + const aes = await this.extractViewAccess(file) + if (aes[1]) { + throw new Error('Requires rekey') + } + ready = { + contents, + viewers: await this.createViewAccess({ + trackingNumber, + viewers, + aes: aes[0], + index: ref, + ulid, + }), + editors: await this.createEditAccess(trackingNumber), + trackingNumber, + } + } else { + throw new Error(`Empty contents`) + } + return { + creator: this.clientAddress, + account: await hashAndHex(ownerAddress), + hashParent, + hashChild, + ...ready, + } + } else { + throw new Error('Not Authorized') + } + } catch (err) { + throw warnError('filetreeReader encodeExistingRef()', err) + } + } + /** * * @param {string} receiverAddress @@ -650,11 +1264,11 @@ export class FiletreeReader implements IFiletreeReader { receiverAddress: string, aes: IAesBundle, ): Promise { - return await this.createViewAccess( - '', - [this.clientAddress, receiverAddress], + return await this.createViewAccess({ + trackingNumber: '', + viewers: { overwrite: [receiverAddress] }, aes, - ) + }) } /** @@ -678,10 +1292,11 @@ export class FiletreeReader implements IFiletreeReader { trackingNumber: '', } const aes = await this.extractViewAccess(bundle) - const msg = await cryptString(contents.msg, aes, 'decrypt', false) + const msg = await cryptString(contents.msg, aes[0], 'decrypt', false) return { sender: notificationData.from, receiver: notificationData.to, + time: notificationData.time, msg, } } catch (err) { @@ -691,37 +1306,74 @@ export class FiletreeReader implements IFiletreeReader { /** * - * @param {string} ulid - * @returns {Promise} + * @param {string} path + * @returns {Promise} + * @protected */ - async loadSharingFolder (ulid: string): Promise { + protected async loadSharerRefs (path: string): Promise { try { - const bundle = await this.loadMetaByUlid(ulid) - if (bundle.metaDataType === 'sharefolder') { - return await this.metaToSharingFolder(bundle) - } else { - throw new Error('No Match') + if (!this.sharerRefs[path]) { + this.sharerRefs[path] = {} + } + const meta = await this.loadMetaByPath(path) + const ulid = this.ulidLookup(path) + if ('sharerCount' in meta) { + const count = hexToInt(meta.sharerCount || '') + for (let i = 0; i < count; i++) { + try { + const loopMeta = await this.loadSharerRefMeta(ulid, i) + if (loopMeta.type !== 'null') { + this.sharerRefs[path][loopMeta.sharer] = i + } + } catch { + console.warn('Bad Sharer Ref') + } + } } + return Object.keys(this.sharerRefs[path]) } catch (err) { - throw warnError('filetreeReader loadSharingFolder()', err) + throw warnError('filetreeReader loadSharerRefs()', err) } } /** * - * @param {string} path - * @param {string} [owner] + * @param {string} sharer + * @returns {Promise} + * @protected + */ + protected async sharingToLookup (sharer: string): Promise { + const pool = this.yellowpages[this.clientAddress] + const path = `Shared/${sharer}` + if (!pool[path]) { + await this.pathToLookup({ owner: this.clientAddress, path: 'Shared' }) + } + await this.pathToLookupPostProcess( + path, + this.clientAddress, + pool[path], + ) + } + + /** + * + * @param {IPathToLookupOptions} options * @returns {Promise} * @protected */ protected async pathToLookup ( - path: string, - owner?: string, + options: IPathToLookupOptions, ): Promise { try { + const { + linkKey, + owner, + path, + } = options const ownerAddress = owner || this.clientAddress - if (path in this.yellowpages[ownerAddress]) { - return this.yellowpages[ownerAddress][path] + let pool = this.yellowpages[ownerAddress] || {} + if (path in pool) { + return pool[path] } else { switch (true) { case path.startsWith('/'): @@ -729,10 +1381,9 @@ export class FiletreeReader implements IFiletreeReader { case path.startsWith('s/'): throw new Error('Storage prefix not required') case !path.includes('/'): - if (this.yellowpages[ownerAddress][path]) { - return this.yellowpages[ownerAddress][path] + if (pool[path]) { + return pool[path] } else { - // console.log(path) const hexRootAddress = await merklePath(`s/ulid/${path}`) const rootLookup = { address: hexRootAddress, @@ -743,16 +1394,27 @@ export class FiletreeReader implements IFiletreeReader { } const { file } = await this.jackalSigner.queries.fileTree.file(rootLookup) - const lookup = (await this.decryptAndParseContents( - file, - )) as IRootLookupMetaData - // console.log(lookup) + let lookup + if (file.contents.includes('metaDataType')) { + lookup = safeParseFileTree(file.contents) + } else { + lookup = await this.decryptAndParseContents( + file, + path, + linkKey, + ) + } if (!(ownerAddress in this.ulidLeaves)) { this.ulidLeaves[ownerAddress] = {} } - this.ulidLeaves[ownerAddress][path] = lookup.ulid + if ('ulid' in lookup) { + this.ulidLeaves[ownerAddress][path] = lookup.ulid + } else { + this.ulidLeaves[ownerAddress][path] = path + } if (!(ownerAddress in this.yellowpages)) { this.yellowpages[ownerAddress] = {} + pool = this.yellowpages[ownerAddress] } await this.setYellowpages( path, @@ -762,22 +1424,24 @@ export class FiletreeReader implements IFiletreeReader { await this.pathToLookupPostProcess( path, ownerAddress, - this.yellowpages[ownerAddress][path], + pool[path], + linkKey, ) - return this.yellowpages[ownerAddress][path] + return pool[path] } default: - if (this.yellowpages[ownerAddress][path]) { - return this.yellowpages[ownerAddress][path] + if (pool[path]) { + return pool[path] } else { const parentPath = path.split('/').slice(0, -1).join('/') - await this.pathToLookup(parentPath, ownerAddress) + await this.pathToLookup({ linkKey, owner: ownerAddress, path: parentPath }) await this.pathToLookupPostProcess( path, ownerAddress, - this.yellowpages[ownerAddress][path], + pool[path], + linkKey, ) - return this.yellowpages[ownerAddress][path] + return pool[path] } } } @@ -786,11 +1450,106 @@ export class FiletreeReader implements IFiletreeReader { } } + /** + * + * @param {string} ulid + * @param {number} [index] + * @returns {Promise} + */ + protected async loadSharedWith (ulid: string, index?: number): Promise { + try { + let reference + if (typeof index !== 'undefined') { + reference = `${ulid}/${intToHex(index)}` + this.viewerShares[reference] = [] + return + } else { + reference = ulid + } + let file + try { + let hexAddress + if (typeof index !== 'undefined') { + hexAddress = await merklePathPlusIndex(`s/ulid/${ulid}`, index) + } else { + hexAddress = await merklePath(`s/ulid/${ulid}`) + } + const lookup = { + address: hexAddress, + ownerAddress: await hashAndHexOwner( + hexAddress, + this.clientAddress, + ), + } + const result = await this.jackalSigner.queries.fileTree.file(lookup) + file = result.file + } catch { + console.warn(`loadSharedWith(): ${reference} Not yet shared`) + this.viewerShares[reference] = [] + return + } + const { contents } = file + const isCleartext = contents.includes('metaDataType') + const access = await this.checkViewAuthorization(file, isCleartext) + if (access) { + let parsed + if (!isCleartext) { + parsed = await this.decryptAndParseContents(file, '-1') + } else { + parsed = JSON.parse(contents) as TMetaDataSets + } + if ('sharerCount' in parsed) { + const count = hexToInt(parsed.sharerCount || '') + for (let i = 0; i < count; i++) { + let file + try { + const hexSubAddress = await merklePath(`s/ulid/${ulid}/s-${intToHex(i)}`) + const subLookup = { + address: hexSubAddress, + ownerAddress: await hashAndHexOwner(hexSubAddress, this.clientAddress), + } + const sub = await this.jackalSigner.queries.fileTree.file(subLookup) + file = sub.file + } catch { + console.warn(`No match for ${reference} - ${i} of count ${parsed.sharerCount}`) + continue + } + const { contents } = file + const isCleartext = contents.includes('metaDataType') + const access = await this.checkViewAuthorization(file, isCleartext) + if (access) { + let parsed + if (!isCleartext) { + parsed = await this.decryptAndParseContents(file, '-1') + } else { + parsed = JSON.parse(contents) as TMetaDataSets + } + parsed = parsed as ISharerRefMetaData + if (reference in this.viewerShares) { + this.viewerShares[reference].push(parsed.sharer) + } else { + this.viewerShares[reference] = [] + this.viewerShares[reference].push(parsed.sharer) + } + } else { + throw new Error('Ref Not Authorized') + } + } + } + } else { + throw new Error('Not Authorized') + } + } catch (err) { + throw warnError('filetreeReader loadSharedWith()', err) + } + } + /** * * @param {string} path * @param {string} ownerAddress * @param {DQueryFileTreeFile} lookup + * @param {string} [linkKey] * @returns {Promise} * @protected */ @@ -798,33 +1557,40 @@ export class FiletreeReader implements IFiletreeReader { path: string, ownerAddress: string, lookup: DQueryFileTreeFile, + linkKey?: string, ): Promise { try { const { file } = await this.jackalSigner.queries.fileTree.file(lookup) const { contents } = file const isCleartext = contents.includes('metaDataType') - const access = await this.checkViewAuthorization(file, isCleartext) + const access = await this.checkViewAuthorization(file, isCleartext, linkKey) if (access) { - const parsed = !isCleartext - ? await this.decryptAndParseContents(file) - : (JSON.parse(contents) as TMetaDataSets) + const id = this.ulidLookup(path, ownerAddress) + let parsed + if (!isCleartext) { + parsed = await this.decryptAndParseContents(file, id, linkKey) + } else { + parsed = JSON.parse(contents) as TMetaDataSets + } if (parsed.metaDataType === 'folder') { const count = hexToInt(parsed.count) if (ownerAddress === this.clientAddress) { this.refCountSet(path, count) } - this.directoryLeaves[ownerAddress][path] = this.basicFolderShell() + if (!path.startsWith('Shared')) { + this.startDirectoryLeaf(path, id, ownerAddress) + } else { + this.sharingLeaves[path] = [] + } const post = [] for (let i = 0; i < count; i++) { - post.push(this.singleLoadMeta(path, ownerAddress, i)) + post.push(this.singleLoadMeta(path, ownerAddress, i, linkKey)) } const final = await Promise.allSettled(post) console.dir(final) } else { // do nothing } - } else { - throw new Error('Not Authorized') } } catch (err) { throw warnError('filetreeReader pathToLookupPostProcess()', err) @@ -836,50 +1602,129 @@ export class FiletreeReader implements IFiletreeReader { * @param {string} path * @param {string} ownerAddress * @param {number} index + * @param {string} [linkKey] * @returns {Promise} * @protected */ - protected async singleLoadMeta (path: string, ownerAddress: string, index: number): Promise { + protected async singleLoadMeta (path: string, ownerAddress: string, index: number, linkKey?: string): Promise { try { - const refMeta = await this.loadRefMeta( - this.ulidLeaves[ownerAddress][path], - index, - ) + const ulidPool = this.ulidLeaves[ownerAddress] + const refMeta = await this.loadRefMeta({ + ulid: ulidPool[path], + ref: index, + linkKey, + ownerAddress, + }) if (refMeta.metaDataType === 'nullref') { return } - const leaf = this.directoryLeaves[ownerAddress][path] - const meta = await this.loadMetaByUlid(refMeta.pointsTo) - if (meta.metaDataType === 'folder') { - const loopPath = `${path}/${meta.whoAmI}` - this.ulidLeaves[ownerAddress][loopPath] = refMeta.pointsTo - await this.setYellowpages( - loopPath, - ownerAddress, - refMeta.pointsTo, - ) - leaf.folders[index] = meta - } else if (meta.metaDataType === 'file') { - const loopPath = `${path}/${meta.fileMeta.name}` - this.ulidLeaves[ownerAddress][loopPath] = refMeta.pointsTo - await this.setYellowpages( - loopPath, - ownerAddress, - refMeta.pointsTo, - ) - leaf.files[index] = meta - } else if (meta.metaDataType === 'null') { - leaf.nulls[index] = await NullMetaHandler.create({ - location: this.ulidLookup(path), - refIndex: index, - ulid: refMeta.pointsTo, - }) + const meta = await this.loadMetaByUlid({ ulid: refMeta.pointsTo, userAddress: ownerAddress, linkKey }) + if (path.startsWith('Shared')) { + if (meta.metaDataType === 'folder') { + const loopPath = `${path}/${meta.whoAmI}` + ulidPool[loopPath] = refMeta.pointsTo + await this.setYellowpages( + loopPath, + ownerAddress, + refMeta.pointsTo, + ) + this.sharers[meta.whoAmI] = meta + if (!this.sharingLeaves[loopPath]) { + this.sharingLeaves[loopPath] = [] + } + } else if (meta.metaDataType === 'share') { + const loopPath = `${path}/${meta.name}` + ulidPool[loopPath] = refMeta.pointsTo + await this.setYellowpages( + loopPath, + ownerAddress, + refMeta.pointsTo, + ) + if (!this.sharingLeaves[path]) { + this.sharingLeaves[path] = [meta] + } else { + const compat = this.sharingLeaves[path] as IShareMetaData[] + compat.push(meta) + this.sharingLeaves[path] = compat + } + } + } else { + const leaf = this.readDirectoryLeafByPath(path, ownerAddress) + if (meta.metaDataType === 'folder') { + const loopPath = `${path}/${meta.whoAmI}` + ulidPool[loopPath] = refMeta.pointsTo + await this.setYellowpages( + loopPath, + ownerAddress, + refMeta.pointsTo, + ) + leaf.folders[index] = meta + } else if (meta.metaDataType === 'file') { + const loopPath = `${path}/${meta.fileMeta.name}` + ulidPool[loopPath] = refMeta.pointsTo + await this.setYellowpages( + loopPath, + ownerAddress, + refMeta.pointsTo, + ) + leaf.files[index] = meta + } else if (meta.metaDataType === 'null') { + leaf.nulls[index] = await NullMetaHandler.create({ + location: this.ulidLookup(path), + refIndex: index, + ulid: refMeta.pointsTo, + }) + } } } catch (err) { throw warnError('filetreeReader singleLoadMeta()', err) } } + /** + * + * @param {string} path + * @param {string} ulid + * @param {string} [ownerAddress] + * @protected + */ + protected startDirectoryLeaf (path: string, ulid: string, ownerAddress?: string): void { + const owner = ownerAddress || this.clientAddress + const shell = this.basicFolderShell() + if (!this.directoryLeaves[owner]) { + this.directoryLeaves[owner] = {} + } + if (!this.directoriesByUlid[owner]) { + this.directoriesByUlid[owner] = {} + } + this.directoryLeaves[owner][path] = shell + this.directoriesByUlid[owner][ulid] = shell + } + + /** + * + * @param {string} path + * @param {string} [ownerAddress] + * @returns {IChildMetaDataMap} + * @protected + */ + protected readDirectoryLeafByPath (path: string, ownerAddress?: string): IChildMetaDataMap { + const owner = ownerAddress || this.clientAddress + return this.directoryLeaves[owner][path] + } + + /** + * + * @param {string} ulid + * @param {string} [ownerAddress] + * @returns {IChildMetaDataMap} + * @protected + */ + protected readDirectoryLeafByUlid (ulid: string, ownerAddress?: string): IChildMetaDataMap { + const owner = ownerAddress || this.clientAddress + return this.directoriesByUlid[owner][ulid] + } + /** * * @param {string} path @@ -906,32 +1751,30 @@ export class FiletreeReader implements IFiletreeReader { /** * - * @param {DFile} file - * @param {[string, string]} [legacyPath] + * @param {ILoadMetaOptions} options * @returns {Promise} * @protected */ protected async loadMeta ( - file: DFile, - legacyPath?: [string, string], + options: ILoadMetaOptions, ): Promise { try { + const { file, ulid } = options const { contents } = file const isCleartext = contents.includes('metaDataType') - const access = await this.checkViewAuthorization(file, isCleartext) - + const access = await this.checkViewAuthorization(file, isCleartext, options.linkKey) if (access) { switch (true) { case isCleartext: return safeParseFileTree(contents) case contents.includes('legacyMerkles'): - if (!legacyPath) { + if (!options.legacyPath) { throw new Error('legacyMerkles requires legacyPath') } const { legacyMerkles } = safeParseLegacyMerkles(contents) - return this.loadLegacyMeta(legacyMerkles, legacyPath) + return this.loadLegacyMeta(legacyMerkles, options.legacyPath) case contents.length > 0: - return await this.decryptAndParseContents(file) + return await this.decryptAndParseContents(file, ulid, options.linkKey) default: throw new Error(`Empty contents`) } @@ -945,52 +1788,41 @@ export class FiletreeReader implements IFiletreeReader { /** * - * @param {IShareFolderMetaData} meta - * @returns {Promise} - * @protected - */ - protected async metaToSharingFolder ( - meta: IShareFolderMetaData, - ): Promise { - try { - const data: ISharedMetaDataMap = {} - const count = hexToInt(meta.count) - for (let i = 0; i < count; i++) { - const ref = await this.loadRefMeta(meta.pointsTo, i) - const found = await this.loadMetaByUlid(ref.pointsTo) - if (found.metaDataType === 'sharefolder') { - data[found.whoAmI] = await this.metaToSharingFolder(found) - } else if (found.metaDataType === 'share') { - data[found.label] = found - } else { - throw new Error('No Match') - } - } - return data - } catch (err) { - throw warnError('filetreeReader metaToSharingFolder()', err) - } - } - - /** - * - * @param {string} trackingNumber - * @param {string[]} viewers - * @param {IAesBundle} aes + * @param {ICreateViewAccessOptions} options * @returns {Promise} * @protected */ protected async createViewAccess ( - trackingNumber: string, - viewers: string[], - aes?: IAesBundle, + options: ICreateViewAccessOptions, ): Promise { try { - const viewAccess: Record = {} - for (let viewer of viewers) { + const { + index, + ulid, + trackingNumber, + viewers, + aes, + } = options + let groupViewers + let viewAccess = ulid ? await this.viewerLookup(ulid, index) : {} + if ('overwrite' in viewers) { + groupViewers = [...new Set([...viewers.overwrite, this.clientAddress])] + viewAccess = {} + } else { + groupViewers = [...new Set(viewers.add || [])] + for (let old of viewers.remove || []) { + const toPurge = await hashAndHexUserAccess('v', trackingNumber, old) + delete viewAccess[toPurge] + } + } + for (let viewer of groupViewers) { const entry = await hashAndHexUserAccess('v', trackingNumber, viewer) if (aes) { - if (viewer === this.clientAddress) { + if (!viewer.startsWith('jkl')) { + const key = await linkPrivateKey(viewer) + const pubKey = key.publicKey.toHex() + viewAccess[entry] = await aesToString(pubKey, aes) + } else if (viewer === this.clientAddress) { const pubKey = this.keyPair.publicKey.toHex() viewAccess[entry] = await aesToString(pubKey, aes) } else { @@ -1005,6 +1837,9 @@ export class FiletreeReader implements IFiletreeReader { viewAccess[entry] = 'public' } } + if (ulid) { + this.viewerSave(ulid, viewAccess) + } return JSON.stringify(viewAccess) } catch (err) { throw warnError('filetreeReader createViewAccess()', err) @@ -1014,17 +1849,17 @@ export class FiletreeReader implements IFiletreeReader { /** * * @param {string} trackingNumber - * @param {string[]} editors + * @param {string[]} [editors] * @returns {Promise} * @protected */ protected async createEditAccess ( trackingNumber: string, - editors?: string[], + editors: string[] = [], ): Promise { try { const editAccess: Record = {} - const finalEditors = editors || [this.clientAddress] + const finalEditors = [...new Set([...editors, this.clientAddress])] for (let editor of finalEditors) { const entry = await hashAndHexUserAccess('e', trackingNumber, editor) editAccess[entry] = 'valid' @@ -1039,10 +1874,11 @@ export class FiletreeReader implements IFiletreeReader { * * @param {DFile} data * @param {boolean} isPublic + * @param {string} [linkKey] * @returns {Promise} * @protected */ - protected async checkViewAuthorization (data: DFile, isPublic: boolean): Promise { + protected async checkViewAuthorization (data: DFile, isPublic: boolean, linkKey?: string): Promise { try { if (isPublic) { return isPublic @@ -1051,7 +1887,7 @@ export class FiletreeReader implements IFiletreeReader { const user = await hashAndHexUserAccess( 'v', data.trackingNumber, - this.clientAddress, + linkKey || this.clientAddress, ) return user in parsedAccess } @@ -1063,22 +1899,39 @@ export class FiletreeReader implements IFiletreeReader { /** * * @param {DFile} data + * @param {string} [linkKey] * @returns {Promise} * @protected */ - protected async extractViewAccess (data: DFile): Promise { + protected async extractViewAccess (data: DFile, linkKey?: string): Promise { try { const parsedAccess = JSON.parse(data.viewingAccess) const user = await hashAndHexUserAccess( 'v', data.trackingNumber, - this.clientAddress, + linkKey || this.clientAddress, ) + let key + if (linkKey) { + key = await linkPrivateKey(linkKey) + } else { + key = this.keyPair + } if (user in parsedAccess) { if (parsedAccess[user] === 'public') { - return await genAesBundle() + return [await genAesBundle(), false] } else { - return await stringToAes(this.keyPair, parsedAccess[user]) + try { + const parsed = await stringToAes(key, parsedAccess[user]) + return [parsed, false] + } catch { + try { + const parsed = await stringToAes(this.defaultKeyPair, parsedAccess[user]) + return [parsed, true] + } catch (err) { + throw err + } + } } } else { throw new Error('Not an authorized Viewer') @@ -1111,18 +1964,22 @@ export class FiletreeReader implements IFiletreeReader { /** * Convert DFile from filetree to metadata. * @param {DFile} file - Filetree file. + * @param {string} id * @returns {Promise} * @protected */ - protected async loadFolderMeta (file: DFile): Promise { + protected async loadFolderMeta (file: DFile, id: string): Promise { try { const { contents } = file const isCleartext = contents.includes('metaDataType') const access = await this.checkViewAuthorization(file, isCleartext) if (access) { - const parsed = !isCleartext - ? await this.decryptAndParseContents(file) - : safeParseFileTree(contents) + let parsed + if (!isCleartext) { + parsed = await this.decryptAndParseContents(file, id) + } else { + parsed = safeParseFileTree(contents) + } if (parsed.metaDataType === 'folder') { return parsed } else { @@ -1139,15 +1996,20 @@ export class FiletreeReader implements IFiletreeReader { /** * * @param {DFile} data - * @returns {Promise>} + * @param {string} id + * @param {string} [linkKey] + * @returns {Promise} * @protected */ - protected async decryptAndParseContents (data: DFile): Promise { + protected async decryptAndParseContents (data: DFile, id: string, linkKey?: string): Promise { try { const safe = prepDecompressionForAmino(data.contents) - const aes = await this.extractViewAccess(data) - let decrypted = await cryptString(safe, aes, 'decrypt') - if (decrypted.startsWith('jklpc1')) { + const aes = await this.extractViewAccess(data, linkKey) + if (id !== '-1' && aes[1]) { + this.conversionQueue = [...new Set([...this.conversionQueue, id])] + } + let decrypted = await cryptString(safe, aes[0], 'decrypt') + if (decrypted.startsWith('jklpc')) { decrypted = safeDecompressData(decrypted) } return safeParseFileTree(decrypted) diff --git a/src/classes/index.ts b/src/classes/index.ts index 79599622..f6f7e539 100644 --- a/src/classes/index.ts +++ b/src/classes/index.ts @@ -1,4 +1,8 @@ export * from '@/classes/clientHandler' +export * from '@/classes/encodingHandler' +export * from '@/classes/filetreeReader' +export * from '@/classes/metaHandlers' +export * from '@/classes/mnemonicSigner' export * from '@/classes/mnemonicWallet' export * from '@/classes/oracleHandler' export * from '@/classes/rnsHandler' diff --git a/src/classes/metaHandlers.ts b/src/classes/metaHandlers.ts index 8656ab87..92eba8f3 100644 --- a/src/classes/metaHandlers.ts +++ b/src/classes/metaHandlers.ts @@ -1,7 +1,7 @@ import { Merkletree } from '@jackallabs/dogwood-tree' import { ulid } from 'ulid' import { chunkSize } from '@/utils/globalDefaults' -import { intToHex, uintArrayToString } from '@/utils/converters' +import { hexToInt, intToHex, uintArrayToString } from '@/utils/converters' import { bufferToHex } from '@/utils/hash' import { IFileMeta, @@ -9,7 +9,6 @@ import { IFileMetaFoundationalData, IFileMetaHandler, IFolderMetaData, - IFolderMetaDataSource, IFolderMetaFoundationalData, IFolderMetaHandler, INullMetaData, @@ -17,18 +16,25 @@ import { INullMetaFoundationalData, INullMetaHandler, INullRefMetaData, + INullSharerRefMetaData, IRefMetaData, - ISharedFolderMetaDataSource, - ISharedFolderMetaFoundationalData, - IShareFolderMetaData, - IShareFolderMetaHandler, + IRnsMetaData, + IRnsMetaFoundationalData, + IRnsMetaHandler, IShareMetaData, IShareMetaDataSource, IShareMetaFoundationalData, IShareMetaHandler, - IShareRefMetaData, + ISharerMetaDataSource, + ISharerMetaFoundationalData, + ISharerMetaHandler, + ISharerRefMetaData, TFileMetaDataSource, + TFolderMetaDataSource, + TRnsMetaDataSource, + TSharerType, } from '@/interfaces' +import { warnError } from '@/utils/misc' export class NullMetaHandler implements INullMetaHandler { protected readonly location: string @@ -115,6 +121,18 @@ export class NullMetaHandler implements INullMetaHandler { pointsTo: '', } } + + exportSharerRef (): INullSharerRefMetaData { + return { + location: `${this.location}/s-${intToHex(this.refIndex)}`, + merkleHex: '', + metaDataType: 'nullsharerref', + sharer: '', + type: 'null', + when: 0, + pointsTo: '', + } + } } export class FolderMetaHandler implements IFolderMetaHandler { @@ -122,6 +140,7 @@ export class FolderMetaHandler implements IFolderMetaHandler { protected description: string protected location: string protected refIndex: number + protected sharerCount: number protected readonly ulid: string protected whoAmI: string @@ -130,25 +149,38 @@ export class FolderMetaHandler implements IFolderMetaHandler { this.description = source.description this.location = source.location this.refIndex = source.refIndex + this.sharerCount = source.sharerCount this.ulid = source.ulid this.whoAmI = source.whoAmI } /** * - * @param {IFolderMetaDataSource} source + * @param {TFolderMetaDataSource} source * @returns {Promise} */ - static async create (source: IFolderMetaDataSource) { - const rdy: IFolderMetaFoundationalData = { - count: source.count, - description: source.description || '', - location: `s/ulid/${source.location}`, - refIndex: source.refIndex || 0, - ulid: source.ulid || ulid(), - whoAmI: source.name, + static async create (source: TFolderMetaDataSource) { + if ('clone' in source) { + const shortcut: IFolderMetaFoundationalData = { + ...source.clone, + count: hexToInt(source.clone.count), + sharerCount: hexToInt(source.clone.sharerCount || ''), + ulid: source.ulid, + refIndex: source.refIndex || 0, + } + return new FolderMetaHandler(shortcut) + } else { + const rdy: IFolderMetaFoundationalData = { + count: source.count, + description: source.description || '', + location: `s/ulid/${source.location}`, + refIndex: source.refIndex || 0, + sharerCount: source.sharerCount || 0, + ulid: source.ulid || ulid(), + whoAmI: source.name, + } + return new FolderMetaHandler(rdy) } - return new FolderMetaHandler(rdy) } /** @@ -177,6 +209,32 @@ export class FolderMetaHandler implements IFolderMetaHandler { return this.count } + /** + * + * @param {number} value + * @returns {number} + */ + addAndReturnSharerCount (value: number): number { + this.sharerCount += value + return this.sharerCount + } + + /** + * + * @param {number} count + */ + setSharerCount (count: number): void { + this.sharerCount = count + } + + /** + * + * @returns {number} + */ + getSharerCount (): number { + return this.sharerCount + } + /** * * @param {number} refIndex @@ -236,6 +294,7 @@ export class FolderMetaHandler implements IFolderMetaHandler { location: this.location, merkleHex: '', metaDataType: 'folder', + sharerCount: intToHex(this.sharerCount), whoAmI: this.whoAmI, } } @@ -262,6 +321,7 @@ export class FileMetaHandler implements IFileMetaHandler { protected readonly merkleMem: string protected readonly merkleRoot: Uint8Array protected refIndex: number + protected sharerCount: number protected readonly thumbnail: string protected readonly ulid: string @@ -273,6 +333,7 @@ export class FileMetaHandler implements IFileMetaHandler { this.merkleMem = source.merkleMem this.merkleRoot = source.merkleRoot this.refIndex = source.refIndex + this.sharerCount = source.sharerCount this.thumbnail = source.thumbnail this.ulid = source.ulid } @@ -286,7 +347,8 @@ export class FileMetaHandler implements IFileMetaHandler { if ('clone' in source) { const shortcut: IFileMetaFoundationalData = { ...source.clone, - refIndex: source.refIndex || 0, + refIndex: source.refIndex || -1, + sharerCount: hexToInt(source.clone.sharerCount || ''), } return new FileMetaHandler(shortcut) } else { @@ -298,6 +360,7 @@ export class FileMetaHandler implements IFileMetaHandler { merkleMem: '', merkleRoot: new Uint8Array(), refIndex: source.refIndex || 0, + sharerCount: source.sharerCount || 0, thumbnail: source.thumbnail || '', ulid: source.ulid || ulid(), } @@ -343,6 +406,32 @@ export class FileMetaHandler implements IFileMetaHandler { return intToHex(this.refIndex) } + /** + * + * @param {number} value + * @returns {number} + */ + addAndReturnSharerCount (value: number): number { + this.sharerCount += value + return this.sharerCount + } + + /** + * + * @param {number} count + */ + setSharerCount (count: number): void { + this.sharerCount = count + } + + /** + * + * @returns {number} + */ + getSharerCount (): number { + return this.sharerCount + } + /** * * @returns {string} @@ -380,6 +469,7 @@ export class FileMetaHandler implements IFileMetaHandler { merkleMem: this.merkleMem, merkleRoot: this.merkleRoot, metaDataType: 'file', + sharerCount: intToHex(this.sharerCount), thumbnail: this.thumbnail, ulid: this.ulid, } @@ -399,53 +489,44 @@ export class FileMetaHandler implements IFileMetaHandler { } } -export class ShareFolderMetaHandler implements IShareFolderMetaHandler { - protected count: number +export class ShareMetaHandler implements IShareMetaHandler { + protected readonly isFile: boolean protected readonly location: string + protected readonly name: string + protected readonly owner: string + protected readonly pointsTo: string + protected readonly received: number protected refIndex: number protected readonly ulid: string - protected readonly whoAmI: string - protected constructor (source: ISharedFolderMetaFoundationalData) { - this.count = source.count + protected constructor (source: IShareMetaFoundationalData) { + this.isFile = source.isFile this.location = source.location + this.name = source.name + this.owner = source.owner + this.pointsTo = source.pointsTo + this.received = source.received this.refIndex = source.refIndex this.ulid = source.ulid - this.whoAmI = source.whoAmI } /** * - * @param {ISharedFolderMetaDataSource} source - * @returns {Promise} + * @param {IShareMetaDataSource} source + * @returns {Promise} */ - static async create (source: ISharedFolderMetaDataSource) { - const rdy: ISharedFolderMetaFoundationalData = { - count: source.count, + static async create (source: IShareMetaDataSource) { + const rdy: IShareMetaFoundationalData = { + isFile: source.isFile, location: `s/ulid/${source.location}`, + name: source.name, + owner: source.owner, + pointsTo: source.pointsTo, + received: source.received, refIndex: source.refIndex || 0, ulid: source.ulid || ulid(), - whoAmI: source.name, } - return new ShareFolderMetaHandler(rdy) - } - - /** - * - * @param {number} value - * @returns {number} - */ - addAndReturnCount (value: number): number { - this.count += value - return this.count - } - - /** - * - * @returns {number} - */ - getCount (): number { - return this.count + return new ShareMetaHandler(rdy) } /** @@ -472,6 +553,14 @@ export class ShareFolderMetaHandler implements IShareFolderMetaHandler { return intToHex(this.refIndex) } + /** + * + * @returns {boolean} + */ + getIsFile (): boolean { + return this.isFile + } + /** * * @returns {string} @@ -490,54 +579,68 @@ export class ShareFolderMetaHandler implements IShareFolderMetaHandler { /** * - * @returns {IShareFolderMetaData} + * @returns {IShareMetaData} */ - export (): IShareFolderMetaData { + export (): IShareMetaData { + return { + isFile: this.isFile, + location: this.location, + merkleHex: '', + metaDataType: 'share', + name: this.name, + owner: this.owner, + pointsTo: this.pointsTo, + received: this.received, + ulid: this.ulid, + } + } + + /** + * + * @returns {IRefMetaData} + */ + exportRef (): IRefMetaData { return { - count: intToHex(this.count), - description: '', location: `${this.location}/${intToHex(this.refIndex)}`, merkleHex: '', - metaDataType: 'sharefolder', + metaDataType: 'ref', pointsTo: this.ulid, - whoAmI: this.whoAmI, } } } -export class ShareMetaHandler implements IShareMetaHandler { - protected label: string +export class SharerMetaHandler implements ISharerMetaHandler { protected readonly location: string - protected readonly owner: string - protected readonly pointsTo: string + protected readonly sharer: string + protected readonly type: TSharerType + protected readonly when: number protected refIndex: number protected readonly ulid: string - protected constructor (source: IShareMetaFoundationalData) { - this.label = source.label + protected constructor (source: ISharerMetaFoundationalData) { this.location = source.location - this.owner = source.owner - this.pointsTo = source.pointsTo + this.sharer = source.sharer + this.type = source.type + this.when = source.when this.refIndex = source.refIndex this.ulid = source.ulid } /** * - * @param {IShareMetaDataSource} source - * @returns {Promise} + * @param {ISharerMetaDataSource} source + * @returns {Promise} */ - static async create (source: IShareMetaDataSource) { - const rdy: IShareMetaFoundationalData = { - label: source.label, + static async create (source: ISharerMetaDataSource) { + const rdy: ISharerMetaFoundationalData = { location: `s/ulid/${source.location}`, - owner: source.owner, - pointsTo: source.pointsTo, + sharer: source.sharer, + type: source.type || 'user', + when: Date.now(), refIndex: source.refIndex || 0, ulid: source.ulid || ulid(), } - - return new ShareMetaHandler(rdy) + return new SharerMetaHandler(rdy) } /** @@ -564,22 +667,6 @@ export class ShareMetaHandler implements IShareMetaHandler { return intToHex(this.refIndex) } - /** - * - * @param {string} label - */ - setLabel (label: string): void { - this.label = label - } - - /** - * - * @returns {string} - */ - getLabel (): string { - return this.label - } - /** * * @returns {string} @@ -598,29 +685,86 @@ export class ShareMetaHandler implements IShareMetaHandler { /** * - * @returns {IShareMetaData} + * @returns {ISharerRefMetaData} */ - export (): IShareMetaData { + exportSharerRef (): ISharerRefMetaData { return { - label: '', - location: this.location, + location: `${this.location}/s-${intToHex(this.refIndex)}`, merkleHex: '', - metaDataType: 'share', - owner: this.owner, - pointsTo: this.pointsTo, + metaDataType: 'sharerref', + sharer: this.sharer, + type: this.type, + when: this.when, + pointsTo: this.ulid, + } + } +} + +export class RnsMetaHandler implements IRnsMetaHandler { + protected readonly avatar: string + protected readonly bio: string + protected readonly discord: string + protected readonly extensions: any + protected readonly telegram: string + protected readonly thumbnail: string + protected readonly twitter: string + protected readonly website: string + + protected constructor (source: IRnsMetaFoundationalData) { + this.avatar = source.avatar + this.bio = source.bio + this.discord = source.discord + this.extensions = source.extensions + this.telegram = source.telegram + this.thumbnail = source.thumbnail + this.twitter = source.twitter + this.website = source.website + } + + /** + * + * @param {TRnsMetaDataSource} [source] + * @returns {Promise} + */ + static async create (source: TRnsMetaDataSource = {}) { + try { + let data + if ('clone' in source) { + data = JSON.parse(source.clone) + } else { + data = source + } + const rdy: IRnsMetaFoundationalData = { + avatar: data.avatar || '', + bio: data.bio || '', + discord: data.discord || '', + extensions: data.extensions || '', + telegram: data.telegram || '', + thumbnail: data.thumbnail || '', + twitter: data.twitter || '', + website: data.website || '', + } + return new RnsMetaHandler(rdy) + } catch (err) { + throw warnError('RnsMetaHandler create()', err) } } /** * - * @returns {IShareRefMetaData} + * @returns {IRnsMetaData} */ - exportRef (): IShareRefMetaData { + export (): IRnsMetaData { return { - location: `${this.location}/${intToHex(this.refIndex)}`, - merkleHex: '', - metaDataType: 'shareref', - pointsTo: this.ulid, + avatar: this.avatar, + bio: this.bio, + discord: this.discord, + extensions: this.extensions, + metaDataType: 'rns', + telegram: this.telegram, + thumbnail: this.thumbnail, + twitter: this.twitter, + website: this.website, } } } diff --git a/src/classes/mnemonicSigner.ts b/src/classes/mnemonicSigner.ts new file mode 100644 index 00000000..b889ef88 --- /dev/null +++ b/src/classes/mnemonicSigner.ts @@ -0,0 +1,25 @@ +import { AccountData, DirectSignResponse, OfflineDirectSigner } from '@cosmjs/proto-signing' +import { AminoSignResponse, OfflineAminoSigner, StdSignDoc } from '@cosmjs/amino' +import { IMnemonicSigner, ISignDoc } from '@/interfaces' + +export class MnemonicSigner implements IMnemonicSigner { + private readonly directSigner: OfflineDirectSigner + private readonly aminoSigner: OfflineAminoSigner + + constructor (directSigner: OfflineDirectSigner, aminoSigner: OfflineAminoSigner) { + this.directSigner = directSigner + this.aminoSigner = aminoSigner + } + + signAmino (signerAddress: string, signDoc: StdSignDoc): Promise { + return this.aminoSigner.signAmino(signerAddress, signDoc) + } + + signDirect (signerAddress: string, signDoc: ISignDoc): Promise { + return this.directSigner.signDirect(signerAddress, signDoc) + } + + getAccounts (): Promise { + return this.directSigner.getAccounts() + } +} diff --git a/src/classes/mnemonicWallet.ts b/src/classes/mnemonicWallet.ts index b56fa59c..3281d02b 100644 --- a/src/classes/mnemonicWallet.ts +++ b/src/classes/mnemonicWallet.ts @@ -3,6 +3,7 @@ import { Secp256k1HdWallet } from '@cosmjs/amino' import { DirectSecp256k1HdWallet } from '@cosmjs/proto-signing' import type { IMnemonicWallet } from '@/interfaces/classes' import { TMergedSigner } from '@jackallabs/jackal.js-protos' +import { MnemonicSigner } from '@/classes/mnemonicSigner' export class MnemonicWallet implements IMnemonicWallet { private readonly mergedSigner: TMergedSigner @@ -35,10 +36,7 @@ export class MnemonicWallet implements IMnemonicWallet { /* Destroy mnemonic */ mnemonic = '' - const mergedSigner = { - ...aminoWallet, - ...directWallet, - } as TMergedSigner + const mergedSigner = new MnemonicSigner(directWallet, aminoWallet) const { address } = (await mergedSigner.getAccounts())[0] return new MnemonicWallet(mergedSigner, address) } @@ -65,6 +63,12 @@ export class MnemonicWallet implements IMnemonicWallet { * @returns {Promise} - Resulting AminoSignResponse.signature. */ async signArbitrary (message: string): Promise { + let data + if (typeof window !== 'undefined') { + data = btoa(message) + } else { + data = Buffer.from(message).toString('base64') + } const signed = await this.mergedSigner.signAmino(this.address, { chain_id: '', account_number: '0', @@ -78,7 +82,7 @@ export class MnemonicWallet implements IMnemonicWallet { type: 'sign/MsgSignData', value: { signer: this.address, - data: btoa(message), + data, }, }, ], @@ -86,4 +90,4 @@ export class MnemonicWallet implements IMnemonicWallet { }) return signed.signature } -} +} \ No newline at end of file diff --git a/src/classes/rnsHandler.ts b/src/classes/rnsHandler.ts index 527069f7..8ca63dcc 100644 --- a/src/classes/rnsHandler.ts +++ b/src/classes/rnsHandler.ts @@ -25,14 +25,15 @@ import { IPageRequest, IRegisterOptions, IRemoveSubRnsOptions, - IRnsData, IRnsHandler, + IRnsMetaData, ISetNewPrimaryOptions, ITransferOptions, IUpdateOptions, IWrappedEncodeObject, } from '@/interfaces' -import type { TAddressPrefix } from '@/types' +import { INameWithMeta, TAddressPrefix } from '@/types' +import { RnsMetaHandler } from '@/classes/metaHandlers' export class RnsHandler implements IRnsHandler { protected readonly jackalClient: IClientHandler @@ -182,6 +183,38 @@ export class RnsHandler implements IRnsHandler { } } + /** + * Get specifics on target RNS name with parsed meta data. + * @param {string} name - RNS name to check. + * @returns {Promise} + */ + async getNameMetaDetails (name: string): Promise { + try { + const result = await this.jackalClient + .getQueries() + .rns.name({ name: this.sanitizeRns(name) }) + const subdomains = [] + for (let one of result.name.subdomains) { + const meta = await RnsMetaHandler.create({ clone: one.data }) + const loop: INameWithMeta = { + ...result.name, + data: meta.export(), + subdomains: [], + } + subdomains.push(loop) + } + const meta = await RnsMetaHandler.create({ clone: result.name.data }) + const final: INameWithMeta = { + ...result.name, + data: meta.export(), + subdomains, + } + return final + } catch (err) { + throw warnError('rnsHandler getNameDetails()', err) + } + } + /** * Find primary RNS for target wallet address. Defaults to own jkl address. * @param {string} address - Jackal Bech32 address to check. @@ -199,6 +232,23 @@ export class RnsHandler implements IRnsHandler { } } + /** + * + * @param {string} name + * @returns {Promise} + */ + async possibleRnsToJklAddress (name: string): Promise { + try { + if (bech32.checkIfValid(name)) { + return name + } else { + return await this.rnsToAddress(name) + } + } catch (err) { + throw warnError('rnsHandler possibleRnsToJklAddress()', err) + } + } + /** * Convert RNS address to wallet address. * @param {string} name - RNS name to convert. @@ -417,8 +467,9 @@ export class RnsHandler implements IRnsHandler { throw new Error(signerNotEnabled('RnsHandler', 'register')) } try { + const meta = await RnsMetaHandler.create(options.data) const msgs: IWrappedEncodeObject[] = [{ - encodedObject: this.makeRegisterMsg(options.rns, !!options.setAsPrimary, options.yearsToRegister, options.data), + encodedObject: this.makeRegisterMsg(options.rns, !!options.setAsPrimary, options.yearsToRegister, meta.export()), modifier: 0, }] if (options?.chain) { @@ -444,8 +495,9 @@ export class RnsHandler implements IRnsHandler { throw new Error(signerNotEnabled('RnsHandler', 'update')) } try { + const meta = await RnsMetaHandler.create(options.data) const msgs: IWrappedEncodeObject[] = [{ - encodedObject: this.makeUpdateMsg(options.rns, options.data), + encodedObject: this.makeUpdateMsg(options.rns, meta.export()), modifier: 0, }] if (options?.chain) { @@ -498,8 +550,9 @@ export class RnsHandler implements IRnsHandler { throw new Error(signerNotEnabled('RnsHandler', 'addSubRns')) } try { + const meta = await RnsMetaHandler.create(options.data) const msgs: IWrappedEncodeObject[] = [{ - encodedObject: this.makeAddRecordMsg(options.rns, options.linkedWallet, options.subRns, options.data), + encodedObject: this.makeAddRecordMsg(options.rns, options.linkedWallet, options.subRns, meta.export()), modifier: 0, }] if (options?.chain) { @@ -690,7 +743,7 @@ export class RnsHandler implements IRnsHandler { * @param {string} rns - RNS address to register. * @param {boolean} primary - If RNS should be set as primary. * @param {number} yearsToRegister - Duration to register for in years. - * @param {IRnsData} [data] - Optional object to include in data field. + * @param {IRnsMetaData} data - Metadata object to include in data field. * @returns {DEncodeObject} * @protected */ @@ -698,28 +751,32 @@ export class RnsHandler implements IRnsHandler { rns: string, primary: boolean, yearsToRegister: number, - data?: IRnsData, + data: IRnsMetaData, ): DEncodeObject { if (!this.signingClient) { throw new Error(signerNotEnabled('RnsHandler', 'makeRegisterMsg')) } - return this.signingClient.txLibrary.rns.msgRegisterName({ - creator: this.jackalClient.getJackalAddress(), - name: this.sanitizeRns(rns), - years: Number(yearsToRegister) || 1, - data: this.standardizeDataContents(data), - setPrimary: primary, - }) + try { + return this.signingClient.txLibrary.rns.msgRegisterName({ + creator: this.jackalClient.getJackalAddress(), + name: this.sanitizeRns(rns), + years: Number(yearsToRegister) || 1, + data: this.standardizeDataContents(data), + setPrimary: primary, + }) + } catch (err) { + throw warnError('rnsHandler makeRegisterMsg()', err) + } } /** * Create Msg to update RNS metadata. * @param {string} rns - RNS address to update. - * @param {IRnsData} [data] - Optional object to replace existing contents of data field. + * @param {IRnsMetaData} data - Optional object to replace existing contents of data field. * @returns {DEncodeObject} * @protected */ - protected makeUpdateMsg (rns: string, data?: IRnsData): DEncodeObject { + protected makeUpdateMsg (rns: string, data: IRnsMetaData): DEncodeObject { if (!this.signingClient) { throw new Error(signerNotEnabled('RnsHandler', 'makeUpdateMsg')) } @@ -753,7 +810,7 @@ export class RnsHandler implements IRnsHandler { * @param {string} rns - RNS to transfer. * @param {string} linkedWallet - Jackal address to link new sub RNS to. * @param {string} subRns - Sub RNS to create. - * @param {IRnsData} [data] - Optional object to include in sub RNS data field. + * @param {IRnsMetaData} data - Optional object to include in sub RNS data field. * @returns {DEncodeObject} * @protected */ @@ -761,7 +818,7 @@ export class RnsHandler implements IRnsHandler { rns: string, linkedWallet: string, subRns: string, - data?: IRnsData, + data: IRnsMetaData, ): DEncodeObject { if (!this.signingClient) { throw new Error(signerNotEnabled('RnsHandler', 'makeAddRecordMsg')) @@ -818,23 +875,22 @@ export class RnsHandler implements IRnsHandler { } /** - * Enforces data field is valid JSON with fallback of '{}'. Used by: + * Enforces data field is valid JSON. Used by: * - makeRegisterMsg() * - makeUpdateMsg() * - makeAddRecordMsg() - * @param {IRnsData} [data] + * @param {IRnsMetaData} data * @returns {string} * @protected */ - protected standardizeDataContents (data: IRnsData = {}): string { + protected standardizeDataContents (data: IRnsMetaData): string { try { return JSON.stringify(data) } catch (err) { console.error('standardizeDataContents() failed') console.log('data') console.log(data) - console.error(err) - return '{}' + throw err } } } diff --git a/src/classes/sharedUpdater.ts b/src/classes/sharedUpdater.ts deleted file mode 100644 index 7a4d97ae..00000000 --- a/src/classes/sharedUpdater.ts +++ /dev/null @@ -1,280 +0,0 @@ -import { findNestedContentsCount, findNestedSharedDepth, warnError } from '@/utils/misc' -import { ShareFolderMetaHandler, ShareMetaHandler } from '@/classes/metaHandlers' -import { sharedPath } from '@/utils/globalDefaults' -import { EncodingHandler } from '@/classes/encodingHandler' -import { genAesBundle } from '@/utils/crypt' -import type { PrivateKey } from 'eciesjs' -import type { THostSigningClient, TJackalSigningClient } from '@jackallabs/jackal.js-protos' -import { - IClientHandler, - INotificationRecord, - ISharedUpdater, - IShareFolderMetaHandler, - IShareMetaHandler, - IWrappedEncodeObject, -} from '@/interfaces' -import type { TSharedRootMetaDataMap } from '@/types' - -export class SharedUpdater extends EncodingHandler implements ISharedUpdater { - protected readonly keyPair: PrivateKey - protected readonly shared: TSharedRootMetaDataMap - - protected readonly notifications: INotificationRecord[] - protected readonly existingPaths: Record - protected readonly addedSharer: Record - protected readonly addedMiddle: Record - protected readonly addedShared: Record - - constructor ( - client: IClientHandler, - jackalSigner: TJackalSigningClient, - hostSigner: THostSigningClient, - keyPair: PrivateKey, - shared: TSharedRootMetaDataMap, - ) { - super(client, jackalSigner, hostSigner, keyPair, client.getJackalAddress()) - this.keyPair = keyPair - this.shared = shared - - this.notifications = [] - this.existingPaths = {} - this.addedSharer = {} - this.addedMiddle = {} - this.addedShared = {} - } - - /** - * Fetch notifications from chain. - * @returns {Promise} - Number of new notifications found. - */ - async fetchNotifications (): Promise { - try { - const raw = - await this.jackalSigner.queries.notifications.allNotificationsByAddress( - { to: this.jklAddress }, - ) - for (let one of raw.notifications) { - const rec = await this.reader.readShareNotification(one) - this.notifications.push(rec) - } - return this.notifications.length - } catch (err) { - throw warnError('SharedUpdater fetchNotifications()', err) - } - } - - /** - * Core process of sharing system. - * @returns {Promise} - */ - async digest (): Promise { - try { - for (let one of this.notifications) { - if (one.msg.startsWith('file|')) { - const msgTrimmed = one.msg.slice(5) - const chunked = msgTrimmed.replace('s/Home/', '').split('/') - - await this.maybeMakeSharer(one.sender) - - const name = chunked.pop() as string - let finalName = '' - if (chunked.length > 0) { - const depth = findNestedSharedDepth( - this.shared[one.sender], - chunked, - ) - const subChunked = chunked.slice(0, depth) - const size = findNestedContentsCount( - this.shared[one.sender], - subChunked, - ) - - const parentName = [ - 's', - sharedPath, - one.sender, - ...subChunked, - ].join('/') - if (parentName in this.existingPaths) { - this.existingPaths[parentName].addAndReturnCount(1) - } else { - this.existingPaths[parentName] = - await ShareFolderMetaHandler.create({ - count: size + 1, - location: '', - name: '', - }) - } - - const fresh = this.makeFreshFolders(one.sender, chunked, depth) - for (let path of fresh) { - if (path in this.addedMiddle) { - this.addedMiddle[path].addAndReturnCount(1) - } else { - this.addedMiddle[path] = await ShareFolderMetaHandler.create({ - count: 1, - location: '', - name: '', - refIndex: this.findRefIndex(path), - }) - } - } - finalName = ['s', sharedPath, one.sender, ...chunked, name].join( - '/', - ) - } else { - finalName = ['s', sharedPath, one.sender, name].join('/') - } - this.addedShared[finalName] = await ShareMetaHandler.create({ - label: '', - location: '', - pointsTo: msgTrimmed, - owner: one.sender, - refIndex: this.findRefIndex(finalName), - }) - } - } - - const msgQueue = await this.buildMsgQueue() - if (msgQueue.length > 0) { - const postBroadcast = - await this.jackalClient.broadcastAndMonitorMsgs(msgQueue) - console.log('resp:', postBroadcast.txResponse) - } - } catch (err) { - throw warnError('SharedUpdater digest()', err) - } - } - - /** - * Check if sharer exists and create if not found. - * @param {string} sender - Sharer to look for. - * @returns {Promise} - * @protected - */ - protected async maybeMakeSharer (sender: string): Promise { - const path = `s/${sharedPath}/${sender}` - if (path in this.existingPaths) { - this.existingPaths[path].addAndReturnCount(1) - } else { - if (sender in this.shared) { - this.existingPaths[path] = await ShareFolderMetaHandler.create({ - count: Object.keys(this.shared[sender]).length + 1, - location: '', - name: '', - }) - } else { - this.addedSharer[path] = await ShareFolderMetaHandler.create({ - count: 1, - location: '', - name: '', - refIndex: Object.keys(this.shared).length, - }) - this.shared[sender] = {} - } - } - } - - /** - * Make a new folder for sharing. - * @param {string} sender - Sender of share. - * @param {string[]} base - Base path. - * @param {number} offset - Starting offset for ref. - * @returns {string[]} - Path of new folder. - * @protected - */ - protected makeFreshFolders ( - sender: string, - base: string[], - offset: number, - ): string[] { - const full: string[] = [] - for (let i = offset + 2; i <= base.length; i++) { - const path = ['s', sharedPath, sender, ...base.slice(0, i)].join('/') - full.push(path) - } - return full - } - - /** - * Select ref from 3 options. - * @param {string} path - Path to ref. - * @returns {number} - Index of ref. - * @protected - */ - protected findRefIndex (path: string): number { - const chunks = path.split('/') - chunks.pop() - const target = chunks.join('/') - if (target in this.existingPaths) { - return this.existingPaths[target].getCount() - 1 - } else if (target in this.addedSharer) { - return this.addedSharer[target].getCount() - 1 - } else { - return this.addedMiddle[target].getCount() - 1 - } - } - - /** - * Create and fill message queue. - * @returns {Promise} - * @protected - */ - protected async buildMsgQueue (): Promise { - try { - const msgs: IWrappedEncodeObject[] = [] - for (let name in this.existingPaths) { - const existingMsgs = await this.existingFolderToMsgs({ - meta: this.existingPaths[name], - aes: await genAesBundle(), - }) - msgs.push(...existingMsgs) - } - - if (Object.keys(this.addedSharer).length > 0) { - const sharedMeta = await ShareFolderMetaHandler.create({ - count: Object.keys(this.shared).length, - location: '', - name: `s/${sharedPath}`, - }) - for (let name in this.addedSharer) { - this.addedSharer[name].setRefIndex(sharedMeta.getCount()) - sharedMeta.addAndReturnCount(1) - const addedSharerMsgs = await this.sharedFolderToMsgs({ - meta: this.addedSharer[name], - aes: await genAesBundle(), - }) - msgs.push(...addedSharerMsgs) - } - const parentMsgs = await this.existingFolderToMsgs({ - meta: sharedMeta, - aes: await genAesBundle(), - }) - msgs.push(...parentMsgs) - } - - const sortedAdditions = Object.keys(this.addedMiddle).sort( - (a, b) => a.length - b.length, - ) - for (let name of sortedAdditions) { - const addedMiddleMsgs = await this.folderToMsgs({ - meta: this.addedMiddle[name], - aes: await genAesBundle(), - }) - msgs.push(...addedMiddleMsgs) - } - - for (let name in this.addedShared) { - const addedSharedMsgs = await this.sharedFileToMsgs({ - meta: this.addedShared[name], - aes: await genAesBundle(), - }) - msgs.push(...addedSharedMsgs) - } - - return msgs - } catch (err) { - throw warnError('SharedUpdater buildMsgQueue()', err) - } - } -} diff --git a/src/classes/storageHandler.ts b/src/classes/storageHandler.ts index 3dc729e5..4e12e038 100644 --- a/src/classes/storageHandler.ts +++ b/src/classes/storageHandler.ts @@ -8,12 +8,11 @@ import type { import { PrivateKey } from 'eciesjs' import { extractFileMetaData, hexToInt, maybeMakeThumbnail } from '@/utils/converters' import { isItPastDate, shuffleArray, signerNotEnabled, tidyString, warnError } from '@/utils/misc' -import { FileMetaHandler, FolderMetaHandler, NullMetaHandler } from '@/classes/metaHandlers' +import { FileMetaHandler, FolderMetaHandler, NullMetaHandler, ShareMetaHandler } from '@/classes/metaHandlers' import { encryptionChunkSize, signatureSeed } from '@/utils/globalDefaults' import { aesBlobCrypt, genAesBundle, genIv, genKey } from '@/utils/crypt' -import { hashAndHex, stringToShaHex } from '@/utils/hash' +import { hashAndHex, hexToBuffer, stringToShaHex } from '@/utils/hash' import { EncodingHandler } from '@/classes/encodingHandler' -import { SharedUpdater } from '@/classes/sharedUpdater' import { bech32 } from '@jackallabs/bech32' import { IAesBundle, @@ -23,34 +22,52 @@ import { IChecks, IChildMetaDataMap, IClientHandler, + ICloneSharesOptions, + ICloneUploadOptions, + IConversionFolderBundle, ICreateFolderOptions, + ICustomRootOptions, IDeleteTargetOptions, + IDownloadByUlidOptions, IDownloadTracker, IFileMetaData, IFileParticulars, IFileTreePackage, IFolderMetaData, IFolderMetaHandler, + ILegacyFolderMetaData, + IMetaDataByUlidOptions, IMoveRenameResourceOptions, IMoveRenameTarget, - INotification, - INotificationPackage, + INotificationRecord, IProviderIpSet, IProviderPool, IProviderUploadResponse, IReadFolderContentOptions, + IRemoveShareRecordOptions, IRnsHandler, + IShareDirectPackage, + IShareLinkOptions, + IShareLinkPackage, + IShareLinks, + IShareMetaData, IShareOptions, + IShareResults, IStagedUploadPackage, IStorageHandler, IStorageOptions, IStorageStatus, + IUnshareOptions, + IUnsharePackage, IUploadPackage, IWrappedEncodeObject, + TDownloadStagingOptions, + TLoadThumbnailOptions, + TSharePackage, } from '@/interfaces' -import type { TMetaHandler, TSharedRootMetaDataMap } from '@/types' -import { IConversionFolderBundle } from '@/interfaces/IConversionFolderBundle' -import { TFullSignerState } from '@/types/TFullSignerState' +import type { TFullSignerState, TMetaDataSets, TMetaHandler } from '@/types' +import { ulid } from 'ulid' +import { UploadHandler } from '@/classes/uploadHandler' export class StorageHandler extends EncodingHandler implements IStorageHandler { protected readonly rns: IRnsHandler | null @@ -63,8 +80,9 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { protected uploadsInProgress: boolean protected uploadQueue: IUploadPackage[] protected stagedUploads: Record + protected notifications: INotificationRecord[] protected children: IChildMetaDataMap - protected shared: TSharedRootMetaDataMap + protected upcycleQueue: IWrappedEncodeObject[] protected meta: IFolderMetaHandler protected providers: IProviderPool @@ -76,10 +94,11 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { hostSigner: THostSigningClient, accountAddress: string, fullSignerState: TFullSignerState, + defaultKeyPair: PrivateKey, path: string, meta: IFolderMetaHandler, ) { - super(client, jackalSigner, hostSigner, fullSignerState[0], accountAddress) + super(client, jackalSigner, hostSigner, fullSignerState[0], defaultKeyPair, accountAddress) this.rns = rns this.path = path @@ -91,6 +110,7 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { this.uploadsInProgress = false this.uploadQueue = [] this.stagedUploads = {} + this.notifications = [] this.children = { files: {}, @@ -98,12 +118,14 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { nulls: {}, } this.mustConvert = false - this.shared = {} + this.upcycleQueue = [] this.meta = meta this.providers = {} - window.addEventListener('beforeunload', this.beforeUnloadHandler) + if (typeof window !== 'undefined' && 'addEventListener' in window) { + window.addEventListener('beforeunload', this.beforeUnloadHandler) + } } /** @@ -134,7 +156,8 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { try { let dummyKey = await stringToShaHex('') - let keyPair: TFullSignerState = [PrivateKey.fromHex(dummyKey), false] + let defaultKeyPair = PrivateKey.fromHex(dummyKey) + let keyPair: TFullSignerState = [defaultKeyPair, false] if (setFullSigner) { keyPair = await this.enableFullSigner(client) } @@ -150,6 +173,7 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { hostSigner, accountAddress, keyPair, + defaultKeyPair, path, meta, ) @@ -179,6 +203,8 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { throw new Error('Leap Wallet selected but unavailable') } break + case 'mnemonic': + break default: throw new Error( 'No wallet selected but one is required to init StorageHandler', @@ -187,32 +213,53 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { const hostAddress = client.getHostAddress() const chainId = client.getHostChainId() - let signatureAsHex = '' + let signed, signatureAsHex switch (selectedWallet) { case 'keplr': if (!window.keplr) { throw 'Missing wallet extension' } else { - const { signature } = await window.keplr.signArbitrary( + signed = await window.keplr.signArbitrary( chainId, hostAddress, signatureSeed, ) - signatureAsHex = await stringToShaHex(signature) + signatureAsHex = await stringToShaHex(signed.signature) } break case 'leap': if (!window.leap) { throw 'Missing wallet extension' } else { - const { signature } = await window.leap.signArbitrary( + signed = await window.leap.signArbitrary( chainId, hostAddress, signatureSeed, ) - signatureAsHex = await stringToShaHex(signature) + signatureAsHex = await stringToShaHex(signed.signature) + } + break + case 'mnemonic': + let wallet + if (typeof window !== 'undefined') { + wallet = window.mnemonicWallet + } else { + wallet = global.mnemonicWallet + } + + if (!wallet) { + throw new Error('Missing mnemonic wallet') + } else { + signed = await wallet.signArbitrary( + signatureSeed, + ) + signatureAsHex = await stringToShaHex(signed.signature) } break + default: + throw new Error( + 'No wallet selected but one is required to init StorageHandler', + ) } return [PrivateKey.fromHex(signatureAsHex), true] } catch (err) { @@ -224,7 +271,9 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { * */ cleanShutdown (): void { - window.removeEventListener('beforeunload', this.beforeUnloadHandler) + if (typeof window !== 'undefined' && 'removeEventListener' in window) { + window.removeEventListener('beforeunload', this.beforeUnloadHandler) + } } /** @@ -355,9 +404,12 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { */ async upgradeSigner (): Promise { try { - ;[this.keyPair, this.fullSigner] = await StorageHandler.enableFullSigner( + const [pair, signer] = await StorageHandler.enableFullSigner( this.jackalClient, ) + this.keyPair = pair + this.fullSigner = signer + await this.resetReader(pair) } catch (err) { throw warnError('storageHandler upgradeSigner()', err) } @@ -464,6 +516,68 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { } } + /** + * + * @param {ICustomRootOptions} options + * @returns {Promise} + */ + async initCustomRoot (options: ICustomRootOptions): Promise { + if (await this.checkLocked({ signer: true })) { + throw new Error('Locked.') + } + try { + const msgs = await this.makeCreateBaseFolderMsgs(options.name) + if (options?.chain) { + return msgs + } else { + const postBroadcast = + await this.jackalClient.broadcastAndMonitorMsgs(msgs, options?.broadcastOptions) + console.log('initCustomRoot:', postBroadcast) + await this.loadDirectory() + return [] + } + } catch (err) { + throw warnError('storageHandler initCustomRoot()', err) + } + } + + /** + * + * @param {IBroadcastOrChainOptions} options + * @returns {Promise} + */ + async checkAndInitSharing (options?: IBroadcastOrChainOptions): Promise { + if (await this.checkLocked({ signer: true })) { + throw new Error('Locked.') + } + try { + const msgs: IWrappedEncodeObject[] = [] + let exists + try { + await this.reader.loadKeysByPath('Shared', this.jklAddress) + exists = true + } catch { + exists = false + } + if (!exists) { + msgs.push(...(await this.makeCreateBaseFolderMsgs('Shared'))) + if (options?.chain) { + return msgs + } else { + const postBroadcast = + await this.jackalClient.broadcastAndMonitorMsgs(msgs, options?.broadcastOptions) + console.log('checkAndInitSharing:', postBroadcast) + await this.loadDirectory() + return [] + } + } else { + return msgs + } + } catch (err) { + throw warnError('storageHandler checkAndInitSharing()', err) + } + } + /** * * @returns {Promise} @@ -609,6 +723,9 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { await this.jackalSigner.queries.storage.allFilesByMerkle({ merkle: merkleRoot, }) + if ((files as DUnifiedFile[]).length === 0) { + continue + } const [target] = files.filter( (file: DUnifiedFile) => file.owner === this.jklAddress, ) @@ -875,7 +992,106 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { } catch (err) { throw warnError('storageHandler queuePublic()', err) } + } + + /** + * + * @param {ICloneSharesOptions} options + * @returns {Promise} + */ + async cloneShares (options: ICloneSharesOptions): Promise { + try { + const targets = [] + let sharer + if (options.targets instanceof Array) { + sharer = options.targets[0].owner + for (let one of options.targets) { + const meta = await this.reader.loadMetaByExternalUlid(one.pointsTo, one.owner) + if ('fileMeta' in meta) { + targets.push(meta) + } + } + } else { + sharer = options.targets.owner + const meta = await this.reader.loadMetaByExternalUlid(options.targets.pointsTo, options.targets.owner) + if ('fileMeta' in meta) { + targets.push(meta) + } + } + if (targets.length === 0) { + throw new Error('No Valid Targets') + } + return await this.cloneUpload({ ...options, targets, sharer }) + } catch (err) { + throw warnError('storageHandler cloneShares()', err) + } + } + /** + * + * @param {ICloneUploadOptions} options + * @returns {Promise} + */ + async cloneUpload (options: ICloneUploadOptions): Promise { + try { + let msgs: IWrappedEncodeObject[] = [] + const blockHeight = await this.jackalClient.getJackalBlockHeight() + const destUlid = this.reader.ulidLookup(options.destination) + const destMeta = await this.reader.loadFolderMetaByUlid(destUlid) + const folderMeta = await FolderMetaHandler.create({ + clone: destMeta, + ulid: destUlid, + }) + let refCount = await this.reader.refCountRead(options.destination) + if (options.targets instanceof Array) { + for (let target of options.targets) { + const reps = Math.ceil(target.fileMeta.size / encryptionChunkSize) + const size = target.fileMeta.size + (reps * 8) + const meta = await FileMetaHandler.create({ clone: target, refIndex: refCount }) + const aes = await this.reader.loadKeysByUlid(target.ulid, options.sharer) + meta.setLocation(destUlid) + const pkg = { + duration: 0, + meta, + size, + aes, + } + refCount++ + const fresh = await this.clonePkgToMsgs(pkg, blockHeight) + msgs.push(...fresh) + } + } else { + const reps = Math.ceil(options.targets.fileMeta.size / encryptionChunkSize) + const size = options.targets.fileMeta.size + (reps * 8) + const meta = await FileMetaHandler.create({ clone: options.targets, refIndex: refCount }) + const aes = await this.reader.loadKeysByUlid(options.targets.ulid, options.sharer) + meta.setLocation(destUlid) + const pkg = { + duration: 0, + meta, + size, + aes, + } + refCount++ + const fresh = await this.clonePkgToMsgs(pkg, blockHeight) + msgs.push(...fresh) + } + folderMeta.setCount(refCount) + const folderMsgs = await this.existingFolderToMsgs({ + meta: folderMeta, + }) + msgs = [...folderMsgs, ...msgs] + if (options?.chain) { + return msgs + } else { + const postBroadcast = + await this.jackalClient.broadcastAndMonitorMsgs(msgs, options?.broadcastOptions) + console.log('registerPubKey:', postBroadcast) + return [] + } + } catch (err) { + throw warnError('storageHandler cloneUpload()', err) + } } /** @@ -905,24 +1121,23 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { const postBroadcast = await this.jackalClient.broadcastAndMonitorMsgs(msgs, options) + if (options?.callback) { + try { + options.callback() + } catch (err) { + console.error(err) + throw new Error('Callback Failed') + } + } + + this.uploadsInProgress = true if (!postBroadcast.error) { if (!postBroadcast.txEvents.length) { throw Error('tx has no events') } - let remaining = [...msgs] const uploadHeight = postBroadcast.txEvents[0].height - while (remaining.length > 0) { - const activeUploads = await this.batchUploads(remaining, uploadHeight) - const results = await Promise.allSettled(activeUploads) - - const loop: IWrappedEncodeObject[] = [] - for (let i = 0; i < results.length; i++) { - if (results[i].status === 'rejected') { - loop.push(remaining[i]) - } - } - remaining = [...loop] - } + const activeUploads = await this.batchUploads(msgs, uploadHeight) + await Promise.allSettled(activeUploads) } this.uploadsInProgress = false await this.loadDirectory() @@ -932,17 +1147,101 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { } } + /** + * + * @param {TLoadThumbnailOptions} options + * @returns {Promise} + */ + async loadThumbnail (options: TLoadThumbnailOptions): Promise { + try { + let meta + if ('filePath' in options) { + meta = await this.reader.loadMetaByExternalPath(options.filePath, options.userAddress) + } else { + meta = await this.reader.loadMetaByExternalUlid(options.ulid, options.userAddress) + } + return ('thumbnail' in meta) ? meta.thumbnail : '' + } catch (err) { + throw warnError('storageHandler loadThumbnail()', err) + } + } + + /** + * + * @param {IMetaDataByUlidOptions} options + * @returns {Promise} + */ + async getMetaDataByUlid (options: IMetaDataByUlidOptions): Promise { + try { + const ica = options.userAddress || this.jackalClient.getICAJackalAddress() + return await this.reader.loadMetaByExternalUlid(options.ulid, ica, options.linkKey) + } catch (err) { + throw warnError('storageHandler getMetaDataByUlid()', err) + } + } + + /** + * + * @param {IMetaDataByUlidOptions} options + * @returns {Promise} + */ + async getFolderDetailsByUlid (options: IMetaDataByUlidOptions): Promise { + try { + return await this.reader.readFolderContents(options.ulid, { + owner: options.userAddress, + linkKey: options.linkKey, + }) + } catch (err) { + throw warnError('storageHandler getFolderDetailsByUlid()', err) + } + } + + /** + * + * @param {string} path + * @param {string} address + * @returns {string} + */ + findUlid (path: string, address?: string): string { + try { + const ica = address || this.jackalClient.getICAJackalAddress() + return this.reader.ulidLookup(path, ica) + } catch (err) { + throw warnError('storageHandler findUlid()', err) + } + } + + /** + * + * @param {string} filePath + * @param {string} [address] + * @returns {Promise} + */ + async getFileMetaData (filePath: string, address?: string): Promise { + try { + const ica = address || this.jackalClient.getICAJackalAddress() + const ft = await this.reader.loadMetaByExternalPath(filePath, ica) + if (ft.metaDataType !== 'file') { + throw new Error('Not a file') + } + return ft + } catch (err) { + throw warnError('storageHandler getFileMetaData()', err) + } + } + /** * * @param {string} filePath + * @param {string} [address] * @returns {Promise} */ - async getFileParticulars (filePath: string): Promise { + async getFileParticulars (filePath: string, address?: string): Promise { if (await this.checkLocked({ signer: true })) { throw new Error('Locked.') } try { - const ica = this.jackalClient.getICAJackalAddress() + const ica = address || this.jackalClient.getICAJackalAddress() const ft = await this.reader.loadMetaByExternalPath(filePath, ica) if (ft.metaDataType !== 'file') { throw new Error('Not a file') @@ -991,56 +1290,24 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { } try { const particulars = await this.getFileParticulars(filePath) + if (particulars.providerIps.length === 0) { + throw new Error('No providers found') + } const providerList = shuffleArray(particulars.providerIps) for (const _ of providerList) { const provider = providerList[Math.floor(Math.random() * providerList.length)] - const url = `${provider}/download/${particulars.merkleLocation}` + if (typeof provider === 'undefined') { + continue + } try { - const resp = await fetch(url, { method: 'GET' }) - const contentLength = resp.headers.get('Content-Length') - if (resp.status !== 200) { - throw new Error(`Status Message: ${resp.statusText}`) - } else if (resp.body === null || !contentLength) { - throw new Error(`Invalid response body`) - } else { - const reader = resp.body.getReader() - let receivedLength = 0 - while (true) { - const { done, value } = await reader.read() - if (done) { - break - } - trackers.chunks.push(value) - receivedLength += value.length - trackers.progress = - Math.floor((receivedLength / Number(contentLength)) * 100) || 1 - } - const { name, ...meta } = particulars.fileMeta - let baseFile = new File(trackers.chunks, name, meta) - const tmp = await baseFile.slice(0, 8).text() - if (Number(tmp) > 0) { - const parts: Blob[] = [] - const aes = await this.reader.loadKeysByPath( - filePath, - userAddress, - ) - for (let i = 0; i < baseFile.size;) { - const offset = i + 8 - const segSize = Number(await baseFile.slice(i, offset).text()) - const last = offset + segSize - const segment = baseFile.slice(offset, last) - - parts.push(await aesBlobCrypt(segment, aes, 'decrypt')) - i = last - } - baseFile = new File(parts, name, meta) - } - if (baseFile.size == 0) { - throw new Error('File is empty') - } - return baseFile - } + return await this.downloadStaging({ + particulars, + provider, + trackers, + userAddress, + filePath, + }) } catch (err) { console.warn(`Error fetching from provider ${provider}: ${err}`) } @@ -1051,6 +1318,54 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { } } + /** + * + * @param {IDownloadByUlidOptions} options + * @returns {Promise} + */ + async downloadByUlid (options: IDownloadByUlidOptions): Promise { + try { + const { + trackers, + ulid, + userAddress, + linkKey, + } = options + const ft = await this.reader.loadMetaByExternalUlid(ulid, userAddress, linkKey) + if (ft.metaDataType !== 'file') { + throw new Error('Not a file') + } + const { providerIps } = await this.jackalSigner.queries.storage.findFile({ + merkle: ft.merkleRoot, + }) + const particulars = { + fileMeta: ft.fileMeta, + merkle: ft.merkleRoot, + merkleLocation: ft.merkleHex, + providerIps, + } + const providerList = shuffleArray(particulars.providerIps) + for (const _ of providerList) { + const provider = providerList[Math.floor(Math.random() * providerList.length)] as string + try { + return await this.downloadStaging({ + particulars, + provider, + trackers, + userAddress, + ulid, + linkKey, + }) + } catch (err) { + console.warn(`Error fetching from provider ${provider}: ${err}`) + } + } + throw new Error('Download Failure') + } catch (err) { + throw warnError('storageHandler downloadByUlid()', err) + } + } + /** * * @param {IDeleteTargetOptions} options @@ -1086,12 +1401,25 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { } } + /** + * + * @param {string} path + * @returns {Promise} + */ + async checkSharedTo (path: string): Promise { + try { + return await this.reader.sharersRead(path) + } catch (err) { + throw warnError('storageHandler checkSharedTo()', err) + } + } + /** * * @param {IShareOptions} options * @returns {Promise} */ - async share (options: IShareOptions): Promise { + async shareDirect (options: IShareOptions): Promise { if ( await this.checkLocked({ noConvert: true, exists: true, signer: true }) ) { @@ -1099,84 +1427,325 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { } try { const { receiver, paths } = options - const rec = await this.possibleRnsToAddress(receiver) const msgs: IWrappedEncodeObject[] = [] - const pkg: INotificationPackage = { + const pkg: IShareDirectPackage = { + isFile: false, isPrivate: true, - receiver: rec, path: 'tbd', - isFile: true, + receiver: await this.possibleRnsToAddress(receiver), } if (paths instanceof Array) { for (let path of paths) { pkg.path = path - msgs.push(...(await this.shareToMsgs(pkg, [rec]))) + const local = await this.prepShare(pkg) + msgs.push(...local.msgs) } } else { pkg.path = paths - msgs.push(...(await this.shareToMsgs(pkg, [rec]))) + const local = await this.prepShare(pkg) + msgs.push(...local.msgs) } - if (options?.chain) { return msgs } else { const postBroadcast = await this.jackalClient.broadcastAndMonitorMsgs(msgs, options?.broadcastOptions) - console.log('share:', postBroadcast) + console.log('shareDirect:', postBroadcast) return [] } } catch (err) { - throw warnError('storageHandler share()', err) + throw warnError('storageHandler shareDirect()', err) } } /** * - * @returns {Promise} + * @param {IShareLinkOptions} options + * @returns {Promise} */ - async checkNotifications (): Promise { - if (await this.checkLocked({ signer: true })) { + async shareLink (options: IShareLinkOptions): Promise { + if ( + await this.checkLocked({ noConvert: true, exists: true, signer: true }) + ) { throw new Error('Locked.') } try { - const updater = new SharedUpdater( - this.jackalClient, - this.jackalSigner, - this.jackalSigner, - this.keyPair, - this.shared, - ) - return await updater.fetchNotifications() - } catch (err) { - throw warnError('storageHandler checkNotifications()', err) + const { paths } = options + const final: IShareLinks = { + links: {}, + msgs: [], + } + const lUlid = ulid() + const pkg: IShareLinkPackage = { + isFile: false, + link: lUlid, + path: 'tbd', + } + if (paths instanceof Array) { + for (let path of paths) { + pkg.path = path + const local = await this.prepShare(pkg) + final.links[path] = { + isFolder: local.isFolder, + linkKey: lUlid, + } + final.msgs.push(...local.msgs) + } + } else { + pkg.path = paths + const local = await this.prepShare(pkg) + final.links[paths] = { + isFolder: local.isFolder, + linkKey: lUlid, + } + final.msgs.push(...local.msgs) + } + if (options?.chain) { + return final + } else { + const postBroadcast = + await this.jackalClient.broadcastAndMonitorMsgs(final.msgs, options?.broadcastOptions) + console.log('shareLink:', postBroadcast) + final.msgs = [] + return final + } + } catch (err) { + throw warnError('storageHandler shareLink()', err) } } /** * - * @returns {Promise} + * @param {IUnshareOptions} options + * @returns {Promise} + */ + async unshare (options: IUnshareOptions): Promise { + try { + const msgs: IWrappedEncodeObject[] = [] + const { paths, receivers } = options + const pkg: IUnsharePackage = { + removed: [...new Set(receivers)], + path: 'tbd', + } + if (paths instanceof Array) { + for (let path of paths) { + pkg.path = path + msgs.push(...(await this.sendUnshareToMsgs(pkg))) + } + } else { + pkg.path = paths + msgs.push(...(await this.sendUnshareToMsgs(pkg))) + } + if (options?.chain) { + return msgs + } else { + const postBroadcast = + await this.jackalClient.broadcastAndMonitorMsgs(msgs, options?.broadcastOptions) + console.log('unshare:', postBroadcast) + return [] + } + } catch (err) { + throw warnError('storageHandler unshare()', err) + } + } + + /** + * + * @param {IRemoveShareRecordOptions} options + * @returns {Promise} + */ + async removeShareRecord (options: IRemoveShareRecordOptions): Promise { + try { + const msgs: IWrappedEncodeObject[] = [] + const { location, name, owner, ulid } = options.record + const loc = location.split('/').slice(-1)[0] + const refIndex = this.reader.findRefIndex(`Shared/${owner}/${name}`) + const meta = await NullMetaHandler.create({ + location: loc, + refIndex, + ulid, + }) + const local = await this.filetreeDeleteToMsgs({ + meta, + aes: await genAesBundle(), + }) + msgs.push(...local) + if (options?.chain) { + return msgs + } else { + const postBroadcast = + await this.jackalClient.broadcastAndMonitorMsgs(msgs, options?.broadcastOptions) + console.log('removeShareRecord:', postBroadcast) + return [] + } + } catch (err) { + throw warnError('storageHandler removeShareRecord()', err) + } + } + + /** + * + * @returns {Promise} + */ + async checkNotifications (): Promise { + if (await this.checkLocked({ signer: true })) { + throw new Error('Locked.') + } + try { + const received = [] + const raw = + await this.jackalSigner.queries.notifications.allNotificationsByAddress( + { to: this.jklAddress }, + ) + for (let one of raw.notifications) { + const rec = await this.reader.readShareNotification(one) + received.push(rec) + } + this.notifications = received + return received.length + } catch (err) { + throw warnError('storageHandler checkNotifications()', err) + } + } + + /** + * + * @param {IBroadcastOrChainOptions} options + * @returns {Promise} */ - async processPendingNotifications (): Promise { + async processPendingNotifications (options?: IBroadcastOrChainOptions): Promise { if ( await this.checkLocked({ noConvert: true, exists: true, signer: true }) ) { throw new Error('Locked.') } try { - const updater = new SharedUpdater( - this.jackalClient, - this.jackalSigner, - this.jackalSigner, - this.keyPair, - this.shared, - ) - const count = await updater.fetchNotifications() - if (count > 0) { - await updater.digest() - await this.loadShared() - return this.shared + let msgs: IWrappedEncodeObject[] = [] + let pendDelMsgs: IWrappedEncodeObject[] = [] + const senders: Record = {} + const fresh: string[] = [] + const pendLength = await this.checkNotifications() + if (pendLength > 0) { + let [errorCode, baseRefCount] = await this.reader.readSharingRefCount() + let baseUlid + if (errorCode === 0) { + try { + baseUlid = this.reader.ulidLookup('Shared') + } catch { + console.warn('No Shared, building...') + } + } + const baseMeta = await FolderMetaHandler.create({ + count: baseRefCount, + location: 'ulid', + name: 'Shared', + ulid: baseUlid, + }) + const received = Date.now() + for (let one of this.notifications) { + if (one.msg.indexOf('|') >= 4) { + const parts = one.msg.split('|') + let isFile + switch (parts[0]) { + case 'file': + isFile = true + break + case 'folder': + isFile = false + break + default: + continue + } + const healthCheck = await this.reader.livenessCheck(parts[1], one.sender) + if (healthCheck) { + let [senderErrorCode, senderRefCount] = await this.reader.readSharingRefCount(one.sender) + let senderIndex + if (senderErrorCode > 0) { + fresh.push(one.sender) + senderIndex = await this.reader.refCountRead('Shared') + this.reader.refCountIncrement('Shared') + } + if (!senders[one.sender]) { + let ulid + try { + ulid = this.reader.ulidLookup(`Shared/${one.sender}`) + } catch { + console.log('New Sharer') + } + senders[one.sender] = await FolderMetaHandler.create({ + count: senderRefCount, + location: baseMeta.getUlid(), + name: one.sender, + refIndex: senderIndex, + ulid, + }) + } + const parent = senders[one.sender] + const mH = await ShareMetaHandler.create({ + isFile, + location: parent.getUlid(), + name: parts[2], + owner: one.sender, + pointsTo: parts[1], + received, + refIndex: senderRefCount, + }) + this.reader.refCountIncrement(`Shared/${one.sender}`) + const shared = await this.receiveShareToMsgs({ + meta: mH, + aes: await genAesBundle(), + }) + msgs.push(...shared) + } + const tidy = await this.tidyReceivedNotifications({ from: one.sender, time: one.time }) + pendDelMsgs.push(...tidy) + } + } + const sub: IWrappedEncodeObject[] = [] + for (let index of Object.keys(senders)) { + senders[index].setCount(await this.reader.refCountRead(`Shared/${index}`)) + let some + if (fresh.includes(index)) { + some = await this.folderToMsgs({ + meta: senders[index], + aes: await genAesBundle(), + }) + } else { + some = await this.existingFolderToMsgs({ + meta: senders[index], + aes: await genAesBundle(), + }) + } + sub.push(...some) + } + msgs = [...sub, ...msgs, ...pendDelMsgs] + if (errorCode === 1) { + baseMeta.setCount(await this.reader.refCountRead('Shared')) + const local = await this.baseFolderToMsgs({ + meta: baseMeta, + aes: await genAesBundle(), + }) + msgs = [...local, ...msgs] + } else { + const sharedUlid = this.reader.ulidLookup('Shared') + const meta = await FolderMetaHandler.create({ clone: baseMeta.export(), ulid: sharedUlid }) + meta.setCount(await this.reader.refCountRead('Shared')) + const local = await this.existingFolderToMsgs({ + meta: meta, + aes: await this.reader.loadKeysByUlid(sharedUlid, this.hostAddress), + }) + msgs = [...local, ...msgs] + } + if (options?.chain) { + return msgs + } else { + const postBroadcast = + await this.jackalClient.broadcastAndMonitorMsgs(msgs, options?.broadcastOptions) + console.log('processPendingNotifications:', postBroadcast) + return [] + } } else { - return this.shared + return [] } } catch (err) { throw warnError('storageHandler processPendingNotifications()', err) @@ -1185,10 +1754,15 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { /** * - * @returns {TSharedRootMetaDataMap} + * @param {string} [sharer] + * @returns {Promise} */ - readSharing (): TSharedRootMetaDataMap { - return this.shared + async readSharing (sharer?: string): Promise { + try { + return this.reader.sharingLookup({ sharer, refresh: true }) + } catch (err) { + throw warnError('storageHandler readSharing()', err) + } } /** @@ -1228,6 +1802,321 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { } } + /** + * + * @returns {boolean} + */ + checkIfUpcycle (): boolean { + const len = this.reader.getConversionQueueLength() + console.log('ConversionQueueLength:', len) + return len > 0 + } + + /** + * + * @param {IBroadcastOptions} [options] + * @returns {Promise} + */ + async checkAndUpcycle (options?: IBroadcastOptions): Promise { + try { + if (this.reader.getConversionQueueLength() > 0) { + const msgs: IWrappedEncodeObject[] = [] + const prep = await this.reader.getConversions() + const blockheight = await this.jackalClient.getJackalBlockHeight() + + for (let one of prep) { + let upcycleMsgs + switch (one[0]) { + case 'file': + try { + const pkg = await this.upcycleFile(one[1]) + const { files } = + await this.jackalSigner.queries.storage.allFilesByMerkle({ + merkle: one[1].export().merkleRoot, + }) + if ((files as DUnifiedFile[]).length === 0) { + continue + } + const [details] = files + const sourceMsgs = this.fileDeleteToMsgs({ + creator: this.jklAddress, + merkle: details.merkle, + start: details.start, + }) + upcycleMsgs = await this.pkgToMsgs(pkg, blockheight) + msgs.push(...sourceMsgs, ...upcycleMsgs) + } catch { + console.log(`Skipping ${one[1].export().fileMeta.name}`) + } + break + case 'null': + upcycleMsgs = await this.filetreeDeleteToMsgs({ meta: one[1], aes: await genAesBundle() }) + msgs.push(...upcycleMsgs) + break + case 'folder': + upcycleMsgs = await this.folderToMsgs({ meta: one[1], aes: await genAesBundle() }) + msgs.push(...upcycleMsgs) + break + case 'rootlookup': + upcycleMsgs = await this.upcycleBaseFolderToMsgs({ meta: one[1], aes: await genAesBundle() }) + msgs.push(...upcycleMsgs) + break + } + } + const ready = confirm('Are you ready to Upcycle?') + this.upcycleQueue = msgs + if (ready) { + await this.runUpcycleQueue(options) + } + } + } catch (err) { + throw warnError('storageHandler checkAndUpcycle()', err) + } + } + + /** + * + * @param {IBroadcastOptions} [options] + * @returns {Promise} + */ + async runUpcycleQueue (options?: IBroadcastOptions): Promise { + try { + const postBroadcast = + await this.jackalClient.broadcastAndMonitorMsgs(this.upcycleQueue, options) + console.log('runUpcycleQueue:', postBroadcast) + if (!postBroadcast.error) { + if (!postBroadcast.txEvents.length) { + throw Error('tx has no events') + } + let remaining = [...this.upcycleQueue] + const uploadHeight = postBroadcast.txEvents[0].height + while (remaining.length > 0) { + const activeUploads = await this.batchUploads(remaining, uploadHeight) + const results = await Promise.allSettled(activeUploads) + + const loop: IWrappedEncodeObject[] = [] + for (let i = 0; i < results.length; i++) { + if (results[i].status === 'rejected') { + loop.push(remaining[i]) + } + } + remaining = [...loop] + } + } + this.upcycleQueue = [] + } catch (err) { + throw warnError('storageHandler runUpcycleQueue()', err) + } + } + + /** + * + * @param {TSharePackage} pkg + * @returns {Promise} + * @protected + */ + protected async prepShare (pkg: TSharePackage): Promise { + try { + const final: IShareResults = { + isFolder: true, + msgs: [], + } + const viewers = ('receiver' in pkg) ? [pkg.receiver] : [] + try { + const contents = await this.reader.readFolderContents(pkg.path) + if ('link' in pkg) { + final.msgs.push(...(await this.shareLinkToMsgs(pkg))) + } else { + final.msgs.push(...(await this.sendShareToMsgs(pkg, viewers))) + } + for (let one of Object.values(contents.folders)) { + const onePkg = { + ...pkg, + path: `${pkg.path}/${one.whoAmI}`, + } + const local = await this.prepShare(onePkg) + final.msgs.push(...local.msgs) + } + for (let one of Object.values(contents.files)) { + const onePkg = { + ...pkg, + path: `${pkg.path}/${one.fileMeta.name}`, + isFile: true, + } + let local + if ('link' in pkg) { + local = await this.shareLinkToMsgs(onePkg as IShareLinkPackage) + } else { + local = await this.sendShareToMsgs(onePkg as IShareDirectPackage, viewers) + } + final.msgs.push(...local) + } + } catch { + final.isFolder = false + pkg.isFile = true + let local + if ('link' in pkg) { + local = await this.shareLinkToMsgs(pkg) + } else { + local = await this.sendShareToMsgs(pkg, viewers) + } + final.msgs.push(...local) + } + return final + } catch (err) { + throw warnError('storageHandler prepShare()', err) + } + } + + /** + * + * @param {TDownloadStagingOptions} options + * @returns {Promise} + * @protected + */ + protected async downloadStaging (options: TDownloadStagingOptions): Promise { + try { + const { + particulars, + provider, + trackers, + userAddress, + } = options + const url = `${provider}/download/${particulars.merkleLocation}` + const resp = await fetch(url, { method: 'GET' }) + const contentLength = resp.headers.get('Content-Length') + if (resp.status !== 200) { + throw new Error(`Status Message: ${resp.statusText}`) + } else if (resp.body === null || !contentLength) { + throw new Error(`Invalid response body`) + } else { + const reader = resp.body.getReader() + let receivedLength = 0 + while (true) { + const { done, value } = await reader.read() + if (done) { + break + } + trackers.chunks.push(value) + receivedLength += value.length + trackers.progress = + Math.floor((receivedLength / Number(contentLength)) * 100) || 1 + } + const { name, ...meta } = particulars.fileMeta + let baseFile = new File(trackers.chunks, name, meta) + const tmp = await baseFile.slice(0, 8).text() + if (Number(tmp) > 0) { + const parts: Blob[] = [] + let aes + if ('filePath' in options) { + aes = await this.reader.loadKeysByPath( + options.filePath, + userAddress, + ) + } else { + aes = await this.reader.loadKeysByUlid( + options.ulid, + userAddress, + options.linkKey, + ) + } + for (let i = 0; i < baseFile.size;) { + const offset = i + 8 + const segSize = Number(await baseFile.slice(i, offset).text()) + const last = offset + segSize + const segment = baseFile.slice(offset, last) + parts.push(await aesBlobCrypt(segment, aes, 'decrypt')) + i = last + } + baseFile = new File(parts, name, meta) + } + if (baseFile.size == 0) { + throw new Error('File is empty') + } + return baseFile + } + } catch (err) { + throw warnError('storageHandler downloadStaging()', err) + } + } + + /** + * + * @param {FileMetaHandler} source + * @returns {Promise} + * @protected + */ + protected async upcycleFile (source: FileMetaHandler): Promise { + try { + const sourceMeta = source.export() + const { providerIps } = await this.jackalSigner.queries.storage.findFile({ + merkle: sourceMeta.merkleRoot, + }) + console.log('providerIps:', providerIps) + let baseFile + for (let i = 0; i < providerIps.length; i++) { + const provider = providerIps[0] + const url = `${provider}/download/${sourceMeta.merkleHex}` + try { + const resp = await fetch(url, { method: 'GET' }) + const contentLength = resp.headers.get('Content-Length') + if (resp.status !== 200 || resp.body === null || !contentLength) { + throw new Error('Download failed') + } else { + const reader = resp.body.getReader() + const chunks = [] + let receivedLength = 0 + while (true) { + const { done, value } = await reader.read() + if (done) { + break + } + chunks.push(value) + receivedLength += value.length + } + const { name, ...meta } = sourceMeta.fileMeta + baseFile = new File(chunks, name, meta) + const tmp = await baseFile.slice(0, 8).text() + if (Number(tmp) > 0) { + const parts: Blob[] = [] + const aes = await this.reader.loadKeysByUlid( + source.getUlid(), + this.jklAddress, + ) + for (let i = 0; i < baseFile.size;) { + const offset = i + 8 + const segSize = Number(await baseFile.slice(i, offset).text()) + const last = offset + segSize + const segment = baseFile.slice(offset, last) + + parts.push(await aesBlobCrypt(segment, aes, 'decrypt')) + i = last + } + baseFile = new File(parts, name, meta) + } + } + } catch (err) { + console.warn(`Error fetching ${sourceMeta.fileMeta.name} from provider ${provider}: ${err}`) + } + } + if (!baseFile) { + throw new Error('Download failed') + } + const pkg = await this.processPrivate(baseFile, 0) + pkg.meta = await FileMetaHandler.create({ + clone: { + ...pkg.meta.export(), + location: source.getLocation(), + ulid: source.getUlid(), + }, + refIndex: source.getRefIndex(), + }) + return pkg + } catch (err) { + throw warnError('storageHandler upcycleFile()', err) + } + } + /** * * @param {IMoveRenameTarget} target @@ -1313,6 +2202,21 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { } } + /** + * + * @returns {Promise} + * @protected + */ + protected async getAllProviders (): Promise { + try { + const providers = await this.getAvailableProviders() + // console.log(providers) + return await this.findProviderIps(providers) + } catch (err) { + throw warnError('storageHandler getAllProviders()', err) + } + } + /** * * @param {IWrappedEncodeObject[]} msgs @@ -1326,43 +2230,23 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { ): Promise[]> { try { const activeUploads: Promise[] = [] - - const providerTeams = Object.keys(this.providers) - const copies = Math.min(3, providerTeams.length) - + const uploader = new UploadHandler(this.providers, this.hostAddress) + this.uploadsInProgress = true for (let i = 0; i < msgs.length; i++) { if (!msgs[i]) { warnError('storageHandler batchUploads()', `msg at ${i} is undefined`) continue } const { file, merkle } = msgs[i] - if (file && merkle) { - this.uploadsInProgress = true - - const used: number[] = [] - for (let i = 0; i < copies; i++) { - while (true) { - const seed = Math.floor(Math.random() * providerTeams.length) - if (used.includes(seed)) { - } else { - used.push(seed) - break - } - } - const [seed] = used.slice(-1) - const selected = this.providers[providerTeams[seed]] - const one = selected[Math.floor(Math.random() * selected.length)] - const uploadUrl = `${one.ip}/upload` - - const uploadPromise = this.uploadFile( - uploadUrl, - uploadHeight, - file, - merkle, - ) - activeUploads.push(uploadPromise) - } + if (!(file && merkle)) { + continue } + const { providerIps } = await this.jackalSigner.queries.storage.findFile({ + merkle: hexToBuffer(merkle), + }) + const started = uploader.upload({ file, merkle, uploadHeight }, providerIps.length) + activeUploads.push(started) + } return activeUploads } catch (err) { @@ -1370,51 +2254,6 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { } } - /** - * - * @param {string} url - * @param {number} startBlock - * @param {File} file - * @param {string} merkle - * @returns {Promise} - * @protected - */ - protected async uploadFile ( - url: string, - startBlock: number, - file: File, - merkle: string, - ): Promise { - if ( - await this.checkLocked({ noConvert: true, exists: true, signer: true }) - ) { - throw new Error('Locked.') - } - try { - const fileFormData = new FormData() - fileFormData.set('file', file) - fileFormData.set('merkle', merkle) - fileFormData.set('sender', this.jklAddress) - fileFormData.set('start', startBlock.toString()) - - console.log('startBlock:', startBlock.toString()) - return await fetch(url, { method: 'POST', body: fileFormData }).then( - async (resp): Promise => { - if (typeof resp === 'undefined' || resp === null) { - throw new Error(`Status Message: Empty Response`) - } - if (resp.status !== 200) { - throw new Error(`Status Message: ${resp.statusText}`) - } else { - return resp.json() - } - }, - ) - } catch (err) { - throw warnError('storageHandler uploadFile()', err) - } - } - /** * * @param {string} name @@ -1423,11 +2262,11 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { */ protected async possibleRnsToAddress (name: string): Promise { try { - if (bech32.checkIfValid(name)) { - return name + if (this.rns) { + return await this.rns.possibleRnsToJklAddress(name) } else { - if (this.rns) { - return await this.rns.rnsToAddress(name) + if (bech32.checkIfValid(name)) { + return name } else { throw new Error('Invalid name') } @@ -1461,6 +2300,7 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { }) msgs.push(...(await this.ulidFolderToMsgs())) msgs.push(...(await this.makeCreateBaseFolderMsgs('Home'))) + msgs.push(...(await this.makeCreateBaseFolderMsgs('Shared'))) return msgs } catch (err) { throw warnError('storageHandler initUlidHome()', err) @@ -1527,15 +2367,17 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { /** * * @param {string} name + * @param {number} [count] * @returns {Promise} * @protected */ protected async makeCreateBaseFolderMsgs ( name: string, + count?: number, ): Promise { try { const baseMeta = await FolderMetaHandler.create({ - count: 0, + count: count || 0, location: 'ulid', name, }) @@ -1563,6 +2405,10 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { await this.jackalSigner.queries.storage.allFilesByMerkle({ merkle: ft.merkleRoot, }) + if ((files as DUnifiedFile[]).length === 0) { + console.warn('looks like we\'re deleting a dead file...') + return msgs + } const [details] = files try { const deletePkg = { @@ -1615,34 +2461,6 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { } } - /** - * - * @returns {Promise} - * @protected - */ - protected async loadMyNotifications (): Promise { - try { - const noti = - await this.jackalSigner.queries.notifications.allNotificationsByAddress( - { to: this.jklAddress }, - ) - - const messages: INotification[] = [] - for (let data of noti.notifications) { - const contents = JSON.parse(data.contents) - if ('private' in contents) { - const clean = await this.reader.readShareNotification(data) - messages.push(clean) - } else { - messages.push(contents) - } - } - return messages - } catch (err) { - throw warnError('storageHandler loadMyNotifications()', err) - } - } - /** * * @param {string} name @@ -1715,7 +2533,7 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { description: '', file: toProcess, fileMeta, - location: this.readCurrentLocation(), + location: this.readCurrentUlid(), }) return { file: toProcess, meta: baseMeta, duration } } catch (err) { @@ -1818,15 +2636,16 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { try { const data = await this.reader.loadMetaByPath(path) if (data.metaDataType === undefined) { + const meta = data as ILegacyFolderMetaData const msgs: IWrappedEncodeObject[] = [] let ii = 0 const parent = await FolderMetaHandler.create({ count: 0, location: '', - name: data.whoAmI, + name: meta.whoAmI, }) - for (let dir of data.dirChildren) { + for (let dir of meta.dirChildren) { const child = await this.buildConversion(`${path}/${dir}`) if (child) { child.handler.setLocation(parent.getUlid()) @@ -1840,7 +2659,7 @@ export class StorageHandler extends EncodingHandler implements IStorageHandler { } } - for (let fileMeta of Object.values(data.fileChildren)) { + for (let fileMeta of Object.values(meta.fileChildren)) { ii++ const meta = await this.reader.loadFromLegacyMerkles( path, diff --git a/src/classes/uploadHandler.ts b/src/classes/uploadHandler.ts new file mode 100644 index 00000000..8626beff --- /dev/null +++ b/src/classes/uploadHandler.ts @@ -0,0 +1,210 @@ +import { + IProviderPool, + IProviderStatusResponse, + IProviderUploadResponse, + IUploadDetails, + TMergedProviderResponse, +} from '@/interfaces' +import { setDelay, shuffleArray, warnError } from '@/utils/misc' +import { hexToBuffer } from '@/utils/hash' +import { IUploadHandler } from '@/interfaces/classes' + +export class UploadHandler implements IUploadHandler { + providers: IProviderPool + readyProviders: string[] + jklAddress: string + queue: IUploadDetails[] + runQueue: boolean + completed: Record + + constructor (providers: IProviderPool, jklAddress: string) { + this.providers = providers + this.readyProviders = Object.values(providers).flat().map(prov => prov.ip) + this.jklAddress = jklAddress + + this.queue = [] + this.runQueue = true + this.completed = {} + + this.hostQueue() + } + + /** + * + * @param {IUploadDetails} details + * @param {number} existing + * @param {number} copies + * @returns {Promise} + */ + async upload (details: IUploadDetails, existing: number, copies: number = 2): Promise { + try { + if (existing >= this.readyProviders.length) { + return { + merkle: hexToBuffer(details.merkle), + owner: this.jklAddress, + start: details.uploadHeight, + cid: '', + } + } + const results = await this.attempt(details) + for (let i = 0; i < copies - existing; i++) { + this.queue.push(details) + } + return results + } catch (err) { + throw warnError('UploadHandler upload()', err) + } + } + + startQueue () { + this.runQueue = true + } + + stopQueue () { + this.runQueue = false + } + + /** + * + * @param {IUploadDetails} details + * @returns {Promise} + * @private + */ + private async attempt (details: IUploadDetails): Promise { + const providerOrder = shuffleArray(this.readyProviders) + while (providerOrder.length > 0) { + try { + const ip = providerOrder.shift() as string + if (ip in (this.completed[details.merkle] || [])) { + continue + } + const v2Url = `${ip}/v2/upload` + const uploadJob = await this.uploadFile(v2Url, details) + + if (!('job_id' in uploadJob)) { + const v1Url = `${ip}/upload` + const results = await this.uploadFile(v1Url, details) as IProviderUploadResponse + if (!this.completed[details.merkle]) { + this.completed[details.merkle] = [ip] + } else { + this.completed[details.merkle].push(ip) + } + return results + } else { + const pollUrl = `${ip}/v2/status/${uploadJob.job_id}` + const results = await this.pollForCompletion(pollUrl) + if (!this.completed[details.merkle]) { + this.completed[details.merkle] = [ip] + } else { + this.completed[details.merkle].push(ip) + } + return results + } + } catch { + } + } + console.log('Ran out of providers to upload to') + return { + merkle: hexToBuffer(details.merkle), + owner: this.jklAddress, + start: details.uploadHeight, + cid: '', + } + } + + private async hostQueue () { + while (true) { + if (this.runQueue && this.queue.length > 0) { + const details = this.queue.shift() as IUploadDetails + await this.attempt(details) + } + await setDelay(.1) + } + } + + /** + * + * @param {string} pollUrl + * @returns {Promise} + * @private + */ + private pollForCompletion (pollUrl: string): Promise { + return new Promise(async (resolve, reject) => { + try { + let counter = 0 + let resp: IProviderStatusResponse = await fetch(pollUrl) + .then(res => res.json()) + console.log('progress:', resp.progress, resp) + + while (resp.progress < 100) { + counter++ + if (counter > 30) { + reject(new Error('Polling timeout after 30 attempts')) + return + } + await setDelay(30) + resp = await fetch(pollUrl) + .then(res => res.json()) + console.log('progress:', resp.progress, resp) + } + + resolve({ + cid: resp.cid, + merkle: resp.merkle, + start: resp.start, + owner: resp.owner, + }) + } catch (err) { + reject(err) + } + }) + } + + /** + * + * @param {string} url + * @param {IUploadDetails} details + * @returns {Promise} + * @private + */ + private async uploadFile ( + url: string, + details: IUploadDetails, + ): Promise { + try { + const { file, merkle, uploadHeight } = details + const fileFormData = new FormData() + fileFormData.set('file', file) + fileFormData.set('merkle', merkle) + fileFormData.set('sender', this.jklAddress) + fileFormData.set('start', uploadHeight.toString()) + + console.log('startBlock:', uploadHeight.toString(), url) + return await fetch(url, { + method: 'POST', + body: fileFormData, + }).then( + async (resp): Promise => { + if (typeof resp === 'undefined' || resp === null) { + throw new Error(`Status Message: Empty Response`) + } + if (resp.status === 202) { + return resp.json() + } else if (resp.status === 200) { + return resp.json() + } else { + try { + const parsed = await resp.json() + throw new Error(`Status Message: ${resp.status} ${resp.statusText} ${parsed.error}`) + } catch (error) { + const parsed = await resp.text() + throw new Error(`Status Message: ${resp.status} ${parsed}`) + } + } + }, + ) + } catch (err) { + throw warnError('UploadHandler uploadFile()', err) + } + } +} \ No newline at end of file diff --git a/src/classes/wasmHandler.ts b/src/classes/wasmHandler.ts index 9a96a1a3..b8f32e58 100644 --- a/src/classes/wasmHandler.ts +++ b/src/classes/wasmHandler.ts @@ -20,7 +20,7 @@ export class WasmHandler extends EncodingHandler implements IWasmHandler { hostSigner: THostSigningClient, keyPair: PrivateKey, ) { - super(client, jackalSigner, hostSigner, keyPair) + super(client, jackalSigner, hostSigner, keyPair, keyPair) } /** @@ -29,58 +29,121 @@ export class WasmHandler extends EncodingHandler implements IWasmHandler { * @returns {Promise} - Instance of WasmHandler. */ static async init (client: IClientHandler): Promise { - const jackalSigner = client.getJackalSigner() - if (!jackalSigner) { - throw new Error(signerNotEnabled('WasmHandler', 'init')) - } - const hostSigner = client.getHostSigner() - if (!hostSigner) { - throw new Error(signerNotEnabled('WasmHandler', 'init')) + try { + const jackalSigner = client.getJackalSigner() + if (!jackalSigner) { + throw new Error(signerNotEnabled('WasmHandler', 'init')) + } + const hostSigner = client.getHostSigner() + if (!hostSigner) { + throw new Error(signerNotEnabled('WasmHandler', 'init')) + } + let dummyKey = await stringToShaHex('') + const keyPair = PrivateKey.fromHex(dummyKey) + return new WasmHandler(client, jackalSigner, hostSigner, keyPair) + } catch (err) { + throw warnError('wasmHandler init()', err) } - let dummyKey = await stringToShaHex('') - const keyPair = PrivateKey.fromHex(dummyKey) - return new WasmHandler(client, jackalSigner, hostSigner, keyPair) } /** - * Instantiate a CosmWasm contract. + * Instantiate an outpost contract. + * @param {string} contractAddress * @param {string} connectionIdA * @param {string} connectionIdB - * @param {number} codeId * @returns {Promise} */ async instantiateICA ( + contractAddress: string, connectionIdA: string, connectionIdB: string, - codeId: number, ): Promise { try { - const wrapped: IWrappedEncodeObject[] = this.instantiateToMsgs( - connectionIdA, - connectionIdB, - codeId, - ) + const msg = { + create_outpost: { + channel_open_init_options: { + connection_id: connectionIdA, + counterparty_connection_id: connectionIdB, + tx_encoding: 'proto3', + }, + }, + } + + const eo = this.jackalClient.getTxs().cosmwasm.msgExecuteContract({ + contract: contractAddress, + msg: stringToUint8Array(JSON.stringify(msg)), + funds: [], + sender: this.jackalClient.getHostAddress(), + }) + const wrapped: IWrappedEncodeObject = { encodedObject: eo, modifier: 0 } + const postBroadcast = - await this.jackalClient.broadcastAndMonitorMsgs(wrapped) + await this.jackalClient.broadcastAndMonitorMsgs(wrapped, { queryOverride: `message.action = '/cosmwasm.wasm.v1.MsgExecuteContract' AND message.sender = '${this.hostAddress}'` }) return postBroadcast.txResponse } catch (err) { throw warnError('wasmHandler instantiateICA()', err) } } + /** + * + * @param {string} contractAddress + * @param {string} connectionIdA + * @param {string} connectionIdB + * @returns {Promise} + */ + async reOpenChannel ( + contractAddress: string, + connectionIdA: string, + connectionIdB: string, + ): Promise { + try { + const msg = { + create_channel: { + channel_open_init_options: { + connection_id: connectionIdA, + counterparty_connection_id: connectionIdB, + tx_encoding: 'proto3', + }, + }, + } + + const eo = this.jackalClient.getTxs().cosmwasm.msgExecuteContract({ + contract: contractAddress, + msg: stringToUint8Array(JSON.stringify(msg)), + funds: [], + sender: this.jackalClient.getHostAddress(), + }) + const wrapped: IWrappedEncodeObject = { encodedObject: eo, modifier: 0 } + const postBroadcast = + await this.jackalClient.broadcastAndMonitorMsgs(wrapped, { queryOverride: `execute._contract_address = '${contractAddress}'` }) + return postBroadcast.txResponse + } catch (err) { + throw warnError('wasmHandler reOpenChannel()', err) + } + } + /** * Get Interchain wasm contract address. - * @param {number} [index] - Optional contract index, defaults to 0. + * @param {string} contractAddress - Contract to query from * @returns {Promise} - Contract address. */ - async getICAContractAddress (index: number = 0): Promise { + async getICAContractAddress (contractAddress: string): Promise { try { - const contractsByCreator = - await this.hostSigner.queries.cosmwasm.contractsByCreator({ - creatorAddress: this.hostAddress, - }) - const contracts = contractsByCreator.contractAddresses - return contracts[index] || '' + const query = { + get_user_outpost_address: { + user_address: this.hostAddress, + }, + } + const uintQuery = stringToUint8Array(JSON.stringify(query)) + const req: DQuerySmartContractStateRequest = { + address: contractAddress, + queryData: uintQuery, + } + const state = + await this.hostSigner.queries.cosmwasm.smartContractState(req) + const uint8Array = state.data instanceof Uint8Array ? state.data : new Uint8Array(state.data) + return uintArrayToString(uint8Array).replaceAll('"', '') } catch (err) { throw warnError('wasmHandler getICAContractAddress()', err) } @@ -88,11 +151,12 @@ export class WasmHandler extends EncodingHandler implements IWasmHandler { /** * Get jkl address from unknown Interchain contract. + * @param {string} contractAddress - Contract to query from * @returns {Promise} */ - async getICAJackalAddress (): Promise { + async getICAJackalAddress (contractAddress: string): Promise { try { - const address = await this.getICAContractAddress() + const address = await this.getICAContractAddress(contractAddress) return this.getJackalAddressFromContract(address) } catch (err) { throw warnError('wasmHandler getICAJackalAddress()', err) @@ -106,20 +170,55 @@ export class WasmHandler extends EncodingHandler implements IWasmHandler { */ async getJackalAddressFromContract (contractAddress: string): Promise { try { - const q = { get_contract_state: {} } + const retries = 30 + let attempt = 0 + while (attempt < retries) { + try { + const query = { get_contract_state: {} } + const req: DQuerySmartContractStateRequest = { + address: contractAddress, + queryData: stringToUint8Array(JSON.stringify(query)), + } + console.log(req) + const res = await this.hostSigner.queries.cosmwasm.smartContractState(req) + const str = uintArrayToString(res.data as Uint8Array) + console.log(str) + const data = JSON.parse(str) + if ('ica_info' in data) { + return data.ica_info.ica_address + } + attempt++ + await new Promise(r => setTimeout(r, 5000)) + } catch (err) { + console.warn('wasmHandler getJackalAddressFromContract()', err) + } + } + throw new Error('can\'t get details from contract') + } catch (err) { + throw warnError('wasmHandler getJackalAddressFromContract()', err) + } + } + /** + * + * @param {string} contractAddress + * @returns {Promise} + */ + async getContractChannelState (contractAddress: string): Promise { + try { + const query = { get_channel: {} } const req: DQuerySmartContractStateRequest = { address: contractAddress, - queryData: stringToUint8Array(JSON.stringify(q)), + queryData: stringToUint8Array(JSON.stringify(query)), } - + console.log(req) const res = await this.hostSigner.queries.cosmwasm.smartContractState(req) const str = uintArrayToString(res.data as Uint8Array) + console.log(str) const data = JSON.parse(str) - - return data.ica_info.ica_address + return data.channel_status } catch (err) { - throw warnError('wasmHandler getJackalAddressFromContract()', err) + throw warnError('wasmHandler getContractChannelState()', err) } } diff --git a/src/interfaces/IClonePackage.ts b/src/interfaces/IClonePackage.ts new file mode 100644 index 00000000..133287ff --- /dev/null +++ b/src/interfaces/IClonePackage.ts @@ -0,0 +1,8 @@ +import { IAesBundle, IFileMetaHandler } from '@/interfaces' + +export interface IClonePackage { + duration: number + meta: IFileMetaHandler + size: number + aes?: IAesBundle +} diff --git a/src/interfaces/IConversionStatus.ts b/src/interfaces/IConversionStatus.ts index aa24cf8d..14dde562 100644 --- a/src/interfaces/IConversionStatus.ts +++ b/src/interfaces/IConversionStatus.ts @@ -1,4 +1,4 @@ -import { IFolderMetaData, ILegacyFolderMetaData } from '@/interfaces/IMetaData' +import { IFolderMetaData, ILegacyFolderMetaData } from '@/interfaces' export interface IConversionNeededBundle { requiresConversion: true diff --git a/src/interfaces/IFileParticulars.ts b/src/interfaces/IFileParticulars.ts index 77359dd6..d583946e 100644 --- a/src/interfaces/IFileParticulars.ts +++ b/src/interfaces/IFileParticulars.ts @@ -1,4 +1,4 @@ -import { IFileMeta } from '@/interfaces/IMetaData' +import { IFileMeta } from '@/interfaces' export interface IFileParticulars { fileMeta: IFileMeta diff --git a/src/interfaces/IFileTreePackage.ts b/src/interfaces/IFileTreePackage.ts index d12ae720..f8c6ec5b 100644 --- a/src/interfaces/IFileTreePackage.ts +++ b/src/interfaces/IFileTreePackage.ts @@ -4,4 +4,5 @@ import { TMetaHandler } from '@/types' export interface IFileTreePackage { meta: TMetaHandler aes?: IAesBundle + update?: boolean } diff --git a/src/interfaces/IMetaData.ts b/src/interfaces/IMetaData.ts index 4fdf9b59..c5d7105f 100644 --- a/src/interfaces/IMetaData.ts +++ b/src/interfaces/IMetaData.ts @@ -32,14 +32,21 @@ export interface IRefMetaData extends IBaseMetaData { pointsTo: string } -export interface IShareRefMetaData extends Omit { - metaDataType: 'shareref' +export interface ISharerRefMetaData extends Omit { + metaDataType: 'sharerref' + sharer: string + type: TSharerType + when: number } export interface INullRefMetaData extends Omit { metaDataType: 'nullref' } +export interface INullSharerRefMetaData extends Omit { + metaDataType: 'nullsharerref' +} + export interface INullMetaDataSource { location: string refIndex: number @@ -54,20 +61,30 @@ export interface INullMetaData extends IBaseMetaData { removed: true } -export interface IFolderMetaDataSource { +export interface ICloneFolderMetaDataSource { + clone: IFolderMetaData + ulid: string + refIndex?: number +} + +export interface INoCloneFolderMetaDataSource { count: number description?: string location: string name: string refIndex?: number + sharerCount?: number ulid?: string } +export type TFolderMetaDataSource = ICloneFolderMetaDataSource | INoCloneFolderMetaDataSource + export interface IFolderMetaFoundationalData { count: number description: string location: string refIndex: number + sharerCount: number ulid: string whoAmI: string } @@ -76,6 +93,7 @@ export interface IFolderMetaData extends IBaseMetaData { count: string description: string metaDataType: 'folder' + sharerCount?: string whoAmI: string } @@ -91,6 +109,7 @@ export interface INoCloneFileMetaDataSource { legacyMerkles?: Uint8Array[] location: string refIndex?: number + sharerCount?: number thumbnail?: string ulid?: string } @@ -105,6 +124,7 @@ export interface IFileMetaFoundationalData { merkleMem: string merkleRoot: Uint8Array refIndex: number + sharerCount: number thumbnail: string ulid: string } @@ -115,60 +135,96 @@ export interface IFileMetaData extends IBaseMetaData { metaDataType: 'file' merkleMem: string merkleRoot: Uint8Array + sharerCount?: string thumbnail: string ulid: string } -export interface ISharedFolderMetaDataSource { - count: number +export interface IShareMetaDataSource { + isFile: boolean location: string name: string + owner: string + pointsTo: string + received: number refIndex?: number ulid?: string } -export interface ISharedFolderMetaFoundationalData { - count: number +export interface IShareMetaFoundationalData { + isFile: boolean location: string + name: string + owner: string + pointsTo: string + received: number refIndex: number ulid: string - whoAmI: string } -export interface IShareFolderMetaData extends Omit { - metaDataType: 'sharefolder' +export interface IShareMetaData extends Omit { + isFile: boolean + location: string + metaDataType: 'share' + name: string + owner: string pointsTo: string + received: number + ulid: string } -export interface IShareMetaDataSource { - label: string +export interface IRootLookupMetaData { + metaDataType: 'rootlookup' + ulid: string +} + +export type TSharerType = 'link' | 'user' | 'null' + +export interface ISharerMetaDataSource { location: string - owner: string - pointsTo: string + sharer: string + type?: TSharerType refIndex?: number ulid?: string } -export interface IShareMetaFoundationalData { - label: string +export interface ISharerMetaFoundationalData { location: string - owner: string - pointsTo: string + sharer: string + type: TSharerType + when: number refIndex: number ulid: string } -export interface IShareMetaData extends Omit { - label: string - metaDataType: 'share' - owner: string +export interface ICloneRnsMetaDataSource { + clone: string } -export interface ISharedMetaDataMap - extends Record { +export interface INoCloneRnsMetaDataSource { + avatar?: string + bio?: string + discord?: string + extensions?: any + telegram?: string + thumbnail?: string + twitter?: string + website?: string } -export interface IRootLookupMetaData { - metaDataType: 'rootlookup' - ulid: string +export type TRnsMetaDataSource = ICloneRnsMetaDataSource | INoCloneRnsMetaDataSource + +export interface IRnsMetaFoundationalData { + avatar: string + bio: string + discord: string + extensions: any + telegram: string + thumbnail: string + twitter: string + website: string +} + +export interface IRnsMetaData extends IRnsMetaFoundationalData { + metaDataType: 'rns' } diff --git a/src/interfaces/INotificationDeletePackage.ts b/src/interfaces/INotificationDeletePackage.ts new file mode 100644 index 00000000..c3b1804e --- /dev/null +++ b/src/interfaces/INotificationDeletePackage.ts @@ -0,0 +1,4 @@ +export interface INotificationDeletePackage { + from: string + time: number +} diff --git a/src/interfaces/INotificationPackage.ts b/src/interfaces/INotificationPackage.ts index dd19a9ce..c49c0900 100644 --- a/src/interfaces/INotificationPackage.ts +++ b/src/interfaces/INotificationPackage.ts @@ -1,6 +1,6 @@ export interface INotificationPackage { isPrivate: boolean receiver: string - path: string - isFile: boolean + contents: string + msg: string } diff --git a/src/interfaces/INotifications.ts b/src/interfaces/INotifications.ts index 596e42a3..7628a5be 100644 --- a/src/interfaces/INotifications.ts +++ b/src/interfaces/INotifications.ts @@ -5,6 +5,7 @@ export interface INotification { export interface INotificationRecord extends INotification { sender: string receiver: string + time: number } export interface IPrivateNotification extends INotification { diff --git a/src/interfaces/IProviderUploadResponse.ts b/src/interfaces/IProviderUploadResponse.ts index cf37b640..ae42ecb4 100644 --- a/src/interfaces/IProviderUploadResponse.ts +++ b/src/interfaces/IProviderUploadResponse.ts @@ -2,4 +2,19 @@ export interface IProviderUploadResponse { merkle: ArrayBuffer owner: string start: number + cid?: string } + +export interface IProviderUploadV2Response { + job_id: string +} + +export interface IProviderStatusResponse { + merkle: ArrayBuffer + owner: string + start: number + cid: string + progress: number +} + +export type TMergedProviderResponse = IProviderUploadResponse | IProviderUploadV2Response diff --git a/src/interfaces/IShareLinkDetails.ts b/src/interfaces/IShareLinkDetails.ts new file mode 100644 index 00000000..429d56e4 --- /dev/null +++ b/src/interfaces/IShareLinkDetails.ts @@ -0,0 +1,4 @@ +export interface IShareLinkDetails { + isFolder: boolean + linkKey: string +} diff --git a/src/interfaces/IShareLinks.ts b/src/interfaces/IShareLinks.ts new file mode 100644 index 00000000..641c6fe3 --- /dev/null +++ b/src/interfaces/IShareLinks.ts @@ -0,0 +1,6 @@ +import { IShareLinkDetails, IWrappedEncodeObject } from '@/interfaces' + +export interface IShareLinks { + links: Record + msgs: IWrappedEncodeObject[] +} diff --git a/src/interfaces/ISharePackage.ts b/src/interfaces/ISharePackage.ts new file mode 100644 index 00000000..1e68512c --- /dev/null +++ b/src/interfaces/ISharePackage.ts @@ -0,0 +1,14 @@ +export interface IShareDirectPackage { + isFile: boolean + isPrivate: boolean + path: string + receiver: string +} + +export interface IShareLinkPackage { + isFile: boolean + link: string + path: string +} + +export type TSharePackage = IShareDirectPackage | IShareLinkPackage diff --git a/src/interfaces/IShareResults.ts b/src/interfaces/IShareResults.ts new file mode 100644 index 00000000..e86ebefe --- /dev/null +++ b/src/interfaces/IShareResults.ts @@ -0,0 +1,6 @@ +import { IWrappedEncodeObject } from '@/interfaces' + +export interface IShareResults { + isFolder: boolean + msgs: IWrappedEncodeObject[] +} diff --git a/src/interfaces/ISignDoc.ts b/src/interfaces/ISignDoc.ts new file mode 100644 index 00000000..90dce554 --- /dev/null +++ b/src/interfaces/ISignDoc.ts @@ -0,0 +1,6 @@ +export interface ISignDoc { + bodyBytes: Uint8Array; + authInfoBytes: Uint8Array; + chainId: string; + accountNumber: bigint; +} diff --git a/src/interfaces/IUnsharePackage.ts b/src/interfaces/IUnsharePackage.ts new file mode 100644 index 00000000..dcca83c1 --- /dev/null +++ b/src/interfaces/IUnsharePackage.ts @@ -0,0 +1,4 @@ +export interface IUnsharePackage { + path: string + removed: string[] +} diff --git a/src/interfaces/IUploadDetails.ts b/src/interfaces/IUploadDetails.ts new file mode 100644 index 00000000..69d407d7 --- /dev/null +++ b/src/interfaces/IUploadDetails.ts @@ -0,0 +1,5 @@ +export interface IUploadDetails { + file: File + merkle: string + uploadHeight: number +} diff --git a/src/interfaces/IWasmDetails.ts b/src/interfaces/IWasmDetails.ts index 51b0077d..8543f0de 100644 --- a/src/interfaces/IWasmDetails.ts +++ b/src/interfaces/IWasmDetails.ts @@ -1,6 +1,5 @@ export interface IWasmDetails { - addressIndex?: number - codeId?: number connIdA?: string connIdB?: string + contract?: string } diff --git a/src/interfaces/classes/IClientHandler.ts b/src/interfaces/classes/IClientHandler.ts index 03a3d2e2..1682f7a5 100644 --- a/src/interfaces/classes/IClientHandler.ts +++ b/src/interfaces/classes/IClientHandler.ts @@ -15,6 +15,7 @@ import { IWasmDetails, IWrappedEncodeObject, } from '@/interfaces' +import { Coin, DeliverTxResponse } from '@cosmjs/stargate' export interface IClientHandler { createStorageHandler (): Promise @@ -49,6 +50,12 @@ export interface IClientHandler { getJklBalance (): Promise + getJackalNetworkBalance (address: string): Promise + + getHostNetworkBalance (address: string, denom: string): Promise + + ibcSend (address: string, amount: Coin, sourceChannel: string): Promise + getJackalAddress (): string getHostAddress (): string diff --git a/src/interfaces/classes/IFiletreeReader.ts b/src/interfaces/classes/IFiletreeReader.ts index a6769ac4..99e2d463 100644 --- a/src/interfaces/classes/IFiletreeReader.ts +++ b/src/interfaces/classes/IFiletreeReader.ts @@ -2,30 +2,60 @@ import type { DMsgFileTreePostFile, DMsgProvisionFileTree, DNotification } from import { IAesBundle, IChildMetaDataMap, + IEncodeExistingRefOptions, IFileMeta, IFileMetaData, IFileMetaHandler, IFileTreeOptions, IFolderMetaData, IFolderMetaHandler, + ILoadRefMetaOptions, + IMetaDataByUlidOptions, INotificationRecord, INullRefMetaData, + INullSharerRefMetaData, IReadFolderContentOptions, IReconstructedFileTree, IRefMetaData, - ISharedMetaDataMap, - IShareFolderMetaData, IShareMetaData, + ISharerRefMetaData, + ISharingLookupOptions, + IViewerSetAddRemove, + TSetMetaViewersOptions, } from '@/interfaces' -import type { TMerkleParentChild, TMetaDataSets } from '@/types' +import { TConversionPair, TMerkleParentChild, TMetaDataSets } from '@/types' export interface IFiletreeReader { + sharersRead (path: string): Promise + + sharerRefRead (path: string, sharer: string): Promise + refCountRead (path: string): Promise refCountIncrement (path: string): void refCountSet (path: string, value: number): void + readSharingRefCount (sharer?: string): Promise<[number, number]> + + sharerCountRead (ulid: string): Promise + + sharerCountIncrement (ulid: string): void + + sharerCountSet (ulid: string, value: number): void + + getConversionQueueLength (): number + + getConversions (): Promise + + sharingLookup (options?: ISharingLookupOptions): Promise + + readViewerShares (ulid: string, index?: number): string[] + + viewerSave (ulid: string, access: Record, index?: number): void + + viewerLookup (ulid: string, index?: number): Promise> + ulidLookup (path: string, owner?: string): string findRefIndex (path: string): number @@ -38,18 +68,18 @@ export interface IFiletreeReader { loadFolderMetaHandler (path: string): Promise - loadShareFolderMeta (path: string): Promise - loadShareMeta (path: string): Promise - loadRefMeta (ulid: string, ref: number): Promise + loadRefMeta (options: ILoadRefMetaOptions): Promise + + loadSharerRefMeta (ulid: string, ref: number): Promise loadLegacyMeta ( legacyMerkles: Uint8Array[], legacyPath: [string, string], ): Promise - loadMetaByUlid (ulid: string): Promise + loadMetaByUlid (options: IMetaDataByUlidOptions): Promise loadMetaByPath (path: string): Promise @@ -58,20 +88,27 @@ export interface IFiletreeReader { ownerAddress: string, ): Promise + loadMetaByExternalUlid ( + ulid: string, + ownerAddress: string, + linkKey?: string, + ): Promise + loadFromLegacyMerkles ( path: string, location: string, fileMeta: IFileMeta, ): Promise - setMetaViewers ( - path: string, - additionalViewers: string[], - ): Promise + setMetaViewers (options: TSetMetaViewersOptions): Promise + + setContents (ulid: string, meta: TMetaDataSets): Promise loadKeysByPath (path: string, ownerAddress: string): Promise - loadKeysByUlid (ulid: string, ownerAddress: string): Promise + loadKeysByUlid (ulid: string, ownerAddress: string, linkKey?: string): Promise + + livenessCheck (ulid: string, ownerAddress: string): Promise encodeProvisionFileTree (): Promise @@ -82,16 +119,22 @@ export interface IFiletreeReader { ): Promise encodeExistingPostFile ( - path: string, + ulid: string, location: TMerkleParentChild, - additionalViewers: string[], + viewers: IViewerSetAddRemove, ): Promise + updateExistingPostFile ( + ulid: string, + location: TMerkleParentChild, + meta: TMetaDataSets, + ): Promise + + encodeExistingRef (options: IEncodeExistingRefOptions): Promise + protectNotification (receiverAddress: string, aes: IAesBundle): Promise readShareNotification ( notificationData: DNotification, ): Promise - - loadSharingFolder (ulid: string): Promise } diff --git a/src/interfaces/classes/IMetaHandler.ts b/src/interfaces/classes/IMetaHandler.ts index 77b69948..d3faa035 100644 --- a/src/interfaces/classes/IMetaHandler.ts +++ b/src/interfaces/classes/IMetaHandler.ts @@ -1,12 +1,13 @@ -import type { +import { IFileMetaData, IFolderMetaData, INullMetaData, INullRefMetaData, + INullSharerRefMetaData, IRefMetaData, - IShareFolderMetaData, + IRnsMetaData, IShareMetaData, - IShareRefMetaData, + ISharerRefMetaData, } from '@/interfaces' export interface IRefMetaHandler { @@ -25,6 +26,8 @@ export interface INullMetaHandler extends IRefMetaHandler { export (): INullMetaData exportRef (): INullRefMetaData + + exportSharerRef (): INullSharerRefMetaData } export interface IFolderMetaHandler extends IRefMetaHandler { @@ -34,6 +37,12 @@ export interface IFolderMetaHandler extends IRefMetaHandler { getCount (): number + addAndReturnSharerCount (value: number): number + + setSharerCount (count: number): void + + getSharerCount (): number + getUlid (): string setLocation (location: string): void @@ -46,6 +55,12 @@ export interface IFolderMetaHandler extends IRefMetaHandler { } export interface IFileMetaHandler extends IRefMetaHandler { + addAndReturnSharerCount (value: number): number + + setSharerCount (count: number): void + + getSharerCount (): number + getUlid (): string setLocation (location: string): void @@ -57,28 +72,26 @@ export interface IFileMetaHandler extends IRefMetaHandler { exportRef (): IRefMetaData } -export interface IShareFolderMetaHandler extends IRefMetaHandler { - addAndReturnCount (value: number): number - - getCount (): number +export interface IShareMetaHandler extends IRefMetaHandler { + getIsFile (): boolean getUlid (): string getLocation (): string - export (): IShareFolderMetaData -} + export (): IShareMetaData -export interface IShareMetaHandler extends IRefMetaHandler { - setLabel (label: string): void + exportRef (): IRefMetaData +} - getLabel (): string +export interface ISharerMetaHandler extends IRefMetaHandler { + getUlid (): string getLocation (): string - getUlid (): string - - export (): IShareMetaData + exportSharerRef (): ISharerRefMetaData +} - exportRef (): IShareRefMetaData +export interface IRnsMetaHandler { + export (): IRnsMetaData } diff --git a/src/interfaces/classes/IMnemonicSigner.ts b/src/interfaces/classes/IMnemonicSigner.ts new file mode 100644 index 00000000..7b2b6af3 --- /dev/null +++ b/src/interfaces/classes/IMnemonicSigner.ts @@ -0,0 +1,6 @@ +import { TMergedSigner } from '@jackallabs/jackal.js-protos' +import { AccountData } from '@cosmjs/proto-signing' + +export interface IMnemonicSigner extends TMergedSigner { + getAccounts (): Promise +} \ No newline at end of file diff --git a/src/interfaces/classes/IRnsHandler.ts b/src/interfaces/classes/IRnsHandler.ts index 94793f10..998c08f6 100644 --- a/src/interfaces/classes/IRnsHandler.ts +++ b/src/interfaces/classes/IRnsHandler.ts @@ -19,11 +19,12 @@ import { IPageRequest, IRegisterOptions, IRemoveSubRnsOptions, + ISetNewPrimaryOptions, ITransferOptions, IUpdateOptions, IWrappedEncodeObject, } from '@/interfaces' -import type { TAddressPrefix } from '@/types' +import { INameWithMeta, TAddressPrefix } from '@/types' export interface IRnsHandler { getBidForSingleName (name: string): Promise @@ -51,8 +52,12 @@ export interface IRnsHandler { getNameDetails (name: string): Promise + getNameMetaDetails (name: string): Promise + getPrimaryName (address?: string): Promise + possibleRnsToJklAddress (name: string): Promise + rnsToAddress (name: string, prefix?: TAddressPrefix): Promise bid (options: IBidOptions): Promise @@ -78,4 +83,6 @@ export interface IRnsHandler { addSubRns (options: IAddSubRnsOptions): Promise removeSubRns (options: IRemoveSubRnsOptions): Promise + + setNewPrimary (options: ISetNewPrimaryOptions): Promise } diff --git a/src/interfaces/classes/ISharedUpdater.ts b/src/interfaces/classes/ISharedUpdater.ts deleted file mode 100644 index 10b58cef..00000000 --- a/src/interfaces/classes/ISharedUpdater.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface ISharedUpdater { - fetchNotifications (): Promise - - digest (): Promise -} diff --git a/src/interfaces/classes/IStorageHandler.ts b/src/interfaces/classes/IStorageHandler.ts index fb4f779b..579320da 100644 --- a/src/interfaces/classes/IStorageHandler.ts +++ b/src/interfaces/classes/IStorageHandler.ts @@ -3,21 +3,32 @@ import { IBroadcastOrChainOptions, IBuyStorageOptions, IChildMetaDataMap, + ICloneSharesOptions, + ICloneUploadOptions, ICreateFolderOptions, + ICustomRootOptions, IDeleteTargetOptions, + IDownloadByUlidOptions, IDownloadTracker, IFileMetaData, IFileParticulars, IFolderMetaData, + IMetaDataByUlidOptions, IMoveRenameResourceOptions, IProviderIpSet, IReadFolderContentOptions, + IRemoveShareRecordOptions, + IShareLinkOptions, + IShareLinks, + IShareMetaData, IShareOptions, IStagedUploadPackage, IStorageStatus, + IUnshareOptions, IWrappedEncodeObject, + TLoadThumbnailOptions, } from '@/interfaces' -import type { TSharedRootMetaDataMap } from '@/types' +import type { TMetaDataSets } from '@/types' export interface IStorageHandler { cleanShutdown (): void @@ -46,7 +57,11 @@ export interface IStorageHandler { loadProviderPool (providers?: IProviderIpSet): Promise - initStorage (options?: IBroadcastOrChainOptions): Promise + initStorage (options?: IBroadcastOrChainOptions): Promise + + initCustomRoot (options: ICustomRootOptions): Promise + + checkAndInitSharing (options?: IBroadcastOrChainOptions): Promise planStatus (): Promise @@ -78,8 +93,22 @@ export interface IStorageHandler { queuePublic (toQueue: File | File[], duration?: number): Promise + cloneShares (options: ICloneSharesOptions): Promise + + cloneUpload (options: ICloneUploadOptions): Promise + processAllQueues (options?: IBroadcastOptions): Promise + loadThumbnail (options: TLoadThumbnailOptions): Promise + + getMetaDataByUlid (options: IMetaDataByUlidOptions): Promise + + getFolderDetailsByUlid (options: IMetaDataByUlidOptions): Promise + + findUlid (path: string, address?: string): string + + getFileMetaData (filePath: string, address?: string): Promise + getFileParticulars (filePath: string): Promise downloadFile (filePath: string, trackers: IDownloadTracker): Promise @@ -90,15 +119,31 @@ export interface IStorageHandler { trackers: IDownloadTracker, ): Promise + downloadByUlid (options: IDownloadByUlidOptions): Promise + deleteTargets (options: IDeleteTargetOptions): Promise - share (options: IShareOptions): Promise + checkSharedTo (path: string): Promise + + shareDirect (options: IShareOptions): Promise + + shareLink (options: IShareLinkOptions): Promise + + unshare (options: IUnshareOptions): Promise + + removeShareRecord (options: IRemoveShareRecordOptions): Promise checkNotifications (): Promise - processPendingNotifications (): Promise + processPendingNotifications (options?: IBroadcastOrChainOptions): Promise - readSharing (): TSharedRootMetaDataMap + readSharing (sharer?: string): Promise convert (options?: IBroadcastOrChainOptions): Promise + + checkIfUpcycle (): boolean + + checkAndUpcycle (options?: IBroadcastOptions): Promise + + runUpcycleQueue (options?: IBroadcastOptions): Promise } diff --git a/src/interfaces/classes/IUploadHandler.ts b/src/interfaces/classes/IUploadHandler.ts new file mode 100644 index 00000000..926ca2e8 --- /dev/null +++ b/src/interfaces/classes/IUploadHandler.ts @@ -0,0 +1,9 @@ +import { IProviderUploadResponse, IUploadDetails } from '@/interfaces' + +export interface IUploadHandler { + upload (details: IUploadDetails, existing: number, copies: number): Promise + + startQueue (): void + + stopQueue (): void +} \ No newline at end of file diff --git a/src/interfaces/classes/IWasmHandler.ts b/src/interfaces/classes/IWasmHandler.ts index 4b96998f..1cd469b4 100644 --- a/src/interfaces/classes/IWasmHandler.ts +++ b/src/interfaces/classes/IWasmHandler.ts @@ -2,16 +2,24 @@ import type { DDeliverTxResponse, DEncodeObject } from '@jackallabs/jackal.js-pr export interface IWasmHandler { instantiateICA ( + contractAddress: string, connectionIdA: string, connectionIdB: string, - codeId: number, ): Promise - getICAContractAddress (index?: number): Promise + reOpenChannel ( + contractAddress: string, + connectionIdA: string, + connectionIdB: string, + ): Promise - getICAJackalAddress (): Promise + getICAContractAddress (contractAddress: string): Promise + + getICAJackalAddress (contractAddress: string): Promise getJackalAddressFromContract (contractAddress: string): Promise + getContractChannelState (contractAddress: string): Promise + wrapEncodeObjectsForBroadcast (contract: string, msgs: DEncodeObject[]): DEncodeObject[] } diff --git a/src/interfaces/classes/index.ts b/src/interfaces/classes/index.ts index 4fdd4b63..5f5a7585 100644 --- a/src/interfaces/classes/index.ts +++ b/src/interfaces/classes/index.ts @@ -2,10 +2,10 @@ export * from '@/interfaces/classes/IClientHandler' export * from '@/interfaces/classes/IClientSetup' export * from '@/interfaces/classes/IFiletreeReader' export * from '@/interfaces/classes/IMetaHandler' +export * from '@/interfaces/classes/IMnemonicSigner' export * from '@/interfaces/classes/IMnemonicWallet' export * from '@/interfaces/classes/IOracleHandler' export * from '@/interfaces/classes/IRnsHandler' -export * from '@/interfaces/classes/ISharedUpdater' export * from '@/interfaces/classes/IStorageHandler' -export * from '@/interfaces/classes/IStorageOptions' +export * from '@/interfaces/classes/IUploadHandler' export * from '@/interfaces/classes/IWasmHandler' diff --git a/src/interfaces/index.ts b/src/interfaces/index.ts index 23234508..99a12163 100644 --- a/src/interfaces/index.ts +++ b/src/interfaces/index.ts @@ -6,6 +6,7 @@ export * from '@/interfaces/IAvailableWallets' export * from '@/interfaces/IBroadcastResults' export * from '@/interfaces/IChain' export * from '@/interfaces/IChecks' +export * from '@/interfaces/IClonePackage' export * from '@/interfaces/IContract' export * from '@/interfaces/IConversionFolderBundle' export * from '@/interfaces/IConversionStatus' @@ -17,6 +18,7 @@ export * from '@/interfaces/IFileTreeStructures' export * from '@/interfaces/IGasRate' export * from '@/interfaces/IMetaData' export * from '@/interfaces/IMoveRenameTarget' +export * from '@/interfaces/INotificationDeletePackage' export * from '@/interfaces/INotificationPackage' export * from '@/interfaces/INotifications' export * from '@/interfaces/IPageRequest' @@ -24,9 +26,16 @@ export * from '@/interfaces/IProviderPool' export * from '@/interfaces/IProviderUploadResponse' export * from '@/interfaces/IReconstructedFileTree' export * from '@/interfaces/IRnsData' +export * from '@/interfaces/IShareLinkDetails' +export * from '@/interfaces/IShareLinks' +export * from '@/interfaces/ISharePackage' +export * from '@/interfaces/IShareResults' +export * from '@/interfaces/ISignDoc' export * from '@/interfaces/IStagedUploadPackage' export * from '@/interfaces/IStorageStatus' export * from '@/interfaces/ITrackers' +export * from '@/interfaces/IUnsharePackage' +export * from '@/interfaces/IUploadDetails' export * from '@/interfaces/IUploadPackage' export * from '@/interfaces/IWalletDetails' export * from '@/interfaces/IWasmDetails' diff --git a/src/interfaces/options/IAcceptBidOptions.ts b/src/interfaces/options/IAcceptBidOptions.ts index 8deff3b5..523b2875 100644 --- a/src/interfaces/options/IAcceptBidOptions.ts +++ b/src/interfaces/options/IAcceptBidOptions.ts @@ -11,4 +11,4 @@ export interface IAcceptBidOptions { rns: string chain?: true broadcastOptions?: IBroadcastOptions -} \ No newline at end of file +} diff --git a/src/interfaces/options/IAddSubRnsOptions.ts b/src/interfaces/options/IAddSubRnsOptions.ts index 381e3672..1b023a94 100644 --- a/src/interfaces/options/IAddSubRnsOptions.ts +++ b/src/interfaces/options/IAddSubRnsOptions.ts @@ -1,4 +1,4 @@ -import { IBroadcastOptions, IRnsData } from '@/interfaces' +import { IBroadcastOptions, INoCloneRnsMetaDataSource } from '@/interfaces' /** * @@ -6,13 +6,13 @@ import { IBroadcastOptions, IRnsData } from '@/interfaces' * @property {string} rns - RNS to transfer. * @property {string} linkedWallet - Jackal address to link new sub RNS to. * @property {string} subRns - Sub RNS to create. - * @property {IRnsData} [data] - Optional object to include in sub RNS data field. + * @property {INoCloneRnsMetaDataSource} [data] - Optional object to include in sub RNS data field. */ export interface IAddSubRnsOptions { rns: string linkedWallet: string subRns: string - data?: IRnsData + data?: INoCloneRnsMetaDataSource chain?: true broadcastOptions?: IBroadcastOptions -} \ No newline at end of file +} diff --git a/src/interfaces/options/IBidOptions.ts b/src/interfaces/options/IBidOptions.ts index a3a6c2a0..4111ce41 100644 --- a/src/interfaces/options/IBidOptions.ts +++ b/src/interfaces/options/IBidOptions.ts @@ -12,4 +12,4 @@ export interface IBidOptions { rns: string chain?: true broadcastOptions?: IBroadcastOptions -} \ No newline at end of file +} diff --git a/src/interfaces/options/IBroadcastOptions.ts b/src/interfaces/options/IBroadcastOptions.ts index 254e10dd..df937462 100644 --- a/src/interfaces/options/IBroadcastOptions.ts +++ b/src/interfaces/options/IBroadcastOptions.ts @@ -6,4 +6,6 @@ export interface IBroadcastOptions { broadcastTimeoutHeight?: bigint monitorTimeout?: number socketOverrides?: TSocketSet + queryOverride?: string + callback?: () => void } diff --git a/src/interfaces/options/IBuyOptions.ts b/src/interfaces/options/IBuyOptions.ts index 9e8aee2d..6e720d37 100644 --- a/src/interfaces/options/IBuyOptions.ts +++ b/src/interfaces/options/IBuyOptions.ts @@ -9,4 +9,4 @@ export interface IBuyOptions { rns: string chain?: true broadcastOptions?: IBroadcastOptions -} \ No newline at end of file +} diff --git a/src/interfaces/options/ICancelBidOptions.ts b/src/interfaces/options/ICancelBidOptions.ts index 4840e65a..c942f07a 100644 --- a/src/interfaces/options/ICancelBidOptions.ts +++ b/src/interfaces/options/ICancelBidOptions.ts @@ -9,4 +9,4 @@ export interface ICancelBidOptions { rns: string chain?: true broadcastOptions?: IBroadcastOptions -} \ No newline at end of file +} diff --git a/src/interfaces/options/ICloneSharesOptions.ts b/src/interfaces/options/ICloneSharesOptions.ts new file mode 100644 index 00000000..b8fc5abf --- /dev/null +++ b/src/interfaces/options/ICloneSharesOptions.ts @@ -0,0 +1,14 @@ +import type { IBroadcastOptions, IShareMetaData } from '@/interfaces' + +/** + * + * @interface ICloneSharesOptions + * @property {IShareMetaData | IShareMetaData[]} targets - Shared File metas to clone from. + * @property {string} destination - Folder to copy files into. + */ +export interface ICloneSharesOptions { + targets: IShareMetaData | IShareMetaData[] + destination: string + chain?: true + broadcastOptions?: IBroadcastOptions +} diff --git a/src/interfaces/options/ICloneUploadOptions.ts b/src/interfaces/options/ICloneUploadOptions.ts new file mode 100644 index 00000000..2e6a953a --- /dev/null +++ b/src/interfaces/options/ICloneUploadOptions.ts @@ -0,0 +1,16 @@ +import type { IBroadcastOptions, IFileMetaData } from '@/interfaces' + +/** + * + * @interface ICloneUploadOptions + * @property {IFileMetaData | IFileMetaData[]} targets - Shared File metas to clone from. + * @property {string} destination - Folder to copy files into. + * @property {string} sharer - Bech32 wallet address of source of targets. + */ +export interface ICloneUploadOptions { + targets: IFileMetaData | IFileMetaData[] + destination: string + sharer: string + chain?: true + broadcastOptions?: IBroadcastOptions +} diff --git a/src/interfaces/options/ICreateViewAccessOptions.ts b/src/interfaces/options/ICreateViewAccessOptions.ts new file mode 100644 index 00000000..1d71563a --- /dev/null +++ b/src/interfaces/options/ICreateViewAccessOptions.ts @@ -0,0 +1,18 @@ +import { IAesBundle, TViewerSetAll } from '@/interfaces' + +/** + * + * @interface ICreateViewAccessOptions + * @property {string} trackingNumber + * @property {TViewerSetAll} viewers + * @property {IAesBundle} [aes] + * @property {number} [index] + * @property {string} [ulid] + */ +export interface ICreateViewAccessOptions { + trackingNumber: string + viewers: TViewerSetAll + aes?: IAesBundle + index?: number + ulid?: string +} diff --git a/src/interfaces/options/ICustomRootOptions.ts b/src/interfaces/options/ICustomRootOptions.ts new file mode 100644 index 00000000..42671c96 --- /dev/null +++ b/src/interfaces/options/ICustomRootOptions.ts @@ -0,0 +1,7 @@ +import { IBroadcastOptions } from '@/interfaces' + +export interface ICustomRootOptions { + name: string + chain?: true + broadcastOptions?: IBroadcastOptions +} diff --git a/src/interfaces/options/IDelistOptions.ts b/src/interfaces/options/IDelistOptions.ts index 72a34b2f..9eb24be2 100644 --- a/src/interfaces/options/IDelistOptions.ts +++ b/src/interfaces/options/IDelistOptions.ts @@ -9,4 +9,4 @@ export interface IDelistOptions { rns: string chain?: true broadcastOptions?: IBroadcastOptions -} \ No newline at end of file +} diff --git a/src/interfaces/options/IDownloadByUlidOptions.ts b/src/interfaces/options/IDownloadByUlidOptions.ts new file mode 100644 index 00000000..fd079f73 --- /dev/null +++ b/src/interfaces/options/IDownloadByUlidOptions.ts @@ -0,0 +1,16 @@ +import { IDownloadTracker } from '@/interfaces' + +/** + * + * @interface IDownloadByUlidOptions + * @property {IDownloadTracker} trackers + * @property {string} ulid + * @property {string} userAddress + * @property {string} [linkKey] + */ +export interface IDownloadByUlidOptions { + trackers: IDownloadTracker + ulid: string + userAddress: string + linkKey?: string +} diff --git a/src/interfaces/options/IDownloadStagingOptions.ts b/src/interfaces/options/IDownloadStagingOptions.ts new file mode 100644 index 00000000..9cf9e0f8 --- /dev/null +++ b/src/interfaces/options/IDownloadStagingOptions.ts @@ -0,0 +1,20 @@ +import { IDownloadTracker, IFileParticulars } from '@/interfaces' + +export interface IDownloadStagingOptionsWithPath { + particulars: IFileParticulars + provider: string + trackers: IDownloadTracker + userAddress: string + filePath: string +} + +export interface IDownloadStagingOptionsWithUlid { + particulars: IFileParticulars + provider: string + trackers: IDownloadTracker + userAddress: string + ulid: string + linkKey?: string +} + +export type TDownloadStagingOptions = IDownloadStagingOptionsWithPath | IDownloadStagingOptionsWithUlid diff --git a/src/interfaces/options/IEncodeExistingRefOptions.ts b/src/interfaces/options/IEncodeExistingRefOptions.ts new file mode 100644 index 00000000..3506057e --- /dev/null +++ b/src/interfaces/options/IEncodeExistingRefOptions.ts @@ -0,0 +1,10 @@ +import { TViewerSetAll } from '@/interfaces' +import { TMerkleParentChild } from '@/types' + +export interface IEncodeExistingRefOptions { + location: TMerkleParentChild + ref: number + ulid: string + viewers: TViewerSetAll + ownerAddress?: string +} diff --git a/src/interfaces/options/IFileTreeOptions.ts b/src/interfaces/options/IFileTreeOptions.ts index 74bb8286..423f118e 100644 --- a/src/interfaces/options/IFileTreeOptions.ts +++ b/src/interfaces/options/IFileTreeOptions.ts @@ -1,4 +1,4 @@ -import type { IAesBundle } from '@/interfaces/IAesBundle' +import type { IAesBundle } from '@/interfaces' export interface IFileTreeOptions { aes?: IAesBundle diff --git a/src/interfaces/options/IListOptions.ts b/src/interfaces/options/IListOptions.ts index 33a705ab..6cbdf163 100644 --- a/src/interfaces/options/IListOptions.ts +++ b/src/interfaces/options/IListOptions.ts @@ -12,4 +12,4 @@ export interface IListOptions { rns: string chain?: true broadcastOptions?: IBroadcastOptions -} \ No newline at end of file +} diff --git a/src/interfaces/options/ILoadMetaOptions.ts b/src/interfaces/options/ILoadMetaOptions.ts new file mode 100644 index 00000000..f2ad2667 --- /dev/null +++ b/src/interfaces/options/ILoadMetaOptions.ts @@ -0,0 +1,16 @@ +import type { DFile } from '@jackallabs/jackal.js-protos' + +/** + * + * @interface IListOptions + * @property {DFile} file + * @property {string} ulid + * @property {[string, string]} [legacyPath] + * @property {string} [linkKey] + */ +export interface ILoadMetaOptions { + file: DFile + ulid: string + legacyPath?: [string, string] + linkKey?: string +} diff --git a/src/interfaces/options/ILoadRefMetaOptions.ts b/src/interfaces/options/ILoadRefMetaOptions.ts new file mode 100644 index 00000000..91ce68c3 --- /dev/null +++ b/src/interfaces/options/ILoadRefMetaOptions.ts @@ -0,0 +1,6 @@ +export interface ILoadRefMetaOptions { + ref: number + ulid: string + linkKey?: string + ownerAddress?: string +} diff --git a/src/interfaces/options/ILoadThumbnailOptions.ts b/src/interfaces/options/ILoadThumbnailOptions.ts new file mode 100644 index 00000000..42efd013 --- /dev/null +++ b/src/interfaces/options/ILoadThumbnailOptions.ts @@ -0,0 +1,23 @@ +/** + * + * @interface ILoadThumbnailOptionsWithUlid + * @property {string} userAddress - The Jackal address owning the data. + * @property {string} filePath - The path to the File Meta. + */ +export interface ILoadThumbnailOptionsWithUlid { + userAddress: string + filePath: string +} + +/** + * + * @interface ILoadThumbnailOptionsWithPath + * @property {string} userAddress - The Jackal address owning the data. + * @property {string} ulid - The ulid of the File Meta. + */ +export interface ILoadThumbnailOptionsWithPath { + userAddress: string + ulid: string +} + +export type TLoadThumbnailOptions = ILoadThumbnailOptionsWithPath | ILoadThumbnailOptionsWithUlid diff --git a/src/interfaces/options/IMetaDataByUlidOptions.ts b/src/interfaces/options/IMetaDataByUlidOptions.ts new file mode 100644 index 00000000..1d4388fb --- /dev/null +++ b/src/interfaces/options/IMetaDataByUlidOptions.ts @@ -0,0 +1,12 @@ +/** + * + * @interface IMetaDataByUlidOptions + * @property {string} ulid - The ulid of the data. + * @property {string} [userAddress] - The Jackal address owning the data. + * @property {string} [linkKey] - The key to unlock the data if this was shared via link. + */ +export interface IMetaDataByUlidOptions { + ulid: string + userAddress?: string + linkKey?: string +} diff --git a/src/interfaces/options/IPathToLookupOptions.ts b/src/interfaces/options/IPathToLookupOptions.ts new file mode 100644 index 00000000..b1e41a1a --- /dev/null +++ b/src/interfaces/options/IPathToLookupOptions.ts @@ -0,0 +1,5 @@ +export interface IPathToLookupOptions { + path: string + linkKey?: string + owner?: string +} diff --git a/src/interfaces/options/IReadFolderContentOptions.ts b/src/interfaces/options/IReadFolderContentOptions.ts index d65c50cd..b6ccef5b 100644 --- a/src/interfaces/options/IReadFolderContentOptions.ts +++ b/src/interfaces/options/IReadFolderContentOptions.ts @@ -1,4 +1,5 @@ export interface IReadFolderContentOptions { + linkKey?: string owner?: string path?: string refresh?: true diff --git a/src/interfaces/options/IRegisterOptions.ts b/src/interfaces/options/IRegisterOptions.ts index 810f1757..c12a4346 100644 --- a/src/interfaces/options/IRegisterOptions.ts +++ b/src/interfaces/options/IRegisterOptions.ts @@ -1,18 +1,18 @@ -import { IBroadcastOptions, IRnsData } from '@/interfaces' +import { IBroadcastOptions, INoCloneRnsMetaDataSource } from '@/interfaces' /** * * @interface IRegisterOptions * @property {string} rns - RNS address to register. * @property {number} yearsToRegister - Duration to register for in years. - * @property {IRnsData} [data] - Optional object to include in data field. + * @property {INoCloneRnsMetaDataSource} [data] - Optional object to include in data field. * @property {boolean} [setAsPrimary] - Optional flag to set as primary RNS. */ export interface IRegisterOptions { rns: string yearsToRegister: number - data?: IRnsData + data?: INoCloneRnsMetaDataSource setAsPrimary?: boolean chain?: true broadcastOptions?: IBroadcastOptions -} \ No newline at end of file +} diff --git a/src/interfaces/options/IRemoveShareRecordOptions.ts b/src/interfaces/options/IRemoveShareRecordOptions.ts new file mode 100644 index 00000000..8daadfad --- /dev/null +++ b/src/interfaces/options/IRemoveShareRecordOptions.ts @@ -0,0 +1,12 @@ +import { IBroadcastOptions, IShareMetaData } from '@/interfaces' + +/** + * + * @interface IRemoveShareRecordOptions + * @property {IShareMetaData} record - Share meta data to remove. + */ +export interface IRemoveShareRecordOptions { + record: IShareMetaData + chain?: true + broadcastOptions?: IBroadcastOptions +} diff --git a/src/interfaces/options/IRemoveSubRnsOptions.ts b/src/interfaces/options/IRemoveSubRnsOptions.ts index 3c8815d0..a6c8339f 100644 --- a/src/interfaces/options/IRemoveSubRnsOptions.ts +++ b/src/interfaces/options/IRemoveSubRnsOptions.ts @@ -9,4 +9,4 @@ export interface IRemoveSubRnsOptions { rns: string chain?: true broadcastOptions?: IBroadcastOptions -} \ No newline at end of file +} diff --git a/src/interfaces/options/ISetMetaViewersOptions.ts b/src/interfaces/options/ISetMetaViewersOptions.ts new file mode 100644 index 00000000..f91cdb7b --- /dev/null +++ b/src/interfaces/options/ISetMetaViewersOptions.ts @@ -0,0 +1,42 @@ +/** + * + * @interface ISetMetaViewersPath + * @param {string} path - Path of resource. + * @param {TViewerSetAll} viewers - Object with properties of if update or overwrite is needed. + */ +export interface ISetMetaViewersPath { + path: string + viewers: TViewerSetAll +} + +/** + * + * @interface ISetMetaViewersUlid + * @param {string} ulid - Ulid of resource. + * @param {TViewerSetAll} viewers - Object with properties of if update or overwrite is needed. + */ +export interface ISetMetaViewersUlid { + ulid: string + viewers: TViewerSetAll +} + +/** + * @interface IViewerSetOverwrite + * @param {string[]} overwrite - Array of wallet addresses. + */ +export interface IViewerSetOverwrite { + overwrite: string[] +} + +/** + * @interface IViewerSetAddRemove + * @param {string[]} [add] - Array of wallet addresses. + * @param {string[]} [remove] - Array of wallet addresses. + */ +export interface IViewerSetAddRemove { + add?: string[] + remove?: string[] +} + +export type TViewerSetAll = IViewerSetOverwrite | IViewerSetAddRemove +export type TSetMetaViewersOptions = ISetMetaViewersPath | ISetMetaViewersUlid diff --git a/src/interfaces/options/ISetNewPrimaryOptions.ts b/src/interfaces/options/ISetNewPrimaryOptions.ts index f3e63db0..a81b109b 100644 --- a/src/interfaces/options/ISetNewPrimaryOptions.ts +++ b/src/interfaces/options/ISetNewPrimaryOptions.ts @@ -9,4 +9,4 @@ export interface ISetNewPrimaryOptions { rns: string chain?: true broadcastOptions?: IBroadcastOptions -} \ No newline at end of file +} diff --git a/src/interfaces/options/IShareLinkOptions.ts b/src/interfaces/options/IShareLinkOptions.ts new file mode 100644 index 00000000..c4f7d79c --- /dev/null +++ b/src/interfaces/options/IShareLinkOptions.ts @@ -0,0 +1,12 @@ +import { IBroadcastOptions } from '@/interfaces' + +/** + * + * @interface IShareLinkOptions + * @property {string | string[]} paths - Paths of files to create sharing links for. + */ +export interface IShareLinkOptions { + paths: string | string[] + chain?: true + broadcastOptions?: IBroadcastOptions +} diff --git a/src/interfaces/options/ISharingLookupOptions.ts b/src/interfaces/options/ISharingLookupOptions.ts new file mode 100644 index 00000000..33bc895e --- /dev/null +++ b/src/interfaces/options/ISharingLookupOptions.ts @@ -0,0 +1,10 @@ +/** + * + * @interface ISharingLookupOptions + * @property {true} [refresh] - If the Sharing list should be refreshed. + * @property {string} [sharer] - JKL address to find list of shared resources. + */ +export interface ISharingLookupOptions { + refresh?: true + sharer?: string +} diff --git a/src/interfaces/classes/IStorageOptions.ts b/src/interfaces/options/IStorageOptions.ts similarity index 100% rename from src/interfaces/classes/IStorageOptions.ts rename to src/interfaces/options/IStorageOptions.ts diff --git a/src/interfaces/options/IUnshareOptions.ts b/src/interfaces/options/IUnshareOptions.ts new file mode 100644 index 00000000..9c7127dd --- /dev/null +++ b/src/interfaces/options/IUnshareOptions.ts @@ -0,0 +1,8 @@ +import { IBroadcastOptions } from '@/interfaces' + +export interface IUnshareOptions { + receivers: string[] + paths: string | string[] + chain?: true + broadcastOptions?: IBroadcastOptions +} diff --git a/src/interfaces/options/IUpdateOptions.ts b/src/interfaces/options/IUpdateOptions.ts index e951db80..6e13938d 100644 --- a/src/interfaces/options/IUpdateOptions.ts +++ b/src/interfaces/options/IUpdateOptions.ts @@ -1,14 +1,14 @@ -import { IBroadcastOptions, IRnsData } from '@/interfaces' +import { IBroadcastOptions, INoCloneRnsMetaDataSource } from '@/interfaces' /** * * @interface IUpdateOptions * @property {string} rns - RNS address to update. - * @property {IRnsData} [data] - Optional object to replace existing contents of data field. + * @property {INoCloneRnsMetaDataSource} [data] - Optional object to replace existing contents of data field. */ export interface IUpdateOptions { rns: string - data?: IRnsData + data?: INoCloneRnsMetaDataSource chain?: true broadcastOptions?: IBroadcastOptions -} \ No newline at end of file +} diff --git a/src/interfaces/options/index.ts b/src/interfaces/options/index.ts index afa14557..843616c6 100644 --- a/src/interfaces/options/index.ts +++ b/src/interfaces/options/index.ts @@ -7,16 +7,34 @@ export * from '@/interfaces/options/IBroadcastOrChainOptions' export * from '@/interfaces/options/IBuyOptions' export * from '@/interfaces/options/IBuyStorageOptions' export * from '@/interfaces/options/ICancelBidOptions' +export * from '@/interfaces/options/ICloneSharesOptions' +export * from '@/interfaces/options/ICloneUploadOptions' export * from '@/interfaces/options/ICreateFolderOptions' +export * from '@/interfaces/options/ICreateViewAccessOptions' +export * from '@/interfaces/options/ICustomRootOptions' export * from '@/interfaces/options/IDeleteTargetOptions' export * from '@/interfaces/options/IDelistOptions' +export * from '@/interfaces/options/IDownloadByUlidOptions' +export * from '@/interfaces/options/IDownloadStagingOptions' +export * from '@/interfaces/options/IEncodeExistingRefOptions' export * from '@/interfaces/options/IFileTreeOptions' export * from '@/interfaces/options/IListOptions' +export * from '@/interfaces/options/ILoadMetaOptions' +export * from '@/interfaces/options/ILoadRefMetaOptions' +export * from '@/interfaces/options/ILoadThumbnailOptions' +export * from '@/interfaces/options/IMetaDataByUlidOptions' export * from '@/interfaces/options/IMoveRenameResourceOptions' +export * from '@/interfaces/options/IPathToLookupOptions' export * from '@/interfaces/options/IReadFolderContentOptions' export * from '@/interfaces/options/IRegisterOptions' +export * from '@/interfaces/options/IRemoveShareRecordOptions' export * from '@/interfaces/options/IRemoveSubRnsOptions' +export * from '@/interfaces/options/ISetMetaViewersOptions' export * from '@/interfaces/options/ISetNewPrimaryOptions' +export * from '@/interfaces/options/IShareLinkOptions' export * from '@/interfaces/options/IShareOptions' +export * from '@/interfaces/options/ISharingLookupOptions' +export * from '@/interfaces/options/IStorageOptions' export * from '@/interfaces/options/ITransferOptions' +export * from '@/interfaces/options/IUnshareOptions' export * from '@/interfaces/options/IUpdateOptions' diff --git a/src/types/TConversionPair.ts b/src/types/TConversionPair.ts new file mode 100644 index 00000000..c155e9ac --- /dev/null +++ b/src/types/TConversionPair.ts @@ -0,0 +1,8 @@ +import { FileMetaHandler, FolderMetaHandler, NullMetaHandler } from '@/classes/metaHandlers' + +export type TConversionFile = ['file', FileMetaHandler] +export type TConversionNull = ['null', NullMetaHandler] +export type TConversionRoot = ['rootlookup', FolderMetaHandler] +export type TConversionFolder = ['folder', FolderMetaHandler] + +export type TConversionPair = TConversionFile | TConversionNull | TConversionRoot | TConversionFolder diff --git a/src/types/TExtractedViewAccess.ts b/src/types/TExtractedViewAccess.ts new file mode 100644 index 00000000..b121cb98 --- /dev/null +++ b/src/types/TExtractedViewAccess.ts @@ -0,0 +1,4 @@ +import { IAesBundle } from '@/interfaces' + +export type TCycleRequired = boolean +export type TExtractedViewAccess = [IAesBundle, TCycleRequired] \ No newline at end of file diff --git a/src/types/TMetaData.ts b/src/types/TMetaData.ts index f887195c..824acb3c 100644 --- a/src/types/TMetaData.ts +++ b/src/types/TMetaData.ts @@ -5,11 +5,11 @@ import { INullMetaData, INullMetaHandler, INullRefMetaData, + INullSharerRefMetaData, IRefMetaData, IRootLookupMetaData, - ISharedMetaDataMap, - IShareFolderMetaData, IShareMetaData, + ISharerRefMetaData, } from '@/interfaces' export type TMetaDataTypes = @@ -18,29 +18,28 @@ export type TMetaDataTypes = | 'ref' | 'null' | 'nullref' + | 'nullsharerref' | 'share' - | 'shareref' - | 'sharefolder' + | 'sharerref' + | 'rootlookup' export type TMetaDataSets = | TChildMetaData - | TSharedMetaData + | IShareMetaData + | ISharerRefMetaData | IRefMetaData | INullRefMetaData + | INullSharerRefMetaData | ILegacyFolderMetaData | IRootLookupMetaData export type TChildMetaData = INullMetaData | IFolderMetaData | IFileMetaData -export type TSharedMetaData = IShareFolderMetaData | IShareMetaData export type TMergedMetaData = INullMetaData & IFolderMetaData & IFileMetaData & IRefMetaData & - IShareFolderMetaData & IShareMetaData export type TFoundationalMetaData = Omit export type TChildNullMetaDataMap = Record export type TChildFolderMetaDataMap = Record export type TChildFileMetaDataMap = Record - -export type TSharedRootMetaDataMap = Record diff --git a/src/types/TMisc.ts b/src/types/TMisc.ts index fb9ac2eb..51a2ce31 100644 --- a/src/types/TMisc.ts +++ b/src/types/TMisc.ts @@ -3,8 +3,8 @@ import { IFileMetaHandler, IFolderMetaHandler, INullMetaHandler, - IShareFolderMetaHandler, IShareMetaHandler, + ISharerMetaHandler, type ISocketConfig, } from '@/interfaces' @@ -19,13 +19,12 @@ export type TMetaHandler = INullMetaHandler | IFolderMetaHandler | IFileMetaHandler - | IShareFolderMetaHandler | IShareMetaHandler + | ISharerMetaHandler export type TSockets = | 'jackal' | 'jackaltest' - | 'jackalv4' | 'jackallocal' | 'archway' | 'archwaytest' diff --git a/src/types/TRns.ts b/src/types/TRns.ts index 5876dae8..17cea8a4 100644 --- a/src/types/TRns.ts +++ b/src/types/TRns.ts @@ -1,3 +1,6 @@ +import type { DName } from '@jackallabs/jackal.js-protos' +import { IRnsMetaData } from '@/interfaces' + export type TAddressPrefix = | 'jkl' | 'akash' @@ -19,3 +22,8 @@ export type TAddressPrefix = | 'qwoyn' | 'stars' | 'stride' + +export interface INameWithMeta extends Omit, 'data'> { + data: IRnsMetaData + subdomains: INameWithMeta[] +} \ No newline at end of file diff --git a/src/types/index.ts b/src/types/index.ts index b3aa41ed..98fda64e 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -1,3 +1,6 @@ +export * from '@/types/TConversionPair' +export * from '@/types/TExtractedViewAccess' +export * from '@/types/TFullSignerState' export * from '@/types/TMetaData' export * from '@/types/TMisc' export * from '@/types/TRns' diff --git a/src/utils/converters.ts b/src/utils/converters.ts index d7660560..a188a4f1 100644 --- a/src/utils/converters.ts +++ b/src/utils/converters.ts @@ -14,7 +14,11 @@ const OneSecondMs = 1000 * @private */ export function safeCompressData (input: string): string { - return `jklpc1${Plzsu.compress(input)}` + if (false) { + return `jklpc3|${input}` + } else { + return `jklpc1${Plzsu.compress(input)}` + } } /** @@ -24,10 +28,13 @@ export function safeCompressData (input: string): string { * @private */ export function safeDecompressData (input: string): string { - if (!input.startsWith('jklpc1')) { + if (input.startsWith('jklpc3|')) { + return input.substring(7) + } else if (input.startsWith('jklpc1')) { + return Plzsu.decompress(input.substring(6)) + } else { throw new Error('Invalid Decompression String') } - return Plzsu.decompress(input.substring(6)) } /** @@ -86,7 +93,7 @@ export function prepDecompressionForAmino (input: string): string { * @private */ export function extractFileMetaData (input: File): IFileMeta { - const { lastModified, name, size, type } = input + const { name, size, type, lastModified = Date.now() } = input return { lastModified, name, size, type } } @@ -222,26 +229,38 @@ export function blockToDateFixed (options: IBlockTimeOptions): Date { * @private */ export async function maybeMakeThumbnail (source: File): Promise { - - console.log('Making thumbnail for type....', source.name, source.type) - if ( - source.type.startsWith('image') - ) { - console.log('it is an image!') - return await convertToWebP(source) - } else if ( - source.type.startsWith('video') - ) { - console.log('it is a video!') - return await extractThumbnailFromVideo(source) - } else { - console.log('it is not convertable :(') + if (source.size > 1024 * 1024 * 1024) { return '' } + + try { + console.log('Making thumbnail for type....', source.name, source.type) + if ( + source.type.startsWith('image') + ) { + console.log('it is an image!') + return await convertToWebP(source) + } else if ( + source.type.startsWith('video') + ) { + console.log('it is a video!') + return await extractThumbnailFromVideo(source) + } else { + console.log('it is not convertable :(') + return '' + } + } catch (err) { + throw warnError('maybeMakeThumbnail()', err) + } } -function extractThumbnailFromVideo (file: File): Promise { - return new Promise((resolve, reject) => { +/** + * + * @param {File} file + * @returns {Promise} + */ +async function extractThumbnailFromVideo (file: File): Promise { + const processor: Promise = new Promise((resolve, reject) => { const video = document.createElement('video') video.src = URL.createObjectURL(file) @@ -289,10 +308,21 @@ function extractThumbnailFromVideo (file: File): Promise { video.onerror = reject }) + try { + return await processor + } catch (err) { + warnError('extractThumbnailFromVideo()', err) + return '' + } } -function convertToWebP (file: File): Promise { - return new Promise((resolve, reject) => { +/** + * + * @param {File} file + * @returns {Promise} + */ +async function convertToWebP (file: File): Promise { + const processor: Promise = new Promise((resolve, reject) => { const reader = new FileReader() reader.onload = (event) => { const img = new Image() @@ -340,6 +370,12 @@ function convertToWebP (file: File): Promise { reader.onerror = reject reader.readAsDataURL(file) }) + try { + return await processor + } catch (err) { + warnError('convertToWebP()', err) + return '' + } } /** @@ -370,7 +406,7 @@ export function safeStringifyFileTree (source: TMetaDataSets): string { export function safeParseFileTree (source: string): TMetaDataSets { try { const base = JSON.parse(source) - if (base.merkleRoot) { + if ('merkleRoot' in base) { if (Array.isArray(base.merkleRoot)) { base.merkleRoot = new Uint8Array(base.merkleRoot) } else { diff --git a/src/utils/crypt.ts b/src/utils/crypt.ts index f35c7631..77b5e4bf 100644 --- a/src/utils/crypt.ts +++ b/src/utils/crypt.ts @@ -1,5 +1,4 @@ -import type { PrivateKey } from 'eciesjs' -import { decrypt, encrypt } from 'eciesjs' +import { decrypt, encrypt, PrivateKey } from 'eciesjs' import { keyAlgo } from '@/utils/globalDefaults' import { prepDecompressionForAmino, @@ -10,7 +9,7 @@ import { uintArrayToString, } from '@/utils/converters' import { warnError } from '@/utils/misc' -import { hexToBuffer } from '@/utils/hash' +import { hexToBuffer, stringToShaHex } from '@/utils/hash' import type { IAesBundle } from '@/interfaces' /** @@ -20,7 +19,11 @@ import type { IAesBundle } from '@/interfaces' * @private */ export async function exportJackalKey (key: CryptoKey): Promise { - return new Uint8Array(await crypto.subtle.exportKey('raw', key)) + try { + return new Uint8Array(await crypto.subtle.exportKey('raw', key)) + } catch (err) { + throw warnError('exportJackalKey()', err) + } } /** @@ -30,10 +33,14 @@ export async function exportJackalKey (key: CryptoKey): Promise { * @private */ export function importJackalKey (rawExport: Uint8Array): Promise { - return crypto.subtle.importKey('raw', rawExport, 'AES-GCM', true, [ - 'encrypt', - 'decrypt', - ]) + try { + return crypto.subtle.importKey('raw', rawExport, 'AES-GCM', true, [ + 'encrypt', + 'decrypt', + ]) + } catch (err) { + throw warnError('importJackalKey()', err) + } } /** @@ -42,7 +49,11 @@ export function importJackalKey (rawExport: Uint8Array): Promise { * @private */ export function genKey (): Promise { - return crypto.subtle.generateKey(keyAlgo, true, ['encrypt', 'decrypt']) + try { + return crypto.subtle.generateKey(keyAlgo, true, ['encrypt', 'decrypt']) + } catch (err) { + throw warnError('genKey()', err) + } } /** @@ -60,9 +71,13 @@ export function genIv (): Uint8Array { * @private */ export async function genAesBundle (): Promise { - return { - iv: genIv(), - key: await genKey(), + try { + return { + iv: genIv(), + key: await genKey(), + } + } catch (err) { + throw warnError('genAesBundle()', err) } } @@ -79,12 +94,13 @@ export async function aesBlobCrypt ( aes: IAesBundle, mode: 'encrypt' | 'decrypt', ): Promise { - const workingData = await data.arrayBuffer() - const result = await aesCrypt(workingData, aes, mode).catch((err) => { - warnError('aesBlobCrypt()', err) - throw err - }) - return new Blob([result]) + try { + const workingData = await data.arrayBuffer() + const result = await aesCrypt(workingData, aes, mode) + return new Blob([result]) + } catch (err) { + throw warnError('aesBlobCrypt()', err) + } } /** @@ -100,20 +116,30 @@ export async function aesCrypt ( aes: IAesBundle, mode: 'encrypt' | 'decrypt', ): Promise { - const algo = { - name: 'AES-GCM', - iv: aes.iv, - } - if (data.byteLength < 1) { - return new ArrayBuffer(0) - } else if (mode?.toLowerCase() === 'encrypt') { - return await crypto.subtle.encrypt(algo, aes.key, data).catch((err) => { - throw warnError('aesCrypt(encrypt)', err) - }) - } else { - return await crypto.subtle.decrypt(algo, aes.key, data).catch((err) => { - throw warnError('aesCrypt(decrypt)', err) - }) + try { + const algo = { + name: 'AES-GCM', + iv: aes.iv, + } + if (data.byteLength < 1) { + return new ArrayBuffer(0) + } else if (mode?.toLowerCase() === 'encrypt') { + try { + return await crypto.subtle.encrypt(algo, aes.key, data) + } catch (err) { + console.warn('encrypt') + throw err + } + } else { + try { + return await crypto.subtle.decrypt(algo, aes.key, data) + } catch (err) { + console.warn('decrypt') + throw err + } + } + } catch (err) { + throw warnError('aesCrypt()', err) } } @@ -162,10 +188,14 @@ export async function aesToString ( pubKey: string, aes: IAesBundle, ): Promise { - const theIv = eciesEncryptWithPubKey(pubKey, aes.iv) - const key = await exportJackalKey(aes.key) - const theKey = eciesEncryptWithPubKey(pubKey, key) - return `${theIv}|${theKey}` + try { + const theIv = eciesEncryptWithPubKey(pubKey, aes.iv) + const key = await exportJackalKey(aes.key) + const theKey = eciesEncryptWithPubKey(pubKey, key) + return `${theIv}|${theKey}` + } catch (err) { + throw warnError('aesToString()', err) + } } /** @@ -206,13 +236,12 @@ export async function compressEncryptString ( aes: IAesBundle, isLedger: boolean, ): Promise { - const compressedString = safeCompressData(input) - return await cryptString(compressedString, aes, 'encrypt', isLedger).catch( - (err) => { - warnError('compressEncryptString(encrypt)', err) - throw err - }, - ) + try { + const compressedString = safeCompressData(input) + return await cryptString(compressedString, aes, 'encrypt', isLedger) + } catch (err) { + throw warnError('compressEncryptString()', err) + } } /** @@ -226,12 +255,13 @@ export async function decryptDecompressString ( input: string, aes: IAesBundle, ): Promise { - const safe = prepDecompressionForAmino(input) - const ready = await cryptString(safe, aes, 'decrypt').catch((err) => { - warnError('decryptDecompressString(decrypt)', err) - throw err - }) - return safeDecompressData(ready) + try { + const safe = prepDecompressionForAmino(input) + const ready = await cryptString(safe, aes, 'decrypt') + return safeDecompressData(ready) + } catch (err) { + throw warnError('decryptDecompressString()', err) + } } /** @@ -262,3 +292,13 @@ export async function cryptString ( throw warnError('cryptString()', err) } } + +/** + * + * @param {string} linkKey + * @returns {Promise} + */ +export async function linkPrivateKey (linkKey: string): Promise { + const signatureAsHex = await stringToShaHex(linkKey) + return PrivateKey.fromHex(signatureAsHex) +} diff --git a/src/utils/gas.ts b/src/utils/gas.ts index d6d09a32..b345059e 100644 --- a/src/utils/gas.ts +++ b/src/utils/gas.ts @@ -35,7 +35,7 @@ USING MODIFIERS * @returns {number} - Adjusted number of gas units collection is expected to require. */ export function estimateGas (msgArray: IWrappedEncodeObject[]): number { - return calculateGas(msgArray, 0)[0] + return calculateGas(msgArray, 1)[0] } /** @@ -58,7 +58,7 @@ export function finalizeGas ( amount: [ { denom: 'ujkl', amount: Math.ceil(totalGas * 0.002).toString() }, ], - gas: totalGas.toString(), + gas: Math.ceil(totalGas).toString(), }, msgs, } diff --git a/src/utils/globalDefaults.ts b/src/utils/globalDefaults.ts index 5591a3cb..45743a4a 100644 --- a/src/utils/globalDefaults.ts +++ b/src/utils/globalDefaults.ts @@ -67,32 +67,27 @@ export const sockets: Record = { jackal: { chainId: 'jackal-1', endpoint: 'wss://rpc.jackalprotocol.com', - gasMultiplier: 1100, + gasMultiplier: 1500, }, jackaltest: { chainId: 'lupulella-2', endpoint: 'wss://testnet-rpc.jackalprotocol.com', - gasMultiplier: 1100, - }, - jackalv4: { - chainId: 'mesomelas-1', - endpoint: 'wss://jackal-testnet-v4-rpc.brocha.in', - gasMultiplier: 1100, + gasMultiplier: 1200, }, jackallocal: { chainId: 'puppy-1', endpoint: 'ws://localhost:62744', - gasMultiplier: 1100, + gasMultiplier: 1200, }, archway: { chainId: 'archway-1', endpoint: 'wss://rpc.mainnet.archway.io', - gasMultiplier: 2200, + gasMultiplier: 5500, }, archwaytest: { chainId: 'constantine-3', endpoint: 'wss://rpc.constantine.archway.io', - gasMultiplier: 2200, + gasMultiplier: 5500, }, wasm: { chainId: 'localwasm-1', diff --git a/src/utils/misc.ts b/src/utils/misc.ts index d2bcea7c..b607caf0 100644 --- a/src/utils/misc.ts +++ b/src/utils/misc.ts @@ -2,7 +2,6 @@ import { DEncodeObject, findQueryKey, IIbcEngageBundle, TxEvent } from '@jackall import { secondToMS } from '@/utils/converters' import { sockets } from '@/utils/globalDefaults' import { TSockets, TSocketSet, TTidyStringModes } from '@/types' -import type { ISharedMetaDataMap } from '@/interfaces' /** * Notify that function is deprecated and should no longer be used. @@ -80,45 +79,6 @@ export async function setDelay (seconds: number): Promise { await new Promise((resolve) => setTimeout(resolve, delay)) } -/** - * Find minimum nested depth of match. - * @param {ISharedMetaDataMap} obj - Nested object to explore. - * @param {string[]} path - Path within object to check. - * @returns {number} - Depth of match. - */ -export function findNestedSharedDepth ( - obj: ISharedMetaDataMap, - path: string[], -): number { - let findings = 0 - const first = path.shift() as string - if (first in obj) { - findings++ - if (path.length > 0) { - findings += findNestedSharedDepth(obj[first] as ISharedMetaDataMap, path) - } - } - return findings -} - -/** - * Find number of matching nested objects exist in tree. - * @param {ISharedMetaDataMap} obj - Nested object to explore. - * @param {string[]} path - Path within object to check. - * @returns {number} - Number of matches found. - */ -export function findNestedContentsCount ( - obj: ISharedMetaDataMap, - path: string[], -): number { - if (path.length > 0) { - const first = path.shift() as string - return findNestedContentsCount(obj[first] as ISharedMetaDataMap, path) - } else { - return Object.keys(obj).length - } -} - /** * Notify that Signer has not been enabled. * @param {string} module - Name of parent Module. @@ -158,7 +118,7 @@ export function isItPastDate (target: Date): boolean { */ export function shuffleArray (source: T[]): T[] { const final: T[] = [] - for (let i = source.length; i > -1; --i) { + for (let i = source.length; i > 0; --i) { final.push(source[Math.floor(Math.random() * i)]) } return final @@ -171,6 +131,7 @@ export function shuffleArray (source: T[]): T[] { * @param {DEncodeObject[]} msgs - Messages to broadcast to chain. * @param {string} addr - Address of signer. * @param {Record} socketOverrides - Object of possible override values for sockets. + * @param {string} [queryOverride] - Overrides generated query. * @returns {IIbcEngageBundle[]} - Broadcast result. */ export function makeConnectionBundles ( @@ -179,6 +140,7 @@ export function makeConnectionBundles ( msgs: DEncodeObject[], addr: string, socketOverrides: TSocketSet, + queryOverride?: string, ): IIbcEngageBundle[] { const bundles: IIbcEngageBundle[] = [] @@ -200,7 +162,7 @@ export function makeConnectionBundles ( } } - const query = `${findQueryKey(url)} = '${addr}'` + const query = queryOverride || `${findQueryKey(url)} = '${addr}'` for (let id of networks) { const { chainId, endpoint } = socketOverrides[id] || sockets[id] console.log('makeConnectionBundles') diff --git a/src/utils/notifications.ts b/src/utils/notifications.ts index f0fe3b7e..aa408a3c 100644 --- a/src/utils/notifications.ts +++ b/src/utils/notifications.ts @@ -13,14 +13,16 @@ export function formatNotification (msg: string): INotification { /** * Standardize share notification message format. - * @param {string} path - Path to shared resource. - * @param {boolean} isFile - True if path points to a file. + * @param {string} ulid - ULID of shared resource. + * @param {string} name - Name of shared resource. + * @param {boolean} isFile - True if ulid points to a file. * @returns {INotification} - Formatted message. */ export function formatShareNotification ( - path: string, + ulid: string, + name: string, isFile: boolean, ): INotification { - const msg = `${isFile ? 'file' : 'folder'}|${path}` + const msg = `${isFile ? 'file' : 'folder'}|${ulid}|${name}` return formatNotification(msg) } diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 4dbdb382..9a15ed98 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -1,8 +1,12 @@ /// import { Window as KeplrWindow } from '@keplr-wallet/types' +import { MnemonicWallet } from '@/classes' declare global { interface Window extends KeplrWindow, LeapWindow { + mnemonicWallet?: MnemonicWallet } + + var mnemonicWallet: MnemonicWallet } diff --git a/tests/converters.test.ts b/tests/converters.test.ts new file mode 100644 index 00000000..1abd4bea --- /dev/null +++ b/tests/converters.test.ts @@ -0,0 +1,93 @@ +import { describe, expect, test } from 'vitest' +import { + safeCompressData, + safeDecompressData, + unsafeCompressData, + unsafeDecompressData, + sanitizeCompressionForAmino, + prepDecompressionForAmino, + extractFileMetaData, + uintArrayToString, + stringToUint8Array, + stringToUint16Array, + intToHex, + hexToInt, + secondToMS, + blockCountUntilTimestamp, + timestampToBlockHeight, + blockToDateFixed +} from '@/utils/converters' + +describe('Compression Functions', () => { + const testString = 'this is my test string' + + test('safeCompressData should prefix string correctly', () => { + expect(safeCompressData(testString)).toBe('jklpc1஀낖ೠҕୠ伫¦ᘕ퀧『샦䀀') + }) + + test('safeDecompressData should remove prefix correctly', () => { + const compressed = safeCompressData(testString) + expect(safeDecompressData(compressed)).toBe(testString) + }) + + test('safeDecompressData should throw error for invalid input', () => { + expect(() => safeDecompressData('invalid')).toThrow('Invalid Decompression String') + }) + + test('unsafeCompressData and unsafeDecompressData should be inverses', () => { + const compressed = unsafeCompressData(testString) + expect(unsafeDecompressData(compressed)).toBe(testString) + }) +}) + +describe('String Conversion Functions', () => { + const testStr = 'Hello' + const testArr = [72, 101, 108, 108, 111] + + test('uintArrayToString should convert array to string', () => { + const array = new Uint8Array(testArr) + expect(uintArrayToString(array)).toBe(testStr) + }) + + test('stringToUint8Array should convert string to Uint8Array', () => { + const uint = stringToUint8Array(testStr) + expect(Array.from(uint)).toEqual(testArr) + expect(uint.buffer.byteLength).toBe(5) + }) + + test('stringToUint16Array should convert string to Uint16Array', () => { + const uint = stringToUint16Array(testStr) + expect(Array.from(uint)).toEqual(testArr) + expect(uint.buffer.byteLength).toBe(10) + }) +}) + +describe('Hexadecimal Conversion Functions', () => { + test('intToHex should correctly convert numbers to hex', () => { + expect(intToHex(255)).toBe('ff') + expect(intToHex(16)).toBe('10') + expect(intToHex()).toBe('0') + }) + + test('hexToInt should correctly convert hex to numbers', () => { + expect(hexToInt('ff')).toBe(255) + expect(hexToInt('10')).toBe(16) + expect(hexToInt('invalid')).toBe(0) + }) +}) + +describe('Timestamp & Block Calculation Functions', () => { + test('secondToMS should correctly convert seconds to milliseconds', () => { + expect(secondToMS(1)).toBe(1000) + expect(secondToMS(60)).toBe(60000) + }) + + test('blockCountUntilTimestamp should return 0 for timestamps within 30 days', () => { + const timestamp = Date.now() + 1000 * 60 * 60 * 24 * 29 // 29 days in future + expect(blockCountUntilTimestamp(timestamp)).toBe(0) + }) + + test('timestampToBlockHeight should return correct block height', () => { + expect(timestampToBlockHeight(Date.now() + 1000 * 60 * 60 * 24 * 40, 1000)).toBeGreaterThan(1000) + }) +}) diff --git a/tests/crypt.test.ts b/tests/crypt.test.ts new file mode 100644 index 00000000..d40eec28 --- /dev/null +++ b/tests/crypt.test.ts @@ -0,0 +1,127 @@ +import { describe, expect, test } from 'vitest' +import { + aesCrypt, + compressEncryptString, + cryptString, eciesDecryptWithPrivateKey, eciesEncryptWithPubKey, + exportJackalKey, + genAesBundle, + genIv, + genKey, + importJackalKey, +} from '@/utils/crypt' +import { safeDecompressData, stringToUint16Array, uintArrayToString } from '@/utils/converters' +import { PrivateKey } from 'eciesjs' + +const testString = 'this is my test string' +const keyAsUint = new Uint8Array([199, 19, 54, 241, 42, 20, 91, 99, 198, 141, 22, 202, 195, 71, 51, 216, 204, 26, 180, 230, 58, 223, 167, 143, 126, 28, 3, 102, 2, 57, 224, 178]) +const staticAes = { + iv: new Uint8Array([10, 182, 241, 205, 156, 79, 7, 97, 252, 75, 154, 115, 250, 178, 126, 166]), + key: await importJackalKey(keyAsUint), +} +let defaultKeyPair = PrivateKey.fromHex('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855') + +describe('Key & AES Functions', () => { + test('genKey should generate a valid CryptoKey', async () => { + const key = await genKey() + expect(key).toBeDefined() + }) + + test('genIv should generate a 16-byte IV', () => { + const iv = genIv() + expect(iv.length).toBe(16) + }) + + test('exportJackalKey and importJackalKey should be inverses', async () => { + const key = await genKey() + const exported = await exportJackalKey(key) + const imported = await importJackalKey(exported) + // expect(exported).toBe(0) + expect(imported).toBeDefined() + }) + + test('eciesEncryptWithPubKey ', async () => { + const randomAes = await genAesBundle() + + const randomIvAsHex = eciesEncryptWithPubKey(defaultKeyPair.publicKey.toHex(), randomAes.iv) + const randomKey = await exportJackalKey(randomAes.key) + const randomKeyAsHex = eciesEncryptWithPubKey(defaultKeyPair.publicKey.toHex(), randomKey) + + expect(randomIvAsHex).toBeDefined() + expect(randomKeyAsHex).toBeDefined() + + // const staticIvAsHex = eciesEncryptWithPubKey(defaultKeyPair.publicKey.toHex(), staticAes.iv) + // const staticKey = await exportJackalKey(staticAes.key) + // const staticKeyAsHex = eciesEncryptWithPubKey(defaultKeyPair.publicKey.toHex(), staticKey) + // + // expect(staticIvAsHex).toBe('0441cc87600f47dc8962e9f9f653a6d1c956f36c6243026e1a9951a74af7e0f24d4b8bc5966437c7a237a1ed407b40edf277efdebf4991524eab879e328ad7cbb7785ed3ad27f60ba6f873da06160c312a9d3182654ddfde81224b94ff2b06c6cc92538f39475f60987d8bb134b82a5dc3') + // expect(staticKeyAsHex).toBe('040756a44fb9cb93497f6e3390402cf3bef303c8d3829ff7c9d147e11fa3f3d6f2db84530616cf2ae7a250a0948a27776f3a1e125a69fccbfc72966606dac6d4c848452697af7bd97983f658a1e3d8e43631acfc8db4e7b309877e52a17220608e07f8ca5f7c5fbc16ff39605a05193a88') + }) + + test('eciesDecryptWithPrivateKey ', async () => { + const staticIvFromHex = eciesDecryptWithPrivateKey(defaultKeyPair, '0441cc87600f47dc8962e9f9f653a6d1c956f36c6243026e1a9951a74af7e0f24d4b8bc5966437c7a237a1ed407b40edf277efdebf4991524eab879e328ad7cbb7785ed3ad27f60ba6f873da06160c312a9d3182654ddfde81224b94ff2b06c6cc92538f39475f60987d8bb134b82a5dc3') + expect(staticIvFromHex).toStrictEqual(staticAes.iv) + const staticKeyFromHex = eciesDecryptWithPrivateKey(defaultKeyPair, '0417e22c547cc51d4b87b8b0cd8e6e98a263a58dc1c97f3e0a61283375a4747a8a9a5e6f00fa7aa08cdd4c8aa40c4391f012f3d03be2e88b8c755c79f581e0550d3737ec10e75f53d0c0d2c9c159a7110935efe203b7c85e5cb4b4a6b7794be274b62e8b09cd4a8b88ea67846eadc5a2c4883874b814b263aa586dbd1ff24439f7') + expect(staticKeyFromHex).toStrictEqual(keyAsUint) + const key = await importJackalKey(staticKeyFromHex) + expect(key).toStrictEqual(staticAes.key) + }) +}) + +describe('AES Encryption & Decryption', () => { + test('aesCrypt should correctly encrypt and decrypt data', async () => { + const aes = await genAesBundle() + const input = new TextEncoder().encode(testString).buffer + + const encrypted = await aesCrypt(input, aes, 'encrypt') + expect(encrypted.byteLength).toBeGreaterThan(0) + + const decrypted = await aesCrypt(encrypted, aes, 'decrypt') + expect(new TextDecoder().decode(decrypted)).toBe(testString) + }) + test('aesCrypt should correctly encrypt and decrypt data 2', async () => { + const aes = await genAesBundle() + const input = stringToUint16Array(testString) + + const encrypted = await aesCrypt(input, aes, 'encrypt') + expect(encrypted.byteLength).toBe(60) + + const middle = uintArrayToString(new Uint16Array(encrypted)) + const ready = stringToUint16Array(middle) + + expect(ready.buffer.byteLength).toBe(60) + expect(ready.buffer).toStrictEqual(encrypted) + + const decrypted = await aesCrypt(ready.buffer, aes, 'decrypt') + expect(uintArrayToString(new Uint16Array(decrypted))).toBe(testString) + }) + + test('cryptString should correctly encrypt and decrypt data', async () => { + const aes = await genAesBundle() + + const encrypted = await cryptString(testString, aes, 'encrypt') + expect(encrypted.length).toBeGreaterThan(0) + + const decrypted = await cryptString(encrypted, aes, 'decrypt') + expect(decrypted).toBe(testString) + }) + + test('compressEncryptString should work the same in browser and node', async () => { + const meta = { + 'count': '0', + 'description': '', + 'location': 's/ulid/ulid', + 'merkleHex': '', + 'metaDataType': 'folder', + 'sharerCount': '0', + 'whoAmI': 'Home', + } + const rdy = JSON.stringify(meta) + + const encrypted = await compressEncryptString(rdy, staticAes, false) + expect(encrypted).toBe('ꄺ쟲ᄉˉ퇿볚⊘x挔䜖뒚胵ɘࡘ䔟录큹襰죣⾁鉊겍ᾀ梥ﴑ犱杒ᗷ⨱㙿콟ᅞ鶇❘ུ䔥暉㗧즸籆㥐ꐚퟨ淪㑬ㇳ跔䩏㵫㇀黰ຎ缇韲쨂Ȫ揁㠭魐쪺ꥣ') + + const decrypted = await cryptString(encrypted, staticAes, 'decrypt') + const decompressed = safeDecompressData(decrypted) + expect(decompressed).toBe(rdy) + }) +}) diff --git a/tests/filetreeReader.test.ts b/tests/filetreeReader.test.ts new file mode 100644 index 00000000..ce3dbfa6 --- /dev/null +++ b/tests/filetreeReader.test.ts @@ -0,0 +1,98 @@ +import { beforeEach, describe, expect, it } from 'vitest' +import { PrivateKey } from 'eciesjs' +import { ClientHandler, FiletreeReader } from '@/classes' +import { signatureSeed } from '@/utils/globalDefaults' +import { stringToShaHex } from '@/utils/hash' +import { IClientHandler, IPathToLookupOptions } from '@/interfaces' +import { TJackalSigningClient } from '@jackallabs/jackal.js-protos' + +class TestFiletreeReader extends FiletreeReader { + constructor ( + client: IClientHandler, + signer: TJackalSigningClient, + privateKeyPair: PrivateKey, + defaultKeyPair: PrivateKey, + address: string, + ) { + super( + client, + signer, + privateKeyPair, + defaultKeyPair, + address, + ) + } + + async testPathToLookup (options: IPathToLookupOptions) { + const lookup = await this.pathToLookup(options) + const { + path, + } = options + console.log('test ulid Home:', this.ulidLeaves[this.clientAddress][path]) + return lookup + } +} + +describe('FileTreeReader', () => { + // new FiletreeReader( + // this.jackalClient, + // this.jackalSigner, + // keyPair, + // defaultKeyPair, + // this.jackalClient.getICAJackalAddress(), + // ) + + let reader: TestFiletreeReader + + beforeEach(async () => { + const mnemonic = 'basic churn vote decide food faculty very odor load nephew link common illness forward fault person love behave half keen proud section destroy fork' + + const client = await ClientHandler.connect({ + selectedWallet: 'mnemonic', + mnemonic, + }) + const signer = client.getJackalSigner() + let seedWallet + if (typeof window !== 'undefined') { + /* @ts-ignore */ + seedWallet = window.mnemonicWallet + } else { + /* @ts-ignore */ + seedWallet = global.mnemonicWallet + } + const signed = await seedWallet.signArbitrary( + signatureSeed, + ) + const signatureAsHex = await stringToShaHex(signed.signature) + let privateKeyPair = PrivateKey.fromHex(signatureAsHex) + let defaultKeyPair = PrivateKey.fromHex('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855') + + if (!signer) { + throw new Error('signer invalid') + } + + reader = new TestFiletreeReader( + client, + signer, + privateKeyPair, + defaultKeyPair, + client.getICAJackalAddress(), + ) + }) + + it('setContents should update contents', async () => { + // const meta = await NullMetaHandler.create({ location: '', refIndex: 0, ulid: '' }) + // reader.setContents('', meta.export()) + + }) + + it('pathToLookup should return a FileTree file', async () => { + const file = await reader.testPathToLookup({ path: 'Home' }) + + expect(file).toStrictEqual({ + "address": "cf7e85bd33b684f0b8f72d6a7f91f8f4da681d7e925d115588516fd4d992ad58", + "ownerAddress": "abc409b6e2d1590b123508451d9c0283577a5bfeac08bc4702df69ca3413f8e9", + }) + }) + +}) diff --git a/tests/gas.test.ts b/tests/gas.test.ts new file mode 100644 index 00000000..73d0f358 --- /dev/null +++ b/tests/gas.test.ts @@ -0,0 +1,56 @@ +import { describe, expect, test } from 'vitest'; +import { estimateGas, finalizeGas } from '@/utils/gas'; +import { IWrappedEncodeObject } from '@/interfaces'; +import { EncodeObject } from '@cosmjs/proto-signing'; + +const mockEncodedObject: EncodeObject = { + typeUrl: '/canine_chain.filetree.MsgPostFile', + value: {}, +}; + +describe('Gas Calculation', () => { + test('estimateGas should return expected values', () => { + const mockMsgArray: IWrappedEncodeObject[] = [ + { encodedObject: mockEncodedObject, modifier: 0 } + ]; + expect(estimateGas(mockMsgArray)).toBe(326); + }); + + test('finalizeGas should return structured gas object', () => { + const mockMsgArray: IWrappedEncodeObject[] = [ + { encodedObject: mockEncodedObject, modifier: 0 } + ]; + const gasObj = finalizeGas(mockMsgArray, 1); + expect(gasObj).toHaveProperty('fee'); + expect(gasObj.fee.amount[0].denom).toBe('ujkl'); + expect(gasObj.msgs).toHaveLength(1); + }); + + test('finalizeGas should correctly apply gas multiplier', () => { + const mockMsgArray: IWrappedEncodeObject[] = [ + { encodedObject: mockEncodedObject, modifier: 0 } + ]; + const gasObj = finalizeGas(mockMsgArray, 2); + expect(parseInt(gasObj.fee.gas)).toBe(652); + }); + + test('estimateGas should correctly handle unknown messages', () => { + const unknownMsg: IWrappedEncodeObject = { + encodedObject: { typeUrl: '/unknown.MsgType', value: {} }, + modifier: 0 + }; + expect(estimateGas([unknownMsg])).toBe(198); + }); + + test('finalizeGas should apply override when provided', () => { + const mockMsgArray: IWrappedEncodeObject[] = [ + { encodedObject: mockEncodedObject, modifier: 0 } + ]; + const gasObj = finalizeGas(mockMsgArray, 1, 500); + expect(parseInt(gasObj.fee.gas)).toBe(500); + }); + + test('estimateGas should throw an error for invalid objects', () => { + expect(() => estimateGas([{ encodedObject: {} as any, modifier: 0 }])).toThrow(); + }); +}); diff --git a/tests/globalDefaults.test.ts b/tests/globalDefaults.test.ts new file mode 100644 index 00000000..86cde3dd --- /dev/null +++ b/tests/globalDefaults.test.ts @@ -0,0 +1,35 @@ +import { describe, expect, test } from 'vitest'; +import { + chunkSize, + encryptionChunkSize, + assumedBlockTime, + jackalTestnetChainConfig, + keyAlgo, + sockets +} from '@/utils/globalDefaults'; + +describe('Global Defaults', () => { + test('chunkSize should not change', () => { + expect(chunkSize).toBe(10240); + }); + + test('encryptionChunkSize should be correct', () => { + expect(encryptionChunkSize).toBe(32 * Math.pow(1024, 2)); + }); + + test('assumedBlockTime should be correct', () => { + expect(assumedBlockTime).toBe(6); + }); + + test('jackalTestnetChainConfig should have correct chainId', () => { + expect(jackalTestnetChainConfig.chainId).toBeDefined(); + }); + + test('keyAlgo should be a valid algorithm', () => { + expect(keyAlgo).toBeDefined(); + }); + + test('sockets should be an object', () => { + expect(typeof sockets).toBe('object'); + }); +}); diff --git a/tests/hash.test.ts b/tests/hash.test.ts new file mode 100644 index 00000000..3cfd1d3e --- /dev/null +++ b/tests/hash.test.ts @@ -0,0 +1,45 @@ +import { describe, expect, test } from 'vitest'; +import { + hashAndHex, + hashAndHexOwner, + hexFullPath, + merklePath, + merklePathPlusIndex, + bufferToHex, + hexToBuffer, stringToShaHex, +} from '@/utils/hash' + +describe('Hash Functions', () => { + test('hashAndHex should return a valid SHA-256 hex string', async () => { + const hash = await hashAndHex('test input'); + expect(hash).toMatch(/^[a-f0-9]{64}$/); + }); + + test('hashAndHexOwner should return valid Merkle hashed owner string', async () => { + const hash = await hashAndHexOwner('abc123', 'user1'); + expect(hash).toMatch(/^[a-f0-9]{64}$/); + }); + + test('hexFullPath should return valid Merkle path', async () => { + const hash = await hexFullPath('path123', 'filename.txt'); + expect(hash).toMatch(/^[a-f0-9]{64}$/); + }); + + test('merklePath should generate consistent hashes', async () => { + const path1 = await merklePath('dir1/dir2/file'); + const path2 = await merklePath(['dir1', 'dir2', 'file']); + expect(path1).toBe(path2); + }); + + test('merklePathPlusIndex should generate indexed Merkle paths', async () => { + const hash = await merklePathPlusIndex('dir1/', 5); + expect(hash).toMatch(/^[a-f0-9]{64}$/); + }); + + test('stringToShaHex should generate a hexed SHA hash', async () => { + const hash1 = await stringToShaHex(''); + expect(hash1).toBe('e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855'); + const hash2 = await stringToShaHex('dGVzdCBpbnB1dA=='); + expect(hash2).toBe('9dfe6f15d1ab73af898739394fd22fd72a03db01834582f24bb2e1c66c7aaeae'); + }); +}); diff --git a/tests/misc.test.ts b/tests/misc.test.ts new file mode 100644 index 00000000..6daf7a36 --- /dev/null +++ b/tests/misc.test.ts @@ -0,0 +1,45 @@ +import { describe, expect, test } from 'vitest'; +import { + tidyString, + setDelay, + signerNotEnabled, + isItPast, + isItPastDate, + shuffleArray +} from '@/utils/misc'; + +describe('Miscellaneous Functions', () => { + test('tidyString should correctly remove specified characters', () => { + const testStr = '---hello---' + expect(tidyString(testStr, '-', 'both')).toBe('hello'); + expect(tidyString(testStr, '-', 'start')).toBe('hello---'); + expect(tidyString(testStr, '-', 'end')).toBe('---hello'); + }); + + test('setDelay should delay execution', { timeout: 12000 }, async () => { + const start = Date.now(); + await setDelay(10); // 10 seconds + const diff = Date.now() - start; + expect(diff).toBeGreaterThanOrEqual(10000); + }); + + test('signerNotEnabled should return correct error message', () => { + expect(signerNotEnabled('TestModule', 'testFunction')).toContain('Signer has not been enabled'); + }); + + test('isItPast should return true for past timestamps', () => { + expect(isItPast(Date.now() - 1000)).toBe(true); + expect(isItPast(Date.now() + 1000)).toBe(false); + }); + + test('isItPastDate should return true for past dates', () => { + expect(isItPastDate(new Date(Date.now() - 1000))).toBe(true); + expect(isItPastDate(new Date(Date.now() + 1000))).toBe(false); + }); + + test('shuffleArray should return an array of the same length', () => { + const input = [1, 2, 3, 4, 5]; + const shuffled = shuffleArray([...input]); + expect(shuffled.length).toBe(input.length); + }); +}); diff --git a/tests/notifications.test.ts b/tests/notifications.test.ts new file mode 100644 index 00000000..2485da62 --- /dev/null +++ b/tests/notifications.test.ts @@ -0,0 +1,19 @@ +import { describe, expect, test } from 'vitest' +import { formatNotification, formatShareNotification } from '@/utils/notifications' + +describe('Notification Formatting', () => { + test('formatNotification should return an object with message', () => { + const result = formatNotification('Test message') + expect(result).toEqual({ msg: 'Test message' }) + }) + + test('formatShareNotification should format correctly for files', () => { + const result = formatShareNotification('ulid123', 'testFile', true) + expect(result.msg).toBe('file|ulid123|testFile') + }) + + test('formatShareNotification should format correctly for folders', () => { + const result = formatShareNotification('ulid456', 'testFolder', false) + expect(result.msg).toBe('folder|ulid456|testFolder') + }) +}) diff --git a/tsconfig.json b/tsconfig.json index 6cc09335..f689087b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -4,7 +4,7 @@ "useDefineForClassFields": true, "module": "ESNext", "lib": ["ESNext", "DOM", "DOM.Iterable"], - "types": ["vite/client"], + "types": ["node", "vite/client"], "skipLibCheck": true, "allowJs": false, "esModuleInterop": true, @@ -14,10 +14,10 @@ /* Bundler mode */ "outDir": "dist", - "sourceMap": true, - "declaration": true, - "declarationMap": true, - "moduleResolution": "node", + "sourceMap": false, + "declaration": false, + "declarationMap": false, + "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, "noEmit": true, @@ -33,6 +33,7 @@ "@/*": ["src/*"] }, "typeRoots": [ + "node_modules/@types", "./src/interfaces", "./src/types" ] @@ -42,6 +43,7 @@ "src/**/*.d.ts" ], "exclude": [ - "node_modules" + "node_modules", + "tests/**/*.ts" ] } diff --git a/vite.config.ts b/vite.config.ts index 1301d5b3..5898732b 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -2,7 +2,6 @@ import { defineConfig } from "vite" import typescript from "@rollup/plugin-typescript" import { resolve } from "path" -import { copyFileSync } from "fs" import { typescriptPaths } from "rollup-plugin-typescript-paths" import tsconfigPaths from 'vite-tsconfig-paths' import dts from 'vite-plugin-dts' @@ -13,14 +12,10 @@ export default defineConfig({ plugins: [ tsconfigPaths(), dts({ - afterBuild: () => { - copyFileSync("dist/index.d.ts", "dist/index.d.mts") - }, include: ["src"], rollupTypes: true, logLevel: 'error' }), - nodePolyfills({ include: ['crypto'] }) ], resolve: { preserveSymlinks: true, @@ -37,6 +32,10 @@ export default defineConfig({ find: "symbol-observable/ponyfill", replacement: resolve(__dirname, "./node_modules", "symbol-observable", "ponyfill.js"), }, + { + find: 'browserify-aes', + replacement: resolve(__dirname, "./node_modules", "@jackallabs", "browserify-aes"), + }, ], extensions: ['.ts'] }, @@ -44,24 +43,34 @@ export default defineConfig({ manifest: true, minify: false, reportCompressedSize: true, - lib: { - entry: resolve(__dirname, "src/index.ts"), - fileName: (format) => `index.${format}.js`, - formats: ['es'], - name: 'Jackal.js' - }, rollupOptions: { + input: resolve(__dirname, "src/index.ts"), + preserveEntrySignatures: 'allow-extension', + output: [ + { + dir: './dist', + entryFileNames: 'index.cjs.js', + format: 'cjs', + name: 'Jackal.js', + plugins: [] + }, + { + dir: './dist', + entryFileNames: 'index.esm.js', + format: 'esm', + name: 'Jackal.js', + plugins: [ + nodePolyfills({ include: ['buffer', 'util'] }) + ] + } + ], external: [ /* Jackal.js-protos */ /@cosmjs.*/, /cosmjs-types*/, 'grpc-web', - 'protobufjs', 'ts-proto', /* Jackal.js */ - 'browserify-sign', - 'browserify-aes', - 'browserify-des', 'ripemd160', 'create-hash', 'for-each', diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000..168639e5 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'vitest/config' +import workspace from './vitest.workspace' + +export default defineConfig({ + test: { + workspace: workspace, + }, +}) \ No newline at end of file diff --git a/vitest.workspace.ts b/vitest.workspace.ts new file mode 100644 index 00000000..f5ae1a93 --- /dev/null +++ b/vitest.workspace.ts @@ -0,0 +1,46 @@ +import { defineWorkspace } from 'vitest/config' +import { resolve } from 'path' +import { nodePolyfills } from 'vite-plugin-node-polyfills' + +export default defineWorkspace([ + { + test: { + globals: true, + alias: [ + { + find: '@', + replacement: resolve(__dirname, './src'), + }, + ], + include: [ + 'tests/**/*.{test,spec}.ts', + ], + name: 'unit', + environment: 'node', + }, + }, + { + plugins: [ + nodePolyfills({ include: ['buffer', 'util'] }) + ], + test: { + globals: true, + alias: [ + { + find: '@', + replacement: resolve(__dirname, './src'), + }, + ], + include: [ + 'tests/**/*.{test,spec}.ts', + ], + name: 'browser', + browser: { + enabled: true, + instances: [ + { browser: 'chromium' }, + ], + }, + }, + }, +])