@ddd-qc/cell-proxy 0.27.6 → 0.28.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/dist/AppProxy.d.ts +9 -45
- package/dist/AppProxy.d.ts.map +1 -0
- package/dist/AppProxy.js +23 -91
- package/dist/AppProxy.js.map +1 -1
- package/dist/CellProxy.d.ts +1 -37
- package/dist/CellProxy.d.ts.map +1 -0
- package/dist/CellProxy.js +4 -71
- package/dist/CellProxy.js.map +1 -1
- package/dist/ConductorAppProxy.d.ts +2 -19
- package/dist/ConductorAppProxy.d.ts.map +1 -0
- package/dist/ConductorAppProxy.js +15 -41
- package/dist/ConductorAppProxy.js.map +1 -1
- package/dist/ExternalAppProxy.d.ts +1 -5
- package/dist/ExternalAppProxy.d.ts.map +1 -0
- package/dist/ExternalAppProxy.js +1 -8
- package/dist/ExternalAppProxy.js.map +1 -1
- package/dist/ZomeProxy.d.ts +4 -15
- package/dist/ZomeProxy.d.ts.map +1 -0
- package/dist/ZomeProxy.js +0 -17
- package/dist/ZomeProxy.js.map +1 -1
- package/dist/cell.d.ts +1 -11
- package/dist/cell.d.ts.map +1 -0
- package/dist/cell.js +0 -14
- package/dist/cell.js.map +1 -1
- package/dist/datum-map.d.ts +2 -6
- package/dist/datum-map.d.ts.map +1 -0
- package/dist/datum-map.js +0 -12
- package/dist/datum-map.js.map +1 -1
- package/dist/hash.d.ts +2 -21
- package/dist/hash.d.ts.map +1 -0
- package/dist/hash.js +19 -51
- package/dist/hash.js.map +1 -1
- package/dist/hcl.d.ts +2 -15
- package/dist/hcl.d.ts.map +1 -0
- package/dist/hcl.js +1 -14
- package/dist/hcl.js.map +1 -1
- package/dist/holochain-id-map.d.ts +2 -1
- package/dist/holochain-id-map.d.ts.map +1 -0
- package/dist/holochain-id-map.js +0 -17
- package/dist/holochain-id-map.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/mixins.d.ts +2 -13
- package/dist/mixins.d.ts.map +1 -0
- package/dist/mixins.js +1 -13
- package/dist/mixins.js.map +1 -1
- package/dist/pretty.d.ts +1 -4
- package/dist/pretty.d.ts.map +1 -0
- package/dist/pretty.js +0 -4
- package/dist/pretty.js.map +1 -1
- package/dist/types.d.ts +1 -11
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +1 -10
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +3 -10
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +11 -11
- package/dist/utils.js.map +1 -1
- package/dist/zomeSignals.integrity.d.ts +1 -0
- package/dist/zomeSignals.integrity.d.ts.map +1 -0
- package/dist/zomeSignals.integrity.js +1 -1
- package/dist/zomeSignals.integrity.js.map +1 -1
- package/dist/zomeSignals.types.d.ts +1 -5
- package/dist/zomeSignals.types.d.ts.map +1 -0
- package/dist/zomeSignals.types.js +0 -4
- package/dist/zomeSignals.types.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CellProxy.d.ts","sourceRoot":"","sources":["../src/CellProxy.ts"],"names":[],"mappings":"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"}
|
package/dist/CellProxy.js
CHANGED
|
@@ -3,28 +3,17 @@ import { SignalType } from "./types";
|
|
|
3
3
|
import { Mutex, withTimeout } from "async-mutex";
|
|
4
4
|
import { prettyDate, prettyDuration } from "./pretty";
|
|
5
5
|
import { anyToB64, intoAnyId } from "./hash";
|
|
6
|
-
/**
|
|
7
|
-
* Proxy for a running DNA.
|
|
8
|
-
* It logs and queues ZomeCalls.
|
|
9
|
-
* It holds a reference to its AppProxy and its Cell.
|
|
10
|
-
* This class is expected to be used by ZomeProxies.
|
|
11
|
-
*/
|
|
12
6
|
export class CellProxy extends CellMixin(Empty) {
|
|
13
|
-
|
|
14
|
-
constructor(_appProxy, cell,
|
|
15
|
-
//public readonly dnaDef: MyDnaDef,
|
|
16
|
-
defaultTimeout) {
|
|
7
|
+
constructor(_appProxy, cell, defaultTimeout) {
|
|
17
8
|
super();
|
|
18
9
|
this._appProxy = _appProxy;
|
|
19
|
-
/** append only logs */
|
|
20
10
|
this._requestLog = [];
|
|
21
11
|
this._responseLog = [];
|
|
22
12
|
this._cell = cell;
|
|
23
13
|
console.log(`CellProxy.ctor`, cell);
|
|
24
14
|
this.defaultTimeout = defaultTimeout ? defaultTimeout : 10 * 1000;
|
|
25
15
|
this._callMutex = withTimeout(new Mutex(), this.defaultTimeout);
|
|
26
|
-
|
|
27
|
-
/*const _unsub =*/ this.addSignalHandler((sig) => this.blockUntilPostCommit(sig));
|
|
16
|
+
this.addSignalHandler((sig) => this.blockUntilPostCommit(sig));
|
|
28
17
|
}
|
|
29
18
|
async blockUntilPostCommit(signal) {
|
|
30
19
|
const zomeSignal = this._appProxy.intoZomeSignal(signal);
|
|
@@ -50,7 +39,6 @@ export class CellProxy extends CellMixin(Empty) {
|
|
|
50
39
|
if (end.app_entry_type !== this._postCommitReleaseEntryType) {
|
|
51
40
|
continue;
|
|
52
41
|
}
|
|
53
|
-
/** Release */
|
|
54
42
|
console.debug("blockUntilPostCommit() RELEASE");
|
|
55
43
|
this._postCommitRelease();
|
|
56
44
|
delete this._postCommitRelease;
|
|
@@ -67,7 +55,6 @@ export class CellProxy extends CellMixin(Empty) {
|
|
|
67
55
|
const sys = pulse.System;
|
|
68
56
|
if (sys.type == "SelfCallStart") {
|
|
69
57
|
console.log("");
|
|
70
|
-
/** Acquire lock */
|
|
71
58
|
try {
|
|
72
59
|
this._callMutex.acquire().then((r) => this._selfCallRelease = r);
|
|
73
60
|
}
|
|
@@ -76,7 +63,6 @@ export class CellProxy extends CellMixin(Empty) {
|
|
|
76
63
|
}
|
|
77
64
|
}
|
|
78
65
|
if (sys.type == "SelfCallEnd" && this._selfCallRelease) {
|
|
79
|
-
/** Release */
|
|
80
66
|
this._selfCallRelease();
|
|
81
67
|
delete this._selfCallRelease;
|
|
82
68
|
const end = sys;
|
|
@@ -88,20 +74,15 @@ export class CellProxy extends CellMixin(Empty) {
|
|
|
88
74
|
}
|
|
89
75
|
}
|
|
90
76
|
}
|
|
91
|
-
/** -- Methods -- */
|
|
92
|
-
/** */
|
|
93
77
|
addSignalHandler(handler) {
|
|
94
78
|
return this._appProxy.addSignalHandler(handler, this.cell.hcl().toString());
|
|
95
79
|
}
|
|
96
|
-
/** */
|
|
97
80
|
dumpSignalLogs(zomeName, canAppSignals) {
|
|
98
81
|
this._appProxy.dumpSignalLogs(canAppSignals ? canAppSignals : true, this.cell.address, zomeName);
|
|
99
82
|
}
|
|
100
|
-
/** */
|
|
101
83
|
get signalLogs() {
|
|
102
84
|
return this._appProxy.signalLogs.filter((log) => log.cellAddr.equals(this.cell.address));
|
|
103
85
|
}
|
|
104
|
-
/** Pass call request to conductor proxy and log it */
|
|
105
86
|
async executeZomeCall(reqLog) {
|
|
106
87
|
reqLog.executionTimestamp = Date.now();
|
|
107
88
|
const requestIndex = this._requestLog.length;
|
|
@@ -118,7 +99,6 @@ export class CellProxy extends CellMixin(Empty) {
|
|
|
118
99
|
return respLog;
|
|
119
100
|
}
|
|
120
101
|
}
|
|
121
|
-
/** Pass call request to conductor proxy and log it */
|
|
122
102
|
logCallTimedout(reqLog) {
|
|
123
103
|
reqLog.executionTimestamp = Date.now();
|
|
124
104
|
const requestIndex = this._requestLog.length;
|
|
@@ -127,10 +107,6 @@ export class CellProxy extends CellMixin(Empty) {
|
|
|
127
107
|
this._responseLog.push(respLog);
|
|
128
108
|
return respLog;
|
|
129
109
|
}
|
|
130
|
-
/**
|
|
131
|
-
* callZome() with Mutex (for calls that writes to source-chain)
|
|
132
|
-
* TODO: Implement call queue instead of mutex?
|
|
133
|
-
*/
|
|
134
110
|
async callZomeBlockPostCommit(entryType, zome_name, fn_name, payload, cap_secret, timeout) {
|
|
135
111
|
timeout = timeout ? timeout : this.defaultTimeout;
|
|
136
112
|
const req = {
|
|
@@ -139,7 +115,6 @@ export class CellProxy extends CellMixin(Empty) {
|
|
|
139
115
|
provenance: this.cell.address.agentId.hash,
|
|
140
116
|
};
|
|
141
117
|
const log = { request: req, timeout, requestTimestamp: Date.now() };
|
|
142
|
-
/** Acquire lock */
|
|
143
118
|
try {
|
|
144
119
|
this._postCommitRelease = await this._callMutex.acquire();
|
|
145
120
|
this._postCommitReleaseEntryType = entryType;
|
|
@@ -149,14 +124,9 @@ export class CellProxy extends CellMixin(Empty) {
|
|
|
149
124
|
this.logCallTimedout(log);
|
|
150
125
|
return Promise.reject("Waiting for callZomeBlockPostCommit mutex timed-out");
|
|
151
126
|
}
|
|
152
|
-
/** Execute */
|
|
153
127
|
const respLog = await this.executeZomeCall(log);
|
|
154
128
|
return respLog.success;
|
|
155
129
|
}
|
|
156
|
-
/**
|
|
157
|
-
* callZome() with Mutex (for calls that writes to source-chain)
|
|
158
|
-
* TODO: Implement call queue instead of mutex?
|
|
159
|
-
*/
|
|
160
130
|
async callZomeBlocking(zome_name, fn_name, payload, cap_secret, timeout) {
|
|
161
131
|
timeout = timeout ? timeout : this.defaultTimeout;
|
|
162
132
|
const req = {
|
|
@@ -165,7 +135,6 @@ export class CellProxy extends CellMixin(Empty) {
|
|
|
165
135
|
provenance: this.cell.address.agentId.hash,
|
|
166
136
|
};
|
|
167
137
|
const log = { request: req, timeout, requestTimestamp: Date.now() };
|
|
168
|
-
/** Acquire lock */
|
|
169
138
|
let release;
|
|
170
139
|
try {
|
|
171
140
|
release = await this._callMutex.acquire();
|
|
@@ -175,9 +144,7 @@ export class CellProxy extends CellMixin(Empty) {
|
|
|
175
144
|
this.logCallTimedout(log);
|
|
176
145
|
return Promise.reject("Waiting for callZomeBlocking mutex timed-out");
|
|
177
146
|
}
|
|
178
|
-
/** Execute */
|
|
179
147
|
const respLog = await this.executeZomeCall(log);
|
|
180
|
-
/** Release */
|
|
181
148
|
release();
|
|
182
149
|
if (respLog.failure) {
|
|
183
150
|
this.dumpCallLogs(zome_name);
|
|
@@ -186,7 +153,6 @@ export class CellProxy extends CellMixin(Empty) {
|
|
|
186
153
|
}
|
|
187
154
|
return respLog.success;
|
|
188
155
|
}
|
|
189
|
-
/** */
|
|
190
156
|
async callZome(zome_name, fn_name, payload, cap_secret, timeout) {
|
|
191
157
|
timeout = timeout ? timeout : this.defaultTimeout;
|
|
192
158
|
const req = {
|
|
@@ -211,14 +177,9 @@ export class CellProxy extends CellMixin(Empty) {
|
|
|
211
177
|
}
|
|
212
178
|
return respLog.success;
|
|
213
179
|
}
|
|
214
|
-
/**
|
|
215
|
-
* Calls the `entry_defs()` zome function and
|
|
216
|
-
* Returns an array of all the zome's AppEntryNames and Visibility, i.e. (AppEntryName, isPublic)[]
|
|
217
|
-
*/
|
|
218
180
|
async callEntryDefs(zomeName) {
|
|
219
|
-
//console.log("callEntryDefs()", zomeName)
|
|
220
181
|
try {
|
|
221
|
-
const entryDefs = await this.callZome(zomeName, "entry_defs", null, null);
|
|
182
|
+
const entryDefs = await this.callZome(zomeName, "entry_defs", null, null);
|
|
222
183
|
console.debug("getEntryDefs() for " + zomeName + " result:");
|
|
223
184
|
console.log({ entryDefs });
|
|
224
185
|
let result = {};
|
|
@@ -229,7 +190,6 @@ export class CellProxy extends CellMixin(Empty) {
|
|
|
229
190
|
}
|
|
230
191
|
result[name] = def;
|
|
231
192
|
}
|
|
232
|
-
//console.log({result})
|
|
233
193
|
return result;
|
|
234
194
|
}
|
|
235
195
|
catch (e) {
|
|
@@ -238,15 +198,10 @@ export class CellProxy extends CellMixin(Empty) {
|
|
|
238
198
|
return Promise.reject(e);
|
|
239
199
|
}
|
|
240
200
|
}
|
|
241
|
-
/**
|
|
242
|
-
* Calls the `zome_info()` zome function
|
|
243
|
-
*/
|
|
244
201
|
async callZomeInfo(zomeName) {
|
|
245
202
|
console.log("callZomeInfo()", zomeName);
|
|
246
203
|
try {
|
|
247
204
|
const zome_info = await this.callZome(zomeName, "get_zome_info", null, null, 10 * 100);
|
|
248
|
-
//console.debug("callZomeInfo() for " + zomeName + " result:")
|
|
249
|
-
//console.log({zome_info})
|
|
250
205
|
return zome_info;
|
|
251
206
|
}
|
|
252
207
|
catch (e) {
|
|
@@ -255,15 +210,10 @@ export class CellProxy extends CellMixin(Empty) {
|
|
|
255
210
|
return Promise.reject(e);
|
|
256
211
|
}
|
|
257
212
|
}
|
|
258
|
-
/**
|
|
259
|
-
* Calls the `dna_info()` zome function
|
|
260
|
-
*/
|
|
261
213
|
async callDnaInfo(zomeName) {
|
|
262
214
|
console.log("callDnaInfo()", zomeName);
|
|
263
215
|
try {
|
|
264
216
|
const dna_info = await this.callZome(zomeName, "get_dna_info", null, null, 10 * 100);
|
|
265
|
-
//console.debug("callDnaInfo() for " + zomeName + " result:")
|
|
266
|
-
//console.log({dna_info})
|
|
267
217
|
return dna_info;
|
|
268
218
|
}
|
|
269
219
|
catch (e) {
|
|
@@ -272,35 +222,20 @@ export class CellProxy extends CellMixin(Empty) {
|
|
|
272
222
|
return Promise.reject(e);
|
|
273
223
|
}
|
|
274
224
|
}
|
|
275
|
-
// /** TODO once we have getDnaDefinition() api */
|
|
276
|
-
// dumpAllZomes() {
|
|
277
|
-
// // FIXME get DNA DEF
|
|
278
|
-
// for (const zomeName of dnaDef) {
|
|
279
|
-
// this.dumpCallLogs(zomeName)
|
|
280
|
-
// }
|
|
281
|
-
// }
|
|
282
|
-
/** */
|
|
283
225
|
dumpCallLogs(zomeName) {
|
|
284
226
|
let result = [];
|
|
285
227
|
for (const response of this._responseLog) {
|
|
286
228
|
const requestLog = this._requestLog[response.requestIndex];
|
|
287
|
-
if (zomeName && requestLog.request.zome_name != zomeName) {
|
|
229
|
+
if (!requestLog || (zomeName && requestLog.request.zome_name != zomeName)) {
|
|
288
230
|
continue;
|
|
289
231
|
}
|
|
290
232
|
const startTime = prettyDate(new Date(requestLog.requestTimestamp));
|
|
291
233
|
const waitTime = prettyDuration(new Date(requestLog.executionTimestamp - requestLog.requestTimestamp));
|
|
292
234
|
const duration = prettyDuration(new Date(response.timestamp - requestLog.requestTimestamp));
|
|
293
235
|
let input = requestLog.request.payload;
|
|
294
|
-
// if (requestLog.request.payload instanceof HoloHash) {
|
|
295
|
-
// //console.log("instanceof HoloHash", requestLog.request.payload);
|
|
296
|
-
// input = intoAnyId(requestLog.request.payload.toBytes()).print();
|
|
297
|
-
// } else {
|
|
298
236
|
if (requestLog.request.payload instanceof Uint8Array) {
|
|
299
|
-
//console.log("instanceof Uint8Array", requestLog.request.payload);
|
|
300
237
|
input = intoAnyId(requestLog.request.payload).print();
|
|
301
238
|
}
|
|
302
|
-
//}
|
|
303
|
-
//const input = requestLog.request.payload instanceof Uint8Array ? enc64(requestLog.request.payload) : requestLog.request.payload;
|
|
304
239
|
const output = anyToB64(response.failure ? response.failure : response.success);
|
|
305
240
|
const log = zomeName
|
|
306
241
|
? { startTime, fnName: requestLog.request.fn_name, input, output, duration, waitTime }
|
|
@@ -312,8 +247,6 @@ export class CellProxy extends CellMixin(Empty) {
|
|
|
312
247
|
console.warn(` - For zome "${zomeName}"`);
|
|
313
248
|
}
|
|
314
249
|
console.table(result);
|
|
315
|
-
/** Parse signal self-call logs */
|
|
316
|
-
//console.log(this._appProxy.signalLogs)
|
|
317
250
|
const zomeSignals = this._appProxy.signalLogs.filter((log) => log.type == SignalType.Zome);
|
|
318
251
|
const sysSignals = zomeSignals.filter((log) => {
|
|
319
252
|
const type = Object.keys(log.zomeSignal.pulses[0])[0];
|
package/dist/CellProxy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CellProxy.js","sourceRoot":"","sources":["../src/CellProxy.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AppSignal,\n AppSignalCb,\n CallZomeRequest,\n CapSecret,\n Timestamp,\n ZomeName\n} from \"@holochain/client\";\nimport {CellMixin, Empty} from \"./mixins\";\nimport {Cell} from \"./cell\";\nimport {\n CellIdStr,\n DnaInfo, EntryDef,\n EntryDefsCallbackResult,\n SignalType,\n SystemPulse,\n\n ZomeInfo\n} from \"./types\";\nimport {Mutex, withTimeout} from \"async-mutex\";\nimport MutexInterface from \"async-mutex/lib/MutexInterface\";\nimport {\n AppProxy,\n SignalUnsubscriber,\n} from \"./AppProxy\";\nimport {prettyDate, prettyDuration} from \"./pretty\";\nimport {anyToB64, enc64, intoAnyId} from \"./hash\";\nimport {\n SystemSignalProtocolVariantPostCommitNewEnd,\n SystemSignalProtocolVariantSelfCallEnd,\n SystemSignalProtocolVariantSelfCallStart\n} from \"./zomeSignals.types\";\nimport {Dictionary} from \"./utils\";\n\n\n// /** */\n// export interface EntryDefMat {\n// // index: number\n// id: string,\n// visibility: \"Public\" | \"Private\",\n// requiredValidations: number,\n// cacheAtAgentActivity: boolean,\n// }\n//\n// function materializeEntryDef(def: EntryDef): EntryDefMat {\n// return {\n// id: def.id.App,\n// visibility: def.visibility,\n// requiredValidations: 0, // FIXME\n// cacheAtAgentActivity: false, // FIXME\n// }\n// }\n\n\nexport interface RequestLog {\n request: CallZomeRequest,\n timeout: number,\n requestTimestamp: number,\n executionTimestamp: number,\n}\n\nexport interface ResponseLog {\n success?: unknown,\n failure?: unknown,\n timestamp: number,\n requestIndex: number;\n}\n\n\nexport type Cb = () => Promise<unknown>\n\n/**\n * Proxy for a running DNA.\n * It logs and queues ZomeCalls.\n * It holds a reference to its AppProxy and its Cell.\n * This class is expected to be used by ZomeProxies.\n */\nexport class CellProxy extends CellMixin(Empty) {\n\n /** Ctor */\n constructor(\n private _appProxy: AppProxy,\n cell: Cell,\n //public readonly dnaDef: MyDnaDef,\n defaultTimeout?: number) {\n super();\n this._cell = cell;\n console.log(`CellProxy.ctor`, cell);\n this.defaultTimeout = defaultTimeout ? defaultTimeout : 10 * 1000;\n this._callMutex = withTimeout(new Mutex(), this.defaultTimeout);\n\n ///*const _unsub =*/ this.addSignalHandler((sig) => this.blockSelfCall(sig));\n /*const _unsub =*/ this.addSignalHandler((sig) => this.blockUntilPostCommit(sig));\n }\n\n\n /** Have a PostCommitEnd release the Mutex */\n private _postCommitRelease?;\n private _postCommitReleaseEntryType?: string;\n protected async blockUntilPostCommit(signal: AppSignal) {\n const zomeSignal = this._appProxy.intoZomeSignal(signal);\n if (!zomeSignal || zomeSignal.pulses.length == 0) {\n return;\n }\n console.debug(\"blockUntilPostCommit()\", zomeSignal, this._postCommitReleaseEntryType, !!this._postCommitRelease);\n const signalType = Object.keys(zomeSignal.pulses[0])[0];\n if (signalType != \"System\" || !this._postCommitRelease || !this._postCommitReleaseEntryType) {\n return;\n }\n for (const pulse of zomeSignal.pulses) {\n const sys = (pulse as SystemPulse).System;\n if (sys.type !== \"PostCommitNewEnd\") {\n continue;\n }\n const end = sys as SystemSignalProtocolVariantPostCommitNewEnd;\n if (!end.succeeded) {\n console.error(\"System call failed\");\n this.dumpCallLogs(signal.zome_name);\n this.dumpSignalLogs(signal.zome_name);\n }\n if (end.app_entry_type !== this._postCommitReleaseEntryType) {\n continue;\n }\n /** Release */\n console.debug(\"blockUntilPostCommit() RELEASE\");\n this._postCommitRelease();\n delete this._postCommitRelease;\n delete this._postCommitReleaseEntryType;\n break;\n }\n }\n\n\n /** Have a self call acquire & the call Mutex */\n private _selfCallRelease?;\n protected async blockSelfCall(signal: AppSignal) {\n const zomeSignal = this._appProxy.intoZomeSignal(signal);\n if (!zomeSignal || zomeSignal.pulses.length == 0 || Object.keys(zomeSignal.pulses[0])[0] != 'System') {\n return;\n }\n for (const pulse of zomeSignal.pulses) {\n const sys = (pulse as SystemPulse).System;\n if (sys.type == \"SelfCallStart\") {\n console.log(\"\")\n /** Acquire lock */\n try {\n this._callMutex.acquire().then((r) => this._selfCallRelease = r)\n } catch (e) {\n console.error(\"A Zome self call is initialted during a writing zome call\", e);\n }\n }\n if (sys.type == \"SelfCallEnd\" && this._selfCallRelease) {\n /** Release */\n this._selfCallRelease();\n delete this._selfCallRelease;\n const end = sys as SystemSignalProtocolVariantSelfCallEnd;\n if (!end.succeeded) {\n console.error(\"Call to self failed.\")\n this.dumpCallLogs(end.zome_name);\n this.dumpSignalLogs(end.zome_name);\n }\n }\n }\n }\n\n /** -- Fields -- */\n\n defaultTimeout: number;\n protected _callMutex: MutexInterface;\n\n\n\n /** append only logs */\n private _requestLog: RequestLog[] = []\n private _responseLog: ResponseLog[] = []\n\n\n /** -- Methods -- */\n\n /** */\n addSignalHandler(handler: AppSignalCb): SignalUnsubscriber {\n return this._appProxy.addSignalHandler(handler, this.cell.hcl().toString());\n }\n\n\n /** */\n dumpSignalLogs(zomeName?: ZomeName, canAppSignals?: boolean) {\n this._appProxy.dumpSignalLogs(canAppSignals? canAppSignals : true, this.cell.address, zomeName);\n }\n\n\n /** */\n get signalLogs() {\n return this._appProxy.signalLogs.filter((log) => log.cellAddr.equals(this.cell.address));\n }\n\n\n /** Pass call request to conductor proxy and log it */\n async executeZomeCall(reqLog: RequestLog): Promise<ResponseLog> {\n reqLog.executionTimestamp = Date.now();\n const requestIndex = this._requestLog.length;\n this._requestLog.push(reqLog);\n try {\n const response = await this._appProxy.callZome(reqLog.request, reqLog.timeout);\n const respLog = { requestIndex, success: response, timestamp: Date.now() };\n this._responseLog.push(respLog);\n return respLog;\n } catch (e) {\n const respLog = { requestIndex, failure: e, timestamp: Date.now() }\n this._responseLog.push(respLog);\n return respLog;\n }\n }\n\n\n /** Pass call request to conductor proxy and log it */\n logCallTimedout(reqLog: RequestLog): ResponseLog {\n reqLog.executionTimestamp = Date.now();\n const requestIndex = this._requestLog.length;\n this._requestLog.push(reqLog);\n const respLog = { requestIndex, failure: \"Waiting for Mutex timed-out\", timestamp: Date.now() }\n this._responseLog.push(respLog);\n return respLog;\n }\n\n\n /**\n * callZome() with Mutex (for calls that writes to source-chain)\n * TODO: Implement call queue instead of mutex?\n */\n async callZomeBlockPostCommit(entryType: string, zome_name: ZomeName, fn_name: string, payload: any, cap_secret: CapSecret | null, timeout?: number): Promise<unknown> {\n timeout = timeout? timeout : this.defaultTimeout;\n const req = {\n cap_secret, zome_name, fn_name, payload,\n cell_id: this.cell.address.intoId(),\n provenance: this.cell.address.agentId.hash,\n } as CallZomeRequest;\n const log = { request: req, timeout, requestTimestamp: Date.now() } as RequestLog;\n\n /** Acquire lock */\n try {\n this._postCommitRelease = await this._callMutex.acquire();\n this._postCommitReleaseEntryType = entryType;\n } catch(e) {\n console.warn(\"Waiting for callZomeBlockPostCommit mutex timed-out\", e);\n this.logCallTimedout(log)\n return Promise.reject(\"Waiting for callZomeBlockPostCommit mutex timed-out\");\n }\n /** Execute */\n const respLog = await this.executeZomeCall(log);\n return respLog.success;\n }\n\n\n /**\n * callZome() with Mutex (for calls that writes to source-chain)\n * TODO: Implement call queue instead of mutex?\n */\n async callZomeBlocking(zome_name: ZomeName, fn_name: string, payload: any, cap_secret: CapSecret | null, timeout?: number): Promise<unknown> {\n timeout = timeout? timeout : this.defaultTimeout;\n const req = {\n cap_secret, zome_name, fn_name, payload,\n cell_id: this.cell.address.intoId(),\n provenance: this.cell.address.agentId.hash,\n } as CallZomeRequest;\n const log = { request: req, timeout, requestTimestamp: Date.now() } as RequestLog;\n\n /** Acquire lock */\n let release;\n try {\n release = await this._callMutex.acquire();\n } catch(e) {\n console.warn(\"Waiting for callZomeBlocking mutex timed-out\", e);\n this.logCallTimedout(log)\n return Promise.reject(\"Waiting for callZomeBlocking mutex timed-out\");\n }\n /** Execute */\n const respLog = await this.executeZomeCall(log);\n /** Release */\n release();\n if (respLog.failure) {\n this.dumpCallLogs(zome_name);\n this.dumpSignalLogs(zome_name);\n return Promise.reject(respLog.failure)\n }\n return respLog.success;\n }\n\n\n /** */\n async callZome(zome_name: ZomeName, fn_name: string, payload: any, cap_secret: CapSecret | null, timeout?: number): Promise<unknown> {\n timeout = timeout? timeout : this.defaultTimeout;\n const req = {\n cap_secret, zome_name, fn_name, payload,\n cell_id: this.cell.address.intoId(),\n provenance: this.cell.address.agentId.hash,\n } as CallZomeRequest;\n const log = { request: req, timeout, requestTimestamp: Date.now() } as RequestLog;\n try {\n await this._callMutex.waitForUnlock();\n } catch(e) {\n console.warn(\"Waiting for callZome mutex timed-out\", e);\n this.logCallTimedout(log);\n return Promise.reject(\"Waiting for callZome mutex timed-out\");\n }\n const respLog = await this.executeZomeCall(log);\n if (respLog.failure) {\n this.dumpCallLogs(zome_name);\n this.dumpSignalLogs(zome_name);\n return Promise.reject(respLog.failure)\n }\n return respLog.success;\n }\n\n\n /**\n * Calls the `entry_defs()` zome function and\n * Returns an array of all the zome's AppEntryNames and Visibility, i.e. (AppEntryName, isPublic)[]\n */\n async callEntryDefs(zomeName: ZomeName): Promise<Dictionary<EntryDef>> {\n //console.log(\"callEntryDefs()\", zomeName)\n try {\n const entryDefs = await this.callZome(zomeName, \"entry_defs\", null, null) as EntryDefsCallbackResult; // Need big timeout since holochain is slow when receiving simultaneous calls from multiple happs\n console.debug(\"getEntryDefs() for \" + zomeName + \" result:\")\n console.log({entryDefs})\n let result: Dictionary<EntryDef> = {}\n for (const def of entryDefs.Defs) {\n let name = Object.keys(def.id)[0];\n if (\"App\" in def.id) {\n name = def.id.App;\n }\n result[name] = def;\n }\n //console.log({result})\n return result;\n } catch (e) {\n console.error(\"Calling getEntryDefs() on \" + zomeName + \" failed: \")\n console.error({ e })\n return Promise.reject(e)\n }\n }\n\n\n\n /**\n * Calls the `zome_info()` zome function\n */\n async callZomeInfo(zomeName: ZomeName): Promise<ZomeInfo> {\n console.log(\"callZomeInfo()\", zomeName)\n try {\n const zome_info = await this.callZome(zomeName, \"get_zome_info\", null, null, 10 * 100) as ZomeInfo;\n //console.debug(\"callZomeInfo() for \" + zomeName + \" result:\")\n //console.log({zome_info})\n return zome_info;\n } catch (e) {\n console.error(\"Calling callZomeInfo() on \" + zomeName + \" failed. Make sure `get_zome_info()` is implemented in your zome code. Error: \")\n console.error({ e })\n return Promise.reject(e)\n }\n }\n\n\n /**\n * Calls the `dna_info()` zome function\n */\n async callDnaInfo(zomeName: ZomeName): Promise<DnaInfo> {\n console.log(\"callDnaInfo()\", zomeName)\n try {\n const dna_info = await this.callZome(zomeName, \"get_dna_info\", null, null, 10 * 100) as DnaInfo;\n //console.debug(\"callDnaInfo() for \" + zomeName + \" result:\")\n //console.log({dna_info})\n return dna_info;\n } catch (e) {\n console.error(\"Calling callDnaInfo() on \" + zomeName + \" failed. Make sure `get_dna_info()` is implemented in your zome code. Error: \")\n console.error({ e })\n return Promise.reject(e)\n }\n }\n\n\n // /** TODO once we have getDnaDefinition() api */\n // dumpAllZomes() {\n // // FIXME get DNA DEF\n // for (const zomeName of dnaDef) {\n // this.dumpCallLogs(zomeName)\n // }\n // }\n\n /** */\n dumpCallLogs(zomeName?: ZomeName) {\n let result = [];\n for (const response of this._responseLog) {\n const requestLog = this._requestLog[response.requestIndex];\n if (zomeName && requestLog.request.zome_name != zomeName) {\n continue;\n }\n const startTime= prettyDate(new Date(requestLog.requestTimestamp));\n const waitTime = prettyDuration(new Date(requestLog.executionTimestamp - requestLog.requestTimestamp));\n const duration = prettyDuration(new Date(response.timestamp - requestLog.requestTimestamp));\n let input = requestLog.request.payload;\n // if (requestLog.request.payload instanceof HoloHash) {\n // //console.log(\"instanceof HoloHash\", requestLog.request.payload);\n // input = intoAnyId(requestLog.request.payload.toBytes()).print();\n // } else {\n if (requestLog.request.payload instanceof Uint8Array) {\n //console.log(\"instanceof Uint8Array\", requestLog.request.payload);\n input = intoAnyId(requestLog.request.payload).print();\n }\n //}\n //const input = requestLog.request.payload instanceof Uint8Array ? enc64(requestLog.request.payload) : requestLog.request.payload;\n const output = anyToB64(response.failure ? response.failure : response.success);\n const log = zomeName\n ? { startTime, fnName: requestLog.request.fn_name, input, output, duration, waitTime }\n : { startTime, zomeName: requestLog.request.zome_name, fnName: requestLog.request.fn_name, input, output, duration, waitTime }\n result.push(log);\n }\n console.warn(`Dumping logs for cell \"${this._appProxy.getLocations(this.cell.address)}\"`)\n if (zomeName) {\n console.warn(` - For zome \"${zomeName}\"`);\n }\n console.table(result)\n\n /** Parse signal self-call logs */\n //console.log(this._appProxy.signalLogs)\n\n const zomeSignals = this._appProxy.signalLogs.filter((log) => log.type == SignalType.Zome);\n const sysSignals = zomeSignals.filter((log) => {\n const type = Object.keys(log.zomeSignal.pulses[0])[0];\n type == \"System\"\n });\n\n const startCalls: [Timestamp, CellIdStr, SystemSignalProtocolVariantSelfCallStart][] = [];\n const endCalls: [Timestamp, CellIdStr, SystemSignalProtocolVariantSelfCallEnd][] = [];\n sysSignals.map((log) => {\n for (const pulse of log.zomeSignal.pulses) {\n const sys = (pulse as SystemPulse).System;\n if(sys.type == \"SelfCallStart\") {\n startCalls.push([log.ts, log.cellAddr.str, (sys as SystemSignalProtocolVariantSelfCallStart)]);\n }\n if(sys.type == \"SelfCallEnd\") {\n endCalls.push([log.ts, log.cellAddr.str, (sys as SystemSignalProtocolVariantSelfCallEnd)]);\n }\n }\n })\n\n let sigResults = [];\n for (const [startTs, startId, startSignal] of startCalls) {\n const index = endCalls.findIndex(([ts, cellId, signal]) => ts >= startTs && startId == cellId && startSignal.fn_name == signal.fn_name)\n if (index == -1) {\n continue;\n }\n const first = endCalls.splice(index, 1)[0];\n const [endTs, _cId, endSignal] = first;\n const duration = prettyDuration(new Date(endTs - startTs));\n const log = { startTime: startTs, zomeName: endSignal.zome_name, fnName: endSignal.fn_name, succeeded: endSignal.succeeded, duration }\n sigResults.push(log);\n }\n\n console.table(sigResults)\n }\n\n\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"CellProxy.js","sourceRoot":"","sources":["../src/CellProxy.ts"],"names":[],"mappings":"AAQA,OAAO,EAAC,SAAS,EAAE,KAAK,EAAC,MAAM,UAAU,CAAC;AAE1C,OAAO,EAIL,UAAU,EAIX,MAAM,SAAS,CAAC;AACjB,OAAO,EAAC,KAAK,EAAE,WAAW,EAAC,MAAM,aAAa,CAAC;AAM/C,OAAO,EAAC,UAAU,EAAE,cAAc,EAAC,MAAM,UAAU,CAAC;AACpD,OAAO,EAAC,QAAQ,EAAE,SAAS,EAAC,MAAM,QAAQ,CAAC;AAmD3C,MAAM,OAAO,SAAU,SAAQ,SAAS,CAAC,KAAK,CAAC;IAG7C,YACU,SAAmB,EAC3B,IAAU,EAEV,cAAuB;QACvB,KAAK,EAAE,CAAC;QAJA,cAAS,GAAT,SAAS,CAAU;QA4FrB,gBAAW,GAAiB,EAAE,CAAA;QAC9B,iBAAY,GAAkB,EAAE,CAAA;QAxFtC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC;QACpC,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC;QAClE,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,IAAI,KAAK,EAAE,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAG7C,IAAI,CAAC,gBAAgB,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC;IACpF,CAAC;IAMS,KAAK,CAAC,oBAAoB,CAAC,MAAiB;QACpD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;YACjD,OAAO;QACT,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,wBAAwB,EAAE,UAAU,EAAE,IAAI,CAAC,2BAA2B,EAAE,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QACjH,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QACzD,IAAI,UAAU,IAAI,QAAQ,IAAI,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,IAAI,CAAC,2BAA2B,EAAE,CAAC;YAC5F,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,GAAG,GAAI,KAAqB,CAAC,MAAM,CAAC;YAC1C,IAAI,GAAG,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBACpC,SAAS;YACX,CAAC;YACD,MAAM,GAAG,GAAG,GAAkD,CAAC;YAC/D,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;gBACnB,OAAO,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;gBACpC,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;gBACpC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACxC,CAAC;YACD,IAAI,GAAG,CAAC,cAAc,KAAK,IAAI,CAAC,2BAA2B,EAAE,CAAC;gBAC5D,SAAS;YACX,CAAC;YAED,OAAO,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;YAChD,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,kBAAkB,CAAC;YAC/B,OAAO,IAAI,CAAC,2BAA2B,CAAC;YACxC,MAAM;QACR,CAAC;IACH,CAAC;IAKS,KAAK,CAAC,aAAa,CAAC,MAAiB;QAC7C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACzD,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,EAAE,CAAC;YACtG,OAAO;QACT,CAAC;QACD,KAAK,MAAM,KAAK,IAAI,UAAU,CAAC,MAAM,EAAE,CAAC;YACtC,MAAM,GAAG,GAAI,KAAqB,CAAC,MAAM,CAAC;YAC1C,IAAI,GAAG,CAAC,IAAI,IAAI,eAAe,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;gBAEf,IAAI,CAAC;oBACH,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,CAAA;gBAClE,CAAC;gBAAC,OAAO,CAAC,EAAE,CAAC;oBACX,OAAO,CAAC,KAAK,CAAC,2DAA2D,EAAE,CAAC,CAAC,CAAC;gBAChF,CAAC;YACH,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,IAAI,aAAa,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAEvD,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC,gBAAgB,CAAC;gBAC7B,MAAM,GAAG,GAAG,GAA6C,CAAC;gBAC1D,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;oBACnB,OAAO,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAA;oBACrC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;oBACjC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACrC,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAiBD,gBAAgB,CAAC,OAAoB;QACnC,OAAO,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9E,CAAC;IAID,cAAc,CAAC,QAAmB,EAAE,aAAuB;QACzD,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,aAAa,CAAA,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAClG,CAAC;IAID,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3F,CAAC;IAID,KAAK,CAAC,eAAe,CAAC,MAAkB;QACtC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAC7C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,CAAC;YAC/E,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAC3E,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChC,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;YACnE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChC,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAID,eAAe,CAAC,MAAkB;QAChC,MAAM,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACvC,MAAM,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC;QAC7C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,6BAA6B,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAA;QAC/F,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAChC,OAAO,OAAO,CAAC;IACjB,CAAC;IAOD,KAAK,CAAC,uBAAuB,CAAC,SAAiB,EAAE,SAAmB,EAAE,OAAe,EAAE,OAAY,EAAE,UAA4B,EAAE,OAAgB;QACjJ,OAAO,GAAG,OAAO,CAAA,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;QACjD,MAAM,GAAG,GAAG;YACV,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO;YACvC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACnC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI;SACxB,CAAC;QACrB,MAAM,GAAG,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,GAAG,EAAE,EAAgB,CAAC;QAGlF,IAAI,CAAC;YACH,IAAI,CAAC,kBAAkB,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YAC1D,IAAI,CAAC,2BAA2B,GAAG,SAAS,CAAC;QAC/C,CAAC;QAAC,OAAM,CAAC,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,qDAAqD,EAAE,CAAC,CAAC,CAAC;YACvE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;YACzB,OAAO,OAAO,CAAC,MAAM,CAAC,qDAAqD,CAAC,CAAC;QAC/E,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAChD,OAAO,OAAO,CAAC,OAAO,CAAC;IACzB,CAAC;IAOD,KAAK,CAAC,gBAAgB,CAAC,SAAmB,EAAE,OAAe,EAAE,OAAY,EAAE,UAA4B,EAAE,OAAgB;QACvH,OAAO,GAAG,OAAO,CAAA,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;QACjD,MAAM,GAAG,GAAG;YACV,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO;YACvC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACnC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI;SACxB,CAAC;QACrB,MAAM,GAAG,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,GAAG,EAAE,EAAgB,CAAC;QAGlF,IAAI,OAAO,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QAC5C,CAAC;QAAC,OAAM,CAAC,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,8CAA8C,EAAE,CAAC,CAAC,CAAC;YAChE,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAA;YACzB,OAAO,OAAO,CAAC,MAAM,CAAC,8CAA8C,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAEhD,OAAO,EAAE,CAAC;QACV,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YAC/B,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACxC,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC;IACzB,CAAC;IAID,KAAK,CAAC,QAAQ,CAAC,SAAmB,EAAE,OAAe,EAAE,OAAY,EAAE,UAA4B,EAAE,OAAgB;QAC/G,OAAO,GAAG,OAAO,CAAA,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;QACjD,MAAM,GAAG,GAAG;YACV,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO;YACvC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE;YACnC,UAAU,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI;SACxB,CAAC;QACrB,MAAM,GAAG,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB,EAAE,IAAI,CAAC,GAAG,EAAE,EAAgB,CAAC;QAClF,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;QACxC,CAAC;QAAC,OAAM,CAAC,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,sCAAsC,EAAE,CAAC,CAAC,CAAC;YACxD,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YAC1B,OAAO,OAAO,CAAC,MAAM,CAAC,sCAAsC,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAChD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YAC7B,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;YAC/B,OAAO,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;QACxC,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC;IACzB,CAAC;IAOD,KAAK,CAAC,aAAa,CAAC,QAAkB;QAEpC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,CAA4B,CAAC;YACrG,OAAO,CAAC,KAAK,CAAC,qBAAqB,GAAG,QAAQ,GAAG,UAAU,CAAC,CAAA;YAC5D,OAAO,CAAC,GAAG,CAAC,EAAC,SAAS,EAAC,CAAC,CAAA;YACxB,IAAI,MAAM,GAA0B,EAAE,CAAA;YACtC,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,CAAC;gBACjC,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAClC,IAAI,KAAK,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;oBACpB,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC;gBACpB,CAAC;gBACD,MAAM,CAAC,IAAK,CAAC,GAAG,GAAG,CAAC;YACtB,CAAC;YAED,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,4BAA4B,GAAG,QAAQ,GAAG,WAAW,CAAC,CAAA;YACpE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YACpB,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC;IAOD,KAAK,CAAC,YAAY,CAAC,QAAkB;QACnC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,QAAQ,CAAC,CAAA;QACvC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,GAAG,CAAa,CAAC;YAGnG,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,4BAA4B,GAAG,QAAQ,GAAG,gFAAgF,CAAC,CAAA;YACzI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YACpB,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC;IAMD,KAAK,CAAC,WAAW,CAAC,QAAkB;QAClC,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,QAAQ,CAAC,CAAA;QACtC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,GAAG,GAAG,CAAY,CAAC;YAGhG,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,KAAK,CAAC,2BAA2B,GAAG,QAAQ,GAAG,+EAA+E,CAAC,CAAA;YACvI,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;YACpB,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QAC1B,CAAC;IACH,CAAC;IAYD,YAAY,CAAC,QAAmB;QAC9B,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACzC,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;YAC3D,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,IAAI,UAAU,CAAC,OAAO,CAAC,SAAS,IAAI,QAAQ,CAAC,EAAE,CAAC;gBAC1E,SAAS;YACX,CAAC;YACD,MAAM,SAAS,GAAE,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC;YACnE,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,kBAAkB,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC;YACvG,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC5F,IAAI,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC;YAKrC,IAAI,UAAU,CAAC,OAAO,CAAC,OAAO,YAAY,UAAU,EAAE,CAAC;gBAErD,KAAK,GAAG,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;YACxD,CAAC;YAGH,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YAChF,MAAM,GAAG,GAAG,QAAQ;gBAClB,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE;gBACtF,CAAC,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;YAChI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,0BAA0B,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QACzF,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO,CAAC,IAAI,CAAC,gBAAgB,QAAQ,GAAG,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;QAKrB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;QAC3F,MAAM,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;YAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACvD,IAAI,IAAI,QAAQ,CAAA;QAClB,CAAC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAuE,EAAE,CAAC;QAC1F,MAAM,QAAQ,GAAqE,EAAE,CAAC;QACtF,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YACrB,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;gBAC5C,MAAM,GAAG,GAAI,KAAqB,CAAC,MAAM,CAAC;gBACxC,IAAG,GAAG,CAAC,IAAI,IAAI,eAAe,EAAE,CAAC;oBAC/B,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAG,GAAgD,CAAC,CAAC,CAAC;gBACjG,CAAC;gBACD,IAAG,GAAG,CAAC,IAAI,IAAI,aAAa,EAAE,CAAC;oBAC7B,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAG,GAA8C,CAAC,CAAC,CAAC;gBAC7F,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAA;QAEF,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,WAAW,CAAC,IAAI,UAAU,EAAE,CAAC;YACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,IAAI,OAAO,IAAI,OAAO,IAAI,MAAM,IAAI,WAAW,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,CAAA;YACvI,IAAI,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC;gBAChB,SAAS;YACX,CAAC;YACD,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC;YAC5C,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC;YACvC,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC;YAC3D,MAAM,GAAG,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAA;YACtI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IAC3B,CAAC;CAGF","sourcesContent":["import {\n AppSignal,\n AppSignalCb,\n CallZomeRequest,\n CapSecret,\n Timestamp,\n ZomeName\n} from \"@holochain/client\";\nimport {CellMixin, Empty} from \"./mixins\";\nimport {Cell} from \"./cell\";\nimport {\n CellIdStr,\n DnaInfo, EntryDef,\n EntryDefsCallbackResult,\n SignalType,\n SystemPulse,\n\n ZomeInfo\n} from \"./types\";\nimport {Mutex, withTimeout} from \"async-mutex\";\nimport MutexInterface from \"async-mutex/lib/MutexInterface\";\nimport {\n AppProxy,\n SignalUnsubscriber,\n} from \"./AppProxy\";\nimport {prettyDate, prettyDuration} from \"./pretty\";\nimport {anyToB64, intoAnyId} from \"./hash\";\nimport {\n SystemSignalProtocolVariantPostCommitNewEnd,\n SystemSignalProtocolVariantSelfCallEnd,\n SystemSignalProtocolVariantSelfCallStart\n} from \"./zomeSignals.types\";\nimport {Dictionary} from \"./utils\";\n\n\n// /** */\n// export interface EntryDefMat {\n// // index: number\n// id: string,\n// visibility: \"Public\" | \"Private\",\n// requiredValidations: number,\n// cacheAtAgentActivity: boolean,\n// }\n//\n// function materializeEntryDef(def: EntryDef): EntryDefMat {\n// return {\n// id: def.id.App,\n// visibility: def.visibility,\n// requiredValidations: 0, // FIXME\n// cacheAtAgentActivity: false, // FIXME\n// }\n// }\n\n\nexport interface RequestLog {\n request: CallZomeRequest,\n timeout: number,\n requestTimestamp: number,\n executionTimestamp: number,\n}\n\nexport interface ResponseLog {\n success?: unknown,\n failure?: unknown,\n timestamp: number,\n requestIndex: number;\n}\n\n\nexport type Cb = () => Promise<unknown>\n\n/**\n * Proxy for a running DNA.\n * It logs and queues ZomeCalls.\n * It holds a reference to its AppProxy and its Cell.\n * This class is expected to be used by ZomeProxies.\n */\nexport class CellProxy extends CellMixin(Empty) {\n\n /** Ctor */\n constructor(\n private _appProxy: AppProxy,\n cell: Cell,\n //public readonly dnaDef: MyDnaDef,\n defaultTimeout?: number) {\n super();\n this._cell = cell;\n console.log(`CellProxy.ctor`, cell);\n this.defaultTimeout = defaultTimeout ? defaultTimeout : 10 * 1000;\n this._callMutex = withTimeout(new Mutex(), this.defaultTimeout);\n\n ///*const _unsub =*/ this.addSignalHandler((sig) => this.blockSelfCall(sig));\n /*const _unsub =*/ this.addSignalHandler((sig) => this.blockUntilPostCommit(sig));\n }\n\n\n /** Have a PostCommitEnd release the Mutex */\n private _postCommitRelease?: MutexInterface.Releaser;\n private _postCommitReleaseEntryType?: string;\n protected async blockUntilPostCommit(signal: AppSignal) {\n const zomeSignal = this._appProxy.intoZomeSignal(signal);\n if (!zomeSignal || zomeSignal.pulses.length == 0) {\n return;\n }\n console.debug(\"blockUntilPostCommit()\", zomeSignal, this._postCommitReleaseEntryType, !!this._postCommitRelease);\n const signalType = Object.keys(zomeSignal.pulses[0]!)[0];\n if (signalType != \"System\" || !this._postCommitRelease || !this._postCommitReleaseEntryType) {\n return;\n }\n for (const pulse of zomeSignal.pulses) {\n const sys = (pulse as SystemPulse).System;\n if (sys.type !== \"PostCommitNewEnd\") {\n continue;\n }\n const end = sys as SystemSignalProtocolVariantPostCommitNewEnd;\n if (!end.succeeded) {\n console.error(\"System call failed\");\n this.dumpCallLogs(signal.zome_name);\n this.dumpSignalLogs(signal.zome_name);\n }\n if (end.app_entry_type !== this._postCommitReleaseEntryType) {\n continue;\n }\n /** Release */\n console.debug(\"blockUntilPostCommit() RELEASE\");\n this._postCommitRelease();\n delete this._postCommitRelease;\n delete this._postCommitReleaseEntryType;\n break;\n }\n }\n\n\n /** Have a self call acquire & the call Mutex */\n private _selfCallRelease?: MutexInterface.Releaser;\n protected async blockSelfCall(signal: AppSignal) {\n const zomeSignal = this._appProxy.intoZomeSignal(signal);\n if (!zomeSignal || zomeSignal.pulses.length == 0 || Object.keys(zomeSignal.pulses[0]!)[0] != 'System') {\n return;\n }\n for (const pulse of zomeSignal.pulses) {\n const sys = (pulse as SystemPulse).System;\n if (sys.type == \"SelfCallStart\") {\n console.log(\"\")\n /** Acquire lock */\n try {\n this._callMutex.acquire().then((r) => this._selfCallRelease = r)\n } catch (e) {\n console.error(\"A Zome self call is initialted during a writing zome call\", e);\n }\n }\n if (sys.type == \"SelfCallEnd\" && this._selfCallRelease) {\n /** Release */\n this._selfCallRelease();\n delete this._selfCallRelease;\n const end = sys as SystemSignalProtocolVariantSelfCallEnd;\n if (!end.succeeded) {\n console.error(\"Call to self failed.\")\n this.dumpCallLogs(end.zome_name);\n this.dumpSignalLogs(end.zome_name);\n }\n }\n }\n }\n\n /** -- Fields -- */\n\n defaultTimeout: number;\n protected _callMutex: MutexInterface;\n\n\n\n /** append only logs */\n private _requestLog: RequestLog[] = []\n private _responseLog: ResponseLog[] = []\n\n\n /** -- Methods -- */\n\n /** */\n addSignalHandler(handler: AppSignalCb): SignalUnsubscriber {\n return this._appProxy.addSignalHandler(handler, this.cell.hcl().toString());\n }\n\n\n /** */\n dumpSignalLogs(zomeName?: ZomeName, canAppSignals?: boolean) {\n this._appProxy.dumpSignalLogs(canAppSignals? canAppSignals : true, this.cell.address, zomeName);\n }\n\n\n /** */\n get signalLogs() {\n return this._appProxy.signalLogs.filter((log) => log.cellAddr.equals(this.cell.address));\n }\n\n\n /** Pass call request to conductor proxy and log it */\n async executeZomeCall(reqLog: RequestLog): Promise<ResponseLog> {\n reqLog.executionTimestamp = Date.now();\n const requestIndex = this._requestLog.length;\n this._requestLog.push(reqLog);\n try {\n const response = await this._appProxy.callZome(reqLog.request, reqLog.timeout);\n const respLog = { requestIndex, success: response, timestamp: Date.now() };\n this._responseLog.push(respLog);\n return respLog;\n } catch (e) {\n const respLog = { requestIndex, failure: e, timestamp: Date.now() }\n this._responseLog.push(respLog);\n return respLog;\n }\n }\n\n\n /** Pass call request to conductor proxy and log it */\n logCallTimedout(reqLog: RequestLog): ResponseLog {\n reqLog.executionTimestamp = Date.now();\n const requestIndex = this._requestLog.length;\n this._requestLog.push(reqLog);\n const respLog = { requestIndex, failure: \"Waiting for Mutex timed-out\", timestamp: Date.now() }\n this._responseLog.push(respLog);\n return respLog;\n }\n\n\n /**\n * callZome() with Mutex (for calls that writes to source-chain)\n * TODO: Implement call queue instead of mutex?\n */\n async callZomeBlockPostCommit(entryType: string, zome_name: ZomeName, fn_name: string, payload: any, cap_secret: CapSecret | null, timeout?: number): Promise<unknown> {\n timeout = timeout? timeout : this.defaultTimeout;\n const req = {\n cap_secret, zome_name, fn_name, payload,\n cell_id: this.cell.address.intoId(),\n provenance: this.cell.address.agentId.hash,\n } as CallZomeRequest;\n const log = { request: req, timeout, requestTimestamp: Date.now() } as RequestLog;\n\n /** Acquire lock */\n try {\n this._postCommitRelease = await this._callMutex.acquire();\n this._postCommitReleaseEntryType = entryType;\n } catch(e) {\n console.warn(\"Waiting for callZomeBlockPostCommit mutex timed-out\", e);\n this.logCallTimedout(log)\n return Promise.reject(\"Waiting for callZomeBlockPostCommit mutex timed-out\");\n }\n /** Execute */\n const respLog = await this.executeZomeCall(log);\n return respLog.success;\n }\n\n\n /**\n * callZome() with Mutex (for calls that writes to source-chain)\n * TODO: Implement call queue instead of mutex?\n */\n async callZomeBlocking(zome_name: ZomeName, fn_name: string, payload: any, cap_secret: CapSecret | null, timeout?: number): Promise<unknown> {\n timeout = timeout? timeout : this.defaultTimeout;\n const req = {\n cap_secret, zome_name, fn_name, payload,\n cell_id: this.cell.address.intoId(),\n provenance: this.cell.address.agentId.hash,\n } as CallZomeRequest;\n const log = { request: req, timeout, requestTimestamp: Date.now() } as RequestLog;\n\n /** Acquire lock */\n let release;\n try {\n release = await this._callMutex.acquire();\n } catch(e) {\n console.warn(\"Waiting for callZomeBlocking mutex timed-out\", e);\n this.logCallTimedout(log)\n return Promise.reject(\"Waiting for callZomeBlocking mutex timed-out\");\n }\n /** Execute */\n const respLog = await this.executeZomeCall(log);\n /** Release */\n release();\n if (respLog.failure) {\n this.dumpCallLogs(zome_name);\n this.dumpSignalLogs(zome_name);\n return Promise.reject(respLog.failure)\n }\n return respLog.success;\n }\n\n\n /** */\n async callZome(zome_name: ZomeName, fn_name: string, payload: any, cap_secret: CapSecret | null, timeout?: number): Promise<unknown> {\n timeout = timeout? timeout : this.defaultTimeout;\n const req = {\n cap_secret, zome_name, fn_name, payload,\n cell_id: this.cell.address.intoId(),\n provenance: this.cell.address.agentId.hash,\n } as CallZomeRequest;\n const log = { request: req, timeout, requestTimestamp: Date.now() } as RequestLog;\n try {\n await this._callMutex.waitForUnlock();\n } catch(e) {\n console.warn(\"Waiting for callZome mutex timed-out\", e);\n this.logCallTimedout(log);\n return Promise.reject(\"Waiting for callZome mutex timed-out\");\n }\n const respLog = await this.executeZomeCall(log);\n if (respLog.failure) {\n this.dumpCallLogs(zome_name);\n this.dumpSignalLogs(zome_name);\n return Promise.reject(respLog.failure)\n }\n return respLog.success;\n }\n\n\n /**\n * Calls the `entry_defs()` zome function and\n * Returns an array of all the zome's AppEntryNames and Visibility, i.e. (AppEntryName, isPublic)[]\n */\n async callEntryDefs(zomeName: ZomeName): Promise<Dictionary<EntryDef>> {\n //console.log(\"callEntryDefs()\", zomeName)\n try {\n const entryDefs = await this.callZome(zomeName, \"entry_defs\", null, null) as EntryDefsCallbackResult; // Need big timeout since holochain is slow when receiving simultaneous calls from multiple happs\n console.debug(\"getEntryDefs() for \" + zomeName + \" result:\")\n console.log({entryDefs})\n let result: Dictionary<EntryDef> = {}\n for (const def of entryDefs.Defs) {\n let name = Object.keys(def.id)[0];\n if (\"App\" in def.id) {\n name = def.id.App;\n }\n result[name!] = def;\n }\n //console.log({result})\n return result;\n } catch (e) {\n console.error(\"Calling getEntryDefs() on \" + zomeName + \" failed: \")\n console.error({ e })\n return Promise.reject(e)\n }\n }\n\n\n\n /**\n * Calls the `zome_info()` zome function\n */\n async callZomeInfo(zomeName: ZomeName): Promise<ZomeInfo> {\n console.log(\"callZomeInfo()\", zomeName)\n try {\n const zome_info = await this.callZome(zomeName, \"get_zome_info\", null, null, 10 * 100) as ZomeInfo;\n //console.debug(\"callZomeInfo() for \" + zomeName + \" result:\")\n //console.log({zome_info})\n return zome_info;\n } catch (e) {\n console.error(\"Calling callZomeInfo() on \" + zomeName + \" failed. Make sure `get_zome_info()` is implemented in your zome code. Error: \")\n console.error({ e })\n return Promise.reject(e)\n }\n }\n\n\n /**\n * Calls the `dna_info()` zome function\n */\n async callDnaInfo(zomeName: ZomeName): Promise<DnaInfo> {\n console.log(\"callDnaInfo()\", zomeName)\n try {\n const dna_info = await this.callZome(zomeName, \"get_dna_info\", null, null, 10 * 100) as DnaInfo;\n //console.debug(\"callDnaInfo() for \" + zomeName + \" result:\")\n //console.log({dna_info})\n return dna_info;\n } catch (e) {\n console.error(\"Calling callDnaInfo() on \" + zomeName + \" failed. Make sure `get_dna_info()` is implemented in your zome code. Error: \")\n console.error({ e })\n return Promise.reject(e)\n }\n }\n\n\n // /** TODO once we have getDnaDefinition() api */\n // dumpAllZomes() {\n // // FIXME get DNA DEF\n // for (const zomeName of dnaDef) {\n // this.dumpCallLogs(zomeName)\n // }\n // }\n\n /** */\n dumpCallLogs(zomeName?: ZomeName) {\n let result = [];\n for (const response of this._responseLog) {\n const requestLog = this._requestLog[response.requestIndex];\n if (!requestLog || (zomeName && requestLog.request.zome_name != zomeName)) {\n continue;\n }\n const startTime= prettyDate(new Date(requestLog.requestTimestamp));\n const waitTime = prettyDuration(new Date(requestLog.executionTimestamp - requestLog.requestTimestamp));\n const duration = prettyDuration(new Date(response.timestamp - requestLog.requestTimestamp));\n let input = requestLog.request.payload;\n // if (requestLog.request.payload instanceof HoloHash) {\n // //console.log(\"instanceof HoloHash\", requestLog.request.payload);\n // input = intoAnyId(requestLog.request.payload.toBytes()).print();\n // } else {\n if (requestLog.request.payload instanceof Uint8Array) {\n //console.log(\"instanceof Uint8Array\", requestLog.request.payload);\n input = intoAnyId(requestLog.request.payload).print();\n }\n //}\n //const input = requestLog.request.payload instanceof Uint8Array ? enc64(requestLog.request.payload) : requestLog.request.payload;\n const output = anyToB64(response.failure ? response.failure : response.success);\n const log = zomeName\n ? { startTime, fnName: requestLog.request.fn_name, input, output, duration, waitTime }\n : { startTime, zomeName: requestLog.request.zome_name, fnName: requestLog.request.fn_name, input, output, duration, waitTime }\n result.push(log);\n }\n console.warn(`Dumping logs for cell \"${this._appProxy.getLocations(this.cell.address)}\"`)\n if (zomeName) {\n console.warn(` - For zome \"${zomeName}\"`);\n }\n console.table(result)\n\n /** Parse signal self-call logs */\n //console.log(this._appProxy.signalLogs)\n\n const zomeSignals = this._appProxy.signalLogs.filter((log) => log.type == SignalType.Zome);\n const sysSignals = zomeSignals.filter((log) => {\n const type = Object.keys(log.zomeSignal.pulses[0]!)[0];\n type == \"System\"\n });\n\n const startCalls: [Timestamp, CellIdStr, SystemSignalProtocolVariantSelfCallStart][] = [];\n const endCalls: [Timestamp, CellIdStr, SystemSignalProtocolVariantSelfCallEnd][] = [];\n sysSignals.map((log) => {\n for (const pulse of log.zomeSignal.pulses) {\n const sys = (pulse as SystemPulse).System;\n if(sys.type == \"SelfCallStart\") {\n startCalls.push([log.ts, log.cellAddr.str, (sys as SystemSignalProtocolVariantSelfCallStart)]);\n }\n if(sys.type == \"SelfCallEnd\") {\n endCalls.push([log.ts, log.cellAddr.str, (sys as SystemSignalProtocolVariantSelfCallEnd)]);\n }\n }\n })\n\n let sigResults = [];\n for (const [startTs, startId, startSignal] of startCalls) {\n const index = endCalls.findIndex(([ts, cellId, signal]) => ts >= startTs && startId == cellId && startSignal.fn_name == signal.fn_name)\n if (index == -1) {\n continue;\n }\n const first = endCalls.splice(index, 1)[0]!;\n const [endTs, _cId, endSignal] = first;\n const duration = prettyDuration(new Date(endTs - startTs));\n const log = { startTime: startTs, zomeName: endSignal.zome_name, fnName: endSignal.fn_name, succeeded: endSignal.succeeded, duration }\n sigResults.push(log);\n }\n\n console.table(sigResults)\n }\n\n\n}\n\n"]}
|
|
@@ -3,37 +3,20 @@ import { UnsubscribeFunction } from "emittery";
|
|
|
3
3
|
import { AppProxy } from "./AppProxy";
|
|
4
4
|
import { CellIdStr } from "./types";
|
|
5
5
|
import { AgentId } from "./hash";
|
|
6
|
-
/**
|
|
7
|
-
* Creates, connects and holds an appWebsocket.
|
|
8
|
-
* Creates and holds Cell proxies for this appWebsocket.
|
|
9
|
-
* Maintains a mapping between CellIds and HCLs
|
|
10
|
-
* Handles SignalHandlers per HCL
|
|
11
|
-
* Stores appSignal logs
|
|
12
|
-
* TODO Implement Singleton per App port?
|
|
13
|
-
*/
|
|
14
6
|
export declare class ConductorAppProxy extends AppProxy implements AppClient {
|
|
15
|
-
defaultTimeout: number;
|
|
16
|
-
/** -- Fields -- */
|
|
7
|
+
constructor(defaultTimeout: number, appId: InstalledAppId, agentId: AgentId, adminWs?: AdminWebsocket);
|
|
17
8
|
private _appWs;
|
|
18
|
-
/** -- Getters -- */
|
|
19
|
-
/** -- AppClient (Passthrough to appWebsocket) -- */
|
|
20
9
|
callZome(req: CallZomeRequest, timeout?: number): Promise<unknown>;
|
|
21
10
|
appInfo(): Promise<AppInfoResponse>;
|
|
22
11
|
on<Name extends keyof AppEvents>(eventName: Name | readonly Name[], listener: AppSignalCb): UnsubscribeFunction;
|
|
23
12
|
createCloneCell(request: CreateCloneCellRequest): Promise<ClonedCell>;
|
|
24
13
|
enableCloneCell(request: EnableCloneCellRequest): Promise<ClonedCell>;
|
|
25
14
|
disableCloneCell(request: DisableCloneCellRequest): Promise<void>;
|
|
26
|
-
/** */
|
|
27
15
|
networkInfo(args: AppNetworkInfoRequest): Promise<NetworkInfoResponse>;
|
|
28
|
-
/** Store networkInfo calls */
|
|
29
16
|
private _lastTimeQueriedMap;
|
|
30
17
|
private _networkInfoLogs;
|
|
31
18
|
get networkInfoLogs(): Record<CellIdStr, [Timestamp, NetworkInfo][]>;
|
|
32
|
-
/** -- Creation -- */
|
|
33
|
-
/** async Factory */
|
|
34
19
|
static new(port_or_socket: number | AppWebsocket, appId: InstalledAppId, adminUrl?: URL, defaultTimeout?: number): Promise<ConductorAppProxy>;
|
|
35
|
-
/** */
|
|
36
20
|
private static fromSocket;
|
|
37
|
-
/** Ctor */
|
|
38
|
-
constructor(defaultTimeout: number, appId: InstalledAppId, agentId: AgentId, adminWs?: AdminWebsocket);
|
|
39
21
|
}
|
|
22
|
+
//# sourceMappingURL=ConductorAppProxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ConductorAppProxy.d.ts","sourceRoot":"","sources":["../src/ConductorAppProxy.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,YAAY,EACZ,eAAe,EACf,cAAc,EACd,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,UAAU,EACV,WAAW,EAEX,SAAS,EACT,SAAS,EACT,SAAS,EACT,WAAW,EACX,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAC,QAAQ,EAAC,MAAM,YAAY,CAAC;AACpC,OAAO,EAAc,SAAS,EAAC,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAC,OAAO,EAAQ,MAAM,QAAQ,CAAC;AActC,qBAAa,iBAAkB,SAAQ,QAAS,YAAW,SAAS;gBAGxC,cAAc,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,cAAc;IAOnH,OAAO,CAAC,MAAM,CAAgB;IAWf,QAAQ,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKlE,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC;IAIzC,EAAE,CAAC,IAAI,SAAS,MAAM,SAAS,EACtC,SAAS,EAAE,IAAI,GAAG,SAAS,IAAI,EAAE,EACjC,QAAQ,EAAE,WAAW,GACpB,mBAAmB;IAIP,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC;IAKrE,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC;IAKrE,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAWjE,WAAW,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA+BrF,OAAO,CAAC,mBAAmB,CAA2C;IAEtE,OAAO,CAAC,gBAAgB,CAAqD;IAE7E,IAAa,eAAe,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,WAAW,CAAC,EAAE,CAAC,CAAgC;WAOhG,GAAG,CAAC,cAAc,EAAE,MAAM,GAAG,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC;mBAsC9H,UAAU;CAWhC"}
|
|
@@ -3,19 +3,12 @@ import { AppProxy } from "./AppProxy";
|
|
|
3
3
|
import { CellAddress } from "./types";
|
|
4
4
|
import { AgentId, DnaId } from "./hash";
|
|
5
5
|
import { AgentIdMap } from "./holochain-id-map";
|
|
6
|
-
/**
|
|
7
|
-
* Creates, connects and holds an appWebsocket.
|
|
8
|
-
* Creates and holds Cell proxies for this appWebsocket.
|
|
9
|
-
* Maintains a mapping between CellIds and HCLs
|
|
10
|
-
* Handles SignalHandlers per HCL
|
|
11
|
-
* Stores appSignal logs
|
|
12
|
-
* TODO Implement Singleton per App port?
|
|
13
|
-
*/
|
|
14
6
|
export class ConductorAppProxy extends AppProxy {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
7
|
+
constructor(defaultTimeout, appId, agentId, adminWs) {
|
|
8
|
+
super(defaultTimeout, appId, agentId, adminWs);
|
|
9
|
+
this._lastTimeQueriedMap = new AgentIdMap();
|
|
10
|
+
this._networkInfoLogs = {};
|
|
11
|
+
}
|
|
19
12
|
async callZome(req, timeout) {
|
|
20
13
|
timeout = timeout ? timeout : this.defaultTimeout;
|
|
21
14
|
return this._appWs.callZome(req, timeout);
|
|
@@ -27,49 +20,34 @@ export class ConductorAppProxy extends AppProxy {
|
|
|
27
20
|
return this._appWs.on(eventName, listener);
|
|
28
21
|
}
|
|
29
22
|
async createCloneCell(request) {
|
|
30
|
-
//console.log("createCloneCell() called:", request)
|
|
31
23
|
return this._appWs.createCloneCell(request);
|
|
32
24
|
}
|
|
33
25
|
async enableCloneCell(request) {
|
|
34
|
-
//console.log("enableCloneCell() called:", request)
|
|
35
26
|
return this._appWs.enableCloneCell(request);
|
|
36
27
|
}
|
|
37
28
|
async disableCloneCell(request) {
|
|
38
|
-
//console.log("disableCloneCell() called:", request)
|
|
39
29
|
return this._appWs.disableCloneCell(request);
|
|
40
30
|
}
|
|
41
|
-
// async networkInfo(args: AppNetworkInfoRequest): Promise<NetworkInfoResponse> {
|
|
42
|
-
// return this._appWs!.networkInfo(args);
|
|
43
|
-
// }
|
|
44
|
-
/** */
|
|
45
31
|
async networkInfo(args) {
|
|
46
32
|
const agentId = new AgentId(this._appWs.myPubKey);
|
|
47
|
-
/* Call networkInfo */
|
|
48
33
|
const response = await this._appWs.networkInfo({
|
|
49
34
|
dnas: args.dnas,
|
|
50
35
|
last_time_queried: this._lastTimeQueriedMap.get(agentId)
|
|
51
36
|
});
|
|
52
37
|
this._lastTimeQueriedMap.set(agentId, Date.now());
|
|
53
|
-
/* Convert result */
|
|
54
38
|
let i = 0;
|
|
55
|
-
//let result = {}
|
|
56
39
|
for (const netInfo of response) {
|
|
57
40
|
const dnaId = new DnaId(args.dnas[i]);
|
|
58
|
-
//result[dnaHash] = [this._lastTimeQueriedMap[agent], netInfo];
|
|
59
|
-
/* Store */
|
|
60
41
|
const cellAddr = new CellAddress(dnaId, agentId);
|
|
61
42
|
if (!this._networkInfoLogs[cellAddr.str]) {
|
|
62
43
|
this._networkInfoLogs[cellAddr.str] = [];
|
|
63
44
|
}
|
|
64
45
|
this._networkInfoLogs[cellAddr.str].push([this._lastTimeQueriedMap.get(agentId), netInfo]);
|
|
65
|
-
/* */
|
|
66
46
|
i += 1;
|
|
67
47
|
}
|
|
68
48
|
return response;
|
|
69
49
|
}
|
|
70
50
|
get networkInfoLogs() { return this._networkInfoLogs; }
|
|
71
|
-
/** -- Creation -- */
|
|
72
|
-
/** async Factory */
|
|
73
51
|
static async new(port_or_socket, appId, adminUrl, defaultTimeout) {
|
|
74
52
|
const timeout = defaultTimeout ? defaultTimeout : 10 * 1000;
|
|
75
53
|
if (typeof port_or_socket == 'object') {
|
|
@@ -78,17 +56,23 @@ export class ConductorAppProxy extends AppProxy {
|
|
|
78
56
|
else {
|
|
79
57
|
let wsUrl = new URL(`ws://localhost:${port_or_socket}`);
|
|
80
58
|
try {
|
|
81
|
-
let token;
|
|
82
|
-
let adminWs;
|
|
59
|
+
let token = undefined;
|
|
60
|
+
let adminWs = undefined;
|
|
83
61
|
if (adminUrl) {
|
|
84
62
|
adminWs = await AdminWebsocket.connect({ url: adminUrl });
|
|
85
63
|
console.log({ adminWs });
|
|
86
64
|
const issued = await adminWs.issueAppAuthenticationToken({ installed_app_id: appId });
|
|
87
65
|
token = issued.token;
|
|
88
66
|
}
|
|
89
|
-
const
|
|
67
|
+
const options = {
|
|
68
|
+
url: wsUrl,
|
|
69
|
+
defaultTimeout: timeout,
|
|
70
|
+
};
|
|
71
|
+
if (token) {
|
|
72
|
+
options.token = token;
|
|
73
|
+
}
|
|
74
|
+
const appWs = await AppWebsocket.connect(options);
|
|
90
75
|
const agentId = new AgentId(appWs.myPubKey);
|
|
91
|
-
//console.log("appWs.myPubKey", appWs.myPubKey, agentId);
|
|
92
76
|
let conductor = new ConductorAppProxy(timeout, appId, agentId, adminWs);
|
|
93
77
|
conductor._appWs = appWs;
|
|
94
78
|
conductor._appWs.on('signal', (sig) => { conductor.onSignal(sig); });
|
|
@@ -100,7 +84,6 @@ export class ConductorAppProxy extends AppProxy {
|
|
|
100
84
|
}
|
|
101
85
|
}
|
|
102
86
|
}
|
|
103
|
-
/** */
|
|
104
87
|
static async fromSocket(appWebsocket, defaultTimeout) {
|
|
105
88
|
try {
|
|
106
89
|
let conductor = new ConductorAppProxy(defaultTimeout, appWebsocket.installedAppId, new AgentId(appWebsocket.myPubKey));
|
|
@@ -113,14 +96,5 @@ export class ConductorAppProxy extends AppProxy {
|
|
|
113
96
|
return Promise.reject("ConductorAppProxy initialization failed");
|
|
114
97
|
}
|
|
115
98
|
}
|
|
116
|
-
/** Ctor */
|
|
117
|
-
/*protected*/ constructor(defaultTimeout, appId, agentId, adminWs) {
|
|
118
|
-
super(defaultTimeout, appId, agentId, adminWs);
|
|
119
|
-
this.defaultTimeout = defaultTimeout;
|
|
120
|
-
/** Store networkInfo calls */
|
|
121
|
-
//private _lastTimeQueriedMap: Record<AgentPubKeyB64, Timestamp> = {};
|
|
122
|
-
this._lastTimeQueriedMap = new AgentIdMap();
|
|
123
|
-
this._networkInfoLogs = {};
|
|
124
|
-
}
|
|
125
99
|
}
|
|
126
100
|
//# sourceMappingURL=ConductorAppProxy.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConductorAppProxy.js","sourceRoot":"","sources":["../src/ConductorAppProxy.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AppInfoResponse,\n AppWebsocket,\n CallZomeRequest,\n InstalledAppId,\n CreateCloneCellRequest,\n DisableCloneCellRequest,\n EnableCloneCellRequest,\n ClonedCell,\n NetworkInfo,\n NetworkInfoRequest,\n Timestamp,\n AppClient,\n AppEvents,\n AppSignalCb,\n AppNetworkInfoRequest,\n NetworkInfoResponse,\n AdminWebsocket,\n} from \"@holochain/client\";\nimport { UnsubscribeFunction } from \"emittery\";\nimport {AppProxy} from \"./AppProxy\";\nimport {CellAddress, CellIdStr} from \"./types\";\nimport {AgentId, DnaId} from \"./hash\";\nimport {AgentIdMap} from \"./holochain-id-map\";\n\n\n/**\n * Creates, connects and holds an appWebsocket.\n * Creates and holds Cell proxies for this appWebsocket.\n * Maintains a mapping between CellIds and HCLs\n * Handles SignalHandlers per HCL\n * Stores appSignal logs\n * TODO Implement Singleton per App port?\n */\nexport class ConductorAppProxy extends AppProxy implements AppClient {\n\n /** -- Fields -- */\n\n private _appWs!: AppWebsocket;\n\n\n /** -- Getters -- */\n\n ///** Check this after connecting since AppWebsocket can shamelessly override the provided args. */\n //get appIdOfShame(): InstalledAppId | undefined { return this._appWs.overrideInstalledAppId;}\n\n\n /** -- AppClient (Passthrough to appWebsocket) -- */\n\n async callZome(req: CallZomeRequest, timeout?: number): Promise<unknown> {\n timeout = timeout ? timeout : this.defaultTimeout\n return this._appWs.callZome(req, timeout)\n }\n\n async appInfo(): Promise<AppInfoResponse> {\n return this._appWs!.appInfo();\n }\n\n on<Name extends keyof AppEvents>(\n eventName: Name | readonly Name[],\n listener: AppSignalCb\n ): UnsubscribeFunction {\n return this._appWs!.on(eventName, listener);\n }\n\n async createCloneCell(request: CreateCloneCellRequest): Promise<ClonedCell> {\n //console.log(\"createCloneCell() called:\", request)\n return this._appWs!.createCloneCell(request);\n }\n\n async enableCloneCell(request: EnableCloneCellRequest): Promise<ClonedCell> {\n //console.log(\"enableCloneCell() called:\", request)\n return this._appWs!.enableCloneCell(request);\n }\n\n async disableCloneCell(request: DisableCloneCellRequest): Promise<void> {\n //console.log(\"disableCloneCell() called:\", request)\n return this._appWs!.disableCloneCell(request);\n }\n\n // async networkInfo(args: AppNetworkInfoRequest): Promise<NetworkInfoResponse> {\n // return this._appWs!.networkInfo(args);\n // }\n\n\n /** */\n async networkInfo(args: AppNetworkInfoRequest): Promise<NetworkInfoResponse> {\n const agentId = new AgentId(this._appWs.myPubKey);\n /* Call networkInfo */\n const response = await this._appWs.networkInfo({\n dnas: args.dnas,\n last_time_queried: this._lastTimeQueriedMap.get(agentId)\n } as NetworkInfoRequest);\n this._lastTimeQueriedMap.set(agentId, Date.now());\n\n /* Convert result */\n let i = 0;\n //let result = {}\n for (const netInfo of response) {\n const dnaId = new DnaId(args.dnas[i]);\n //result[dnaHash] = [this._lastTimeQueriedMap[agent], netInfo];\n /* Store */\n const cellAddr = new CellAddress(dnaId, agentId);\n if (!this._networkInfoLogs[cellAddr.str]) {\n this._networkInfoLogs[cellAddr.str] = [];\n }\n this._networkInfoLogs[cellAddr.str].push([this._lastTimeQueriedMap.get(agentId), netInfo])\n /* */\n i += 1;\n }\n return response;\n }\n\n\n\n /** Store networkInfo calls */\n //private _lastTimeQueriedMap: Record<AgentPubKeyB64, Timestamp> = {};\n private _lastTimeQueriedMap: AgentIdMap<Timestamp> = new AgentIdMap();\n\n private _networkInfoLogs: Record<CellIdStr, [Timestamp, NetworkInfo][]> = {};\n\n get networkInfoLogs(): Record<CellIdStr, [Timestamp, NetworkInfo][]> {return this._networkInfoLogs;}\n\n\n\n/** -- Creation -- */\n\n /** async Factory */\n static async new(port_or_socket: number | AppWebsocket, appId: InstalledAppId, adminUrl?: URL, defaultTimeout?: number): Promise<ConductorAppProxy> {\n const timeout = defaultTimeout ? defaultTimeout : 10 * 1000;\n if (typeof port_or_socket == 'object') {\n return ConductorAppProxy.fromSocket(port_or_socket, timeout);\n } else {\n let wsUrl = new URL(`ws://localhost:${port_or_socket}`);\n try {\n let token;\n let adminWs: AdminWebsocket;\n if (adminUrl) {\n adminWs = await AdminWebsocket.connect({url: adminUrl});\n console.log({adminWs});\n const issued = await adminWs.issueAppAuthenticationToken({installed_app_id: appId});\n token = issued.token;\n }\n const appWs = await AppWebsocket.connect({url: wsUrl, defaultTimeout: timeout, token});\n const agentId = new AgentId(appWs.myPubKey);\n //console.log(\"appWs.myPubKey\", appWs.myPubKey, agentId);\n let conductor = new ConductorAppProxy(timeout, appId, agentId, adminWs);\n conductor._appWs = appWs;\n conductor._appWs.on('signal', (sig) => {conductor.onSignal(sig)});\n return conductor;\n } catch (e) {\n console.error(\"ConductorAppProxy initialization failed\", e)\n return Promise.reject(\"ConductorAppProxy initialization failed\");\n }\n }\n }\n\n\n /** */\n private static async fromSocket(appWebsocket: AppWebsocket, defaultTimeout: number): Promise<ConductorAppProxy> {\n try {\n let conductor = new ConductorAppProxy(defaultTimeout, appWebsocket.installedAppId, new AgentId(appWebsocket.myPubKey));\n conductor._appWs = appWebsocket;\n conductor._appWs.on('signal', (sig) => {conductor.onSignal(sig)})\n return conductor;\n } catch (e) {\n console.error(\"ConductorAppProxy initialization failed\", e)\n return Promise.reject(\"ConductorAppProxy initialization failed\");\n }\n }\n\n\n /** Ctor */\n /*protected*/ constructor(public defaultTimeout: number, appId: InstalledAppId, agentId: AgentId, adminWs?: AdminWebsocket) {\n super(defaultTimeout, appId, agentId, adminWs);\n }\n\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"ConductorAppProxy.js","sourceRoot":"","sources":["../src/ConductorAppProxy.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n AppInfoResponse,\n AppWebsocket,\n CallZomeRequest,\n InstalledAppId,\n CreateCloneCellRequest,\n DisableCloneCellRequest,\n EnableCloneCellRequest,\n ClonedCell,\n NetworkInfo,\n NetworkInfoRequest,\n Timestamp,\n AppClient,\n AppEvents,\n AppSignalCb,\n AppNetworkInfoRequest,\n NetworkInfoResponse,\n AdminWebsocket,\n} from \"@holochain/client\";\nimport { UnsubscribeFunction } from \"emittery\";\nimport {AppProxy} from \"./AppProxy\";\nimport {CellAddress, CellIdStr} from \"./types\";\nimport {AgentId, DnaId} from \"./hash\";\nimport {AgentIdMap} from \"./holochain-id-map\";\nimport {AppWebsocketConnectionOptions} from \"@holochain/client/lib/api/app/types\";\nimport {AppAuthenticationToken} from \"@holochain/client/lib/api/admin/types\";\n\n\n/**\n * Creates, connects and holds an appWebsocket.\n * Creates and holds Cell proxies for this appWebsocket.\n * Maintains a mapping between CellIds and HCLs\n * Handles SignalHandlers per HCL\n * Stores appSignal logs\n * TODO Implement Singleton per App port?\n */\nexport class ConductorAppProxy extends AppProxy implements AppClient {\n\n /** Ctor */\n /*protected*/ constructor(defaultTimeout: number, appId: InstalledAppId, agentId: AgentId, adminWs?: AdminWebsocket) {\n super(defaultTimeout, appId, agentId, adminWs);\n }\n\n\n /** -- Fields -- */\n\n private _appWs!: AppWebsocket;\n\n\n /** -- Getters -- */\n\n ///** Check this after connecting since AppWebsocket can shamelessly override the provided args. */\n //get appIdOfShame(): InstalledAppId | undefined { return this._appWs.overrideInstalledAppId;}\n\n\n /** -- AppClient (Passthrough to appWebsocket) -- */\n\n override async callZome(req: CallZomeRequest, timeout?: number): Promise<unknown> {\n timeout = timeout ? timeout : this.defaultTimeout\n return this._appWs.callZome(req, timeout)\n }\n\n override async appInfo(): Promise<AppInfoResponse> {\n return this._appWs!.appInfo();\n }\n\n override on<Name extends keyof AppEvents>(\n eventName: Name | readonly Name[],\n listener: AppSignalCb\n ): UnsubscribeFunction {\n return this._appWs!.on(eventName, listener);\n }\n\n override async createCloneCell(request: CreateCloneCellRequest): Promise<ClonedCell> {\n //console.log(\"createCloneCell() called:\", request)\n return this._appWs!.createCloneCell(request);\n }\n\n override async enableCloneCell(request: EnableCloneCellRequest): Promise<ClonedCell> {\n //console.log(\"enableCloneCell() called:\", request)\n return this._appWs!.enableCloneCell(request);\n }\n\n override async disableCloneCell(request: DisableCloneCellRequest): Promise<void> {\n //console.log(\"disableCloneCell() called:\", request)\n return this._appWs!.disableCloneCell(request);\n }\n\n // async networkInfo(args: AppNetworkInfoRequest): Promise<NetworkInfoResponse> {\n // return this._appWs!.networkInfo(args);\n // }\n\n\n /** */\n override async networkInfo(args: AppNetworkInfoRequest): Promise<NetworkInfoResponse> {\n const agentId = new AgentId(this._appWs.myPubKey);\n /* Call networkInfo */\n const response = await this._appWs.networkInfo({\n dnas: args.dnas,\n last_time_queried: this._lastTimeQueriedMap.get(agentId)\n } as NetworkInfoRequest);\n this._lastTimeQueriedMap.set(agentId, Date.now());\n\n /* Convert result */\n let i = 0;\n //let result = {}\n for (const netInfo of response) {\n const dnaId = new DnaId(args.dnas[i]!);\n //result[dnaHash] = [this._lastTimeQueriedMap[agent], netInfo];\n /* Store */\n const cellAddr = new CellAddress(dnaId, agentId);\n if (!this._networkInfoLogs[cellAddr.str]) {\n this._networkInfoLogs[cellAddr.str] = [];\n }\n this._networkInfoLogs[cellAddr.str]!.push([this._lastTimeQueriedMap.get(agentId)!, netInfo])\n /* */\n i += 1;\n }\n return response;\n }\n\n\n\n /** Store networkInfo calls */\n //private _lastTimeQueriedMap: Record<AgentPubKeyB64, Timestamp> = {};\n private _lastTimeQueriedMap: AgentIdMap<Timestamp> = new AgentIdMap();\n\n private _networkInfoLogs: Record<CellIdStr, [Timestamp, NetworkInfo][]> = {};\n\n override get networkInfoLogs(): Record<CellIdStr, [Timestamp, NetworkInfo][]> {return this._networkInfoLogs;}\n\n\n\n/** -- Creation -- */\n\n /** async Factory */\n static async new(port_or_socket: number | AppWebsocket, appId: InstalledAppId, adminUrl?: URL, defaultTimeout?: number): Promise<ConductorAppProxy> {\n const timeout = defaultTimeout ? defaultTimeout : 10 * 1000;\n if (typeof port_or_socket == 'object') {\n return ConductorAppProxy.fromSocket(port_or_socket, timeout);\n } else {\n let wsUrl = new URL(`ws://localhost:${port_or_socket}`);\n try {\n let token: AppAuthenticationToken | undefined = undefined;\n let adminWs: AdminWebsocket | undefined = undefined;\n if (adminUrl) {\n adminWs = await AdminWebsocket.connect({url: adminUrl});\n console.log({adminWs});\n const issued = await adminWs.issueAppAuthenticationToken({installed_app_id: appId});\n token = issued.token;\n }\n const options: AppWebsocketConnectionOptions = {\n url: wsUrl,\n defaultTimeout: timeout,\n };\n if (token) {\n options.token = token;\n }\n const appWs = await AppWebsocket.connect(options);\n const agentId = new AgentId(appWs.myPubKey);\n //console.log(\"appWs.myPubKey\", appWs.myPubKey, agentId);\n let conductor = new ConductorAppProxy(timeout, appId, agentId, adminWs);\n conductor._appWs = appWs;\n conductor._appWs.on('signal', (sig) => {conductor.onSignal(sig)});\n return conductor;\n } catch (e) {\n console.error(\"ConductorAppProxy initialization failed\", e)\n return Promise.reject(\"ConductorAppProxy initialization failed\");\n }\n }\n }\n\n\n /** */\n private static async fromSocket(appWebsocket: AppWebsocket, defaultTimeout: number): Promise<ConductorAppProxy> {\n try {\n let conductor = new ConductorAppProxy(defaultTimeout, appWebsocket.installedAppId, new AgentId(appWebsocket.myPubKey));\n conductor._appWs = appWebsocket;\n conductor._appWs.on('signal', (sig) => {conductor.onSignal(sig)})\n return conductor;\n } catch (e) {\n console.error(\"ConductorAppProxy initialization failed\", e)\n return Promise.reject(\"ConductorAppProxy initialization failed\");\n }\n }\n}\n\n"]}
|
|
@@ -1,14 +1,9 @@
|
|
|
1
1
|
import { AppInfoResponse, CallZomeRequest, DisableCloneCellRequest, EnableCloneCellRequest, ClonedCell, AppClient, AppEvents, AppSignalCb, AppCreateCloneCellRequest, CreateCloneCellResponse, AppNetworkInfoRequest, NetworkInfoResponse } from "@holochain/client";
|
|
2
2
|
import { UnsubscribeFunction } from "emittery";
|
|
3
3
|
import { AppProxy } from "./AppProxy";
|
|
4
|
-
/**
|
|
5
|
-
*
|
|
6
|
-
*/
|
|
7
4
|
export declare class ExternalAppProxy extends AppProxy implements AppClient {
|
|
8
5
|
private _appClient;
|
|
9
|
-
/** Ctor */
|
|
10
6
|
constructor(_appClient: AppClient, defaultTimeout: number);
|
|
11
|
-
/** -- AppClient (Passthrough to external AppClient) -- */
|
|
12
7
|
callZome(req: CallZomeRequest, timeout?: number): Promise<unknown>;
|
|
13
8
|
on<Name extends keyof AppEvents>(eventName: Name | readonly Name[], listener: AppSignalCb): UnsubscribeFunction;
|
|
14
9
|
appInfo(): Promise<AppInfoResponse>;
|
|
@@ -17,3 +12,4 @@ export declare class ExternalAppProxy extends AppProxy implements AppClient {
|
|
|
17
12
|
disableCloneCell(request: DisableCloneCellRequest): Promise<void>;
|
|
18
13
|
networkInfo(args: AppNetworkInfoRequest): Promise<NetworkInfoResponse>;
|
|
19
14
|
}
|
|
15
|
+
//# sourceMappingURL=ExternalAppProxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExternalAppProxy.d.ts","sourceRoot":"","sources":["../src/ExternalAppProxy.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,eAAe,EACf,uBAAuB,EACvB,sBAAsB,EACtB,UAAU,EACV,SAAS,EACT,SAAS,EACT,WAAW,EACX,yBAAyB,EACzB,uBAAuB,EACvB,qBAAqB,EAAE,mBAAmB,EAC3C,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,EAAC,QAAQ,EAAC,MAAM,YAAY,CAAC;AAOpC,qBAAa,gBAAiB,SAAQ,QAAS,YAAW,SAAS;IAGvC,OAAO,CAAC,UAAU;gBAAV,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM;IAWhE,QAAQ,CAAC,GAAG,EAAE,eAAe,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKxE,EAAE,CAAC,IAAI,SAAS,MAAM,SAAS,EACtC,SAAS,EAAE,IAAI,GAAG,SAAS,IAAI,EAAE,EACjC,QAAQ,EAAE,WAAW,GACpB,mBAAmB;IAIP,OAAO,IAAI,OAAO,CAAC,eAAe,CAAC;IAInC,eAAe,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAIrF,eAAe,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,CAAC,UAAU,CAAC;IAIrE,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE,WAAW,CAAC,IAAI,EAAE,qBAAqB,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAIhF"}
|