ds-harness-remote 0.4.1 → 0.4.3
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 +35 -11
- package/cordis.patch.yml +3 -0
- package/dist/client-runtime.d.ts +28 -0
- package/dist/client-runtime.d.ts.map +1 -1
- package/dist/client-runtime.js +327 -5
- package/dist/client-runtime.js.map +1 -1
- package/dist/client-secure-transport.d.ts.map +1 -1
- package/dist/client-secure-transport.js +9 -2
- package/dist/client-secure-transport.js.map +1 -1
- package/dist/client.github.js +167 -48
- package/dist/client.js +167 -48
- package/dist/client.js.map +1 -1
- package/dist/codex/app-server.d.ts +71 -0
- package/dist/codex/app-server.d.ts.map +1 -0
- package/dist/codex/app-server.js +268 -0
- package/dist/codex/app-server.js.map +1 -0
- package/dist/codex/domain.d.ts +82 -0
- package/dist/codex/domain.d.ts.map +1 -0
- package/dist/codex/domain.js +893 -0
- package/dist/codex/domain.js.map +1 -0
- package/dist/codex/method-policy.d.ts +297 -0
- package/dist/codex/method-policy.d.ts.map +1 -0
- package/dist/codex/method-policy.js +103 -0
- package/dist/codex/method-policy.js.map +1 -0
- package/dist/codex/peer-bridge.d.ts +57 -0
- package/dist/codex/peer-bridge.d.ts.map +1 -0
- package/dist/codex/peer-bridge.js +300 -0
- package/dist/codex/peer-bridge.js.map +1 -0
- package/dist/codex/virtual-harness.d.ts +178 -0
- package/dist/codex/virtual-harness.d.ts.map +1 -0
- package/dist/codex/virtual-harness.js +2515 -0
- package/dist/codex/virtual-harness.js.map +1 -0
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +12 -0
- package/dist/config.js.map +1 -1
- package/dist/control-runtime.d.ts +1 -0
- package/dist/control-runtime.d.ts.map +1 -1
- package/dist/control-runtime.js +22 -0
- package/dist/control-runtime.js.map +1 -1
- package/dist/harness-remote-bridge.d.ts +2 -2
- package/dist/harness-remote-bridge.d.ts.map +1 -1
- package/dist/harness-remote-bridge.js +2 -2
- package/dist/harness-remote-bridge.js.map +1 -1
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8550 -3884
- package/dist/index.js.map +4 -4
- package/dist/remote-typert-gateway.d.ts +1 -1
- package/dist/remote-typert-gateway.d.ts.map +1 -1
- package/dist/remote-typert-gateway.js +9 -2
- package/dist/remote-typert-gateway.js.map +1 -1
- package/dist/rpc-router.d.ts +5 -2
- package/dist/rpc-router.d.ts.map +1 -1
- package/dist/rpc-router.js +30 -1
- package/dist/rpc-router.js.map +1 -1
- package/dist/server-connection.d.ts +1 -0
- package/dist/server-connection.d.ts.map +1 -1
- package/dist/server-connection.js +69 -22
- package/dist/server-connection.js.map +1 -1
- package/dist/service.d.ts +20 -0
- package/dist/service.d.ts.map +1 -1
- package/dist/service.js +58 -2
- package/dist/service.js.map +1 -1
- package/dist/typert-gateway-contract.d.ts +2 -2
- package/dist/typert-gateway-contract.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +19 -23
- package/public.d.ts +4 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type RemoteClientCore } from '@dsh-remote/client-core';
|
|
2
2
|
import type { RemoteTypertGatewayTarget, TypertGatewayRequest, TypertRpcResult } from './typert-gateway-contract.js';
|
|
3
|
-
/** Client-side alpha
|
|
3
|
+
/** Client-side alpha Gateway carrier over the authenticated Remote channel. */
|
|
4
4
|
export declare class RemoteTypertGateway implements RemoteTypertGatewayTarget {
|
|
5
5
|
private readonly client;
|
|
6
6
|
constructor(client: RemoteClientCore);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-typert-gateway.d.ts","sourceRoot":"","sources":["../src/remote-typert-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAWlF,OAAO,KAAK,EACV,yBAAyB,EACzB,oBAAoB,EACpB,eAAe,EAChB,MAAM,8BAA8B,CAAA;AAIrC
|
|
1
|
+
{"version":3,"file":"remote-typert-gateway.d.ts","sourceRoot":"","sources":["../src/remote-typert-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAWlF,OAAO,KAAK,EACV,yBAAyB,EACzB,oBAAoB,EACpB,eAAe,EAChB,MAAM,8BAA8B,CAAA;AAIrC,+EAA+E;AAC/E,qBAAa,mBAAoB,YAAW,yBAAyB;IACvD,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,gBAAgB;IAE/C,MAAM,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC;IAUvD,QAAQ,CACZ,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,eAAe,CAAC;IAiBrB,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;YAoBrF,OAAO;YAmBR,eAAe;CA2D9B"}
|
|
@@ -2,7 +2,7 @@ import { RemoteClientError } from '@dsh-remote/client-core';
|
|
|
2
2
|
import { HARNESS_API_TRANSFER_CHUNK_BYTES, MAX_HARNESS_API_TRANSFER_BYTES, } from '@dsh-remote/protocol';
|
|
3
3
|
import { uuidV7 } from './ids.js';
|
|
4
4
|
const DIRECT_REMOTE_CALL_BYTES = 2 * 1024 * 1024;
|
|
5
|
-
/** Client-side alpha
|
|
5
|
+
/** Client-side alpha Gateway carrier over the authenticated Remote channel. */
|
|
6
6
|
export class RemoteTypertGateway {
|
|
7
7
|
client;
|
|
8
8
|
constructor(client) {
|
|
@@ -209,7 +209,14 @@ function parseRpcResult(value) {
|
|
|
209
209
|
};
|
|
210
210
|
}
|
|
211
211
|
function remoteFailure(failure) {
|
|
212
|
-
|
|
212
|
+
// alpha.2 identifies RemoteError values structurally across bundles and
|
|
213
|
+
// realms. Keep this carrier dependency-free so the same build still runs on
|
|
214
|
+
// older Harness releases, while preserving alpha.2 stream failures at the local mux.
|
|
215
|
+
return Object.assign(new Error(failure.message), {
|
|
216
|
+
isDSHRemoteError: true,
|
|
217
|
+
code: failure.code,
|
|
218
|
+
details: failure.details,
|
|
219
|
+
});
|
|
213
220
|
}
|
|
214
221
|
function bytesToBase64(bytes) {
|
|
215
222
|
let binary = '';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"remote-typert-gateway.js","sourceRoot":"","sources":["../src/remote-typert-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAyB,MAAM,yBAAyB,CAAA;AAClF,OAAO,EACL,gCAAgC,EAChC,8BAA8B,GAM/B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAOjC,MAAM,wBAAwB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAA;AAEhD
|
|
1
|
+
{"version":3,"file":"remote-typert-gateway.js","sourceRoot":"","sources":["../src/remote-typert-gateway.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAyB,MAAM,yBAAyB,CAAA;AAClF,OAAO,EACL,gCAAgC,EAChC,8BAA8B,GAM/B,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AAOjC,MAAM,wBAAwB,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAA;AAEhD,+EAA+E;AAC/E,MAAM,OAAO,mBAAmB;IACD;IAA7B,YAA6B,MAAwB;QAAxB,WAAM,GAAN,MAAM,CAAkB;IAAG,CAAC;IAEzD,KAAK,CAAC,MAAM,CAAC,OAA6B;QACxC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,CAChC,GAAG,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,EAAE,EACxC,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,EACtB,OAAO,CAAC,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC,MAAM,CAC/C,CAAA;QACD,IAAI,MAAM,CAAC,EAAE;YAAE,OAAO,MAAM,CAAC,KAAK,CAAA;QAClC,MAAM,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACnC,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,QAAgB,EAChB,OAAgB,EAChB,MAAmB;QAEnB,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAA;QACrC,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAA;QACjE,IAAI,QAAiB,CAAA;QACrB,IAAI,OAAO,CAAC,UAAU,GAAG,wBAAwB,EAAE,CAAC;YAClD,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACxD,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAU,qBAAqB,EAAE,OAAO,EAAE,MAAM,CAAC,CAAA;YACnF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,oBAAoB,CAAC;oBAAE,MAAM,KAAK,CAAA;gBAC3D,QAAQ,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACxD,CAAC;QACH,CAAC;QACD,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAA;IACjC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,QAAgB,EAAE,OAAgB,EAAE,MAAmB;QAChE,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAA;QACzB,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAA;QACnC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAA;QAC1F,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;YAChD,KAAK,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,kBAAkB,EAAE,6CAA6C,CAAC,CAAC,CAAA;QACtG,CAAC,CAAC,CAAA;QACF,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,CAAA;QACnC,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACzD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,4BAA4B,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,CAAC,CAAA;QAC9F,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAC5C,WAAW,EAAE,CAAA;YACb,gBAAgB,EAAE,CAAA;YAClB,MAAM,KAAK,CAAA;QACb,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,EAAE,OAAO,CAAC,CAAA;IACtF,CAAC;IAEO,KAAK,CAAC,CAAC,OAAO,CACpB,QAAgB,EAChB,KAAsB,EACtB,WAAuB,EACvB,gBAA4B,EAC5B,MAAmB,EACnB,OAAmB;QAEnB,IAAI,CAAC;YACH,KAAK,CAAC,CAAC,KAAK,CAAA;QACd,CAAC;gBAAS,CAAC;YACT,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;YAC5C,WAAW,EAAE,CAAA;YACb,gBAAgB,EAAE,CAAA;YAClB,KAAK,CAAC,KAAK,EAAE,CAAA;YACb,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,6BAA6B,EAAE,EAAE,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;QAC3F,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,eAAe,CAAC,OAAmB,EAAE,MAAmB;QACpE,IAAI,OAAO,CAAC,UAAU,GAAG,8BAA8B,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAA;QAC3E,CAAC;QACD,MAAM,UAAU,GAAG,MAAM,EAAE,CAAA;QAC3B,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,GAAG,gCAAgC,CAAC,CAAA;QACpF,IAAI,MAAM,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,8BAA8B,EAAE;gBACpD,UAAU;gBACV,UAAU,EAAE,OAAO,CAAC,UAAU;gBAC9B,WAAW;aACZ,EAAE,MAAM,CAAC,CAAA;YACV,MAAM,GAAG,IAAI,CAAA;YACb,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,WAAW,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;gBACpD,MAAM,KAAK,GAAG,KAAK,GAAG,gCAAgC,CAAA;gBACtD,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,gCAAgC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC,CAAA;gBAC7G,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,+BAA+B,EAAE;oBACrD,UAAU;oBACV,KAAK;oBACL,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC;iBAC3B,EAAE,MAAM,CAAC,CAAA;YACZ,CAAC;YACD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CACrC,gCAAgC,EAChC,EAAE,UAAU,EAAE,EACd,MAAM,CACP,CAAA;YACD,IAAI,SAAS,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAC,QAAQ,CAAA;YAC1D,IAAI,SAAS,CAAC,UAAU,KAAK,UAAU;mBAClC,SAAS,CAAC,UAAU,IAAI,CAAC;mBACzB,SAAS,CAAC,UAAU,GAAG,8BAA8B;mBACrD,SAAS,CAAC,WAAW,KAAK,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,gCAAgC,CAAC,EAAE,CAAC;gBAClG,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAA;YAC5F,CAAC;YACD,MAAM,aAAa,GAAG,IAAI,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,CAAA;YAC1D,IAAI,MAAM,GAAG,CAAC,CAAA;YACd,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,SAAS,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;gBAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAClC,8BAA8B,EAC9B,EAAE,UAAU,EAAE,KAAK,EAAE,EACrB,MAAM,CACP,CAAA;gBACD,IAAI,MAAM,CAAC,UAAU,KAAK,UAAU,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;oBAC/D,MAAM,IAAI,KAAK,CAAC,yEAAyE,CAAC,CAAA;gBAC5F,CAAC;gBACD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;gBACxC,MAAM,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,gCAAgC,EAAE,SAAS,CAAC,UAAU,GAAG,MAAM,CAAC,CAAA;gBAC/F,IAAI,KAAK,CAAC,UAAU,KAAK,aAAa,EAAE,CAAC;oBACvC,MAAM,IAAI,KAAK,CAAC,oEAAoE,CAAC,CAAA;gBACvF,CAAC;gBACD,aAAa,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;gBAChC,MAAM,IAAI,KAAK,CAAC,UAAU,CAAA;YAC5B,CAAC;YACD,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,CAAY,CAAA;QAC/F,CAAC;gBAAS,CAAC;YACT,IAAI,MAAM;gBAAE,MAAM,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,+BAA+B,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;QAC3G,CAAC;IACH,CAAC;CACF;AAED,MAAM,eAAe;IACF,MAAM,GAAc,EAAE,CAAA;IACtB,OAAO,GAAqD,EAAE,CAAA;IACvE,MAAM,GAAG,KAAK,CAAA;IACd,KAAK,CAAQ;IAErB,IAAI,CAAC,KAAc;QACjB,IAAI,IAAI,CAAC,MAAM;YAAE,OAAM;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QACnC,IAAI,MAAM,KAAK,SAAS;YAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;;YAC5C,MAAM,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;IACrC,CAAC;IAED,KAAK;QACH,IAAI,IAAI,CAAC,MAAM;YAAE,OAAM;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAA;QAClB,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;YAAE,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;IACvF,CAAC;IAED,IAAI,CAAC,KAAY;QACf,IAAI,IAAI,CAAC,MAAM;YAAE,OAAM;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAA;QAClB,IAAI,CAAC,KAAK,EAAE,CAAA;IACd,CAAC;IAED,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC;QAC3B,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAA;gBACzB,SAAQ;YACV,CAAC;YACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;oBAAE,MAAM,IAAI,CAAC,KAAK,CAAA;gBAC9C,OAAM;YACR,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAA0B,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAA;YAC9F,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;oBAAE,MAAM,IAAI,CAAC,KAAK,CAAA;gBAC9C,OAAM;YACR,CAAC;YACD,MAAM,IAAI,CAAC,KAAK,CAAA;QAClB,CAAC;IACH,CAAC;CACF;AAED,SAAS,gBAAgB,CAAC,KAAmB,EAAE,QAAgB,EAAE,KAAsB;IACrF,IAAI,KAAK,CAAC,KAAK,KAAK,sBAAsB,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,KAAK,CAAC,IAAuC,CAAA;QAC1D,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAChF,OAAM;IACR,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,KAAK,8BAA8B;QAAE,OAAM;IAC1D,MAAM,IAAI,GAAG,KAAK,CAAC,IAA8C,CAAA;IACjE,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ;QAAE,OAAM;IACtC,IAAI,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAC5B,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC;YACvB,IAAI,EAAE,OAAO,OAAO,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU;YACnE,OAAO,EAAE,OAAO,OAAO,EAAE,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,mCAAmC;YACrG,OAAO,EAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;SAC3D,CAAC,CAAC,CAAA;IACL,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,KAAK,EAAE,CAAA;IACf,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAA;IAC5F,IAAI,KAAK,CAAC,EAAE,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;IAC7G,IAAI,KAAK,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;WAC3C,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,QAAQ;WACpC,OAAO,KAAK,CAAC,KAAK,CAAC,OAAO,KAAK,QAAQ;WACvC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAA;IACzE,CAAC;IACD,OAAO;QACL,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE;KAC9F,CAAA;AACH,CAAC;AAED,SAAS,aAAa,CAAC,OAA4E;IACjG,wEAAwE;IACxE,4EAA4E;IAC5E,qFAAqF;IACrF,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QAC/C,gBAAgB,EAAE,IAAa;QAC/B,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAiB;IACtC,IAAI,MAAM,GAAG,EAAE,CAAA;IACf,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC,UAAU,EAAE,MAAM,IAAI,MAAM,EAAE,CAAC;QACjE,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,GAAG,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAA;IACvG,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,CAAA;AACrB,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,IAAI,MAAc,CAAA;IAClB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAA;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,kEAAkE,CAAC,CAAA;IACrF,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;IAC3C,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC;QAAE,KAAK,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;IAC9F,IAAI,aAAa,CAAC,KAAK,CAAC,KAAK,KAAK;QAAE,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAA;IAC3H,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAC7E,CAAC;AAED,SAAS,YAAY,CAAC,KAAc,EAAE,IAAY;IAChD,OAAO,KAAK,YAAY,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAA;AACzE,CAAC"}
|
package/dist/rpc-router.d.ts
CHANGED
|
@@ -3,8 +3,9 @@ import type { RemoteFileViewerBridge } from './file-viewer-bridge.js';
|
|
|
3
3
|
import type { HarnessApiBridge } from './harness-api-bridge.js';
|
|
4
4
|
import type { HarnessRemoteBridge } from './harness-remote-bridge.js';
|
|
5
5
|
import type { SafeLogger } from './logging.js';
|
|
6
|
+
import type { CodexPeerBridge } from './codex/peer-bridge.js';
|
|
6
7
|
export { RpcError } from './safe-error.js';
|
|
7
|
-
export declare const HOST_CAPABILITIES: readonly ["harness.api.v1", "harness.api.transfer.v1", "harness.remote.v1", "harness.remote.transfer.v1", "fileviewer.read.v1"];
|
|
8
|
+
export declare const HOST_CAPABILITIES: readonly ["harness.api.v1", "harness.api.transfer.v1", "harness.remote.v1", "harness.remote.transfer.v1", "fileviewer.read.v1", "codex.appserver.v1", "codex.appserver.transfer.v1"];
|
|
8
9
|
export declare class RpcRouter {
|
|
9
10
|
private readonly harnessApi;
|
|
10
11
|
private readonly maxPending;
|
|
@@ -12,12 +13,14 @@ export declare class RpcRouter {
|
|
|
12
13
|
private readonly fileViewer?;
|
|
13
14
|
private readonly harnessRemote?;
|
|
14
15
|
private readonly capabilities;
|
|
16
|
+
private readonly codex?;
|
|
15
17
|
private active;
|
|
16
|
-
constructor(harnessApi: HarnessApiBridge | undefined, maxPending?: number, logger?: SafeLogger | undefined, fileViewer?: RemoteFileViewerBridge | undefined, harnessRemote?: HarnessRemoteBridge | undefined, capabilities?: () => readonly string[]);
|
|
18
|
+
constructor(harnessApi: HarnessApiBridge | undefined, maxPending?: number, logger?: SafeLogger | undefined, fileViewer?: RemoteFileViewerBridge | undefined, harnessRemote?: HarnessRemoteBridge | undefined, capabilities?: () => readonly string[], codex?: CodexPeerBridge | undefined);
|
|
17
19
|
closePeerStreams(): Promise<void>;
|
|
18
20
|
handle(message: RemoteMessage): Promise<RemoteMessage>;
|
|
19
21
|
private invoke;
|
|
20
22
|
private requireApiProxy;
|
|
21
23
|
private requireRemoteGateway;
|
|
24
|
+
private requireCodex;
|
|
22
25
|
}
|
|
23
26
|
//# sourceMappingURL=rpc-router.d.ts.map
|
package/dist/rpc-router.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-router.d.ts","sourceRoot":"","sources":["../src/rpc-router.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAGnB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"rpc-router.d.ts","sourceRoot":"","sources":["../src/rpc-router.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,aAAa,EAGnB,MAAM,sBAAsB,CAAA;AAE7B,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAA;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAA;AACrE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAA;AAG7D,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAA;AAmC1C,eAAO,MAAM,iBAAiB,sLAQpB,CAAA;AAEV,qBAAa,SAAS;IAIlB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IACxB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;IATzB,OAAO,CAAC,MAAM,CAAI;gBAGC,UAAU,EAAE,gBAAgB,GAAG,SAAS,EACxC,UAAU,SAAM,EAChB,MAAM,CAAC,EAAE,UAAU,YAAA,EACnB,UAAU,CAAC,EAAE,sBAAsB,YAAA,EACnC,aAAa,CAAC,EAAE,mBAAmB,YAAA,EACnC,YAAY,GAAE,MAAM,SAAS,MAAM,EAA4B,EAC/D,KAAK,CAAC,EAAE,eAAe,YAAA;IAGpC,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;IAQjC,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAoC5D,OAAO,CAAC,MAAM;IA0Cd,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,YAAY;CAMrB"}
|
package/dist/rpc-router.js
CHANGED
|
@@ -24,6 +24,15 @@ const apiMethods = new Set([
|
|
|
24
24
|
'harness.remote.stream.open',
|
|
25
25
|
'harness.remote.stream.close',
|
|
26
26
|
'fileviewer.call',
|
|
27
|
+
'codex.app.call',
|
|
28
|
+
'codex.app.respond',
|
|
29
|
+
'codex.app.stream.open',
|
|
30
|
+
'codex.app.stream.close',
|
|
31
|
+
'codex.app.transfer.open',
|
|
32
|
+
'codex.app.transfer.chunk',
|
|
33
|
+
'codex.app.transfer.commit',
|
|
34
|
+
'codex.app.transfer.read',
|
|
35
|
+
'codex.app.transfer.close',
|
|
27
36
|
]);
|
|
28
37
|
export const HOST_CAPABILITIES = [
|
|
29
38
|
'harness.api.v1',
|
|
@@ -31,6 +40,8 @@ export const HOST_CAPABILITIES = [
|
|
|
31
40
|
'harness.remote.v1',
|
|
32
41
|
'harness.remote.transfer.v1',
|
|
33
42
|
'fileviewer.read.v1',
|
|
43
|
+
'codex.appserver.v1',
|
|
44
|
+
'codex.appserver.transfer.v1',
|
|
34
45
|
];
|
|
35
46
|
export class RpcRouter {
|
|
36
47
|
harnessApi;
|
|
@@ -39,19 +50,22 @@ export class RpcRouter {
|
|
|
39
50
|
fileViewer;
|
|
40
51
|
harnessRemote;
|
|
41
52
|
capabilities;
|
|
53
|
+
codex;
|
|
42
54
|
active = 0;
|
|
43
|
-
constructor(harnessApi, maxPending = 128, logger, fileViewer, harnessRemote, capabilities = () => HOST_CAPABILITIES) {
|
|
55
|
+
constructor(harnessApi, maxPending = 128, logger, fileViewer, harnessRemote, capabilities = () => HOST_CAPABILITIES, codex) {
|
|
44
56
|
this.harnessApi = harnessApi;
|
|
45
57
|
this.maxPending = maxPending;
|
|
46
58
|
this.logger = logger;
|
|
47
59
|
this.fileViewer = fileViewer;
|
|
48
60
|
this.harnessRemote = harnessRemote;
|
|
49
61
|
this.capabilities = capabilities;
|
|
62
|
+
this.codex = codex;
|
|
50
63
|
}
|
|
51
64
|
async closePeerStreams() {
|
|
52
65
|
await Promise.all([
|
|
53
66
|
this.harnessApi?.closeAll(),
|
|
54
67
|
this.harnessRemote?.closeAll(),
|
|
68
|
+
this.codex?.closeAll(),
|
|
55
69
|
]);
|
|
56
70
|
}
|
|
57
71
|
async handle(message) {
|
|
@@ -121,6 +135,15 @@ export class RpcRouter {
|
|
|
121
135
|
}
|
|
122
136
|
return this.fileViewer.call(params);
|
|
123
137
|
}
|
|
138
|
+
case 'codex.app.call': return this.requireCodex().call(params);
|
|
139
|
+
case 'codex.app.respond': return this.requireCodex().respond(params);
|
|
140
|
+
case 'codex.app.stream.open': return this.requireCodex().openStream(params);
|
|
141
|
+
case 'codex.app.stream.close': return this.requireCodex().closeStream(params);
|
|
142
|
+
case 'codex.app.transfer.open': return this.requireCodex().openTransfer(params);
|
|
143
|
+
case 'codex.app.transfer.chunk': return this.requireCodex().appendTransfer(params);
|
|
144
|
+
case 'codex.app.transfer.commit': return this.requireCodex().commitTransfer(params);
|
|
145
|
+
case 'codex.app.transfer.read': return this.requireCodex().readTransfer(params);
|
|
146
|
+
case 'codex.app.transfer.close': return this.requireCodex().closeTransfer(params);
|
|
124
147
|
default: throw new RpcError('METHOD_NOT_FOUND', 'The requested method does not exist.');
|
|
125
148
|
}
|
|
126
149
|
}
|
|
@@ -136,6 +159,12 @@ export class RpcRouter {
|
|
|
136
159
|
}
|
|
137
160
|
return this.harnessRemote;
|
|
138
161
|
}
|
|
162
|
+
requireCodex() {
|
|
163
|
+
if (this.codex === undefined) {
|
|
164
|
+
throw new RpcError('FEATURE_NOT_SUPPORTED', 'Codex Remote is disabled or unavailable on this Host.');
|
|
165
|
+
}
|
|
166
|
+
return this.codex;
|
|
167
|
+
}
|
|
139
168
|
}
|
|
140
169
|
function errorResponse(requestId, error) {
|
|
141
170
|
const code = safeErrorCode(error);
|
package/dist/rpc-router.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rpc-router.js","sourceRoot":"","sources":["../src/rpc-router.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,iBAAiB,GAIlB,MAAM,sBAAsB,CAAA;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"rpc-router.js","sourceRoot":"","sources":["../src/rpc-router.ts"],"names":[],"mappings":"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"}
|
|
@@ -42,6 +42,7 @@ export declare class HostServerConnection {
|
|
|
42
42
|
private resumeQueued;
|
|
43
43
|
private rtcFactory?;
|
|
44
44
|
private negotiatedCapabilities;
|
|
45
|
+
private controlFrameLimits;
|
|
45
46
|
constructor(config: ResolvedConfig, identity: HostIdentity, identities: IdentityStore, api: HostServerApi, connections: ConnectionController, logger: SafeLogger, createWebSocket?: WebSocketFactory, rtcFactoryProvider?: (() => Promise<RtcPeerConnectionFactory | undefined>) | undefined, hostCapabilities?: () => readonly string[], harnessVersion?: string | undefined);
|
|
46
47
|
start(): void;
|
|
47
48
|
resume(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-connection.d.ts","sourceRoot":"","sources":["../src/server-connection.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server-connection.d.ts","sourceRoot":"","sources":["../src/server-connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { NoiseIkSession, createNoisePrologue, fromBase64Url, toBase64Url, } from '@dsh-remote/crypto';
|
|
2
|
-
import { PROTOCOL_VERSION, SecureMessageCodec, acceptNegotiatedCapabilities, createControlFrame, decodeMessage,
|
|
2
|
+
import { PROTOCOL_VERSION, SecureMessageCodec, acceptNegotiatedCapabilities, createControlFrame, decodeControlFrame, decodeMessage, encodeControlFrame, encodeMessage, } from '@dsh-remote/protocol';
|
|
3
3
|
import { RtcDataChannelTransport, stunOnlyIceServers, } from '@dsh-remote/webrtc';
|
|
4
4
|
import { ServerApiError } from './server-api.js';
|
|
5
5
|
import { PLUGIN_VERSION } from './version.js';
|
|
@@ -27,6 +27,7 @@ export class HostServerConnection {
|
|
|
27
27
|
resumeQueued = false;
|
|
28
28
|
rtcFactory;
|
|
29
29
|
negotiatedCapabilities = ['transport.relay'];
|
|
30
|
+
controlFrameLimits = {};
|
|
30
31
|
constructor(config, identity, identities, api, connections, logger, createWebSocket = url => new WebSocket(url), rtcFactoryProvider, hostCapabilities = () => ['harness.api.v1'], harnessVersion) {
|
|
31
32
|
this.config = config;
|
|
32
33
|
this.identity = identity;
|
|
@@ -129,9 +130,10 @@ export class HostServerConnection {
|
|
|
129
130
|
return;
|
|
130
131
|
const offeredCapabilities = this.rtcFactoryProvider === undefined || this.config.forceRelay
|
|
131
132
|
? ['transport.relay', ...this.hostCapabilities()]
|
|
132
|
-
: ['transport.p2p', 'transport.turn', 'transport.relay', ...this.hostCapabilities()];
|
|
133
|
+
: ['transport.lan', 'transport.p2p', 'transport.turn', 'transport.relay', ...this.hostCapabilities()];
|
|
133
134
|
const socket = this.createWebSocket(websocketUrl(this.api.baseUrl));
|
|
134
135
|
this.socket = socket;
|
|
136
|
+
this.controlFrameLimits = {};
|
|
135
137
|
let acknowledged = false;
|
|
136
138
|
let messageQueue = Promise.resolve();
|
|
137
139
|
await new Promise((resolve, reject) => {
|
|
@@ -160,12 +162,17 @@ export class HostServerConnection {
|
|
|
160
162
|
};
|
|
161
163
|
socket.onmessage = event => {
|
|
162
164
|
messageQueue = messageQueue.then(async () => {
|
|
163
|
-
const frame = decodeControl(event.data);
|
|
165
|
+
const frame = decodeControl(event.data, this.controlFrameLimits);
|
|
164
166
|
this.lastActiveAt = Date.now();
|
|
165
167
|
if (frame.type === 'hello.ack') {
|
|
166
168
|
const payload = requireHelloAck(frame.payload);
|
|
169
|
+
this.controlFrameLimits = {
|
|
170
|
+
maxControlFrameBytes: payload.maxControlFrameBytes,
|
|
171
|
+
maxRelayFrameBytes: payload.maxRelayFrameBytes,
|
|
172
|
+
};
|
|
167
173
|
this.negotiatedCapabilities = acceptNegotiatedCapabilities(offeredCapabilities, payload.capabilities);
|
|
168
174
|
if (!this.negotiatedCapabilities.some(capability => capability === 'transport.relay'
|
|
175
|
+
|| capability === 'transport.lan'
|
|
169
176
|
|| capability === 'transport.p2p'
|
|
170
177
|
|| capability === 'transport.turn')) {
|
|
171
178
|
throw new ControlConnectionError('INVALID_MESSAGE', 'Server did not negotiate a transport capability.');
|
|
@@ -265,11 +272,15 @@ export class HostServerConnection {
|
|
|
265
272
|
}
|
|
266
273
|
else if (payload.connectionId !== undefined) {
|
|
267
274
|
await this.dropTunnel(payload.connectionId, payload.code);
|
|
268
|
-
|
|
275
|
+
const fields = {
|
|
269
276
|
code: payload.code,
|
|
270
277
|
connectionId: shortId(payload.connectionId),
|
|
271
278
|
retryable: payload.retryable,
|
|
272
|
-
}
|
|
279
|
+
};
|
|
280
|
+
if (payload.retryable)
|
|
281
|
+
this.logger.debug('server closed a remote connection', fields);
|
|
282
|
+
else
|
|
283
|
+
this.logger.warn('server closed a remote connection', fields);
|
|
273
284
|
}
|
|
274
285
|
else {
|
|
275
286
|
this.terminalError = payload.code;
|
|
@@ -379,10 +390,13 @@ export class HostServerConnection {
|
|
|
379
390
|
const reply = tunnel.noise.writeHandshake();
|
|
380
391
|
if (!tunnel.noise.complete)
|
|
381
392
|
throw new ControlConnectionError('SECURE_CHANNEL_FAILED', 'Noise IK handshake did not complete.');
|
|
382
|
-
const viaWebRtc = tunnel.rtc !== undefined
|
|
393
|
+
const viaWebRtc = tunnel.rtc !== undefined
|
|
394
|
+
&& (tunnel.transport === 'lan' || tunnel.transport === 'p2p' || tunnel.transport === 'turn');
|
|
383
395
|
if (!viaWebRtc && tunnel.transport === 'negotiating')
|
|
384
396
|
tunnel.transport = 'relay';
|
|
385
|
-
const mode = viaWebRtc
|
|
397
|
+
const mode = viaWebRtc
|
|
398
|
+
? tunnel.transportMode ?? (tunnel.transport === 'turn' ? 'TURN' : tunnel.transport === 'lan' ? 'LAN' : 'P2P')
|
|
399
|
+
: 'Relay';
|
|
386
400
|
const transmit = viaWebRtc
|
|
387
401
|
? (ciphertext) => tunnel.rtc.send(ciphertext)
|
|
388
402
|
: (ciphertext) => this.sendRelay(tunnel, ciphertext);
|
|
@@ -560,7 +574,8 @@ export class HostServerConnection {
|
|
|
560
574
|
await this.resumePendingHandshake(tunnel);
|
|
561
575
|
}
|
|
562
576
|
canUseWebRtc() {
|
|
563
|
-
return this.negotiatedCapabilities.includes('transport.
|
|
577
|
+
return this.negotiatedCapabilities.includes('transport.lan')
|
|
578
|
+
|| this.negotiatedCapabilities.includes('transport.p2p')
|
|
564
579
|
|| this.negotiatedCapabilities.includes('transport.turn');
|
|
565
580
|
}
|
|
566
581
|
sendRtcSignal(tunnel, signal) {
|
|
@@ -582,7 +597,14 @@ export class HostServerConnection {
|
|
|
582
597
|
handleRtcOpened(tunnel, selected) {
|
|
583
598
|
if (this.tunnels.get(tunnel.connectionId) !== tunnel || tunnel.rtc === undefined)
|
|
584
599
|
return;
|
|
585
|
-
const
|
|
600
|
+
const wireSelected = selected === 'lan'
|
|
601
|
+
&& !this.negotiatedCapabilities.includes('transport.lan')
|
|
602
|
+
&& this.negotiatedCapabilities.includes('transport.p2p')
|
|
603
|
+
? 'p2p'
|
|
604
|
+
: selected;
|
|
605
|
+
const requiredCapability = wireSelected === 'lan'
|
|
606
|
+
? 'transport.lan'
|
|
607
|
+
: wireSelected === 'turn' ? 'transport.turn' : 'transport.p2p';
|
|
586
608
|
if (!this.negotiatedCapabilities.includes(requiredCapability)) {
|
|
587
609
|
const error = new Error(`WebRTC selected unnegotiated transport: ${selected}`);
|
|
588
610
|
if (!this.negotiatedCapabilities.includes('transport.relay')) {
|
|
@@ -592,15 +614,21 @@ export class HostServerConnection {
|
|
|
592
614
|
void this.handleRtcFailed(tunnel, tunnel.rtc, error);
|
|
593
615
|
return;
|
|
594
616
|
}
|
|
595
|
-
tunnel.transport =
|
|
617
|
+
tunnel.transport = wireSelected;
|
|
596
618
|
tunnel.transportMode = tunnel.rtc.selectedPathMode();
|
|
597
|
-
this.sendTransportSelected(tunnel,
|
|
619
|
+
this.sendTransportSelected(tunnel, wireSelected);
|
|
620
|
+
const diagnostics = rtcDiagnostics(tunnel.rtc);
|
|
598
621
|
this.logger.info('webrtc data channel ready', {
|
|
599
622
|
connectionId: shortId(tunnel.connectionId),
|
|
600
623
|
peerDeviceId: shortId(tunnel.peer.deviceId),
|
|
601
|
-
transport: tunnel.transportMode ??
|
|
602
|
-
...webrtcDiagnosticsLogFields(rtcDiagnostics(tunnel.rtc)),
|
|
624
|
+
transport: tunnel.transportMode ?? wireSelected,
|
|
603
625
|
});
|
|
626
|
+
if (diagnostics !== undefined) {
|
|
627
|
+
this.logger.debug('webrtc data channel diagnostics', {
|
|
628
|
+
connectionId: shortId(tunnel.connectionId),
|
|
629
|
+
...webrtcDiagnosticsLogFields(diagnostics),
|
|
630
|
+
});
|
|
631
|
+
}
|
|
604
632
|
void this.resumePendingHandshake(tunnel).catch(error => {
|
|
605
633
|
this.logger.warn('pending secure handshake failed', {
|
|
606
634
|
connectionId: shortId(tunnel.connectionId),
|
|
@@ -612,12 +640,18 @@ export class HostServerConnection {
|
|
|
612
640
|
async handleRtcFailed(tunnel, rtc, error) {
|
|
613
641
|
if (this.tunnels.get(tunnel.connectionId) !== tunnel || tunnel.rtc !== rtc)
|
|
614
642
|
return;
|
|
615
|
-
|
|
643
|
+
const diagnostics = rtcDiagnostics(rtc);
|
|
644
|
+
if (tunnel.transport === 'lan' || tunnel.transport === 'p2p' || tunnel.transport === 'turn') {
|
|
616
645
|
this.logger.warn('webrtc data channel failed; disconnecting peer', {
|
|
617
646
|
connectionId: shortId(tunnel.connectionId),
|
|
618
647
|
reason: diagnosticReason(error),
|
|
619
|
-
...webrtcDiagnosticsLogFields(rtcDiagnostics(rtc)),
|
|
620
648
|
});
|
|
649
|
+
if (diagnostics !== undefined) {
|
|
650
|
+
this.logger.debug('webrtc data channel failure diagnostics', {
|
|
651
|
+
connectionId: shortId(tunnel.connectionId),
|
|
652
|
+
...webrtcDiagnosticsLogFields(diagnostics),
|
|
653
|
+
});
|
|
654
|
+
}
|
|
621
655
|
await this.dropTunnel(tunnel.connectionId, 'CONNECTION_FAILED');
|
|
622
656
|
return;
|
|
623
657
|
}
|
|
@@ -627,8 +661,13 @@ export class HostServerConnection {
|
|
|
627
661
|
this.logger.warn('webrtc negotiation failed; falling back to relay', {
|
|
628
662
|
connectionId: shortId(tunnel.connectionId),
|
|
629
663
|
reason: diagnosticReason(error),
|
|
630
|
-
...webrtcDiagnosticsLogFields(rtcDiagnostics(rtc)),
|
|
631
664
|
});
|
|
665
|
+
if (diagnostics !== undefined) {
|
|
666
|
+
this.logger.debug('webrtc negotiation failure diagnostics', {
|
|
667
|
+
connectionId: shortId(tunnel.connectionId),
|
|
668
|
+
...webrtcDiagnosticsLogFields(diagnostics),
|
|
669
|
+
});
|
|
670
|
+
}
|
|
632
671
|
await this.resumePendingHandshake(tunnel);
|
|
633
672
|
}
|
|
634
673
|
sendTransportSelected(tunnel, transport) {
|
|
@@ -653,7 +692,7 @@ export class HostServerConnection {
|
|
|
653
692
|
const socket = this.socket;
|
|
654
693
|
if (socket === undefined || socket.readyState !== 1)
|
|
655
694
|
throw new ControlConnectionError('CONNECTION_FAILED', 'Server control socket is not open.');
|
|
656
|
-
socket.send(
|
|
695
|
+
socket.send(encodeControlFrame(createControlFrame(type, payload), this.controlFrameLimits));
|
|
657
696
|
}
|
|
658
697
|
async dropTunnels() {
|
|
659
698
|
const tunnels = [...this.tunnels.values()];
|
|
@@ -744,8 +783,15 @@ class ServerNoiseChannel {
|
|
|
744
783
|
async send(message) {
|
|
745
784
|
if (this.closed)
|
|
746
785
|
throw new Error('secure channel is closed');
|
|
747
|
-
|
|
748
|
-
|
|
786
|
+
const plaintextFrames = this.outgoing.encode(encodeMessage(message));
|
|
787
|
+
try {
|
|
788
|
+
for (const plaintext of plaintextFrames) {
|
|
789
|
+
await this.transmit(this.tunnel.noise.encrypt(plaintext));
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
catch (error) {
|
|
793
|
+
await this.close().catch(() => undefined);
|
|
794
|
+
throw error;
|
|
749
795
|
}
|
|
750
796
|
}
|
|
751
797
|
onMessage(handler) {
|
|
@@ -792,11 +838,11 @@ function websocketUrl(baseUrl) {
|
|
|
792
838
|
url.pathname = `${url.pathname.replace(/\/$/, '')}/ws/v1/connect`;
|
|
793
839
|
return url.toString();
|
|
794
840
|
}
|
|
795
|
-
function decodeControl(data) {
|
|
841
|
+
function decodeControl(data, limits) {
|
|
796
842
|
if (typeof data !== 'string')
|
|
797
843
|
throw new ControlConnectionError('INVALID_MESSAGE', 'Server control frames must be text JSON.');
|
|
798
844
|
try {
|
|
799
|
-
return
|
|
845
|
+
return decodeControlFrame(data, limits);
|
|
800
846
|
}
|
|
801
847
|
catch {
|
|
802
848
|
throw new ControlConnectionError('INVALID_MESSAGE', 'Server sent an invalid control frame.');
|
|
@@ -855,7 +901,8 @@ function requireSignalIce(value) {
|
|
|
855
901
|
function requireTransportSelected(value) {
|
|
856
902
|
const payload = requireObject(value);
|
|
857
903
|
if (typeof payload.connectionId !== 'string' || typeof payload.targetDeviceId !== 'string'
|
|
858
|
-
|| (payload.transport !== '
|
|
904
|
+
|| (payload.transport !== 'lan' && payload.transport !== 'p2p'
|
|
905
|
+
&& payload.transport !== 'turn' && payload.transport !== 'relay')) {
|
|
859
906
|
throw new ControlConnectionError('INVALID_MESSAGE', 'transport.selected payload is invalid.');
|
|
860
907
|
}
|
|
861
908
|
return payload;
|