ugly-app 0.1.716 → 0.1.717
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/cli/version.d.ts +1 -1
- package/dist/cli/version.js +1 -1
- package/dist/inspect/index.d.ts +1 -0
- package/dist/inspect/index.d.ts.map +1 -1
- package/dist/inspect/index.js +1 -0
- package/dist/inspect/index.js.map +1 -1
- package/dist/inspect/selfHost.d.ts +20 -0
- package/dist/inspect/selfHost.d.ts.map +1 -0
- package/dist/inspect/selfHost.js +38 -0
- package/dist/inspect/selfHost.js.map +1 -0
- package/package.json +1 -1
- package/src/cli/version.ts +1 -1
- package/src/inspect/index.ts +6 -0
- package/src/inspect/selfHost.test.ts +59 -0
- package/src/inspect/selfHost.ts +58 -0
package/dist/cli/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CLI_VERSION = "0.1.
|
|
1
|
+
export declare const CLI_VERSION = "0.1.717";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/dist/cli/version.js
CHANGED
package/dist/inspect/index.d.ts
CHANGED
|
@@ -3,4 +3,5 @@ export type { AgentEvents, AgentMeta, InspectAgent } from './agent/types.js';
|
|
|
3
3
|
export { createInspectAgent, installInspectAgent } from './agent/install.js';
|
|
4
4
|
export { InspectClient, type InspectTransport } from './client.js';
|
|
5
5
|
export { buildTarget, dispatchToAgent, HOST_ONLY_CHANNELS } from './dispatch.js';
|
|
6
|
+
export { createSelfInspectHost, SELF_TARGET_ID, type SelfInspectHost, type SelfInspectHostOpts, } from './selfHost.js';
|
|
6
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/inspect/index.ts"],"names":[],"mappings":"AAIA,cAAc,eAAe,CAAC;AAC9B,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/inspect/index.ts"],"names":[],"mappings":"AAIA,cAAc,eAAe,CAAC;AAC9B,YAAY,EAAE,WAAW,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,cAAc,EACd,KAAK,eAAe,EACpB,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAC"}
|
package/dist/inspect/index.js
CHANGED
|
@@ -5,4 +5,5 @@ export * from './protocol.js';
|
|
|
5
5
|
export { createInspectAgent, installInspectAgent } from './agent/install.js';
|
|
6
6
|
export { InspectClient } from './client.js';
|
|
7
7
|
export { buildTarget, dispatchToAgent, HOST_ONLY_CHANNELS } from './dispatch.js';
|
|
8
|
+
export { createSelfInspectHost, SELF_TARGET_ID, } from './selfHost.js';
|
|
8
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/inspect/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,6EAA6E;AAC7E,+EAA+E;AAE/E,cAAc,eAAe,CAAC;AAE9B,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAyB,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/inspect/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,6EAA6E;AAC7E,+EAA+E;AAE/E,cAAc,eAAe,CAAC;AAE9B,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAyB,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACjF,OAAO,EACL,qBAAqB,EACrB,cAAc,GAGf,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { InspectPlatform, Screenshot, ScreenshotRequest } from './protocol.js';
|
|
2
|
+
/** The id this host reports for its single (self) target. */
|
|
3
|
+
export declare const SELF_TARGET_ID = "self";
|
|
4
|
+
export interface SelfInspectHostOpts {
|
|
5
|
+
platform: InspectPlatform;
|
|
6
|
+
/** Screenshot delegate — on mobile this calls native (WKWebView.takeSnapshot /
|
|
7
|
+
* Android PixelCopy) via the uglyNative `capture.screenshot` channel. */
|
|
8
|
+
screenshot?: (req: ScreenshotRequest) => Promise<Screenshot>;
|
|
9
|
+
/** Forward live agent events to the proxy connection. Event names are the
|
|
10
|
+
* per-target dynamic form (`inspect.console:self`, `inspect.network:self`,
|
|
11
|
+
* `inspect.picked:self`). */
|
|
12
|
+
onEvent?: (event: string, data: unknown) => void;
|
|
13
|
+
}
|
|
14
|
+
export interface SelfInspectHost {
|
|
15
|
+
/** Route one inspect.* channel (targetId is ignored — there is only `self`). */
|
|
16
|
+
dispatch(channel: string, payload?: Record<string, unknown>): Promise<unknown>;
|
|
17
|
+
stop(): void;
|
|
18
|
+
}
|
|
19
|
+
export declare function createSelfInspectHost(opts: SelfInspectHostOpts): SelfInspectHost;
|
|
20
|
+
//# sourceMappingURL=selfHost.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selfHost.d.ts","sourceRoot":"","sources":["../../src/inspect/selfHost.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,eAAe,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEpF,6DAA6D;AAC7D,eAAO,MAAM,cAAc,SAAS,CAAC;AAErC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,eAAe,CAAC;IAC1B;8EAC0E;IAC1E,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7D;;kCAE8B;IAC9B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CAClD;AAED,MAAM,WAAW,eAAe;IAC9B,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/E,IAAI,IAAI,IAAI,CAAC;CACd;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,mBAAmB,GAAG,eAAe,CAuBhF"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// A single-page inspect host: answers inspect.* for the CURRENT page only,
|
|
2
|
+
// routing to the in-page agent. This is the building block for shells that have
|
|
3
|
+
// no native cross-tab host — chiefly the MOBILE SPA (iOS WKWebView / Android
|
|
4
|
+
// WebView), where the whole proxy stack lives in the webview JS (browser
|
|
5
|
+
// RTCPeerConnection) and there is exactly one inspectable page: itself.
|
|
6
|
+
//
|
|
7
|
+
// The transport that connects a remote inspector to this host (the SPA acting
|
|
8
|
+
// as an MSK-authenticated proxy host) is shell-specific and wired separately;
|
|
9
|
+
// this module is just the platform-agnostic dispatch + target it answers with.
|
|
10
|
+
import { installInspectAgent } from './agent/install.js';
|
|
11
|
+
import { buildTarget, dispatchToAgent } from './dispatch.js';
|
|
12
|
+
/** The id this host reports for its single (self) target. */
|
|
13
|
+
export const SELF_TARGET_ID = 'self';
|
|
14
|
+
export function createSelfInspectHost(opts) {
|
|
15
|
+
const agent = installInspectAgent({
|
|
16
|
+
onConsole: (e) => opts.onEvent?.(`inspect.console:${SELF_TARGET_ID}`, e),
|
|
17
|
+
onNetwork: (e) => opts.onEvent?.(`inspect.network:${SELF_TARGET_ID}`, e),
|
|
18
|
+
onPicked: (p) => opts.onEvent?.(`inspect.picked:${SELF_TARGET_ID}`, p),
|
|
19
|
+
});
|
|
20
|
+
return {
|
|
21
|
+
async dispatch(channel, payload = {}) {
|
|
22
|
+
if (channel === 'inspect.listTargets') {
|
|
23
|
+
return { targets: [buildTarget(SELF_TARGET_ID, opts.platform, agent.meta())] };
|
|
24
|
+
}
|
|
25
|
+
if (channel === 'inspect.screenshot') {
|
|
26
|
+
if (!opts.screenshot)
|
|
27
|
+
throw new Error('inspect.screenshot: no native capture on this shell');
|
|
28
|
+
return opts.screenshot({ ...payload, targetId: SELF_TARGET_ID });
|
|
29
|
+
}
|
|
30
|
+
// Everything else is an agent method (targetId stripped — there is only self).
|
|
31
|
+
return dispatchToAgent(agent, channel, payload);
|
|
32
|
+
},
|
|
33
|
+
stop() {
|
|
34
|
+
agent.stop();
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=selfHost.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"selfHost.js","sourceRoot":"","sources":["../../src/inspect/selfHost.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,gFAAgF;AAChF,6EAA6E;AAC7E,yEAAyE;AACzE,wEAAwE;AACxE,EAAE;AACF,8EAA8E;AAC9E,8EAA8E;AAC9E,+EAA+E;AAE/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAG7D,6DAA6D;AAC7D,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC;AAmBrC,MAAM,UAAU,qBAAqB,CAAC,IAAyB;IAC7D,MAAM,KAAK,GAAG,mBAAmB,CAAC;QAChC,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,mBAAmB,cAAc,EAAE,EAAE,CAAC,CAAC;QACxE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,mBAAmB,cAAc,EAAE,EAAE,CAAC,CAAC;QACxE,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,kBAAkB,cAAc,EAAE,EAAE,CAAC,CAAC;KACvE,CAAC,CAAC;IAEH,OAAO;QACL,KAAK,CAAC,QAAQ,CAAC,OAAe,EAAE,UAAmC,EAAE;YACnE,IAAI,OAAO,KAAK,qBAAqB,EAAE,CAAC;gBACtC,OAAO,EAAE,OAAO,EAAE,CAAC,WAAW,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YACjF,CAAC;YACD,IAAI,OAAO,KAAK,oBAAoB,EAAE,CAAC;gBACrC,IAAI,CAAC,IAAI,CAAC,UAAU;oBAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;gBAC7F,OAAO,IAAI,CAAC,UAAU,CAAC,EAAE,GAAI,OAAwC,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,CAAC;YACrG,CAAC;YACD,+EAA+E;YAC/E,OAAO,eAAe,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAClD,CAAC;QACD,IAAI;YACF,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ugly-app",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.717",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"comment:files": "Allowlist what ships to npm. dist = runtime; src = sourcemap targets (dist/*.js.map reference ../../src/); templates = CLI scaffold. Everything else at repo root (.pgdata local Postgres, coverage, assets/icons sources, test/, test-results/) is excluded by omission. The !negations strip the scaffold's installed deps + cruft (templates/node_modules is 200MB+ and must never ship). package.json/README/LICENSE ship automatically.",
|
|
6
6
|
"files": [
|
package/src/cli/version.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Auto-generated by prebuild — do not edit manually
|
|
2
|
-
export const CLI_VERSION = "0.1.
|
|
2
|
+
export const CLI_VERSION = "0.1.717";
|
package/src/inspect/index.ts
CHANGED
|
@@ -7,3 +7,9 @@ export type { AgentEvents, AgentMeta, InspectAgent } from './agent/types.js';
|
|
|
7
7
|
export { createInspectAgent, installInspectAgent } from './agent/install.js';
|
|
8
8
|
export { InspectClient, type InspectTransport } from './client.js';
|
|
9
9
|
export { buildTarget, dispatchToAgent, HOST_ONLY_CHANNELS } from './dispatch.js';
|
|
10
|
+
export {
|
|
11
|
+
createSelfInspectHost,
|
|
12
|
+
SELF_TARGET_ID,
|
|
13
|
+
type SelfInspectHost,
|
|
14
|
+
type SelfInspectHostOpts,
|
|
15
|
+
} from './selfHost.js';
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
// @vitest-environment jsdom
|
|
2
|
+
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
3
|
+
import { createSelfInspectHost, SELF_TARGET_ID } from './selfHost.js';
|
|
4
|
+
import type { Screenshot } from './protocol.js';
|
|
5
|
+
|
|
6
|
+
afterEach(() => {
|
|
7
|
+
// Reset the singleton agent between tests.
|
|
8
|
+
delete (window as { __uglyInspectAgent?: unknown }).__uglyInspectAgent;
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
describe('createSelfInspectHost', () => {
|
|
12
|
+
it('lists exactly one target (self) with the given platform', async () => {
|
|
13
|
+
document.title = 'Mobile App';
|
|
14
|
+
const host = createSelfInspectHost({ platform: 'ios' });
|
|
15
|
+
const res = (await host.dispatch('inspect.listTargets')) as { targets: { id: string; platform: string }[] };
|
|
16
|
+
expect(res.targets).toHaveLength(1);
|
|
17
|
+
expect(res.targets[0].id).toBe(SELF_TARGET_ID);
|
|
18
|
+
expect(res.targets[0].platform).toBe('ios');
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it('routes inspect.eval to the in-page agent', async () => {
|
|
22
|
+
const host = createSelfInspectHost({ platform: 'android' });
|
|
23
|
+
const res = (await host.dispatch('inspect.eval', { expression: '21 * 2' })) as {
|
|
24
|
+
ok: boolean;
|
|
25
|
+
value: { value: number };
|
|
26
|
+
};
|
|
27
|
+
expect(res.ok).toBe(true);
|
|
28
|
+
expect(res.value.value).toBe(42);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('captures the DOM via the agent', async () => {
|
|
32
|
+
document.body.innerHTML = '<main id="x">hi</main>';
|
|
33
|
+
const host = createSelfInspectHost({ platform: 'ios' });
|
|
34
|
+
const snap = (await host.dispatch('inspect.dom.capture')) as { root: { nodeName: string } };
|
|
35
|
+
expect(snap.root.nodeName).toBe('HTML');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it('delegates inspect.screenshot to the native capture callback', async () => {
|
|
39
|
+
const shot: Screenshot = { base64: 'AAAA', width: 390, height: 844, dpr: 3, format: 'png' };
|
|
40
|
+
const capture = vi.fn(async () => shot);
|
|
41
|
+
const host = createSelfInspectHost({ platform: 'ios', screenshot: capture });
|
|
42
|
+
const res = await host.dispatch('inspect.screenshot', { fullPage: true });
|
|
43
|
+
expect(res).toEqual(shot);
|
|
44
|
+
expect(capture).toHaveBeenCalledWith(expect.objectContaining({ targetId: SELF_TARGET_ID, fullPage: true }));
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
it('errors on screenshot when no native capture is provided', async () => {
|
|
48
|
+
const host = createSelfInspectHost({ platform: 'web' });
|
|
49
|
+
await expect(host.dispatch('inspect.screenshot', {})).rejects.toThrow(/no native capture/);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it('forwards live console events under the self event name', async () => {
|
|
53
|
+
const events: { event: string; data: unknown }[] = [];
|
|
54
|
+
createSelfInspectHost({ platform: 'android', onEvent: (event, data) => events.push({ event, data }) });
|
|
55
|
+
console.log('streamed-line');
|
|
56
|
+
const consoleEvt = events.find((e) => e.event === `inspect.console:${SELF_TARGET_ID}`);
|
|
57
|
+
expect(consoleEvt).toBeTruthy();
|
|
58
|
+
});
|
|
59
|
+
});
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// A single-page inspect host: answers inspect.* for the CURRENT page only,
|
|
2
|
+
// routing to the in-page agent. This is the building block for shells that have
|
|
3
|
+
// no native cross-tab host — chiefly the MOBILE SPA (iOS WKWebView / Android
|
|
4
|
+
// WebView), where the whole proxy stack lives in the webview JS (browser
|
|
5
|
+
// RTCPeerConnection) and there is exactly one inspectable page: itself.
|
|
6
|
+
//
|
|
7
|
+
// The transport that connects a remote inspector to this host (the SPA acting
|
|
8
|
+
// as an MSK-authenticated proxy host) is shell-specific and wired separately;
|
|
9
|
+
// this module is just the platform-agnostic dispatch + target it answers with.
|
|
10
|
+
|
|
11
|
+
import { installInspectAgent } from './agent/install.js';
|
|
12
|
+
import { buildTarget, dispatchToAgent } from './dispatch.js';
|
|
13
|
+
import type { InspectPlatform, Screenshot, ScreenshotRequest } from './protocol.js';
|
|
14
|
+
|
|
15
|
+
/** The id this host reports for its single (self) target. */
|
|
16
|
+
export const SELF_TARGET_ID = 'self';
|
|
17
|
+
|
|
18
|
+
export interface SelfInspectHostOpts {
|
|
19
|
+
platform: InspectPlatform;
|
|
20
|
+
/** Screenshot delegate — on mobile this calls native (WKWebView.takeSnapshot /
|
|
21
|
+
* Android PixelCopy) via the uglyNative `capture.screenshot` channel. */
|
|
22
|
+
screenshot?: (req: ScreenshotRequest) => Promise<Screenshot>;
|
|
23
|
+
/** Forward live agent events to the proxy connection. Event names are the
|
|
24
|
+
* per-target dynamic form (`inspect.console:self`, `inspect.network:self`,
|
|
25
|
+
* `inspect.picked:self`). */
|
|
26
|
+
onEvent?: (event: string, data: unknown) => void;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export interface SelfInspectHost {
|
|
30
|
+
/** Route one inspect.* channel (targetId is ignored — there is only `self`). */
|
|
31
|
+
dispatch(channel: string, payload?: Record<string, unknown>): Promise<unknown>;
|
|
32
|
+
stop(): void;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function createSelfInspectHost(opts: SelfInspectHostOpts): SelfInspectHost {
|
|
36
|
+
const agent = installInspectAgent({
|
|
37
|
+
onConsole: (e) => opts.onEvent?.(`inspect.console:${SELF_TARGET_ID}`, e),
|
|
38
|
+
onNetwork: (e) => opts.onEvent?.(`inspect.network:${SELF_TARGET_ID}`, e),
|
|
39
|
+
onPicked: (p) => opts.onEvent?.(`inspect.picked:${SELF_TARGET_ID}`, p),
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
async dispatch(channel: string, payload: Record<string, unknown> = {}): Promise<unknown> {
|
|
44
|
+
if (channel === 'inspect.listTargets') {
|
|
45
|
+
return { targets: [buildTarget(SELF_TARGET_ID, opts.platform, agent.meta())] };
|
|
46
|
+
}
|
|
47
|
+
if (channel === 'inspect.screenshot') {
|
|
48
|
+
if (!opts.screenshot) throw new Error('inspect.screenshot: no native capture on this shell');
|
|
49
|
+
return opts.screenshot({ ...(payload as unknown as ScreenshotRequest), targetId: SELF_TARGET_ID });
|
|
50
|
+
}
|
|
51
|
+
// Everything else is an agent method (targetId stripped — there is only self).
|
|
52
|
+
return dispatchToAgent(agent, channel, payload);
|
|
53
|
+
},
|
|
54
|
+
stop() {
|
|
55
|
+
agent.stop();
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|