@ddd-qc/lit-happ 0.33.4 → 0.33.6
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 +3 -3
- package/dist/HappElement.d.ts +4 -4
- package/dist/HappElement.d.ts.map +1 -1
- package/dist/HappElement.js +4 -4
- package/dist/HappElement.js.map +1 -1
- package/dist/HappMultiElement.d.ts +4 -4
- package/dist/HappMultiElement.d.ts.map +1 -1
- package/dist/HappMultiElement.js +5 -5
- package/dist/HappMultiElement.js.map +1 -1
- package/dist/NetworkCaller.d.ts +6 -1
- package/dist/NetworkCaller.d.ts.map +1 -1
- package/dist/NetworkCaller.js +29 -4
- package/dist/NetworkCaller.js.map +1 -1
- package/dist/globals.js +3 -5
- package/dist/globals.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# lit-happ
|
|
2
2
|
|
|
3
3
|
**Compatible with:**
|
|
4
|
-
- **HDK v0.
|
|
5
|
-
- **@holochain/client v0.
|
|
6
|
-
|
|
4
|
+
- **HDK v0.6.0**
|
|
5
|
+
- **@holochain/client v0.20.0**
|
|
6
|
+
|
|
7
7
|
Builds on the [cell-proxy](https://www.npmjs.com/package/@ddd-qc/cell-proxy) package to provide a MVVM framework for building web-UI in [Lit](https://www.npmjs.com/package/lit) for [holochain](https://www.npmjs.com/package/@holochain/client) apps.
|
|
8
8
|
|
|
9
9
|
|
package/dist/HappElement.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { LitElement } from "lit";
|
|
2
|
-
import { BaseRoleName, AppProxy } from "@ddd-qc/cell-proxy";
|
|
2
|
+
import { BaseRoleName, AppProxy, HcConnectionOptions } from "@ddd-qc/cell-proxy";
|
|
3
3
|
import { HappViewModel } from "./HappViewModel";
|
|
4
4
|
import { CellDef, HvmDef } from "./definitions";
|
|
5
|
-
import {
|
|
5
|
+
import { ClonedCell, InstalledAppId } from "@holochain/client";
|
|
6
6
|
import { DnaViewModel } from "./DnaViewModel";
|
|
7
7
|
import { NetworkCaller } from "./NetworkCaller";
|
|
8
8
|
export declare class HappElement extends LitElement {
|
|
@@ -10,8 +10,8 @@ export declare class HappElement extends LitElement {
|
|
|
10
10
|
protected appProxy: AppProxy;
|
|
11
11
|
hvm: HappViewModel;
|
|
12
12
|
networkCaller?: NetworkCaller;
|
|
13
|
-
protected constructor(
|
|
14
|
-
protected constructHvm(
|
|
13
|
+
protected constructor(options: HcConnectionOptions, appId?: InstalledAppId);
|
|
14
|
+
protected constructHvm(options: HcConnectionOptions, appId?: InstalledAppId): Promise<void>;
|
|
15
15
|
initializePerspectiveFromLocal(): Promise<void>;
|
|
16
16
|
initializePerspectiveFromNetwork(): Promise<void>;
|
|
17
17
|
shouldUpdate(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HappElement.d.ts","sourceRoot":"","sources":["../src/HappElement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,KAAK,CAAC;AAE/B,OAAO,
|
|
1
|
+
{"version":3,"file":"HappElement.d.ts","sourceRoot":"","sources":["../src/HappElement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,KAAK,CAAC;AAE/B,OAAO,EACH,YAAY,EACZ,QAAQ,EACW,mBAAmB,EACzC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAC,OAAO,EAAE,MAAM,EAAC,MAAM,eAAe,CAAC;AAC9C,OAAO,EACL,UAAU,EACV,cAAc,EACf,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAG5C,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAO9C,qBAAa,WAAY,SAAQ,UAAU;IAGzC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC;IAGvB,SAAS,CAAC,QAAQ,EAAG,QAAQ,CAAC;IACrB,GAAG,EAAG,aAAa,CAAC;IAG7B,aAAa,CAAC,EAAE,aAAa,CAAC;IAG9B,SAAS,aAAa,OAAO,EAAE,mBAAmB,EAAE,KAAK,CAAC,EAAE,cAAc;cAO1D,YAAY,CAAC,OAAO,EAAE,mBAAmB,EAAE,KAAK,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB3F,8BAA8B,IAAI,OAAO,CAAC,IAAI,CAAC;IAO/C,gCAAgC,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ5C,YAAY;IAIZ,YAAY;IAQf,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAE/B,+BAA+B,IAAI,OAAO,CAAC,IAAI,CAAC;IAEhD,iCAAiC,IAAI,OAAO,CAAC,IAAI,CAAC;IAMlD,WAAW,CAAC,YAAY,EAAE,YAAY,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;CAGxG"}
|
package/dist/HappElement.js
CHANGED
|
@@ -5,12 +5,12 @@ import { ConductorAppProxy, } from "@ddd-qc/cell-proxy";
|
|
|
5
5
|
import { HappViewModel } from "./HappViewModel";
|
|
6
6
|
import { NetworkCaller } from "./NetworkCaller";
|
|
7
7
|
export class HappElement extends LitElement {
|
|
8
|
-
constructor(
|
|
8
|
+
constructor(options, appId) {
|
|
9
9
|
super();
|
|
10
|
-
this.constructHvm(
|
|
10
|
+
this.constructHvm(options, appId)
|
|
11
11
|
.then(() => console.debug("HappElement constructed:", this.hvm.appId));
|
|
12
12
|
}
|
|
13
|
-
async constructHvm(
|
|
13
|
+
async constructHvm(options, appId) {
|
|
14
14
|
const hvmDef = this.constructor.HVM_DEF;
|
|
15
15
|
if (!hvmDef) {
|
|
16
16
|
throw Error("HVM_DEF static field undefined in HappElement subclass " + this.constructor.name);
|
|
@@ -18,7 +18,7 @@ export class HappElement extends LitElement {
|
|
|
18
18
|
if (appId) {
|
|
19
19
|
hvmDef.id = appId;
|
|
20
20
|
}
|
|
21
|
-
this.appProxy = await ConductorAppProxy.new(
|
|
21
|
+
this.appProxy = await ConductorAppProxy.new(hvmDef.id, options);
|
|
22
22
|
this.hvm = await HappViewModel.new(this, this.appProxy, hvmDef, true);
|
|
23
23
|
this.networkCaller = new NetworkCaller(this.appProxy);
|
|
24
24
|
await this.hvm.authorizeAllZomeCalls(this.appProxy.adminWs);
|
package/dist/HappElement.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HappElement.js","sourceRoot":"","sources":["../src/HappElement.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,KAAK,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,
|
|
1
|
+
{"version":3,"file":"HappElement.js","sourceRoot":"","sources":["../src/HappElement.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,KAAK,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAGH,iBAAiB,GACpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAS9C,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAO9C,MAAM,OAAO,WAAY,SAAQ,UAAU;IAazC,YAAsB,OAA4B,EAAE,KAAsB;QACxE,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC;aAC5B,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;IAC5E,CAAC;IAGS,KAAK,CAAC,YAAY,CAAC,OAA4B,EAAE,KAAsB;QAC/E,MAAM,MAAM,GAAI,IAAI,CAAC,WAAkC,CAAC,OAAO,CAAC;QAChE,IAAI,CAAC,MAAM,EAAE;YACX,MAAM,KAAK,CAAC,yDAAyD,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;SAChG;QAED,IAAI,KAAK,EAAE;YACT,MAAM,CAAC,EAAE,GAAG,KAAK,CAAC;SACnB;QACD,IAAI,CAAC,QAAQ,GAAG,MAAM,iBAAiB,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC;QAChE,IAAI,CAAC,GAAG,GAAG,MAAM,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;QACtE,IAAI,CAAC,aAAa,GAAG,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAEtD,MAAM,IAAI,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,IAAI,CAAC,8BAA8B,EAAE,CAAC;IAC9C,CAAC;IAGD,KAAK,CAAC,8BAA8B;QAChC,MAAM,IAAI,CAAC,GAAG,CAAC,8BAA8B,EAAE,CAAC;QAChD,MAAM,IAAI,CAAC,+BAA+B,EAAE,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,+DAA+D,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACpG,CAAC;IAGD,KAAK,CAAC,gCAAgC;QACpC,MAAM,IAAI,CAAC,GAAG,CAAC,gCAAgC,EAAE,CAAC;QAClD,MAAM,IAAI,CAAC,iCAAiC,EAAE,CAAC;IACjD,CAAC;IAKU,YAAY;QACjB,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IACtB,CAAC;IAEQ,YAAY;QACjB,IAAI,CAAC,iCAAiC,EAAE;aACnC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,gEAAgE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAA;IACrH,CAAC;IAKD,KAAK,CAAC,cAAc,KAAmB,CAAC;IAExC,KAAK,CAAC,+BAA+B,KAAmB,CAAC;IAEzD,KAAK,CAAC,iCAAiC,KAAmB,CAAC;IAM3D,KAAK,CAAC,WAAW,CAAC,YAA0B,EAAE,OAAiB;QAC3D,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;CACJ;AAxEU;IAAR,KAAK,EAAE;wCAAqB","sourcesContent":["import {LitElement} from \"lit\";\nimport { state } from \"lit/decorators.js\";\nimport {\n BaseRoleName,\n AppProxy,\n ConductorAppProxy, HcConnectionOptions,\n} from \"@ddd-qc/cell-proxy\";\nimport {HappViewModel} from \"./HappViewModel\";\nimport {CellDef, HvmDef} from \"./definitions\";\nimport {\n ClonedCell,\n InstalledAppId,\n} from \"@holochain/client\";\nimport {DnaViewModel} from \"./DnaViewModel\";\n// @ts-ignore\nimport * as net from \"net\";\nimport {NetworkCaller} from \"./NetworkCaller\";\n\n\n/**\n * Base class for HappElements, which are LitElements that wrap a HappViewModel,\n * i.e. the main WebComponent of a single Holochain app.\n */\nexport class HappElement extends LitElement {\n\n /** Must be defined by subclass */\n static HVM_DEF: HvmDef;\n\n /** Set during init triggered at ctor */\n protected appProxy!: AppProxy;\n @state() hvm!: HappViewModel;\n\n /** Continually calls networkInfo for a specific cell with appProxy */\n networkCaller?: NetworkCaller;\n\n /** Ctor */\n protected constructor(options: HcConnectionOptions, appId?: InstalledAppId) {\n super();\n this.constructHvm(options, appId)\n .then(() => console.debug(\"HappElement constructed:\", this.hvm.appId))\n }\n\n /** */\n protected async constructHvm(options: HcConnectionOptions, appId?: InstalledAppId): Promise<void> {\n const hvmDef = (this.constructor as typeof HappElement).HVM_DEF;\n if (!hvmDef) {\n throw Error(\"HVM_DEF static field undefined in HappElement subclass \" + this.constructor.name);\n }\n /** Override appId */\n if (appId) {\n hvmDef.id = appId;\n }\n this.appProxy = await ConductorAppProxy.new(hvmDef.id, options);\n this.hvm = await HappViewModel.new(this, this.appProxy, hvmDef, true);\n this.networkCaller = new NetworkCaller(this.appProxy);\n /** FIXME: wait for genesis to finish first? */\n await this.hvm.authorizeAllZomeCalls(this.appProxy.adminWs);\n await this.hvmConstructed();\n await this.initializePerspectiveFromLocal();\n }\n\n /** */\n async initializePerspectiveFromLocal(): Promise<void> {\n await this.hvm.initializePerspectiveFromLocal();\n await this.perspectiveInitializedFromLocal();\n console.debug(\"Finished initializing Happ perspective with Local data. App: \" + this.hvm.appId);\n }\n\n /** */\n async initializePerspectiveFromNetwork(): Promise<void> {\n await this.hvm.initializePerspectiveFromNetwork();\n await this.perspectiveInitializedFromNetwork();\n }\n\n /** -- Lit lifecycle hooks -- */\n\n /** */\n override shouldUpdate() {\n return !!this.hvm;\n }\n\n override firstUpdated() {\n this.perspectiveInitializedFromNetwork()\n .then(() => console.debug(\"Finished initializing Happ perspective with Network data. App \" + this.hvm.appId))\n }\n\n /** -- Hooks for subclasses to override -- */\n\n /** */\n async hvmConstructed(): Promise<void> {}\n /** */\n async perspectiveInitializedFromLocal(): Promise<void> {}\n /** */\n async perspectiveInitializedFromNetwork(): Promise<void> {}\n\n\n /** -- Methods -- */\n\n /** */\n async createClone(baseRoleName: BaseRoleName, cellDef?: CellDef): Promise<[ClonedCell, DnaViewModel]> {\n return this.hvm.cloneDvm(baseRoleName, cellDef);\n }\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { LitElement } from "lit";
|
|
2
|
-
import { AppProxy, CellIdStr } from "@ddd-qc/cell-proxy";
|
|
2
|
+
import { AppProxy, CellIdStr, HcConnectionOptions } from "@ddd-qc/cell-proxy";
|
|
3
3
|
import { HappViewModel } from "./HappViewModel";
|
|
4
4
|
import { HvmDef } from "./definitions";
|
|
5
|
-
import {
|
|
5
|
+
import { InstalledAppId, NetworkMetrics, Timestamp } from "@holochain/client";
|
|
6
6
|
import { NetworkCaller } from "./NetworkCaller";
|
|
7
7
|
export declare class HappMultiElement extends LitElement {
|
|
8
8
|
readonly isMainView: boolean;
|
|
@@ -10,8 +10,8 @@ export declare class HappMultiElement extends LitElement {
|
|
|
10
10
|
hvms: [AppProxy, HappViewModel][];
|
|
11
11
|
networkCaller?: NetworkCaller;
|
|
12
12
|
get count(): number;
|
|
13
|
-
protected constructor(
|
|
14
|
-
protected constructHvms(
|
|
13
|
+
protected constructor(appConnections: [HcConnectionOptions, InstalledAppId | undefined][], isMainView: boolean);
|
|
14
|
+
protected constructHvms(appConnections: [HcConnectionOptions, InstalledAppId | undefined][]): Promise<void>;
|
|
15
15
|
initializePerspectiveFromLocal(): Promise<void>;
|
|
16
16
|
initializePerspectiveFromNetwork(): Promise<void>;
|
|
17
17
|
shouldUpdate(): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HappMultiElement.d.ts","sourceRoot":"","sources":["../src/HappMultiElement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,KAAK,CAAC;AAE/B,OAAO,
|
|
1
|
+
{"version":3,"file":"HappMultiElement.d.ts","sourceRoot":"","sources":["../src/HappMultiElement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,KAAK,CAAC;AAE/B,OAAO,EACH,QAAQ,EAGR,SAAS,EAAkC,mBAAmB,EACjE,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAC,MAAM,EAAC,MAAM,eAAe,CAAC;AACrC,OAAO,EACL,cAAc,EAAE,cAAc,EAC9B,SAAS,EACV,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAC,aAAa,EAAC,MAAM,iBAAiB,CAAC;AAO9C,qBAAa,gBAAiB,SAAQ,UAAU;aAgB5B,UAAU,EAAE,OAAO;IAbrC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC;IAGd,IAAI,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,EAAE,CAAK;IAG/C,aAAa,CAAC,EAAE,aAAa,CAAC;IAE9B,IAAI,KAAK,IAAI,MAAM,CAA0B;IAG7C,SAAS,aACP,cAAc,EAAE,CAAC,mBAAmB,EAAE,cAAc,GAAG,SAAS,CAAC,EAAE,EACnD,UAAU,EAAE,OAAO;cAQrB,aAAa,CAAC,cAAc,EAAE,CAAC,mBAAmB,EAAE,cAAc,GAAG,SAAS,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB3G,8BAA8B,IAAI,OAAO,CAAC,IAAI,CAAC;IAO/C,gCAAgC,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5C,YAAY;IAIZ,YAAY;IAQf,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;IAEhC,+BAA+B,IAAI,OAAO,CAAC,IAAI,CAAC;IAEhD,iCAAiC,IAAI,OAAO,CAAC,IAAI,CAAC;IAMpD,cAAc,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC;CAgDrG"}
|
package/dist/HappMultiElement.js
CHANGED
|
@@ -6,20 +6,20 @@ import { HappViewModel } from "./HappViewModel";
|
|
|
6
6
|
import { NetworkCaller } from "./NetworkCaller";
|
|
7
7
|
export class HappMultiElement extends LitElement {
|
|
8
8
|
get count() { return this.hvms.length; }
|
|
9
|
-
constructor(
|
|
9
|
+
constructor(appConnections, isMainView) {
|
|
10
10
|
super();
|
|
11
11
|
this.isMainView = isMainView;
|
|
12
12
|
this.hvms = [];
|
|
13
|
-
this.constructHvms(
|
|
13
|
+
this.constructHvms(appConnections)
|
|
14
14
|
.then(() => console.debug("HappMultiElement constructed"));
|
|
15
15
|
}
|
|
16
|
-
async constructHvms(
|
|
16
|
+
async constructHvms(appConnections) {
|
|
17
17
|
const hvmDef = this.constructor.HVM_DEF;
|
|
18
18
|
if (!hvmDef) {
|
|
19
19
|
throw Error("HVM_DEF static field undefined in HappMultiElement subclass " + this.constructor.name);
|
|
20
20
|
}
|
|
21
|
-
for (const [
|
|
22
|
-
const appProxy = await ConductorAppProxy.new(
|
|
21
|
+
for (const [options, appId] of appConnections) {
|
|
22
|
+
const appProxy = await ConductorAppProxy.new(hvmDef.id, options);
|
|
23
23
|
if (appId) {
|
|
24
24
|
hvmDef.id = appId;
|
|
25
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"HappMultiElement.js","sourceRoot":"","sources":["../src/HappMultiElement.ts"],"names":[],"mappings":";AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,KAAK,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,
|
|
1
|
+
{"version":3,"file":"HappMultiElement.js","sourceRoot":"","sources":["../src/HappMultiElement.ts"],"names":[],"mappings":"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","sourcesContent":["import {LitElement} from \"lit\";\nimport { state } from \"lit/decorators.js\";\nimport {\n AppProxy,\n ConductorAppProxy,\n flattenCells,\n CellIdStr, AgentIdMap, DnaId, CellAddress, HcConnectionOptions,\n} from \"@ddd-qc/cell-proxy\";\nimport {HappViewModel} from \"./HappViewModel\";\nimport {HvmDef} from \"./definitions\";\nimport {\n InstalledAppId, NetworkMetrics,\n Timestamp\n} from \"@holochain/client\";\n// @ts-ignore\nimport * as net from \"net\";\nimport {NetworkCaller} from \"./NetworkCaller\";\n\n\n/**\n * Base class for HappMultiElements, which are LitElements that wrap multiple HappViewModel,\n * i.e. the main WebComponent of a web-app using multiple Holochain apps.\n */\nexport class HappMultiElement extends LitElement {\n\n /** Must be defined by subclass */\n static HVM_DEF: HvmDef;\n\n /** Set during init triggered at ctor */\n @state() hvms: [AppProxy, HappViewModel][] = []\n\n /** Continually calls networkInfo for a specific cell with appProxy */\n networkCaller?: NetworkCaller;\n\n get count(): number {return this.hvms.length}\n\n /** Ctor */\n protected constructor(\n appConnections: [HcConnectionOptions, InstalledAppId | undefined][],\n public readonly isMainView: boolean,\n ) {\n super();\n this.constructHvms(appConnections)\n .then(() => console.debug(\"HappMultiElement constructed\"))\n }\n\n /** */\n protected async constructHvms(appConnections: [HcConnectionOptions, InstalledAppId | undefined][]): Promise<void> {\n const hvmDef = (this.constructor as typeof HappMultiElement).HVM_DEF;\n if (!hvmDef) {\n throw Error(\"HVM_DEF static field undefined in HappMultiElement subclass \" + this.constructor.name);\n }\n for (const [options, appId] of appConnections) {\n const appProxy = await ConductorAppProxy.new(hvmDef.id, options);\n if (appId) {\n /** Override appId */\n hvmDef.id = appId;\n }\n const hvm = await HappViewModel.new(this, appProxy, hvmDef, this.isMainView);\n await hvm.authorizeAllZomeCalls(appProxy.adminWs);\n this.hvms.push([appProxy, hvm]);\n }\n this.networkCaller = new NetworkCaller(this.hvms[0]![0]); // use first appProxy\n await this.hvmsConstructed();\n await this.initializePerspectiveFromLocal();\n }\n\n /** */\n async initializePerspectiveFromLocal(): Promise<void> {\n for (const [_proxy, hvm] of this.hvms) {\n await hvm.initializePerspectiveFromLocal();\n }\n await this.perspectiveInitializedFromLocal();\n }\n\n async initializePerspectiveFromNetwork(): Promise<void> {\n for (const [_proxy, hvm] of this.hvms) {\n await hvm.initializePerspectiveFromLocal();\n }\n await this.perspectiveInitializedFromNetwork();\n }\n\n /** -- Lit lifecycle hooks -- */\n\n /** */\n override shouldUpdate() {\n return this.hvms.length > 0;\n }\n\n override firstUpdated() {\n this.perspectiveInitializedFromNetwork()\n .then(() => console.debug(\"Finished initializing Happ perspective from Network\"))\n }\n\n /** -- Hooks for subclasses to override -- */\n\n /** */\n async hvmsConstructed(): Promise<void> {}\n /** */\n async perspectiveInitializedFromLocal(): Promise<void> {}\n /** */\n async perspectiveInitializedFromNetwork(): Promise<void> {}\n\n\n /** -- Methods -- */\n\n /** */\n async networkInfoAll(baseRoleName?: string): Promise<Record<CellIdStr, [Timestamp, NetworkMetrics]>> {\n //console.debug(`networkInfoAll() \"${baseRoleName}\"`);\n /** Grab cellMap */\n const hvmDef = (this.constructor as typeof HappMultiElement).HVM_DEF;\n const appProxy = this.hvms[0]![0];\n const cellMap = appProxy.getAppCells(hvmDef.id);\n if (!cellMap) {\n return Promise.reject(\"No cells found at given appId: \" + hvmDef.id);\n }\n /** Get cell Ids */\n let cellAddrs: CellAddress[] = [];\n if (baseRoleName) {\n const cfr = cellMap[baseRoleName];\n if (!cfr) {\n return Promise.reject(\"No cells found at given baseRoleName: \" + baseRoleName);\n }\n cellAddrs = flattenCells(cfr);\n } else {\n for (const cells of Object.values(cellMap)) {\n cellAddrs = cellAddrs.concat(flattenCells(cells))\n }\n }\n //console.debug(`networkInfoAll() cellIds`, cellAddrs.map(cellId => cellId.str));\n /* Sort by agent key */\n let dnaPerAgentMap: AgentIdMap<DnaId[]> = new AgentIdMap();\n for (const cellAddr of cellAddrs) {\n if (!dnaPerAgentMap.get(cellAddr.agentId)) {\n dnaPerAgentMap.set(cellAddr.agentId, []);\n }\n dnaPerAgentMap.get(cellAddr.agentId)!.push(cellAddr.dnaId);\n }\n //console.debug(`networkInfoAll() dnaMap`, dnaPerAgentMap);\n /** Call NetworkInfo per AgentId */\n const allNetInfos: Record<CellIdStr, [Timestamp, NetworkMetrics]> = {};\n for (const [agent, dnaIds] of dnaPerAgentMap.entries()) {\n for (const dna of dnaIds) {\n const response = await appProxy.dumpNetworkMetrics({dna_hash: dna.hash, include_dht_summary: true});\n if (!response || !response[dna.b64]) {\n throw Promise.reject(\"No network metrics response for dna\");\n }\n const idStr = new CellAddress(dna, agent).str;\n allNetInfos[idStr] = [Date.now(), response[dna.b64]!];\n }\n }\n /* Done */\n return allNetInfos;\n }\n\n}\n"]}
|
package/dist/NetworkCaller.d.ts
CHANGED
|
@@ -1,23 +1,28 @@
|
|
|
1
1
|
import { AppProxy, CellAddress } from "@ddd-qc/cell-proxy";
|
|
2
2
|
import { NetworkMetrics, Timestamp } from "@holochain/client";
|
|
3
|
+
import { TransportStats } from "@holochain/client/lib/api/admin/types";
|
|
3
4
|
export declare class NetworkCaller {
|
|
4
5
|
private appProxy;
|
|
5
6
|
private cellAddr?;
|
|
6
7
|
constructor(appProxy: AppProxy, cellAddr?: CellAddress | undefined);
|
|
7
8
|
private _lastTimeQueried;
|
|
8
9
|
private _networkMetricsLogs;
|
|
10
|
+
private _networkStatsLogs;
|
|
9
11
|
private _intervalId;
|
|
10
12
|
private _callbacks;
|
|
11
13
|
setCellAddr(cellAddr: CellAddress): void;
|
|
12
14
|
setCapacity(n: number): void;
|
|
13
15
|
get networkMetricsLogs(): [Timestamp, NetworkMetrics][];
|
|
16
|
+
get networkStatsLogs(): [Timestamp, TransportStats][];
|
|
14
17
|
isLooping(): boolean;
|
|
15
18
|
startCallLoop(interval: number): void;
|
|
16
|
-
addCallback(callback: (n: NetworkMetrics) => void): void;
|
|
19
|
+
addCallback(callback: (n: NetworkMetrics, m: TransportStats) => void): void;
|
|
17
20
|
clearAllCallbacks(): void;
|
|
18
21
|
stopCallLoop(): void;
|
|
19
22
|
clear(): void;
|
|
20
23
|
callNetworkMetrics(): Promise<NetworkMetrics>;
|
|
21
24
|
dumpNetworkMetricsLogs(n?: number): void;
|
|
25
|
+
callNetworkStats(): Promise<TransportStats>;
|
|
26
|
+
dumpNetworkStatsLogs(n?: number): void;
|
|
22
27
|
}
|
|
23
28
|
//# sourceMappingURL=NetworkCaller.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NetworkCaller.d.ts","sourceRoot":"","sources":["../src/NetworkCaller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,WAAW,EAAyB,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAuD,cAAc,EAAE,SAAS,EAAC,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"NetworkCaller.d.ts","sourceRoot":"","sources":["../src/NetworkCaller.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,WAAW,EAAyB,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAuD,cAAc,EAAE,SAAS,EAAC,MAAM,mBAAmB,CAAC;AAClH,OAAO,EAAC,cAAc,EAAC,MAAM,uCAAuC,CAAC;AAQrE,qBAAa,aAAa;IAGZ,OAAO,CAAC,QAAQ;IAAY,OAAO,CAAC,QAAQ,CAAC;gBAArC,QAAQ,EAAE,QAAQ,EAAU,QAAQ,CAAC,yBAAa;IAKtE,OAAO,CAAC,gBAAgB,CAAgB;IACxC,OAAO,CAAC,mBAAmB,CAA+D;IAC1F,OAAO,CAAC,iBAAiB,CAA+D;IAGxF,OAAO,CAAC,WAAW,CAA8B;IAEjD,OAAO,CAAC,UAAU,CAAuB;IAIzC,WAAW,CAAC,QAAQ,EAAE,WAAW;IAEjC,WAAW,CAAC,CAAC,EAAE,MAAM;IAKrB,IAAI,kBAAkB,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,CAA6C;IAEpG,IAAI,gBAAgB,IAAI,CAAC,SAAS,EAAE,cAAc,CAAC,EAAE,CAA2C;IAMhG,SAAS,IAAI,OAAO;IAMpB,aAAa,CAAC,QAAQ,EAAE,MAAM;IAgB9B,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,EAAE,cAAc,KAAK,IAAI;IAKpE,iBAAiB;IAKjB,YAAY;IAOZ,KAAK;IAOC,kBAAkB,IAAI,OAAO,CAAC,cAAc,CAAC;IAuBnD,sBAAsB,CAAC,CAAC,CAAC,EAAE,MAAM;IA6BzB,gBAAgB,IAAI,OAAO,CAAC,cAAc,CAAC;IAajD,oBAAoB,CAAC,CAAC,CAAC,EAAE,MAAM;CAYlC"}
|
package/dist/NetworkCaller.js
CHANGED
|
@@ -5,6 +5,7 @@ export class NetworkCaller {
|
|
|
5
5
|
this.cellAddr = cellAddr;
|
|
6
6
|
this._lastTimeQueried = 0;
|
|
7
7
|
this._networkMetricsLogs = new RingBuffer(50);
|
|
8
|
+
this._networkStatsLogs = new RingBuffer(50);
|
|
8
9
|
this._intervalId = undefined;
|
|
9
10
|
this._callbacks = [];
|
|
10
11
|
}
|
|
@@ -12,8 +13,10 @@ export class NetworkCaller {
|
|
|
12
13
|
;
|
|
13
14
|
setCapacity(n) {
|
|
14
15
|
this._networkMetricsLogs.resize(n);
|
|
16
|
+
this._networkStatsLogs.resize(n);
|
|
15
17
|
}
|
|
16
18
|
get networkMetricsLogs() { return this._networkMetricsLogs.toArray(); }
|
|
19
|
+
get networkStatsLogs() { return this._networkStatsLogs.toArray(); }
|
|
17
20
|
isLooping() {
|
|
18
21
|
const isUnd = this._intervalId === undefined;
|
|
19
22
|
return !isUnd;
|
|
@@ -24,8 +27,9 @@ export class NetworkCaller {
|
|
|
24
27
|
}
|
|
25
28
|
this._intervalId = setInterval(async () => {
|
|
26
29
|
const res = await this.callNetworkMetrics();
|
|
30
|
+
const res2 = await this.callNetworkStats();
|
|
27
31
|
for (const callback of this._callbacks) {
|
|
28
|
-
callback(res);
|
|
32
|
+
callback(res, res2);
|
|
29
33
|
}
|
|
30
34
|
}, interval);
|
|
31
35
|
}
|
|
@@ -41,15 +45,17 @@ export class NetworkCaller {
|
|
|
41
45
|
}
|
|
42
46
|
clear() {
|
|
43
47
|
this._networkMetricsLogs.clear();
|
|
48
|
+
this._networkStatsLogs.clear();
|
|
44
49
|
}
|
|
45
50
|
async callNetworkMetrics() {
|
|
46
51
|
if (!this.cellAddr) {
|
|
47
52
|
throw Promise.reject("callNetworkMetrics() aborted. cellAddr not specified.");
|
|
48
53
|
}
|
|
49
|
-
const
|
|
54
|
+
const request = {
|
|
50
55
|
dna_hash: this.cellAddr.dnaId.hash,
|
|
51
56
|
include_dht_summary: true,
|
|
52
|
-
}
|
|
57
|
+
};
|
|
58
|
+
const response = await this.appProxy.dumpNetworkMetrics(request);
|
|
53
59
|
if (!response || !response[this.cellAddr.dnaId.b64]) {
|
|
54
60
|
throw Promise.reject("No network metrics response for dna");
|
|
55
61
|
}
|
|
@@ -61,7 +67,7 @@ export class NetworkCaller {
|
|
|
61
67
|
dumpNetworkMetricsLogs(n) {
|
|
62
68
|
console.log(`dumpNetworkMetricsLogs()`, this.cellAddr);
|
|
63
69
|
if (!this.cellAddr) {
|
|
64
|
-
throw
|
|
70
|
+
throw Error("dumpNetworkMetricsLogs() aborted. cellAddr not specified.");
|
|
65
71
|
}
|
|
66
72
|
const nn = n ? n : this._networkMetricsLogs.getBufferLength();
|
|
67
73
|
let logs = this._networkMetricsLogs.getLastN(nn).map(([ts, metrics]) => {
|
|
@@ -83,6 +89,25 @@ export class NetworkCaller {
|
|
|
83
89
|
});
|
|
84
90
|
console.table(logs);
|
|
85
91
|
}
|
|
92
|
+
async callNetworkStats() {
|
|
93
|
+
const response = await this.appProxy.dumpNetworkStats();
|
|
94
|
+
if (!response) {
|
|
95
|
+
throw Promise.reject("No network stats response for dna");
|
|
96
|
+
}
|
|
97
|
+
this._networkStatsLogs.add([this._lastTimeQueried, response]);
|
|
98
|
+
return response;
|
|
99
|
+
}
|
|
100
|
+
dumpNetworkStatsLogs(n) {
|
|
101
|
+
console.log(`dumpNetworkStatsLogs()`);
|
|
102
|
+
const nn = n ? n : this._networkStatsLogs.getBufferLength();
|
|
103
|
+
this._networkStatsLogs.getLastN(nn).map(([ts, stats]) => {
|
|
104
|
+
console.log(`[${prettyDate(new Date(ts))}] Backend: ${stats.backend} ; Peers: ${stats.peer_urls.length}`);
|
|
105
|
+
const logs = stats.connections.map((connection) => {
|
|
106
|
+
return connection;
|
|
107
|
+
});
|
|
108
|
+
console.table(logs);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
86
111
|
}
|
|
87
112
|
function count_pending_requests(fetchSummary) {
|
|
88
113
|
let total = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NetworkCaller.js","sourceRoot":"","sources":["../src/NetworkCaller.ts"],"names":[],"mappings":"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","sourcesContent":["import {AppProxy, CellAddress, prettyDate, RingBuffer} from \"@ddd-qc/cell-proxy\";\r\nimport {DhtArc, DumpNetworkMetricsRequest, FetchStateSummary, NetworkMetrics, Timestamp} from \"@holochain/client\";\r\n\r\ntype NetworkInfoCb = (info:NetworkMetrics) => void;\r\n\r\n\r\n/**\r\n * Class handling network info calling and result storing\r\n */\r\nexport class NetworkCaller {\r\n\r\n /** */\r\n constructor(private appProxy: AppProxy, private cellAddr?: CellAddress) {\r\n // N/A\r\n }\r\n\r\n\r\n private _lastTimeQueried: Timestamp = 0;\r\n private _networkMetricsLogs: RingBuffer<[Timestamp, NetworkMetrics]> = new RingBuffer(50);\r\n\r\n private _intervalId: any | undefined = undefined;\r\n\r\n private _callbacks: NetworkInfoCb[] = [];\r\n\r\n /** -- Getters & Setters -- */\r\n\r\n setCellAddr(cellAddr: CellAddress) { this.cellAddr = cellAddr};\r\n\r\n setCapacity(n: number) {\r\n this._networkMetricsLogs.resize(n);\r\n }\r\n\r\n get networkMetricsLogs(): [Timestamp, NetworkMetrics][] {return this._networkMetricsLogs.toArray();}\r\n\r\n\r\n /** -- Methods -- */\r\n\r\n /** */\r\n isLooping(): boolean {\r\n const isUnd = this._intervalId === undefined;\r\n return !isUnd;\r\n }\r\n\r\n /** */\r\n startCallLoop(interval: number) {\r\n if (this.isLooping()) {\r\n this.stopCallLoop();\r\n }\r\n this._intervalId = setInterval(async () => {\r\n //console.log(\"Requesting network info...\");\r\n const res = await this.callNetworkMetrics();\r\n for (const callback of this._callbacks) {\r\n callback(res);\r\n }\r\n }, interval);\r\n }\r\n\r\n\r\n /** */\r\n addCallback(callback: (n: NetworkMetrics) => void) {\r\n this._callbacks.push(callback);\r\n }\r\n\r\n /** */\r\n clearAllCallbacks() {\r\n this._callbacks = [];\r\n }\r\n\r\n /** */\r\n stopCallLoop() {\r\n clearInterval(this._intervalId);\r\n this._intervalId = undefined;\r\n }\r\n\r\n\r\n /** */\r\n clear() {\r\n this._networkMetricsLogs.clear();\r\n }\r\n\r\n\r\n /** */\r\n async callNetworkMetrics(): Promise<NetworkMetrics> {\r\n if (!this.cellAddr) {\r\n throw Promise.reject(\"callNetworkMetrics() aborted. cellAddr not specified.\");\r\n }\r\n /* Call networkInfo */\r\n const response = await this.appProxy.dumpNetworkMetrics({\r\n dna_hash: this.cellAddr.dnaId.hash,\r\n include_dht_summary: true, // ???\r\n } as DumpNetworkMetricsRequest);\r\n if (!response || !response[this.cellAddr.dnaId.b64]) {\r\n throw Promise.reject(\"No network metrics response for dna\");\r\n }\r\n /* Store */\r\n const dnaResp = response[this.cellAddr.dnaId.b64]!;\r\n this._lastTimeQueried = Date.now();\r\n this._networkMetricsLogs.add([this._lastTimeQueried, dnaResp]);\r\n /** */\r\n return dnaResp;\r\n }\r\n\r\n\r\n /** */\r\n dumpNetworkMetricsLogs(n?: number) {\r\n console.log(`dumpNetworkMetricsLogs()`, this.cellAddr);\r\n if (!this.cellAddr) {\r\n throw Promise.reject(\"dumpNetworkMetricsLogs() aborted. cellAddr not specified.\");\r\n }\r\n const nn = n? n : this._networkMetricsLogs.getBufferLength();\r\n let logs = this._networkMetricsLogs.getLastN(nn).map(([ts, metrics]) => {\r\n if (metrics.local_agents.length == 0) {\r\n throw Error(\"No local agents found in NetworkMetrics\");\r\n }\r\n if (metrics.local_agents.length == 0) {\r\n console.warn(\"dumpNetworkMetricsLogs() More than one local_agent found\");\r\n }\r\n const local_agent = metrics.local_agents[0]!;\r\n return {\r\n //ts,\r\n ts: prettyDate(new Date(ts)),\r\n current_arc: arc_size(local_agent.storage_arc),\r\n target_arc: arc_size(local_agent.target_arc),\r\n peers: Object.keys(metrics.gossip_state_summary.peer_meta).length,\r\n //total_peers: Object.keys(metrics.gossip_state_summary.peer_meta).length,\r\n rounds: metrics.gossip_state_summary.accepted_rounds.length,\r\n pending_requests: count_pending_requests(metrics.fetch_state_summary),\r\n }\r\n })\r\n console.table(logs);\r\n }\r\n}\r\n\r\n\r\n/** */\r\nfunction count_pending_requests(fetchSummary: FetchStateSummary): number {\r\n let total = 0;\r\n for (const peerUrls of Object.values(fetchSummary.pending_requests)) {\r\n total += peerUrls.length;\r\n }\r\n return total;\r\n}\r\n\r\n\r\n/** */\r\nfunction arc_size(arc: DhtArc): number {\r\n if (arc == null) {\r\n return 0;\r\n }\r\n return arc[1] - arc[0];\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"NetworkCaller.js","sourceRoot":"","sources":["../src/NetworkCaller.ts"],"names":[],"mappings":"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","sourcesContent":["import {AppProxy, CellAddress, prettyDate, RingBuffer} from \"@ddd-qc/cell-proxy\";\r\nimport {DhtArc, DumpNetworkMetricsRequest, FetchStateSummary, NetworkMetrics, Timestamp} from \"@holochain/client\";\r\nimport {TransportStats} from \"@holochain/client/lib/api/admin/types\";\r\n\r\ntype NetworkInfoCb = (info:NetworkMetrics, m: TransportStats) => void;\r\n\r\n\r\n/**\r\n * Class handling network info calling and result storing\r\n */\r\nexport class NetworkCaller {\r\n\r\n /** */\r\n constructor(private appProxy: AppProxy, private cellAddr?: CellAddress) {\r\n // N/A\r\n }\r\n\r\n\r\n private _lastTimeQueried: Timestamp = 0;\r\n private _networkMetricsLogs: RingBuffer<[Timestamp, NetworkMetrics]> = new RingBuffer(50);\r\n private _networkStatsLogs: RingBuffer<[Timestamp, TransportStats]> = new RingBuffer(50);\r\n\r\n\r\n private _intervalId: any | undefined = undefined;\r\n\r\n private _callbacks: NetworkInfoCb[] = [];\r\n\r\n /** -- Getters & Setters -- */\r\n\r\n setCellAddr(cellAddr: CellAddress) { this.cellAddr = cellAddr};\r\n\r\n setCapacity(n: number) {\r\n this._networkMetricsLogs.resize(n);\r\n this._networkStatsLogs.resize(n);\r\n }\r\n\r\n get networkMetricsLogs(): [Timestamp, NetworkMetrics][] {return this._networkMetricsLogs.toArray();}\r\n\r\n get networkStatsLogs(): [Timestamp, TransportStats][] {return this._networkStatsLogs.toArray();}\r\n\r\n\r\n /** -- Methods -- */\r\n\r\n /** */\r\n isLooping(): boolean {\r\n const isUnd = this._intervalId === undefined;\r\n return !isUnd;\r\n }\r\n\r\n /** */\r\n startCallLoop(interval: number) {\r\n if (this.isLooping()) {\r\n this.stopCallLoop();\r\n }\r\n this._intervalId = setInterval(async () => {\r\n //console.log(\"Requesting network info...\");\r\n const res = await this.callNetworkMetrics();\r\n const res2 = await this.callNetworkStats();\r\n for (const callback of this._callbacks) {\r\n callback(res, res2);\r\n }\r\n }, interval);\r\n }\r\n\r\n\r\n /** */\r\n addCallback(callback: (n: NetworkMetrics, m: TransportStats) => void) {\r\n this._callbacks.push(callback);\r\n }\r\n\r\n /** */\r\n clearAllCallbacks() {\r\n this._callbacks = [];\r\n }\r\n\r\n /** */\r\n stopCallLoop() {\r\n clearInterval(this._intervalId);\r\n this._intervalId = undefined;\r\n }\r\n\r\n\r\n /** */\r\n clear() {\r\n this._networkMetricsLogs.clear();\r\n this._networkStatsLogs.clear();\r\n }\r\n\r\n\r\n /** */\r\n async callNetworkMetrics(): Promise<NetworkMetrics> {\r\n if (!this.cellAddr) {\r\n throw Promise.reject(\"callNetworkMetrics() aborted. cellAddr not specified.\");\r\n }\r\n /* Call networkInfo */\r\n const request: DumpNetworkMetricsRequest = {\r\n dna_hash: this.cellAddr.dnaId.hash,\r\n include_dht_summary: true, // ???\r\n };\r\n const response = await this.appProxy.dumpNetworkMetrics(request);\r\n if (!response || !response[this.cellAddr.dnaId.b64]) {\r\n throw Promise.reject(\"No network metrics response for dna\");\r\n }\r\n /* Store */\r\n const dnaResp = response[this.cellAddr.dnaId.b64]!;\r\n this._lastTimeQueried = Date.now();\r\n this._networkMetricsLogs.add([this._lastTimeQueried, dnaResp]);\r\n /** */\r\n return dnaResp;\r\n }\r\n\r\n\r\n /** */\r\n dumpNetworkMetricsLogs(n?: number) {\r\n console.log(`dumpNetworkMetricsLogs()`, this.cellAddr);\r\n if (!this.cellAddr) {\r\n throw Error(\"dumpNetworkMetricsLogs() aborted. cellAddr not specified.\");\r\n }\r\n const nn = n? n : this._networkMetricsLogs.getBufferLength();\r\n let logs = this._networkMetricsLogs.getLastN(nn).map(([ts, metrics]) => {\r\n if (metrics.local_agents.length == 0) {\r\n throw Error(\"No local agents found in NetworkMetrics\");\r\n }\r\n if (metrics.local_agents.length == 0) {\r\n console.warn(\"dumpNetworkMetricsLogs() More than one local_agent found\");\r\n }\r\n const local_agent = metrics.local_agents[0]!;\r\n return {\r\n //ts,\r\n ts: prettyDate(new Date(ts)),\r\n current_arc: arc_size(local_agent.storage_arc),\r\n target_arc: arc_size(local_agent.target_arc),\r\n peers: Object.keys(metrics.gossip_state_summary.peer_meta).length,\r\n //total_peers: Object.keys(metrics.gossip_state_summary.peer_meta).length,\r\n rounds: metrics.gossip_state_summary.accepted_rounds.length,\r\n pending_requests: count_pending_requests(metrics.fetch_state_summary),\r\n }\r\n })\r\n console.table(logs);\r\n }\r\n\r\n /** */\r\n async callNetworkStats(): Promise<TransportStats> {\r\n const response = await this.appProxy.dumpNetworkStats();\r\n if (!response) {\r\n throw Promise.reject(\"No network stats response for dna\");\r\n }\r\n /* Store */\r\n this._networkStatsLogs.add([this._lastTimeQueried, response]);\r\n /** */\r\n return response;\r\n }\r\n\r\n\r\n /** */\r\n dumpNetworkStatsLogs(n?: number) {\r\n console.log(`dumpNetworkStatsLogs()`);\r\n const nn = n ? n : this._networkStatsLogs.getBufferLength();\r\n this._networkStatsLogs.getLastN(nn).map(([ts, stats]) => {\r\n console.log(`[${prettyDate(new Date(ts))}] Backend: ${stats.backend} ; Peers: ${stats.peer_urls.length}`);\r\n const logs = stats.connections.map((connection) => {\r\n return connection;\r\n });\r\n console.table(logs);\r\n });\r\n }\r\n\r\n}\r\n\r\n\r\n/** */\r\nfunction count_pending_requests(fetchSummary: FetchStateSummary): number {\r\n let total = 0;\r\n for (const peerUrls of Object.values(fetchSummary.pending_requests)) {\r\n total += peerUrls.length;\r\n }\r\n return total;\r\n}\r\n\r\n\r\n/** */\r\nfunction arc_size(arc: DhtArc): number {\r\n if (arc == null) {\r\n return 0;\r\n }\r\n return arc[1] - arc[0];\r\n}\r\n"]}
|
package/dist/globals.js
CHANGED
|
@@ -18,7 +18,7 @@ export var HappBuildModeType;
|
|
|
18
18
|
export function isHappBuildMode(value) {
|
|
19
19
|
return Object.values(HappBuildModeType).includes(value);
|
|
20
20
|
}
|
|
21
|
-
console.log("[lit-happ]
|
|
21
|
+
console.log("[lit-happ] Initializing LIT-HAPP global consts", window);
|
|
22
22
|
const maybeElectronApi = 'electronBridge' in window ? window.electronBridge : undefined;
|
|
23
23
|
let happEnv;
|
|
24
24
|
try {
|
|
@@ -72,9 +72,7 @@ export let HAPP_ELECTRON_API = maybeElectronApi;
|
|
|
72
72
|
console.log("[lit-happ] HAPP_BUILD_MODE =", HAPP_BUILD_MODE);
|
|
73
73
|
console.log("[lit-happ] HAPP_ENV =", HAPP_ENV);
|
|
74
74
|
if (HAPP_ELECTRON_API) {
|
|
75
|
-
console.log("[lit-happ] HAPP_ELECTRON_API
|
|
75
|
+
console.log("[lit-happ] HAPP_ELECTRON_API =", HAPP_ENV);
|
|
76
76
|
}
|
|
77
|
-
console.log("[lit-happ]
|
|
78
|
-
console.log("[lit-happ] HC_ADMIN_PORT =", process.env.HC_ADMIN_PORT);
|
|
79
|
-
console.log("[lit-happ] Initializaing LIT-HAPP global consts - DONE");
|
|
77
|
+
console.log("[lit-happ] Initializing LIT-HAPP global consts - DONE");
|
|
80
78
|
//# sourceMappingURL=globals.js.map
|
package/dist/globals.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"globals.js","sourceRoot":"","sources":["../src/globals.ts"],"names":[],"mappings":"AAEA,MAAM,CAAN,IAAY,WAMX;AAND,WAAY,WAAW;IACnB,kCAAuB,CAAA;IACvB,wBAAkB,CAAA;IAClB,sCAAyB,CAAA;IACzB,oCAAwB,CAAA;IACxB,4BAAoB,CAAA;AACxB,CAAC,EANW,WAAW,KAAX,WAAW,QAMtB;AAED,MAAM,UAAU,SAAS,CAAC,KAAU;IAChC,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AAGD,MAAM,CAAN,IAAY,iBAIX;AAJD,WAAY,iBAAiB;IACzB,oCAAiB,CAAA;IACjB,wCAAmB,CAAA;IACnB,sCAAkB,CAAA;AACtB,CAAC,EAJW,iBAAiB,KAAjB,iBAAiB,QAI5B;AAED,MAAM,UAAU,eAAe,CAAC,KAAU;IACtC,OAAO,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAKD,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"globals.js","sourceRoot":"","sources":["../src/globals.ts"],"names":[],"mappings":"AAEA,MAAM,CAAN,IAAY,WAMX;AAND,WAAY,WAAW;IACnB,kCAAuB,CAAA;IACvB,wBAAkB,CAAA;IAClB,sCAAyB,CAAA;IACzB,oCAAwB,CAAA;IACxB,4BAAoB,CAAA;AACxB,CAAC,EANW,WAAW,KAAX,WAAW,QAMtB;AAED,MAAM,UAAU,SAAS,CAAC,KAAU;IAChC,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AAGD,MAAM,CAAN,IAAY,iBAIX;AAJD,WAAY,iBAAiB;IACzB,oCAAiB,CAAA;IACjB,wCAAmB,CAAA;IACnB,sCAAkB,CAAA;AACtB,CAAC,EAJW,iBAAiB,KAAjB,iBAAiB,QAI5B;AAED,MAAM,UAAU,eAAe,CAAC,KAAU;IACtC,OAAO,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAKD,OAAO,CAAC,GAAG,CAAC,gDAAgD,EAAE,MAAM,CAAC,CAAC;AAEtE,MAAM,gBAAgB,GAAG,gBAAgB,IAAI,MAAM,CAAA,CAAC,CAAC,MAAM,CAAC,cAAqB,CAAC,CAAC,CAAC,SAAS,CAAC;AAG9F,IAAI,OAAoB,CAAC;AACzB,IAAI;IACA,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAuB,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,gDAAgD,OAAO,GAAG,CAAC,CAAC;CAC3E;AAAC,OAAO,CAAC,EAAE;IAER,IAAI,gBAAgB,EAAE;QAClB,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC;QAC/B,OAAO,CAAC,GAAG,CAAC,2BAA2B,WAAW,CAAC,QAAQ,GAAG,CAAC,CAAC;KACnE;SAAM;QAEH,MAAM,MAAM,GAAG,OAAO,IAAI,MAAM,CAAA,CAAC,CAAC,MAAM,CAAC,KAAgB,CAAC,CAAC,CAAC,KAAK,CAAC;QAClE,IAAI,MAAM,EAAE;YACR,OAAO,GAAG,WAAW,CAAC,EAAE,CAAC;SAC5B;aAAM;YAGH,MAAM,QAAQ,GAAG,KAAK,CAAC;YACvB,IAAI,QAAQ,EAAE;gBACV,OAAO,GAAG,WAAW,CAAC,IAAI,CAAC;aAC9B;iBAAM;gBAEH,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC;aACjC;SACJ;KACJ;CACJ;AAGD,IAAI,SAAS,GAAsB,iBAAiB,CAAC,MAAM,CAAC;AAC5D,IAAI,gBAAgB,EAAE;IAClB,SAAS,GAAG,gBAAgB,CAAC,UAAU,CAAC;CAC3C;KAAM;IACH,IAAI;QACA,IAAI,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE;YAC7B,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,eAAoC,CAAC;SAChE;KACJ;IAAC,OAAO,CAAC,EAAE;QACT,OAAO,CAAC,GAAG,CAAC,0DAA0D,iBAAiB,CAAC,MAAM,GAAG,CAAC,CAAC;KACrG;CACJ;AAED,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE;IAC7B,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,SAAS,CAAC,CAAC;CAC9D;AAED,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,OAAO,CAAC,CAAC;CAC1D;AAGD,MAAM,CAAC,IAAI,eAAe,GAAG,SAAS,CAAC;AACvC,MAAM,CAAC,IAAI,QAAQ,GAAG,OAAO,CAAC;AAC9B,MAAM,CAAC,IAAI,iBAAiB,GAAG,gBAAgB,CAAC;AAEhD,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,eAAe,CAAC,CAAA;AAC7D,OAAO,CAAC,GAAG,CAAC,+BAA+B,EAAE,QAAQ,CAAC,CAAC;AACvD,IAAI,iBAAiB,EAAE;IACnB,OAAO,CAAC,GAAG,CAAC,mCAAmC,EAAE,QAAQ,CAAC,CAAC;CAC9D;AAED,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAA","sourcesContent":["\n/** */\nexport enum HappEnvType {\n Browser = \"Browser\", // default value\n We = \"We\", // if window.IN_WE defined\n BrowserWe = \"BrowserWe\", // Testing we-applet in browser\n Electron = \"Electron\", // if window.electronBridge is defined\n Holo = \"Holo\", // ???\n}\n\nexport function isHappEnv(value: any): value is HappEnvType {\n return Object.values(HappEnvType).includes(value);\n}\n\n/** */\nexport enum HappBuildModeType {\n Debug = \"Debug\", // logs\n Release = \"Release\", // logs & optimization\n Retail = \"Retail\", // optimization (default)\n}\n\nexport function isHappBuildMode(value: any): value is HappBuildModeType {\n return Object.values(HappBuildModeType).includes(value);\n}\n\n\n/** INIT GLOBAL CONSTS */\n\nconsole.log(\"[lit-happ] Initializing LIT-HAPP global consts\", window);\n\nconst maybeElectronApi = 'electronBridge' in window? window.electronBridge as any : undefined;\n\n/** Determine HappEnv */\nlet happEnv: HappEnvType;\ntry {\n happEnv = process.env.HAPP_ENV as HappEnvType;\n console.log(`[lit-happ] HAPP_ENV defined by process.ENV: \"${happEnv}\"`);\n} catch (e) {\n /** Looking for Electron */\n if (maybeElectronApi) {\n happEnv = HappEnvType.Electron;\n console.log(`[lit-happ] HAPP_ENV is \"${HappEnvType.Electron}\"`);\n } else {\n /** Looking for We */\n const isInWe = 'IN_WE' in window? window.IN_WE as boolean : false;\n if (isInWe) {\n happEnv = HappEnvType.We;\n } else {\n /** Looking for Holo */\n // FIXME\n const isInHolo = false;\n if (isInHolo) {\n happEnv = HappEnvType.Holo;\n } else {\n /** Default to prod */\n happEnv = HappEnvType.Browser;\n }\n }\n }\n}\n\n/** Determine BuildMode */\nlet buildMode: HappBuildModeType = HappBuildModeType.Retail;\nif (maybeElectronApi) {\n buildMode = maybeElectronApi.BUILD_MODE;\n} else {\n try {\n if (process.env.HAPP_BUILD_MODE) {\n buildMode = process.env.HAPP_BUILD_MODE as HappBuildModeType;\n }\n } catch (e) {\n console.log(`[lit-happ] HAPP_BUILD_MODE not defined. Defaulting to \"${HappBuildModeType.Retail}\"`);\n }\n}\n\nif (!isHappBuildMode(buildMode)) {\n console.error(\"[lit-happ] buildMode not valid\", buildMode);\n}\n\nif (!isHappEnv(happEnv)) {\n console.error(\"[lit-happ] happEnv not valid\", happEnv);\n}\n\n/** export result */\nexport let HAPP_BUILD_MODE = buildMode;\nexport let HAPP_ENV = happEnv;\nexport let HAPP_ELECTRON_API = maybeElectronApi;\n\nconsole.log(\"[lit-happ] HAPP_BUILD_MODE =\", HAPP_BUILD_MODE)\nconsole.log(\"[lit-happ] HAPP_ENV =\", HAPP_ENV);\nif (HAPP_ELECTRON_API) {\n console.log(\"[lit-happ] HAPP_ELECTRON_API =\", HAPP_ENV);\n}\n\nconsole.log(\"[lit-happ] Initializing LIT-HAPP global consts - DONE\")\n\n\n/** Remove console.log() in PROD */\n// FIXME\n// if (HAPP_BUILD_MODE === 'prod') {\n// console.log(\"console.log() disabled\");\n// console.log = () => {};\n// }\n"]}
|