@drakkar.software/octobot-client 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +140 -0
- package/dist/client/adapters/accounts.d.ts +66 -0
- package/dist/client/adapters/accounts.d.ts.map +1 -0
- package/dist/client/adapters/accounts.js +214 -0
- package/dist/client/adapters/accounts.js.map +1 -0
- package/dist/client/adapters/actionHandle.d.ts +29 -0
- package/dist/client/adapters/actionHandle.d.ts.map +1 -0
- package/dist/client/adapters/actionHandle.js +34 -0
- package/dist/client/adapters/actionHandle.js.map +1 -0
- package/dist/client/adapters/automations.d.ts +31 -0
- package/dist/client/adapters/automations.d.ts.map +1 -0
- package/dist/client/adapters/automations.js +79 -0
- package/dist/client/adapters/automations.js.map +1 -0
- package/dist/client/adapters/documents.d.ts +55 -0
- package/dist/client/adapters/documents.d.ts.map +1 -0
- package/dist/client/adapters/documents.js +66 -0
- package/dist/client/adapters/documents.js.map +1 -0
- package/dist/client/adapters/nodeApi.d.ts +25 -0
- package/dist/client/adapters/nodeApi.d.ts.map +1 -0
- package/dist/client/adapters/nodeApi.js +81 -0
- package/dist/client/adapters/nodeApi.js.map +1 -0
- package/dist/client/adapters/settings.d.ts +16 -0
- package/dist/client/adapters/settings.d.ts.map +1 -0
- package/dist/client/adapters/settings.js +43 -0
- package/dist/client/adapters/settings.js.map +1 -0
- package/dist/client/adapters/strategies.d.ts +17 -0
- package/dist/client/adapters/strategies.d.ts.map +1 -0
- package/dist/client/adapters/strategies.js +75 -0
- package/dist/client/adapters/strategies.js.map +1 -0
- package/dist/client/connect/connect.d.ts +40 -0
- package/dist/client/connect/connect.d.ts.map +1 -0
- package/dist/client/connect/connect.js +133 -0
- package/dist/client/connect/connect.js.map +1 -0
- package/dist/client/connect/readOnly.d.ts +97 -0
- package/dist/client/connect/readOnly.d.ts.map +1 -0
- package/dist/client/connect/readOnly.js +167 -0
- package/dist/client/connect/readOnly.js.map +1 -0
- package/dist/client/core/errors.d.ts +80 -0
- package/dist/client/core/errors.d.ts.map +1 -0
- package/dist/client/core/errors.js +154 -0
- package/dist/client/core/errors.js.map +1 -0
- package/dist/client/core/options.d.ts +44 -0
- package/dist/client/core/options.d.ts.map +1 -0
- package/dist/client/core/options.js +2 -0
- package/dist/client/core/options.js.map +1 -0
- package/dist/client/core/session.d.ts +90 -0
- package/dist/client/core/session.d.ts.map +1 -0
- package/dist/client/core/session.js +72 -0
- package/dist/client/core/session.js.map +1 -0
- package/dist/client/core/views.d.ts +40 -0
- package/dist/client/core/views.d.ts.map +1 -0
- package/dist/client/core/views.js +32 -0
- package/dist/client/core/views.js.map +1 -0
- package/dist/client/index.d.ts +16 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +9 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/mirror/collections.d.ts +125 -0
- package/dist/client/mirror/collections.d.ts.map +1 -0
- package/dist/client/mirror/collections.js +118 -0
- package/dist/client/mirror/collections.js.map +1 -0
- package/dist/client/mirror/index.d.ts +4 -0
- package/dist/client/mirror/index.d.ts.map +1 -0
- package/dist/client/mirror/index.js +4 -0
- package/dist/client/mirror/index.js.map +1 -0
- package/dist/client/mirror/writer.d.ts +39 -0
- package/dist/client/mirror/writer.d.ts.map +1 -0
- package/dist/client/mirror/writer.js +50 -0
- package/dist/client/mirror/writer.js.map +1 -0
- package/dist/client/pairing/mirrorGrant.d.ts +91 -0
- package/dist/client/pairing/mirrorGrant.d.ts.map +1 -0
- package/dist/client/pairing/mirrorGrant.js +99 -0
- package/dist/client/pairing/mirrorGrant.js.map +1 -0
- package/dist/client/pairing/mirrorReader.d.ts +99 -0
- package/dist/client/pairing/mirrorReader.d.ts.map +1 -0
- package/dist/client/pairing/mirrorReader.js +117 -0
- package/dist/client/pairing/mirrorReader.js.map +1 -0
- package/dist/client/pairing/pairingGrantExchange.d.ts +135 -0
- package/dist/client/pairing/pairingGrantExchange.d.ts.map +1 -0
- package/dist/client/pairing/pairingGrantExchange.js +186 -0
- package/dist/client/pairing/pairingGrantExchange.js.map +1 -0
- package/dist/client/pairing/pairingRequest.d.ts +82 -0
- package/dist/client/pairing/pairingRequest.d.ts.map +1 -0
- package/dist/client/pairing/pairingRequest.js +120 -0
- package/dist/client/pairing/pairingRequest.js.map +1 -0
- package/dist/client/strategy.d.ts +36 -0
- package/dist/client/strategy.d.ts.map +1 -0
- package/dist/client/strategy.js +26 -0
- package/dist/client/strategy.js.map +1 -0
- package/dist/collections/index.d.ts +3 -0
- package/dist/collections/index.d.ts.map +1 -0
- package/dist/collections/index.js +3 -0
- package/dist/collections/index.js.map +1 -0
- package/dist/collections/nodeCollections.d.ts +57 -0
- package/dist/collections/nodeCollections.d.ts.map +1 -0
- package/dist/collections/nodeCollections.js +40 -0
- package/dist/collections/nodeCollections.js.map +1 -0
- package/dist/collections/paths.d.ts +7 -0
- package/dist/collections/paths.d.ts.map +1 -0
- package/dist/collections/paths.js +13 -0
- package/dist/collections/paths.js.map +1 -0
- package/dist/crypto/collectionKeys.d.ts +28 -0
- package/dist/crypto/collectionKeys.d.ts.map +1 -0
- package/dist/crypto/collectionKeys.js +53 -0
- package/dist/crypto/collectionKeys.js.map +1 -0
- package/dist/crypto/hkdf.d.ts +14 -0
- package/dist/crypto/hkdf.d.ts.map +1 -0
- package/dist/crypto/hkdf.js +19 -0
- package/dist/crypto/hkdf.js.map +1 -0
- package/dist/crypto/index.d.ts +5 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +5 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/secretEncryptor.d.ts +20 -0
- package/dist/crypto/secretEncryptor.d.ts.map +1 -0
- package/dist/crypto/secretEncryptor.js +82 -0
- package/dist/crypto/secretEncryptor.js.map +1 -0
- package/dist/crypto/wireConstants.d.ts +14 -0
- package/dist/crypto/wireConstants.d.ts.map +1 -0
- package/dist/crypto/wireConstants.js +17 -0
- package/dist/crypto/wireConstants.js.map +1 -0
- package/dist/identity/address.d.ts +3 -0
- package/dist/identity/address.d.ts.map +1 -0
- package/dist/identity/address.js +17 -0
- package/dist/identity/address.js.map +1 -0
- package/dist/identity/bip39-wordlist.d.ts +2 -0
- package/dist/identity/bip39-wordlist.d.ts.map +1 -0
- package/dist/identity/bip39-wordlist.js +2051 -0
- package/dist/identity/bip39-wordlist.js.map +1 -0
- package/dist/identity/capProvider.d.ts +45 -0
- package/dist/identity/capProvider.d.ts.map +1 -0
- package/dist/identity/capProvider.js +80 -0
- package/dist/identity/capProvider.js.map +1 -0
- package/dist/identity/derivationSchemes.d.ts +25 -0
- package/dist/identity/derivationSchemes.d.ts.map +1 -0
- package/dist/identity/derivationSchemes.js +34 -0
- package/dist/identity/derivationSchemes.js.map +1 -0
- package/dist/identity/evm.d.ts +8 -0
- package/dist/identity/evm.d.ts.map +1 -0
- package/dist/identity/evm.js +78 -0
- package/dist/identity/evm.js.map +1 -0
- package/dist/identity/index.d.ts +10 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +10 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/identity/keys.d.ts +17 -0
- package/dist/identity/keys.d.ts.map +1 -0
- package/dist/identity/keys.js +36 -0
- package/dist/identity/keys.js.map +1 -0
- package/dist/identity/mnemonic.d.ts +4 -0
- package/dist/identity/mnemonic.d.ts.map +1 -0
- package/dist/identity/mnemonic.js +93 -0
- package/dist/identity/mnemonic.js.map +1 -0
- package/dist/identity/pairing.d.ts +45 -0
- package/dist/identity/pairing.d.ts.map +1 -0
- package/dist/identity/pairing.js +91 -0
- package/dist/identity/pairing.js.map +1 -0
- package/dist/identity/pairingRequest.d.ts +99 -0
- package/dist/identity/pairingRequest.d.ts.map +1 -0
- package/dist/identity/pairingRequest.js +217 -0
- package/dist/identity/pairingRequest.js.map +1 -0
- package/dist/identity/secret.d.ts +32 -0
- package/dist/identity/secret.d.ts.map +1 -0
- package/dist/identity/secret.js +54 -0
- package/dist/identity/secret.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/bytes.d.ts +11 -0
- package/dist/internal/bytes.d.ts.map +1 -0
- package/dist/internal/bytes.js +38 -0
- package/dist/internal/bytes.js.map +1 -0
- package/dist/node-api/dexPair.d.ts +24 -0
- package/dist/node-api/dexPair.d.ts.map +1 -0
- package/dist/node-api/dexPair.js +39 -0
- package/dist/node-api/dexPair.js.map +1 -0
- package/dist/node-api/dsl.d.ts +10 -0
- package/dist/node-api/dsl.d.ts.map +1 -0
- package/dist/node-api/dsl.js +7 -0
- package/dist/node-api/dsl.js.map +1 -0
- package/dist/node-api/exchanges.d.ts +49 -0
- package/dist/node-api/exchanges.d.ts.map +1 -0
- package/dist/node-api/exchanges.js +32 -0
- package/dist/node-api/exchanges.js.map +1 -0
- package/dist/node-api/index.d.ts +12 -0
- package/dist/node-api/index.d.ts.map +1 -0
- package/dist/node-api/index.js +12 -0
- package/dist/node-api/index.js.map +1 -0
- package/dist/node-api/marketMaking.d.ts +39 -0
- package/dist/node-api/marketMaking.d.ts.map +1 -0
- package/dist/node-api/marketMaking.js +44 -0
- package/dist/node-api/marketMaking.js.map +1 -0
- package/dist/node-api/octobots.d.ts +14 -0
- package/dist/node-api/octobots.d.ts.map +1 -0
- package/dist/node-api/octobots.js +16 -0
- package/dist/node-api/octobots.js.map +1 -0
- package/dist/node-api/orderBookPreview.d.ts +11 -0
- package/dist/node-api/orderBookPreview.d.ts.map +1 -0
- package/dist/node-api/orderBookPreview.js +7 -0
- package/dist/node-api/orderBookPreview.js.map +1 -0
- package/dist/node-api/pairing.d.ts +39 -0
- package/dist/node-api/pairing.d.ts.map +1 -0
- package/dist/node-api/pairing.js +61 -0
- package/dist/node-api/pairing.js.map +1 -0
- package/dist/node-api/pairs.d.ts +32 -0
- package/dist/node-api/pairs.d.ts.map +1 -0
- package/dist/node-api/pairs.js +72 -0
- package/dist/node-api/pairs.js.map +1 -0
- package/dist/node-api/requiredFunds.d.ts +11 -0
- package/dist/node-api/requiredFunds.d.ts.map +1 -0
- package/dist/node-api/requiredFunds.js +7 -0
- package/dist/node-api/requiredFunds.js.map +1 -0
- package/dist/node-api/setup.d.ts +25 -0
- package/dist/node-api/setup.d.ts.map +1 -0
- package/dist/node-api/setup.js +13 -0
- package/dist/node-api/setup.js.map +1 -0
- package/dist/node-api/wallet.d.ts +55 -0
- package/dist/node-api/wallet.d.ts.map +1 -0
- package/dist/node-api/wallet.js +87 -0
- package/dist/node-api/wallet.js.map +1 -0
- package/dist/protocol/actions.d.ts +40 -0
- package/dist/protocol/actions.d.ts.map +1 -0
- package/dist/protocol/actions.js +118 -0
- package/dist/protocol/actions.js.map +1 -0
- package/dist/protocol/documents.d.ts +25 -0
- package/dist/protocol/documents.d.ts.map +1 -0
- package/dist/protocol/documents.js +2 -0
- package/dist/protocol/documents.js.map +1 -0
- package/dist/protocol/index.d.ts +10 -0
- package/dist/protocol/index.d.ts.map +1 -0
- package/dist/protocol/index.js +12 -0
- package/dist/protocol/index.js.map +1 -0
- package/dist/protocol/orchestration/createAutomation.d.ts +61 -0
- package/dist/protocol/orchestration/createAutomation.d.ts.map +1 -0
- package/dist/protocol/orchestration/createAutomation.js +71 -0
- package/dist/protocol/orchestration/createAutomation.js.map +1 -0
- package/dist/protocol/poll.d.ts +4 -0
- package/dist/protocol/poll.d.ts.map +1 -0
- package/dist/protocol/poll.js +4 -0
- package/dist/protocol/poll.js.map +1 -0
- package/dist/protocol/proposal.d.ts +36 -0
- package/dist/protocol/proposal.d.ts.map +1 -0
- package/dist/protocol/proposal.js +39 -0
- package/dist/protocol/proposal.js.map +1 -0
- package/dist/protocol/state.d.ts +87 -0
- package/dist/protocol/state.d.ts.map +1 -0
- package/dist/protocol/state.js +303 -0
- package/dist/protocol/state.js.map +1 -0
- package/dist/protocol/strategy/build.d.ts +44 -0
- package/dist/protocol/strategy/build.d.ts.map +1 -0
- package/dist/protocol/strategy/build.js +50 -0
- package/dist/protocol/strategy/build.js.map +1 -0
- package/dist/protocol/strategy/builders.d.ts +252 -0
- package/dist/protocol/strategy/builders.d.ts.map +1 -0
- package/dist/protocol/strategy/builders.js +382 -0
- package/dist/protocol/strategy/builders.js.map +1 -0
- package/dist/protocol/strategy/index.d.ts +5 -0
- package/dist/protocol/strategy/index.d.ts.map +1 -0
- package/dist/protocol/strategy/index.js +4 -0
- package/dist/protocol/strategy/index.js.map +1 -0
- package/dist/protocol/strategy/kinds.d.ts +2 -0
- package/dist/protocol/strategy/kinds.d.ts.map +1 -0
- package/dist/protocol/strategy/kinds.js +2 -0
- package/dist/protocol/strategy/kinds.js.map +1 -0
- package/dist/protocol/strategy/patch.d.ts +59 -0
- package/dist/protocol/strategy/patch.d.ts.map +1 -0
- package/dist/protocol/strategy/patch.js +253 -0
- package/dist/protocol/strategy/patch.js.map +1 -0
- package/dist/protocol/symbols.d.ts +8 -0
- package/dist/protocol/symbols.d.ts.map +1 -0
- package/dist/protocol/symbols.js +11 -0
- package/dist/protocol/symbols.js.map +1 -0
- package/dist/transport/constants.d.ts +8 -0
- package/dist/transport/constants.d.ts.map +1 -0
- package/dist/transport/constants.js +8 -0
- package/dist/transport/constants.js.map +1 -0
- package/dist/transport/documents.d.ts +27 -0
- package/dist/transport/documents.d.ts.map +1 -0
- package/dist/transport/documents.js +34 -0
- package/dist/transport/documents.js.map +1 -0
- package/dist/transport/index.d.ts +8 -0
- package/dist/transport/index.d.ts.map +1 -0
- package/dist/transport/index.js +8 -0
- package/dist/transport/index.js.map +1 -0
- package/dist/transport/probe.d.ts +44 -0
- package/dist/transport/probe.d.ts.map +1 -0
- package/dist/transport/probe.js +121 -0
- package/dist/transport/probe.js.map +1 -0
- package/dist/transport/rendezvous.d.ts +116 -0
- package/dist/transport/rendezvous.d.ts.map +1 -0
- package/dist/transport/rendezvous.js +139 -0
- package/dist/transport/rendezvous.js.map +1 -0
- package/dist/transport/rest.d.ts +35 -0
- package/dist/transport/rest.d.ts.map +1 -0
- package/dist/transport/rest.js +58 -0
- package/dist/transport/rest.js.map +1 -0
- package/dist/transport/syncClient.d.ts +14 -0
- package/dist/transport/syncClient.d.ts.map +1 -0
- package/dist/transport/syncClient.js +30 -0
- package/dist/transport/syncClient.js.map +1 -0
- package/dist/transport/urls.d.ts +35 -0
- package/dist/transport/urls.d.ts.map +1 -0
- package/dist/transport/urls.js +126 -0
- package/dist/transport/urls.js.map +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { StarfishClient, StarfishCapProvider } from '@drakkar.software/starfish-client';
|
|
2
|
+
import type { Encryptor } from '@drakkar.software/starfish-protocol';
|
|
3
|
+
import type { ClientSession } from '../core/session.js';
|
|
4
|
+
import type { CallOptions } from '../core/options.js';
|
|
5
|
+
import { type NodeCollectionKey } from '../../collections/nodeCollections.js';
|
|
6
|
+
/** Escape hatch: raw access to the node collections and the underlying
|
|
7
|
+
* Starfish client, for anything the typed `accounts`/`automations`/`strategies`
|
|
8
|
+
* namespaces don't cover. Full-wallet client only — see `ReadOnlyDocumentsApi`
|
|
9
|
+
* for the read-only client's deliberately narrower equivalent. */
|
|
10
|
+
export interface DocumentsApi {
|
|
11
|
+
pull<T = Record<string, unknown>>(collection: NodeCollectionKey, opts?: CallOptions & {
|
|
12
|
+
accountId?: string;
|
|
13
|
+
}): Promise<{
|
|
14
|
+
data: T;
|
|
15
|
+
hash: string | null;
|
|
16
|
+
}>;
|
|
17
|
+
push(collection: NodeCollectionKey, data: Record<string, unknown>, opts: CallOptions & {
|
|
18
|
+
baseHash: string | null;
|
|
19
|
+
accountId?: string;
|
|
20
|
+
}): Promise<{
|
|
21
|
+
hash: string;
|
|
22
|
+
}>;
|
|
23
|
+
append(collection: NodeCollectionKey, element: Record<string, unknown>, opts?: CallOptions): Promise<void>;
|
|
24
|
+
readonly raw: {
|
|
25
|
+
readonly sync: StarfishClient;
|
|
26
|
+
readonly capProvider: StarfishCapProvider;
|
|
27
|
+
encryptorFor(collection: NodeCollectionKey): Promise<Encryptor>;
|
|
28
|
+
pullPath(collection: NodeCollectionKey, accountId?: string): string;
|
|
29
|
+
pushPath(collection: NodeCollectionKey, accountId?: string): string;
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/** The read-only client's `documents` escape hatch — deliberately smaller
|
|
33
|
+
* than `DocumentsApi`. No `push`/`append` (this client has no append rights
|
|
34
|
+
* by design — see `ReadOnlyOctoBotClient`'s doc comment), and `raw` drops
|
|
35
|
+
* `sync`/`capProvider`/`pushPath`: those hand a caller an unconstrained
|
|
36
|
+
* `StarfishClient` that can pull or push ANY path, bypassing
|
|
37
|
+
* `collectionEncryptor`'s per-collection gate entirely. What remains
|
|
38
|
+
* (`pull`, `raw.encryptorFor`, `raw.pullPath`) all still route through the
|
|
39
|
+
* session's gate, so a collection outside the grant still throws
|
|
40
|
+
* `OctoBotScopeError` rather than silently working. */
|
|
41
|
+
export interface ReadOnlyDocumentsApi {
|
|
42
|
+
pull<T = Record<string, unknown>>(collection: NodeCollectionKey, opts?: CallOptions & {
|
|
43
|
+
accountId?: string;
|
|
44
|
+
}): Promise<{
|
|
45
|
+
data: T;
|
|
46
|
+
hash: string | null;
|
|
47
|
+
}>;
|
|
48
|
+
readonly raw: {
|
|
49
|
+
encryptorFor(collection: NodeCollectionKey): Promise<Encryptor>;
|
|
50
|
+
pullPath(collection: NodeCollectionKey, accountId?: string): string;
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
export declare function createDocumentsApi(session: ClientSession): DocumentsApi;
|
|
54
|
+
export declare function createReadOnlyDocumentsApi(session: ClientSession): ReadOnlyDocumentsApi;
|
|
55
|
+
//# sourceMappingURL=documents.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documents.d.ts","sourceRoot":"","sources":["../../../src/client/adapters/documents.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAA;AAC5F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAGrD,OAAO,EAAoB,KAAK,iBAAiB,EAAE,MAAM,sCAAsC,CAAA;AAG/F;;;mEAGmE;AACnE,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,UAAU,EAAE,iBAAiB,EAC7B,IAAI,CAAC,EAAE,WAAW,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1C,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;IAC5C,IAAI,CACF,UAAU,EAAE,iBAAiB,EAC7B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,IAAI,EAAE,WAAW,GAAG;QAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAClE,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;IAC5B,MAAM,CACJ,UAAU,EAAE,iBAAiB,EAC7B,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,IAAI,CAAC,CAAA;IAChB,QAAQ,CAAC,GAAG,EAAE;QACZ,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAA;QAC7B,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAA;QACzC,YAAY,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;QAC/D,QAAQ,CAAC,UAAU,EAAE,iBAAiB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;QACnE,QAAQ,CAAC,UAAU,EAAE,iBAAiB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KACpE,CAAA;CACF;AAED;;;;;;;;wDAQwD;AACxD,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,UAAU,EAAE,iBAAiB,EAC7B,IAAI,CAAC,EAAE,WAAW,GAAG;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1C,OAAO,CAAC;QAAE,IAAI,EAAE,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC,CAAA;IAC5C,QAAQ,CAAC,GAAG,EAAE;QACZ,YAAY,CAAC,UAAU,EAAE,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAAC,CAAA;QAC/D,QAAQ,CAAC,UAAU,EAAE,iBAAiB,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KACpE,CAAA;CACF;AAMD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,aAAa,GAAG,YAAY,CA4CvE;AAED,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,aAAa,GAAG,oBAAoB,CAqBvF"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { pullDocument, pushDocument, appendElement } from '../../transport/documents.js';
|
|
2
|
+
import { pullPath, pushPath } from '../../collections/paths.js';
|
|
3
|
+
import { NODE_COLLECTIONS } from '../../collections/nodeCollections.js';
|
|
4
|
+
import { rethrowAsOctoBotError } from '../core/errors.js';
|
|
5
|
+
function documentPath(userId, accountId) {
|
|
6
|
+
return accountId ? { identity: userId, accountId } : { identity: userId };
|
|
7
|
+
}
|
|
8
|
+
export function createDocumentsApi(session) {
|
|
9
|
+
function params(accountId) {
|
|
10
|
+
return documentPath(session.userId, accountId);
|
|
11
|
+
}
|
|
12
|
+
return {
|
|
13
|
+
async pull(collection, opts) {
|
|
14
|
+
try {
|
|
15
|
+
const encryptor = await session.collectionEncryptor(collection);
|
|
16
|
+
return await pullDocument(session.syncClient, collection, params(opts?.accountId), encryptor);
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
rethrowAsOctoBotError(err);
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
async push(collection, data, opts) {
|
|
23
|
+
try {
|
|
24
|
+
const encryptor = await session.collectionEncryptor(collection);
|
|
25
|
+
return await pushDocument(session.syncClient, collection, params(opts?.accountId), data, opts.baseHash, encryptor);
|
|
26
|
+
}
|
|
27
|
+
catch (err) {
|
|
28
|
+
rethrowAsOctoBotError(err);
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
async append(collection, element) {
|
|
32
|
+
try {
|
|
33
|
+
const encryptor = await session.collectionEncryptor(collection);
|
|
34
|
+
await appendElement(session.syncClient, collection, params(), element, encryptor);
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
rethrowAsOctoBotError(err);
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
raw: {
|
|
41
|
+
sync: session.syncClient,
|
|
42
|
+
capProvider: session.capProvider,
|
|
43
|
+
encryptorFor: (collection) => session.collectionEncryptor(collection),
|
|
44
|
+
pullPath: (collection, accountId) => pullPath(NODE_COLLECTIONS[collection].storagePath, accountId ? { identity: session.userId, accountId } : { identity: session.userId }),
|
|
45
|
+
pushPath: (collection, accountId) => pushPath(NODE_COLLECTIONS[collection].storagePath, accountId ? { identity: session.userId, accountId } : { identity: session.userId }),
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
export function createReadOnlyDocumentsApi(session) {
|
|
50
|
+
return {
|
|
51
|
+
async pull(collection, opts) {
|
|
52
|
+
try {
|
|
53
|
+
const encryptor = await session.collectionEncryptor(collection);
|
|
54
|
+
return await pullDocument(session.syncClient, collection, documentPath(session.userId, opts?.accountId), encryptor);
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
rethrowAsOctoBotError(err);
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
raw: {
|
|
61
|
+
encryptorFor: (collection) => session.collectionEncryptor(collection),
|
|
62
|
+
pullPath: (collection, accountId) => pullPath(NODE_COLLECTIONS[collection].storagePath, accountId ? { identity: session.userId, accountId } : { identity: session.userId }),
|
|
63
|
+
},
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=documents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"documents.js","sourceRoot":"","sources":["../../../src/client/adapters/documents.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { DslKeywordsState, MarketMakingConfiguration } from '@drakkar.software/octobot-protocol';
|
|
2
|
+
import type { ClientSession } from '../core/session.js';
|
|
3
|
+
import type { CallOptions } from '../core/options.js';
|
|
4
|
+
import { type ExchangeConfigParams, type PredictedOrderBookResponse, type RequiredFundsResponse, type NodeWalletExport, type TradedPairsByExchange, type LegacyTradedPairsByExchange } from '../../node-api/index.js';
|
|
5
|
+
export interface NodeApi {
|
|
6
|
+
status(opts?: CallOptions): Promise<{
|
|
7
|
+
reachable: boolean;
|
|
8
|
+
configured: boolean;
|
|
9
|
+
}>;
|
|
10
|
+
tradedPairs(exchange: ExchangeConfigParams, opts?: CallOptions & {
|
|
11
|
+
withVolume?: boolean;
|
|
12
|
+
}): Promise<TradedPairsByExchange | LegacyTradedPairsByExchange>;
|
|
13
|
+
predictedOrderBook(exchange: ExchangeConfigParams, config: MarketMakingConfiguration, opts?: CallOptions): Promise<PredictedOrderBookResponse>;
|
|
14
|
+
requiredFunds(exchange: ExchangeConfigParams, config: MarketMakingConfiguration, opts?: CallOptions): Promise<RequiredFundsResponse>;
|
|
15
|
+
/** Requires `ConnectOptions.basicAuth` — throws `OctoBotConfigError` otherwise. */
|
|
16
|
+
dslKeywords(opts?: CallOptions): Promise<DslKeywordsState>;
|
|
17
|
+
/** Requires `ConnectOptions.basicAuth`. */
|
|
18
|
+
exportWallet(opts?: CallOptions): Promise<NodeWalletExport>;
|
|
19
|
+
/** Requires `ConnectOptions.basicAuth`. */
|
|
20
|
+
createGenericProcessBot(name: string, opts?: CallOptions): Promise<{
|
|
21
|
+
automation_id: string;
|
|
22
|
+
}>;
|
|
23
|
+
}
|
|
24
|
+
export declare function createNodeApi(session: ClientSession): NodeApi;
|
|
25
|
+
//# sourceMappingURL=nodeApi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeApi.d.ts","sourceRoot":"","sources":["../../../src/client/adapters/nodeApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,oCAAoC,CAAA;AACrG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAErD,OAAO,EAOL,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,qBAAqB,EAC1B,KAAK,gBAAgB,EACrB,KAAK,qBAAqB,EAC1B,KAAK,2BAA2B,EACjC,MAAM,yBAAyB,CAAA;AAGhC,MAAM,WAAW,OAAO;IACtB,MAAM,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;QAAE,SAAS,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAAC,CAAA;IAChF,WAAW,CACT,QAAQ,EAAE,oBAAoB,EAC9B,IAAI,CAAC,EAAE,WAAW,GAAG;QAAE,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,GAC5C,OAAO,CAAC,qBAAqB,GAAG,2BAA2B,CAAC,CAAA;IAC/D,kBAAkB,CAChB,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,EAAE,yBAAyB,EACjC,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,0BAA0B,CAAC,CAAA;IACtC,aAAa,CACX,QAAQ,EAAE,oBAAoB,EAC9B,MAAM,EAAE,yBAAyB,EACjC,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,qBAAqB,CAAC,CAAA;IACjC,mFAAmF;IACnF,WAAW,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC1D,2CAA2C;IAC3C,YAAY,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAA;IAC3D,2CAA2C;IAC3C,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC;QAAE,aAAa,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC9F;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAuE7D"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { detectNode } from '../../transport/probe.js';
|
|
2
|
+
import { fetchNodeTradedPairs, fetchPredictedOrderBook, fetchRequiredFunds, fetchNodeDslKeywords, fetchNodeWalletExport, createGenericProcessBot, } from '../../node-api/index.js';
|
|
3
|
+
import { OctoBotConfigError, rethrowAsOctoBotError } from '../core/errors.js';
|
|
4
|
+
export function createNodeApi(session) {
|
|
5
|
+
function requireBasicAuth() {
|
|
6
|
+
if (!session.basicAuth) {
|
|
7
|
+
throw new OctoBotConfigError('this call requires ConnectOptions.basicAuth — only a node paired by an older QR carries HTTP Basic credentials');
|
|
8
|
+
}
|
|
9
|
+
return session.basicAuth;
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
async status(opts) {
|
|
13
|
+
try {
|
|
14
|
+
const result = await detectNode(session.node.host, session.node.port, session.node.secure, {
|
|
15
|
+
signal: opts?.signal,
|
|
16
|
+
timeoutMs: opts?.timeoutMs,
|
|
17
|
+
fetch: session.fetch,
|
|
18
|
+
});
|
|
19
|
+
if (result.status === 'reachable')
|
|
20
|
+
return { reachable: true, configured: result.configured };
|
|
21
|
+
return { reachable: false, configured: false };
|
|
22
|
+
}
|
|
23
|
+
catch (err) {
|
|
24
|
+
rethrowAsOctoBotError(err);
|
|
25
|
+
}
|
|
26
|
+
},
|
|
27
|
+
async tradedPairs(exchange, opts) {
|
|
28
|
+
try {
|
|
29
|
+
return await fetchNodeTradedPairs(session.node, exchange, {
|
|
30
|
+
withVolume: opts?.withVolume,
|
|
31
|
+
signal: opts?.signal,
|
|
32
|
+
fetch: session.fetch,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
catch (err) {
|
|
36
|
+
rethrowAsOctoBotError(err);
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
async predictedOrderBook(exchange, config, opts) {
|
|
40
|
+
try {
|
|
41
|
+
return await fetchPredictedOrderBook(session.node, exchange, config, { signal: opts?.signal, fetch: session.fetch });
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
rethrowAsOctoBotError(err);
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
async requiredFunds(exchange, config, opts) {
|
|
48
|
+
try {
|
|
49
|
+
return await fetchRequiredFunds(session.node, exchange, config, { signal: opts?.signal, fetch: session.fetch });
|
|
50
|
+
}
|
|
51
|
+
catch (err) {
|
|
52
|
+
rethrowAsOctoBotError(err);
|
|
53
|
+
}
|
|
54
|
+
},
|
|
55
|
+
async dslKeywords(opts) {
|
|
56
|
+
try {
|
|
57
|
+
return await fetchNodeDslKeywords(session.node, requireBasicAuth(), { signal: opts?.signal, fetch: session.fetch });
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
rethrowAsOctoBotError(err);
|
|
61
|
+
}
|
|
62
|
+
},
|
|
63
|
+
async exportWallet(opts) {
|
|
64
|
+
try {
|
|
65
|
+
return await fetchNodeWalletExport(session.node, requireBasicAuth(), { signal: opts?.signal, fetch: session.fetch });
|
|
66
|
+
}
|
|
67
|
+
catch (err) {
|
|
68
|
+
rethrowAsOctoBotError(err);
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
async createGenericProcessBot(name, opts) {
|
|
72
|
+
try {
|
|
73
|
+
return await createGenericProcessBot(session.node, requireBasicAuth(), name, { signal: opts?.signal, fetch: session.fetch });
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
rethrowAsOctoBotError(err);
|
|
77
|
+
}
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=nodeApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nodeApi.js","sourceRoot":"","sources":["../../../src/client/adapters/nodeApi.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ClientSession } from '../core/session.js';
|
|
2
|
+
import type { CallOptions } from '../core/options.js';
|
|
3
|
+
/** The node stores this document encrypted and OPAQUE — it never reads a
|
|
4
|
+
* field, which is why every method here is generic over the caller's own
|
|
5
|
+
* shape rather than a fixed `UserSettings` type. */
|
|
6
|
+
export interface SettingsApi {
|
|
7
|
+
get<T extends object = Record<string, unknown>>(opts?: CallOptions): Promise<T>;
|
|
8
|
+
/** Read-modify-write against the pulled `baseHash`. This is last-write-wins
|
|
9
|
+
* over the WHOLE document, not a field-level or CRDT merge — a concurrent
|
|
10
|
+
* writer's changes outside `patch` are still preserved (shallow-merged),
|
|
11
|
+
* but two concurrent patches to the same field race normally. */
|
|
12
|
+
patch<T extends object = Record<string, unknown>>(patch: Partial<T>, opts?: CallOptions): Promise<T>;
|
|
13
|
+
replace<T extends object = Record<string, unknown>>(doc: T, opts?: CallOptions): Promise<T>;
|
|
14
|
+
}
|
|
15
|
+
export declare function createSettingsApi(session: ClientSession): SettingsApi;
|
|
16
|
+
//# sourceMappingURL=settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../../src/client/adapters/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAIrD;;qDAEqD;AACrD,MAAM,WAAW,WAAW;IAC1B,GAAG,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IAC/E;;;sEAGkE;IAClE,KAAK,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;IACpG,OAAO,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,CAAA;CAC5F;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,aAAa,GAAG,WAAW,CA2CrE"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { pullDocument, pushDocument } from '../../transport/documents.js';
|
|
2
|
+
import { rethrowAsOctoBotError } from '../core/errors.js';
|
|
3
|
+
export function createSettingsApi(session) {
|
|
4
|
+
async function pull() {
|
|
5
|
+
const encryptor = await session.collectionEncryptor('settings');
|
|
6
|
+
return pullDocument(session.syncClient, 'settings', { identity: session.userId }, encryptor);
|
|
7
|
+
}
|
|
8
|
+
return {
|
|
9
|
+
async get() {
|
|
10
|
+
try {
|
|
11
|
+
const { data } = await pull();
|
|
12
|
+
return data;
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
rethrowAsOctoBotError(err);
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
async patch(patch) {
|
|
19
|
+
try {
|
|
20
|
+
const { data, hash } = await pull();
|
|
21
|
+
const merged = { ...data, ...patch };
|
|
22
|
+
const encryptor = await session.collectionEncryptor('settings');
|
|
23
|
+
await pushDocument(session.syncClient, 'settings', { identity: session.userId }, merged, hash, encryptor);
|
|
24
|
+
return merged;
|
|
25
|
+
}
|
|
26
|
+
catch (err) {
|
|
27
|
+
rethrowAsOctoBotError(err);
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
async replace(doc) {
|
|
31
|
+
try {
|
|
32
|
+
const { hash } = await pull();
|
|
33
|
+
const encryptor = await session.collectionEncryptor('settings');
|
|
34
|
+
await pushDocument(session.syncClient, 'settings', { identity: session.userId }, doc, hash, encryptor);
|
|
35
|
+
return doc;
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
rethrowAsOctoBotError(err);
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../../src/client/adapters/settings.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAezD,MAAM,UAAU,iBAAiB,CAAC,OAAsB;IACtD,KAAK,UAAU,IAAI;QACjB,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAA;QAC/D,OAAO,YAAY,CAAI,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,SAAS,CAAC,CAAA;IACjG,CAAC;IAED,OAAO;QACL,KAAK,CAAC,GAAG;YACP,IAAI,CAAC;gBACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,EAAK,CAAA;gBAChC,OAAO,IAAI,CAAA;YACb,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,qBAAqB,CAAC,GAAG,CAAC,CAAA;YAC5B,CAAC;QACH,CAAC;QACD,KAAK,CAAC,KAAK,CAA6C,KAAiB;YACvE,IAAI,CAAC;gBACH,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,EAAK,CAAA;gBACtC,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,KAAK,EAAO,CAAA;gBACzC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAA;gBAC/D,MAAM,YAAY,CAChB,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,EAC5D,MAA4C,EAAE,IAAI,EAAE,SAAS,CAC9D,CAAA;gBACD,OAAO,MAAM,CAAA;YACf,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,qBAAqB,CAAC,GAAG,CAAC,CAAA;YAC5B,CAAC;QACH,CAAC;QACD,KAAK,CAAC,OAAO,CAA6C,GAAM;YAC9D,IAAI,CAAC;gBACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,EAAK,CAAA;gBAChC,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAA;gBAC/D,MAAM,YAAY,CAChB,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,EAC5D,GAAyC,EAAE,IAAI,EAAE,SAAS,CAC3D,CAAA;gBACD,OAAO,GAAG,CAAA;YACZ,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,qBAAqB,CAAC,GAAG,CAAC,CAAA;YAC5B,CAAC;QACH,CAAC;KACF,CAAA;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Strategy as ProtocolStrategy } from '@drakkar.software/octobot-protocol';
|
|
2
|
+
import type { ClientSession } from '../core/session.js';
|
|
3
|
+
import type { CallOptions } from '../core/options.js';
|
|
4
|
+
import type { AppendAction } from './accounts.js';
|
|
5
|
+
import { type ActionHandle } from './actionHandle.js';
|
|
6
|
+
export interface StrategiesApi {
|
|
7
|
+
/** Reconstructed from the node's `strategy_create`/`strategy_edit` actions
|
|
8
|
+
* — the node exposes no strategies collection of its own; a strategy only
|
|
9
|
+
* exists as the configuration an automation was created or edited with. */
|
|
10
|
+
list(opts?: CallOptions): Promise<ProtocolStrategy[]>;
|
|
11
|
+
get(id: string, version?: string, opts?: CallOptions): Promise<ProtocolStrategy | null>;
|
|
12
|
+
create(strategy: ProtocolStrategy, opts?: CallOptions): Promise<ActionHandle<ProtocolStrategy>>;
|
|
13
|
+
update(strategy: ProtocolStrategy, opts?: CallOptions): Promise<ActionHandle<ProtocolStrategy>>;
|
|
14
|
+
delete(id: string, opts?: CallOptions): Promise<ActionHandle<void>>;
|
|
15
|
+
}
|
|
16
|
+
export declare function createStrategiesApi(session: ClientSession, appendAction: AppendAction): StrategiesApi;
|
|
17
|
+
//# sourceMappingURL=strategies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategies.d.ts","sourceRoot":"","sources":["../../../src/client/adapters/strategies.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,IAAI,gBAAgB,EAAc,MAAM,oCAAoC,CAAA;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAMzE,MAAM,WAAW,aAAa;IAC5B;;gFAE4E;IAC5E,IAAI,CAAC,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,EAAE,CAAC,CAAA;IACrD,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAA;IACvF,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAC/F,MAAM,CAAC,QAAQ,EAAE,gBAAgB,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,CAAA;IAC/F,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAA;CACpE;AA0BD,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,YAAY,GAAG,aAAa,CAiDrG"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { createActionHandle } from './actionHandle.js';
|
|
2
|
+
import { pullDocument } from '../../transport/documents.js';
|
|
3
|
+
import { parseNodeUserActions } from '../../protocol/state.js';
|
|
4
|
+
import { buildCreateStrategyConfig, buildEditStrategyConfig, buildDeleteStrategyConfig } from '../../protocol/actions.js';
|
|
5
|
+
import { rethrowAsOctoBotError } from '../core/errors.js';
|
|
6
|
+
/** Every strategy the action history carries, one entry per (id, version)
|
|
7
|
+
* the newest action for that pair produced — `strategy_edit` supersedes an
|
|
8
|
+
* earlier `strategy_create` for the same id. */
|
|
9
|
+
function strategiesFromActions(actions) {
|
|
10
|
+
const byKey = new Map();
|
|
11
|
+
for (const action of actions) {
|
|
12
|
+
const cfg = action.configuration;
|
|
13
|
+
if (cfg?.action_type !== 'strategy_create' && cfg?.action_type !== 'strategy_edit')
|
|
14
|
+
continue;
|
|
15
|
+
const strategy = cfg.configuration;
|
|
16
|
+
if (!strategy?.id)
|
|
17
|
+
continue;
|
|
18
|
+
const key = `${strategy.id}@${strategy.version ?? ''}`;
|
|
19
|
+
const at = action.updated_at ?? action.created_at ?? '';
|
|
20
|
+
const existing = byKey.get(key);
|
|
21
|
+
if (!existing || at >= existing.at)
|
|
22
|
+
byKey.set(key, { at, strategy });
|
|
23
|
+
}
|
|
24
|
+
return [...byKey.values()].map((v) => v.strategy);
|
|
25
|
+
}
|
|
26
|
+
export function createStrategiesApi(session, appendAction) {
|
|
27
|
+
async function pullActions() {
|
|
28
|
+
const encryptor = await session.collectionEncryptor('userData');
|
|
29
|
+
const { data } = await pullDocument(session.syncClient, 'userData', { identity: session.userId }, encryptor);
|
|
30
|
+
return parseNodeUserActions(data);
|
|
31
|
+
}
|
|
32
|
+
async function list() {
|
|
33
|
+
try {
|
|
34
|
+
return strategiesFromActions(await pullActions());
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
rethrowAsOctoBotError(err);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
async function get(id, version) {
|
|
41
|
+
const all = await list();
|
|
42
|
+
const matches = all.filter((s) => s.id === id);
|
|
43
|
+
if (version)
|
|
44
|
+
return matches.find((s) => s.version === version) ?? null;
|
|
45
|
+
return matches.at(-1) ?? null;
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
list,
|
|
49
|
+
get,
|
|
50
|
+
async create(strategy) {
|
|
51
|
+
const ids = [];
|
|
52
|
+
const work = (async () => {
|
|
53
|
+
ids.push(await appendAction(buildCreateStrategyConfig(strategy)));
|
|
54
|
+
return strategy;
|
|
55
|
+
})();
|
|
56
|
+
return createActionHandle(session, ids, work);
|
|
57
|
+
},
|
|
58
|
+
async update(strategy) {
|
|
59
|
+
const ids = [];
|
|
60
|
+
const work = (async () => {
|
|
61
|
+
ids.push(await appendAction(buildEditStrategyConfig(strategy)));
|
|
62
|
+
return strategy;
|
|
63
|
+
})();
|
|
64
|
+
return createActionHandle(session, ids, work);
|
|
65
|
+
},
|
|
66
|
+
async delete(id) {
|
|
67
|
+
const ids = [];
|
|
68
|
+
const work = (async () => {
|
|
69
|
+
ids.push(await appendAction(buildDeleteStrategyConfig(id)));
|
|
70
|
+
})();
|
|
71
|
+
return createActionHandle(session, ids, work);
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=strategies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"strategies.js","sourceRoot":"","sources":["../../../src/client/adapters/strategies.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type ConnectOptions, type SeedDerivation, type CallOptions } from '../core/options.js';
|
|
2
|
+
import { type AccountsApi } from '../adapters/accounts.js';
|
|
3
|
+
import { type AutomationsApi } from '../adapters/automations.js';
|
|
4
|
+
import { type StrategiesApi } from '../adapters/strategies.js';
|
|
5
|
+
import { type SettingsApi } from '../adapters/settings.js';
|
|
6
|
+
import { type NodeApi } from '../adapters/nodeApi.js';
|
|
7
|
+
import { type DocumentsApi } from '../adapters/documents.js';
|
|
8
|
+
export type { ConnectOptions, SeedDerivation, CallOptions };
|
|
9
|
+
export type OctoBotClient = {
|
|
10
|
+
/** The node's origin, normalized, e.g. `'http://192.168.1.10:5001'`. */
|
|
11
|
+
readonly url: string;
|
|
12
|
+
/** EIP-55 checksummed EVM address the seed derives to. */
|
|
13
|
+
readonly address: string;
|
|
14
|
+
/** Starfish identity — `sha256(rootEdPub)[:32]`; the `{identity}` URL segment. */
|
|
15
|
+
readonly userId: string;
|
|
16
|
+
readonly accounts: AccountsApi;
|
|
17
|
+
readonly automations: AutomationsApi;
|
|
18
|
+
readonly strategies: StrategiesApi;
|
|
19
|
+
readonly settings: SettingsApi;
|
|
20
|
+
readonly node: NodeApi;
|
|
21
|
+
/** Escape hatch: raw pull/push/append and the underlying `StarfishClient`. */
|
|
22
|
+
readonly documents: DocumentsApi;
|
|
23
|
+
/** Drops the derived-key cache. Does not abort in-flight `ActionHandle`
|
|
24
|
+
* work already started — those complete or time out on their own. */
|
|
25
|
+
close(): void;
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Connect to a self-hosted OctoBot node.
|
|
29
|
+
*
|
|
30
|
+
* ```ts
|
|
31
|
+
* const octobot = await connectOctoBot({ url: 'http://192.168.1.10:5001', seed })
|
|
32
|
+
* const accounts = await octobot.accounts.list()
|
|
33
|
+
* ```
|
|
34
|
+
*
|
|
35
|
+
* No document is ever cached — every read is a fresh pull. The only state
|
|
36
|
+
* kept across calls is the derived key material (a pure function of `seed`),
|
|
37
|
+
* dropped by `close()`.
|
|
38
|
+
*/
|
|
39
|
+
export declare function connectOctoBot(options: ConnectOptions): Promise<OctoBotClient>;
|
|
40
|
+
//# sourceMappingURL=connect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../../src/client/connect/connect.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAE/F,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC7E,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,4BAA4B,CAAA;AACtF,OAAO,EAAuB,KAAK,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACnF,OAAO,EAAqB,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAA;AAC7E,OAAO,EAAiB,KAAK,OAAO,EAAE,MAAM,wBAAwB,CAAA;AACpE,OAAO,EAAsB,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAIhF,YAAY,EAAE,cAAc,EAAE,cAAc,EAAE,WAAW,EAAE,CAAA;AAE3D,MAAM,MAAM,aAAa,GAAG;IAC1B,wEAAwE;IACxE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;IACxB,kFAAkF;IAClF,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;IACvB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAA;IAC9B,QAAQ,CAAC,WAAW,EAAE,cAAc,CAAA;IACpC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAA;IAClC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAA;IAC9B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;IACtB,8EAA8E;IAC9E,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAA;IAChC;0EACsE;IACtE,KAAK,IAAI,IAAI,CAAA;CACd,CAAA;AAcD;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA0FpF"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { StarfishHttpError } from '@drakkar.software/starfish-client';
|
|
2
|
+
import { parseHostInput } from '../../transport/urls.js';
|
|
3
|
+
import { isEvmPrivateKey } from '../../identity/evm.js';
|
|
4
|
+
import { listDerivationSchemeIds, DEFAULT_DERIVATION_SCHEME_ID } from '../../identity/derivationSchemes.js';
|
|
5
|
+
import { pullPath } from '../../collections/paths.js';
|
|
6
|
+
import { SYNC_FETCH_TIMEOUT_MS } from '../../crypto/wireConstants.js';
|
|
7
|
+
import { createSession } from '../core/session.js';
|
|
8
|
+
import { OctoBotConfigError, OctoBotAuthError, rethrowAsOctoBotError } from '../core/errors.js';
|
|
9
|
+
import { createAccountsApi } from '../adapters/accounts.js';
|
|
10
|
+
import { createAutomationsApi } from '../adapters/automations.js';
|
|
11
|
+
import { createStrategiesApi } from '../adapters/strategies.js';
|
|
12
|
+
import { createSettingsApi } from '../adapters/settings.js';
|
|
13
|
+
import { createNodeApi } from '../adapters/nodeApi.js';
|
|
14
|
+
import { createDocumentsApi } from '../adapters/documents.js';
|
|
15
|
+
import { appendElement } from '../../transport/documents.js';
|
|
16
|
+
async function probeIdentity(session) {
|
|
17
|
+
try {
|
|
18
|
+
await session.syncClient.pull(pullPath('users/{identity}/data', { identity: session.userId }));
|
|
19
|
+
return { ok: true };
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
if (err instanceof StarfishHttpError && (err.status === 401 || err.status === 403)) {
|
|
23
|
+
return { ok: false, err };
|
|
24
|
+
}
|
|
25
|
+
throw err;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Connect to a self-hosted OctoBot node.
|
|
30
|
+
*
|
|
31
|
+
* ```ts
|
|
32
|
+
* const octobot = await connectOctoBot({ url: 'http://192.168.1.10:5001', seed })
|
|
33
|
+
* const accounts = await octobot.accounts.list()
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* No document is ever cached — every read is a fresh pull. The only state
|
|
37
|
+
* kept across calls is the derived key material (a pure function of `seed`),
|
|
38
|
+
* dropped by `close()`.
|
|
39
|
+
*/
|
|
40
|
+
export async function connectOctoBot(options) {
|
|
41
|
+
if (!options?.url?.trim())
|
|
42
|
+
throw new OctoBotConfigError('ConnectOptions.url is required');
|
|
43
|
+
if (!options?.seed?.trim())
|
|
44
|
+
throw new OctoBotConfigError('ConnectOptions.seed is required');
|
|
45
|
+
const parsedHost = parseHostInput(options.url);
|
|
46
|
+
if (!parsedHost)
|
|
47
|
+
throw new OctoBotConfigError(`could not parse ConnectOptions.url: ${JSON.stringify(options.url)}`);
|
|
48
|
+
const node = { host: parsedHost.host, port: parsedHost.port, secure: parsedHost.secure };
|
|
49
|
+
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
50
|
+
const defaultTimeoutMs = options.timeoutMs ?? SYNC_FETCH_TIMEOUT_MS;
|
|
51
|
+
const origin = `${node.secure ? 'https' : 'http'}://${node.host}:${node.port}`;
|
|
52
|
+
const verify = options.verify ?? true;
|
|
53
|
+
const requested = options.seedDerivation ?? DEFAULT_DERIVATION_SCHEME_ID;
|
|
54
|
+
const isRawKey = isEvmPrivateKey(options.seed.trim());
|
|
55
|
+
function buildSession(derivation) {
|
|
56
|
+
return createSession({
|
|
57
|
+
origin,
|
|
58
|
+
node,
|
|
59
|
+
// address/userId filled in below via the cap provider itself; placeholder
|
|
60
|
+
// values here are never observed because they're overwritten before return.
|
|
61
|
+
address: '',
|
|
62
|
+
userId: '',
|
|
63
|
+
derivation,
|
|
64
|
+
seed: options.seed,
|
|
65
|
+
fetch: fetchImpl,
|
|
66
|
+
defaultTimeoutMs,
|
|
67
|
+
basicAuth: options.basicAuth,
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
async function finalize(session) {
|
|
71
|
+
const address = await session.walletAddress();
|
|
72
|
+
const userId = await session.capProvider.getUserId();
|
|
73
|
+
return { ...session, address, userId };
|
|
74
|
+
}
|
|
75
|
+
let session;
|
|
76
|
+
try {
|
|
77
|
+
if (requested === 'auto') {
|
|
78
|
+
// A raw key passes through every scheme identically, so trying more than
|
|
79
|
+
// one is pointless — only a mnemonic's derivation is actually ambiguous.
|
|
80
|
+
const candidates = isRawKey ? [DEFAULT_DERIVATION_SCHEME_ID] : listDerivationSchemeIds();
|
|
81
|
+
let lastFailed;
|
|
82
|
+
let authorized;
|
|
83
|
+
for (const d of candidates) {
|
|
84
|
+
const candidate = await finalize(buildSession(d));
|
|
85
|
+
if (!verify) {
|
|
86
|
+
authorized = candidate;
|
|
87
|
+
break;
|
|
88
|
+
}
|
|
89
|
+
const probe = await probeIdentity(candidate);
|
|
90
|
+
if (probe.ok) {
|
|
91
|
+
authorized = candidate;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
lastFailed = candidate;
|
|
95
|
+
}
|
|
96
|
+
if (!authorized) {
|
|
97
|
+
const failed = lastFailed;
|
|
98
|
+
throw new OctoBotAuthError(failed.address, failed.userId, failed.derivation);
|
|
99
|
+
}
|
|
100
|
+
session = authorized;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
session = await finalize(buildSession(requested));
|
|
104
|
+
if (verify) {
|
|
105
|
+
const probe = await probeIdentity(session);
|
|
106
|
+
if (!probe.ok)
|
|
107
|
+
throw new OctoBotAuthError(session.address, session.userId, session.derivation);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
rethrowAsOctoBotError(err);
|
|
113
|
+
}
|
|
114
|
+
async function appendAction(configuration) {
|
|
115
|
+
const id = `ua_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;
|
|
116
|
+
const encryptor = await session.collectionEncryptor('actions');
|
|
117
|
+
await appendElement(session.syncClient, 'actions', { identity: session.userId }, { id, status: 'pending', created_at: new Date().toISOString(), configuration }, encryptor);
|
|
118
|
+
return id;
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
url: origin,
|
|
122
|
+
address: session.address,
|
|
123
|
+
userId: session.userId,
|
|
124
|
+
accounts: createAccountsApi(session, appendAction),
|
|
125
|
+
automations: createAutomationsApi(session, appendAction),
|
|
126
|
+
strategies: createStrategiesApi(session, appendAction),
|
|
127
|
+
settings: createSettingsApi(session),
|
|
128
|
+
node: createNodeApi(session),
|
|
129
|
+
documents: createDocumentsApi(session),
|
|
130
|
+
close: () => session.close(),
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=connect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connect.js","sourceRoot":"","sources":["../../../src/client/connect/connect.ts"],"names":[],"mappings":"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"}
|