@@ -73,8 +73,7 @@ export class Substrate {
73
73
* @throws {Error } when the client encounters an error making the request.
74
74
*/
75
75
async run ( ...nodes : Node [ ] ) : Promise < SubstrateResponse > {
76
- const serialized = Substrate . serialize ( ...nodes ) ;
77
- return this . runSerialized ( serialized , nodes ) ;
76
+ return this . runSerialized ( nodes ) ;
78
77
}
79
78
80
79
/**
@@ -93,10 +92,10 @@ export class Substrate {
93
92
* @throws {Error } when the client encounters an error making the request.
94
93
*/
95
94
async runSerialized (
96
- serialized : any ,
97
- nodes : Node [ ] | null = null ,
95
+ nodes : Node [ ] ,
98
96
endpoint : string = "/compose" ,
99
97
) : Promise < SubstrateResponse > {
98
+ const serialized = Substrate . serialize ( ...nodes ) ;
100
99
const url = this . baseUrl + endpoint ;
101
100
const req = { dag : serialized } ;
102
101
// NOTE: we're creating the signal this way instead of AbortController.timeout because it is only very
@@ -114,10 +113,9 @@ export class Substrate {
114
113
const json = await apiResponse . json ( ) ;
115
114
const res = new SubstrateResponse ( request , apiResponse , json ) ;
116
115
/** TODO stop setting output on node */
117
- if ( nodes ) {
118
- // @ts -expect-error (accessing protected)
119
- for ( let node of nodes ) node . response = res ;
120
- }
116
+
117
+ // @ts -expect-error (accessing protected)
118
+ for ( let node of Substrate . findAllNodes ( nodes ) ) node . response = res ;
121
119
122
120
return res ;
123
121
} else {
@@ -181,31 +179,48 @@ export class Substrate {
181
179
}
182
180
183
181
/**
184
- * Transform an array of nodes into JSON for the Substrate API
182
+ * Return a set of all nodes and their dependent nodes.
185
183
*/
186
- static serialize ( ... nodes : Node [ ] ) : any {
184
+ static findAllNodes ( fromNodes : Node [ ] ) : Set < Node > {
187
185
const allNodes = new Set < Node > ( ) ;
188
- const allFutures = new Set < Future < any > > ( ) ;
189
-
190
- for ( let node of nodes ) {
186
+ for ( let node of fromNodes ) {
191
187
// @ts -ignore: .references() is protected
192
188
const refs = node . references ( ) ;
193
189
for ( let n of refs . nodes ) {
194
190
allNodes . add ( n ) ;
195
191
}
192
+ }
193
+ return allNodes ;
194
+ }
195
+
196
+ /**
197
+ * Return a set of all futures and their dependent futures.
198
+ */
199
+ static findAllFutures ( fromNodes : Node [ ] ) : Set < Future < any > > {
200
+ const allFutures = new Set < Future < any > > ( ) ;
201
+ for ( let node of fromNodes ) {
202
+ // @ts -ignore: .references() is protected
203
+ const refs = node . references ( ) ;
196
204
for ( let f of refs . futures ) {
197
205
allFutures . add ( f ) ;
198
206
}
199
207
}
208
+ return allFutures ;
209
+ }
200
210
211
+ /**
212
+ * Transform an array of nodes into JSON for the Substrate API
213
+ */
214
+ static serialize ( ...nodes : Node [ ] ) : any {
215
+ const allFutures = this . findAllFutures ( nodes ) ;
216
+ const allNodes = this . findAllNodes ( nodes ) ;
201
217
const allEdges : Record < string , Set < string > > = { } ;
202
218
for ( let n of allNodes ) {
203
219
allEdges [ n . id ] = new Set < string > ( ) ;
204
220
for ( let d of n . depends ) {
205
221
allEdges [ n . id ] ! . add ( d . id ) ;
206
222
}
207
223
}
208
-
209
224
return {
210
225
nodes : Array . from ( allNodes ) . map ( ( node ) => node . toJSON ( ) ) ,
211
226
futures : Array . from ( allFutures ) . map ( ( future ) => future . toJSON ( ) ) ,
0 commit comments