1
1
/* eslint-disable promise/no-nesting */
2
2
/* eslint-disable @typescript-eslint/no-explicit-any */
3
3
import { DnsResolver } from '../utils' ;
4
- import { HandleProvider , SubmitTxArgs } from '@cardano-sdk/core' ;
5
4
import { Logger } from 'ts-log' ;
6
5
import { MissingCardanoNodeOption } from '../errors' ;
7
- import {
8
- OgmiosCardanoNode ,
9
- OgmiosObservableCardanoNode ,
10
- OgmiosTxSubmitProvider ,
11
- urlToConnectionConfig
12
- } from '@cardano-sdk/ogmios' ;
6
+ import { OgmiosCardanoNode , OgmiosObservableCardanoNode , urlToConnectionConfig } from '@cardano-sdk/ogmios' ;
13
7
import { OgmiosOptionDescriptions , OgmiosProgramOptions } from '../options/ogmios' ;
14
8
import { RunnableModule , isConnectionError } from '@cardano-sdk/util' ;
15
9
import { defer , from , of } from 'rxjs' ;
@@ -31,103 +25,6 @@ const recreateOgmiosCardanoNode = async (
31
25
return new OgmiosCardanoNode ( { host : record . name , port : record . port } , logger ) ;
32
26
} ;
33
27
34
- const recreateOgmiosTxSubmitProvider = async (
35
- serviceName : string ,
36
- ogmiosTxSubmitProvider : OgmiosTxSubmitProvider ,
37
- dnsResolver : DnsResolver ,
38
- logger : Logger ,
39
- handleProvider ?: HandleProvider
40
- ) => {
41
- const record = await dnsResolver ( serviceName ! ) ;
42
- logger . info ( `DNS resolution for OgmiosTxSubmitProvider, resolved with record: ${ JSON . stringify ( record ) } ` ) ;
43
- await ogmiosTxSubmitProvider
44
- . shutdown ( )
45
- . catch ( ( error_ ) => logger . warn ( `OgmiosTxSubmitProvider failed to shutdown after connection error: ${ error_ } ` ) ) ;
46
- return new OgmiosTxSubmitProvider ( { host : record . name , port : record . port } , { logger } , handleProvider ) ;
47
- } ;
48
- /**
49
- * Creates an extended TxSubmitProvider instance :
50
- * - use passed srv service name in order to resolve the port
51
- * - make dealing with fail-overs (re-resolving the port) opaque
52
- * - use exponential backoff retry internally with default timeout and factor
53
- * - intercept 'initialize' operation and handle connection errors on initialization
54
- * - intercept 'submitTx' operation and handle connection errors runtime
55
- * - all other operations are bind to pool object without modifications
56
- *
57
- * @returns TxSubmitProvider instance
58
- */
59
- export const ogmiosTxSubmitProviderWithDiscovery = async (
60
- dnsResolver : DnsResolver ,
61
- logger : Logger ,
62
- serviceName : string ,
63
- handleProvider ?: HandleProvider
64
- ) : Promise < OgmiosTxSubmitProvider > => {
65
- const { name, port } = await dnsResolver ( serviceName ! ) ;
66
- let ogmiosProvider = new OgmiosTxSubmitProvider ( { host : name , port } , { logger } , handleProvider ) ;
67
-
68
- const txSubmitProviderProxy = new Proxy < OgmiosTxSubmitProvider > ( { } as OgmiosTxSubmitProvider , {
69
- get ( _ , prop , receiver ) {
70
- if ( prop === 'then' ) return ;
71
- if ( prop === 'initialize' ) {
72
- return ( ) =>
73
- ogmiosProvider . initialize ( ) . catch ( async ( error ) => {
74
- if ( isConnectionError ( error ) ) {
75
- ogmiosProvider = await recreateOgmiosTxSubmitProvider (
76
- serviceName ,
77
- ogmiosProvider ,
78
- dnsResolver ,
79
- logger ,
80
- handleProvider
81
- ) ;
82
- return receiver . initialize ( ) ;
83
- }
84
- throw error ;
85
- } ) ;
86
- }
87
- if ( prop === 'submitTx' ) {
88
- return ( submitTxArgs : SubmitTxArgs ) =>
89
- ogmiosProvider . submitTx ( submitTxArgs ) . catch ( async ( error ) => {
90
- if ( isConnectionError ( error ) ) {
91
- ogmiosProvider = await recreateOgmiosTxSubmitProvider (
92
- serviceName ,
93
- ogmiosProvider ,
94
- dnsResolver ,
95
- logger ,
96
- handleProvider
97
- ) ;
98
- await receiver . initialize ( ) ;
99
- await receiver . start ( ) ;
100
- return await receiver . submitTx ( submitTxArgs ) ;
101
- }
102
- throw error ;
103
- } ) ;
104
- }
105
- // Bind if it is a function, no intercept operations
106
- if ( typeof ogmiosProvider [ prop as keyof OgmiosTxSubmitProvider ] === 'function' ) {
107
- const method = ogmiosProvider [ prop as keyof OgmiosTxSubmitProvider ] as any ;
108
- return method . bind ( ogmiosProvider ) ;
109
- }
110
-
111
- return ogmiosProvider [ prop as keyof OgmiosTxSubmitProvider ] ;
112
- }
113
- } ) ;
114
-
115
- return Object . setPrototypeOf ( txSubmitProviderProxy , RunnableModule . prototype ) ;
116
- } ;
117
-
118
- export const getOgmiosTxSubmitProvider = async (
119
- dnsResolver : DnsResolver ,
120
- logger : Logger ,
121
- options ?: OgmiosProgramOptions ,
122
- handleProvider ?: HandleProvider
123
- ) : Promise < OgmiosTxSubmitProvider > => {
124
- if ( options ?. ogmiosSrvServiceName )
125
- return ogmiosTxSubmitProviderWithDiscovery ( dnsResolver , logger , options . ogmiosSrvServiceName , handleProvider ) ;
126
- if ( options ?. ogmiosUrl )
127
- return new OgmiosTxSubmitProvider ( urlToConnectionConfig ( options ?. ogmiosUrl ) , { logger } , handleProvider ) ;
128
- throw new MissingCardanoNodeOption ( [ OgmiosOptionDescriptions . Url , OgmiosOptionDescriptions . SrvServiceName ] ) ;
129
- } ;
130
-
131
28
/**
132
29
* Creates an extended OgmiosCardanoNode instance :
133
30
* - use passed srv service name in order to resolve the port
0 commit comments