@matter/general 0.16.0-alpha.0-20251006-3fe1e7c57 → 0.16.0-alpha.0-20251013-89bb7099d
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/cjs/codec/Base64Codec.js +2 -2
- package/dist/cjs/codec/Base64Codec.js.map +1 -1
- package/dist/cjs/environment/Environment.d.ts +12 -18
- package/dist/cjs/environment/Environment.d.ts.map +1 -1
- package/dist/cjs/environment/Environment.js +17 -32
- package/dist/cjs/environment/Environment.js.map +1 -1
- package/dist/cjs/environment/Environmental.d.ts +16 -2
- package/dist/cjs/environment/Environmental.d.ts.map +1 -1
- package/dist/cjs/log/Logger.js +1 -1
- package/dist/cjs/net/Network.d.ts +4 -0
- package/dist/cjs/net/Network.d.ts.map +1 -1
- package/dist/cjs/net/Network.js +6 -0
- package/dist/cjs/net/Network.js.map +1 -1
- package/dist/cjs/net/ServerAddress.d.ts +1 -0
- package/dist/cjs/net/ServerAddress.d.ts.map +1 -1
- package/dist/cjs/net/ServerAddress.js +13 -0
- package/dist/cjs/net/ServerAddress.js.map +1 -1
- package/dist/cjs/net/http/HttpEndpoint.d.ts +53 -0
- package/dist/cjs/net/http/HttpEndpoint.d.ts.map +1 -0
- package/dist/cjs/net/http/HttpEndpoint.js +22 -0
- package/dist/cjs/net/http/HttpEndpoint.js.map +6 -0
- package/dist/cjs/net/http/HttpEndpointFactory.d.ts +23 -0
- package/dist/cjs/net/http/HttpEndpointFactory.d.ts.map +1 -0
- package/dist/cjs/net/http/HttpEndpointFactory.js +39 -0
- package/dist/cjs/net/http/HttpEndpointFactory.js.map +6 -0
- package/dist/cjs/net/http/HttpEndpointGroup.d.ts +17 -0
- package/dist/cjs/net/http/HttpEndpointGroup.d.ts.map +1 -0
- package/dist/cjs/net/http/HttpEndpointGroup.js +56 -0
- package/dist/cjs/net/http/HttpEndpointGroup.js.map +6 -0
- package/dist/cjs/net/http/HttpService.d.ts +20 -0
- package/dist/cjs/net/http/HttpService.d.ts.map +1 -0
- package/dist/cjs/net/http/HttpService.js +83 -0
- package/dist/cjs/net/http/HttpService.js.map +6 -0
- package/dist/cjs/net/http/HttpSharedEndpoint.d.ts +16 -0
- package/dist/cjs/net/http/HttpSharedEndpoint.d.ts.map +1 -0
- package/dist/cjs/net/http/HttpSharedEndpoint.js +92 -0
- package/dist/cjs/net/http/HttpSharedEndpoint.js.map +6 -0
- package/dist/cjs/net/http/index.d.ts +11 -0
- package/dist/cjs/net/http/index.d.ts.map +1 -0
- package/dist/cjs/net/http/index.js +28 -0
- package/dist/cjs/net/http/index.js.map +6 -0
- package/dist/cjs/net/index.d.ts +2 -0
- package/dist/cjs/net/index.d.ts.map +1 -1
- package/dist/cjs/net/index.js +2 -0
- package/dist/cjs/net/index.js.map +1 -1
- package/dist/cjs/net/mqtt/MqttEndpoint.d.ts +39 -0
- package/dist/cjs/net/mqtt/MqttEndpoint.d.ts.map +1 -0
- package/dist/cjs/net/mqtt/MqttEndpoint.js +36 -0
- package/dist/cjs/net/mqtt/MqttEndpoint.js.map +6 -0
- package/dist/cjs/net/mqtt/MqttEndpointFactory.d.ts +15 -0
- package/dist/cjs/net/mqtt/MqttEndpointFactory.d.ts.map +1 -0
- package/dist/cjs/net/mqtt/MqttEndpointFactory.js +31 -0
- package/dist/cjs/net/mqtt/MqttEndpointFactory.js.map +6 -0
- package/dist/cjs/net/mqtt/MqttService.d.ts +19 -0
- package/dist/cjs/net/mqtt/MqttService.d.ts.map +1 -0
- package/dist/cjs/net/mqtt/MqttService.js +52 -0
- package/dist/cjs/net/mqtt/MqttService.js.map +6 -0
- package/dist/cjs/net/mqtt/index.d.ts +9 -0
- package/dist/cjs/net/mqtt/index.d.ts.map +1 -0
- package/dist/cjs/net/mqtt/index.js +26 -0
- package/dist/cjs/net/mqtt/index.js.map +6 -0
- package/dist/cjs/net/udp/UdpChannel.d.ts +31 -2
- package/dist/cjs/net/udp/UdpChannel.d.ts.map +1 -1
- package/dist/cjs/net/udp/UdpMulticastServer.d.ts.map +1 -1
- package/dist/cjs/net/udp/UdpMulticastServer.js +6 -3
- package/dist/cjs/net/udp/UdpMulticastServer.js.map +1 -1
- package/dist/cjs/storage/StorageService.d.ts +5 -1
- package/dist/cjs/storage/StorageService.d.ts.map +1 -1
- package/dist/cjs/storage/StorageService.js +6 -1
- package/dist/cjs/storage/StorageService.js.map +1 -1
- package/dist/cjs/time/Duration.d.ts +1 -1
- package/dist/cjs/util/Abort.d.ts +4 -1
- package/dist/cjs/util/Abort.d.ts.map +1 -1
- package/dist/cjs/util/Abort.js +19 -3
- package/dist/cjs/util/Abort.js.map +1 -1
- package/dist/cjs/util/Construction.d.ts +1 -1
- package/dist/cjs/util/Multiplex.js +1 -1
- package/dist/cjs/util/Multiplex.js.map +1 -1
- package/dist/cjs/util/String.d.ts +5 -1
- package/dist/cjs/util/String.d.ts.map +1 -1
- package/dist/cjs/util/String.js +16 -0
- package/dist/cjs/util/String.js.map +1 -1
- package/dist/esm/codec/Base64Codec.js +2 -2
- package/dist/esm/codec/Base64Codec.js.map +1 -1
- package/dist/esm/environment/Environment.d.ts +12 -18
- package/dist/esm/environment/Environment.d.ts.map +1 -1
- package/dist/esm/environment/Environment.js +17 -32
- package/dist/esm/environment/Environment.js.map +1 -1
- package/dist/esm/environment/Environmental.d.ts +16 -2
- package/dist/esm/environment/Environmental.d.ts.map +1 -1
- package/dist/esm/log/Logger.js +1 -1
- package/dist/esm/net/Network.d.ts +4 -0
- package/dist/esm/net/Network.d.ts.map +1 -1
- package/dist/esm/net/Network.js +6 -0
- package/dist/esm/net/Network.js.map +1 -1
- package/dist/esm/net/ServerAddress.d.ts +1 -0
- package/dist/esm/net/ServerAddress.d.ts.map +1 -1
- package/dist/esm/net/ServerAddress.js +13 -0
- package/dist/esm/net/ServerAddress.js.map +1 -1
- package/dist/esm/net/http/HttpEndpoint.d.ts +53 -0
- package/dist/esm/net/http/HttpEndpoint.d.ts.map +1 -0
- package/dist/esm/net/http/HttpEndpoint.js +6 -0
- package/dist/esm/net/http/HttpEndpoint.js.map +6 -0
- package/dist/esm/net/http/HttpEndpointFactory.d.ts +23 -0
- package/dist/esm/net/http/HttpEndpointFactory.d.ts.map +1 -0
- package/dist/esm/net/http/HttpEndpointFactory.js +19 -0
- package/dist/esm/net/http/HttpEndpointFactory.js.map +6 -0
- package/dist/esm/net/http/HttpEndpointGroup.d.ts +17 -0
- package/dist/esm/net/http/HttpEndpointGroup.d.ts.map +1 -0
- package/dist/esm/net/http/HttpEndpointGroup.js +36 -0
- package/dist/esm/net/http/HttpEndpointGroup.js.map +6 -0
- package/dist/esm/net/http/HttpService.d.ts +20 -0
- package/dist/esm/net/http/HttpService.d.ts.map +1 -0
- package/dist/esm/net/http/HttpService.js +63 -0
- package/dist/esm/net/http/HttpService.js.map +6 -0
- package/dist/esm/net/http/HttpSharedEndpoint.d.ts +16 -0
- package/dist/esm/net/http/HttpSharedEndpoint.d.ts.map +1 -0
- package/dist/esm/net/http/HttpSharedEndpoint.js +72 -0
- package/dist/esm/net/http/HttpSharedEndpoint.js.map +6 -0
- package/dist/esm/net/http/index.d.ts +11 -0
- package/dist/esm/net/http/index.d.ts.map +1 -0
- package/dist/esm/net/http/index.js +11 -0
- package/dist/esm/net/http/index.js.map +6 -0
- package/dist/esm/net/index.d.ts +2 -0
- package/dist/esm/net/index.d.ts.map +1 -1
- package/dist/esm/net/index.js +2 -0
- package/dist/esm/net/index.js.map +1 -1
- package/dist/esm/net/mqtt/MqttEndpoint.d.ts +39 -0
- package/dist/esm/net/mqtt/MqttEndpoint.d.ts.map +1 -0
- package/dist/esm/net/mqtt/MqttEndpoint.js +16 -0
- package/dist/esm/net/mqtt/MqttEndpoint.js.map +6 -0
- package/dist/esm/net/mqtt/MqttEndpointFactory.d.ts +15 -0
- package/dist/esm/net/mqtt/MqttEndpointFactory.d.ts.map +1 -0
- package/dist/esm/net/mqtt/MqttEndpointFactory.js +11 -0
- package/dist/esm/net/mqtt/MqttEndpointFactory.js.map +6 -0
- package/dist/esm/net/mqtt/MqttService.d.ts +19 -0
- package/dist/esm/net/mqtt/MqttService.d.ts.map +1 -0
- package/dist/esm/net/mqtt/MqttService.js +32 -0
- package/dist/esm/net/mqtt/MqttService.js.map +6 -0
- package/dist/esm/net/mqtt/index.d.ts +9 -0
- package/dist/esm/net/mqtt/index.d.ts.map +1 -0
- package/dist/esm/net/mqtt/index.js +9 -0
- package/dist/esm/net/mqtt/index.js.map +6 -0
- package/dist/esm/net/udp/UdpChannel.d.ts +31 -2
- package/dist/esm/net/udp/UdpChannel.d.ts.map +1 -1
- package/dist/esm/net/udp/UdpMulticastServer.d.ts.map +1 -1
- package/dist/esm/net/udp/UdpMulticastServer.js +6 -3
- package/dist/esm/net/udp/UdpMulticastServer.js.map +1 -1
- package/dist/esm/storage/StorageService.d.ts +5 -1
- package/dist/esm/storage/StorageService.d.ts.map +1 -1
- package/dist/esm/storage/StorageService.js +6 -1
- package/dist/esm/storage/StorageService.js.map +1 -1
- package/dist/esm/time/Duration.d.ts +1 -1
- package/dist/esm/util/Abort.d.ts +4 -1
- package/dist/esm/util/Abort.d.ts.map +1 -1
- package/dist/esm/util/Abort.js +19 -3
- package/dist/esm/util/Abort.js.map +1 -1
- package/dist/esm/util/Construction.d.ts +1 -1
- package/dist/esm/util/Multiplex.js +1 -1
- package/dist/esm/util/Multiplex.js.map +1 -1
- package/dist/esm/util/String.d.ts +5 -1
- package/dist/esm/util/String.d.ts.map +1 -1
- package/dist/esm/util/String.js +16 -0
- package/dist/esm/util/String.js.map +1 -1
- package/package.json +2 -2
- package/src/codec/Base64Codec.ts +2 -2
- package/src/environment/Environment.ts +35 -52
- package/src/environment/Environmental.ts +17 -2
- package/src/log/Logger.ts +1 -1
- package/src/net/Network.ts +4 -0
- package/src/net/ServerAddress.ts +16 -0
- package/src/net/http/HttpEndpoint.ts +60 -0
- package/src/net/http/HttpEndpointFactory.ts +27 -0
- package/src/net/http/HttpEndpointGroup.ts +43 -0
- package/src/net/http/HttpService.ts +75 -0
- package/src/net/http/HttpSharedEndpoint.ts +88 -0
- package/src/net/http/index.ts +11 -0
- package/src/net/index.ts +2 -0
- package/src/net/mqtt/MqttEndpoint.ts +50 -0
- package/src/net/mqtt/MqttEndpointFactory.ts +17 -0
- package/src/net/mqtt/MqttService.ts +40 -0
- package/src/net/mqtt/index.ts +9 -0
- package/src/net/udp/UdpChannel.ts +35 -2
- package/src/net/udp/UdpMulticastServer.ts +3 -0
- package/src/storage/StorageService.ts +14 -1
- package/src/time/Duration.ts +1 -1
- package/src/util/Abort.ts +28 -4
- package/src/util/Construction.ts +2 -2
- package/src/util/Multiplex.ts +1 -1
- package/src/util/String.ts +25 -6
|
@@ -16,7 +16,7 @@ export declare function asyncNew<const A extends any[], const C extends new (...
|
|
|
16
16
|
* Construction happens in the initializer parameter of {@link Construction} or via {@link Construction.construct} on
|
|
17
17
|
* the subject. You invoke in your constructor and place in a property called "construction".
|
|
18
18
|
*
|
|
19
|
-
*
|
|
19
|
+
* Destruction is optional and happens in the destructor parameter of {@link Construction#close} or via
|
|
20
20
|
* {@link Construction.destruct} on the subject. Typically you invoke in a "close" method of the subject.
|
|
21
21
|
*
|
|
22
22
|
* If construction or destruction is not asynchronous (does not return a Promise) then they complete synchronously,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/util/Multiplex.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC,SAAS,oBAAoB;AAC7B,SAAS,gBAAgB;AAEzB,MAAM,SAAS,OAAO,IAAI,WAAW;AAmB9B,MAAM,eAA4C;AAAA,EACrD,WAAW,IAAI,SAAsB;AAAA,EAErC,IAAI,QAA+B,aAAsB;AACrD,QAAI,CAAC,aAAa,GAAG,MAAM,GAAG;AAC1B;AAAA,IACJ;AAEA,UAAM,QAAQ;AAAA,MACV,MAAM,QAAQ,QAAQ,MAAM,EACvB,MAAM,OAAK;AACR,YAAI,UAAU;AACd,YAAI,aAAa;AACb,oBAAU,GAAG,OAAO,OAAO,WAAW;AAAA,QAC1C;AACA,eAAO,MAAM,
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,cAAc;AACvB,SAAS,4BAA4B;AACrC,SAAS,oBAAoB;AAC7B,SAAS,gBAAgB;AAEzB,MAAM,SAAS,OAAO,IAAI,WAAW;AAmB9B,MAAM,eAA4C;AAAA,EACrD,WAAW,IAAI,SAAsB;AAAA,EAErC,IAAI,QAA+B,aAAsB;AACrD,QAAI,CAAC,aAAa,GAAG,MAAM,GAAG;AAC1B;AAAA,IACJ;AAEA,UAAM,QAAQ;AAAA,MACV,MAAM,QAAQ,QAAQ,MAAM,EACvB,MAAM,OAAK;AACR,YAAI,UAAU;AACd,YAAI,aAAa;AACb,oBAAU,GAAG,OAAO,OAAO,WAAW;AAAA,QAC1C;AACA,eAAO,MAAM,GAAG,OAAO,KAAK,CAAC;AAAA,MACjC,CAAC,EACA,QAAQ,MAAM,KAAK,SAAS,OAAO,KAAK,CAAC;AAAA,MAC9C;AAAA,IACJ;AAEA,SAAK,SAAS,IAAI,KAAK;AAAA,EAC3B;AAAA,EAEA,MAAM,QAAQ;AACV,WAAO,KAAK,SAAS,MAAM;AACvB,YAAM,qBAAqB,WAAW,CAAC,GAAG,KAAK,QAAQ,EAAE,IAAI,WAAS,MAAM,IAAI,CAAC;AAAA,IACrF;AAAA,EACJ;AAAA,EAEA,KACI,aACA,YACgC;AAChC,WAAO,KAAK,MAAM,EAAE,KAAK,aAAa,UAAU;AAAA,EACpD;AAAA,EAEA,CAAC,OAAO,YAAY,IAAI,KAAK,MAAM,KAAK,IAAI;AAChD;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -16,7 +16,11 @@ export declare function decamelize(name: string, separator?: string): string;
|
|
|
16
16
|
/**
|
|
17
17
|
* Like JSON.stringify but targets well-formed JS and is slightly more readable.
|
|
18
18
|
*/
|
|
19
|
-
export declare function serialize(value:
|
|
19
|
+
export declare function serialize(value: unknown): string | undefined;
|
|
20
|
+
/**
|
|
21
|
+
* Like {@link JSON.stringify} but with support for additional standard objects.
|
|
22
|
+
*/
|
|
23
|
+
export declare function asJson(value: unknown, space?: number): string;
|
|
20
24
|
export declare namespace serialize {
|
|
21
25
|
/**
|
|
22
26
|
* Custom serialization function key.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"String.d.ts","sourceRoot":"","sources":["../../../src/util/String.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,GACE,UAAU,CAAC,CAAC,CAAC,CAClE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,UAAQ,UA8DxD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAM,UAgBvD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"String.d.ts","sourceRoot":"","sources":["../../../src/util/String.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,wBAAgB,UAAU,CAAC,CAAC,SAAS,MAAM,EAAE,IAAI,EAAE,CAAC,GACE,UAAU,CAAC,CAAC,CAAC,CAClE;AAED;;;GAGG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,UAAQ,UA8DxD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAM,UAgBvD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,sBAyEvC;AAED;;GAEG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,UAcpD;AAED,yBAAiB,SAAS,CAAC;IACvB;;OAEG;IACI,MAAM,SAAS,eAAsB,CAAC;IAE7C;;;OAGG;IACH,SAAgB,IAAI,CAAC,KAAK,EAAE,GAAG,OAU9B;IAED;;OAEG;IACH,SAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,WAgBrC;CACJ;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,UAkBvE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,UAwD3C"}
|
package/dist/esm/util/String.js
CHANGED
|
@@ -135,6 +135,21 @@ function serialize(value) {
|
|
|
135
135
|
}
|
|
136
136
|
return serializeOne(value);
|
|
137
137
|
}
|
|
138
|
+
function asJson(value, space) {
|
|
139
|
+
return JSON.stringify(
|
|
140
|
+
value,
|
|
141
|
+
(_key, value2) => {
|
|
142
|
+
if (typeof value2 === "bigint") {
|
|
143
|
+
return value2.toString();
|
|
144
|
+
}
|
|
145
|
+
if (Bytes.isBytes(value2)) {
|
|
146
|
+
return Bytes.toHex(value2);
|
|
147
|
+
}
|
|
148
|
+
return value2;
|
|
149
|
+
},
|
|
150
|
+
space
|
|
151
|
+
);
|
|
152
|
+
}
|
|
138
153
|
((serialize2) => {
|
|
139
154
|
serialize2.SERIALIZE = Symbol("SERIALIZE");
|
|
140
155
|
function asIs(value) {
|
|
@@ -223,6 +238,7 @@ function serializeToJs(value) {
|
|
|
223
238
|
return parts.join("");
|
|
224
239
|
}
|
|
225
240
|
export {
|
|
241
|
+
asJson,
|
|
226
242
|
camelize,
|
|
227
243
|
capitalize,
|
|
228
244
|
decamelize,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/util/String.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,2BAA2B;AACpC,SAAS,aAAa;AACtB,SAAS,gBAAgB;AAElB,SAAS,WAA6B,MAAS;AAClD,SAAQ,KAAK,CAAC,EAAE,YAAY,IAAI,KAAK,MAAM,CAAC;AAChD;AAMO,SAAS,SAAS,MAAc,aAAa,OAAO;AACvD,QAAM,SAAS,IAAI,MAAc;AACjC,MAAI,aAAa,GACb,WAAW,OACX,WAAW,OACX,IAAI;AAER,WAAS,SAAS,IAAY;AAC1B,QAAI,aAAa,GAAI,QAAO,KAAK,KAAK,MAAM,YAAY,EAAE,CAAC;AAC3D,eAAW,WAAW;AAAA,EAC1B;AAEA,SAAO,IAAI,KAAK,QAAQ,KAAK;AACzB,QAAI,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC,KAAK,KAAK;AAClC,UAAI,UAAU;AACV,iBAAS,CAAC;AACV,qBAAa;AAAA,MACjB;AACA,iBAAW;AACX;AAAA,IACJ;AAEA,QAAI,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC,KAAK,KAAK;AAClC,UAAI,CAAC,UAAU;AACX,YAAI,UAAU;AACV,mBAAS,IAAI,CAAC;AACd,uBAAa,IAAI;AAAA,QACrB;AAAA,MACJ;AACA,iBAAW;AACX;AAAA,IACJ;AAEA,aAAS,CAAC;AAEV,QAAK,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC,KAAK,OAAQ,KAAK,CAAC,MAAM,KAAK;AACvD,aAAO,KAAK,KAAK,CAAC,CAAC;AAAA,IACvB;AAEA,iBAAa,IAAI;AACjB;AAAA,EACJ;AACA,WAAS,CAAC;AAEV,MAAI,WAAW;AACf,MAAI,SAAS,OACR,IAAI,WAAS;AACV,QAAI,YAAY,MAAM,CAAC;AACvB,QAAI,cAAc,UAAU;AACxB,kBAAY,UAAU,YAAY;AAAA,IACtC,OAAO;AACH,kBAAY,UAAU,YAAY;AAClC,iBAAW;AAAA,IACf;AACA,WAAO,GAAG,SAAS,GAAG,MAAM,MAAM,CAAC,EAAE,YAAY,CAAC;AAAA,EACtD,CAAC,EACA,KAAK,EAAE;AAGZ,WAAS,OAAO,QAAQ,YAAY,OAAO;AAE3C,SAAO;AACX;AAKO,SAAS,WAAW,MAAc,YAAY,KAAK;AACtD,QAAM,SAAS,MAAc;AAC7B,MAAI,gBAAgB;AACpB,aAAW,KAAK,MAAM;AAClB,QAAI,KAAK,OAAO,KAAK,KAAK;AACtB,UAAI,eAAe;AACf,eAAO,KAAK,SAAS;AACrB,wBAAgB;AAAA,MACpB;AACA,aAAO,KAAK,EAAE,YAAY,CAAC;AAAA,IAC/B,OAAO;AACH,aAAO,KAAK,CAAC;AACb,sBAAgB;AAAA,IACpB;AAAA,EACJ;AACA,SAAO,OAAO,KAAK,EAAE;AACzB;AAKO,SAAS,UAAU,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["value", "serialize", "parts"]
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matter/general",
|
|
3
|
-
"version": "0.16.0-alpha.0-
|
|
3
|
+
"version": "0.16.0-alpha.0-20251013-89bb7099d",
|
|
4
4
|
"description": "Non-Matter support for Matter.js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"iot",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"@noble/curves": "^2.0.1"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@matter/testing": "0.16.0-alpha.0-
|
|
39
|
+
"@matter/testing": "0.16.0-alpha.0-20251013-89bb7099d"
|
|
40
40
|
},
|
|
41
41
|
"files": [
|
|
42
42
|
"dist/**/*",
|
package/src/codec/Base64Codec.ts
CHANGED
|
@@ -103,7 +103,7 @@ export namespace Base64 {
|
|
|
103
103
|
outLength += 1;
|
|
104
104
|
break;
|
|
105
105
|
case 1:
|
|
106
|
-
throw new
|
|
106
|
+
throw new SyntaxError("Invalid base-64 encoding");
|
|
107
107
|
}
|
|
108
108
|
|
|
109
109
|
const out = new Uint8Array(outLength);
|
|
@@ -113,7 +113,7 @@ export namespace Base64 {
|
|
|
113
113
|
if (inPos >= inputLength) return 0;
|
|
114
114
|
const v = A2B[input.codePointAt(inPos++) ?? -1];
|
|
115
115
|
if (v === undefined) {
|
|
116
|
-
throw new
|
|
116
|
+
throw new SyntaxError("Invalid base-64 encoding");
|
|
117
117
|
}
|
|
118
118
|
return v;
|
|
119
119
|
}
|
|
@@ -33,12 +33,12 @@ const logger = Logger.get("Environment");
|
|
|
33
33
|
* TODO - could remove global singletons by moving here
|
|
34
34
|
*/
|
|
35
35
|
export class Environment {
|
|
36
|
-
#services?: Map<
|
|
36
|
+
#services?: Map<Environmental.ServiceType, Environmental.Service | null>;
|
|
37
37
|
#name: string;
|
|
38
38
|
#parent?: Environment;
|
|
39
|
-
#added = Observable<[type:
|
|
40
|
-
#deleted = Observable<[type:
|
|
41
|
-
#serviceEvents = new Map<
|
|
39
|
+
#added = Observable<[type: Environmental.ServiceType, instance: {}]>();
|
|
40
|
+
#deleted = Observable<[type: Environmental.ServiceType, instance: {}]>();
|
|
41
|
+
#serviceEvents = new Map<Environmental.ServiceType, Environmental.ServiceEvents<any>>();
|
|
42
42
|
|
|
43
43
|
constructor(name: string, parent?: Environment) {
|
|
44
44
|
this.#name = name;
|
|
@@ -48,7 +48,7 @@ export class Environment {
|
|
|
48
48
|
/**
|
|
49
49
|
* Determine if an environmental service is available.
|
|
50
50
|
*/
|
|
51
|
-
has(type:
|
|
51
|
+
has(type: Environmental.ServiceType): boolean {
|
|
52
52
|
const mine = this.#services?.get(type);
|
|
53
53
|
|
|
54
54
|
if (mine === null) {
|
|
@@ -61,14 +61,14 @@ export class Environment {
|
|
|
61
61
|
/**
|
|
62
62
|
* Determine if an environmental services is owned by this environment (not an ancestor).
|
|
63
63
|
*/
|
|
64
|
-
owns(type:
|
|
64
|
+
owns(type: Environmental.ServiceType): boolean {
|
|
65
65
|
return !!this.#services?.get(type);
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
/**
|
|
69
69
|
* Access an environmental service.
|
|
70
70
|
*/
|
|
71
|
-
get<T extends object>(type:
|
|
71
|
+
get<T extends object>(type: Environmental.ServiceType<T>): T {
|
|
72
72
|
const mine = this.#services?.get(type);
|
|
73
73
|
|
|
74
74
|
if (mine !== undefined && mine !== null) {
|
|
@@ -77,21 +77,20 @@ export class Environment {
|
|
|
77
77
|
|
|
78
78
|
// When null then we do not have it and also do not want to inherit from parent
|
|
79
79
|
if (mine === undefined) {
|
|
80
|
-
|
|
80
|
+
const instance = this.#parent?.maybeGet(type);
|
|
81
81
|
if (instance !== undefined && instance !== null) {
|
|
82
82
|
// Parent has it, use it
|
|
83
83
|
return instance;
|
|
84
84
|
}
|
|
85
|
+
}
|
|
85
86
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
}
|
|
92
|
-
this.set(type, instance);
|
|
93
|
-
return instance;
|
|
87
|
+
// ... otherwise try to create it. The create method must install it in the environment if needed
|
|
88
|
+
if ((type as Environmental.Factory<T>)[Environmental.create]) {
|
|
89
|
+
const instance = (type as any)[Environmental.create](this) as T;
|
|
90
|
+
if (!(instance instanceof type)) {
|
|
91
|
+
throw new InternalError(`Service creation did not produce instance of ${type.name}`);
|
|
94
92
|
}
|
|
93
|
+
return instance;
|
|
95
94
|
}
|
|
96
95
|
|
|
97
96
|
throw new UnsupportedDependencyError(`Required dependency ${type.name}`, "is not available");
|
|
@@ -100,64 +99,48 @@ export class Environment {
|
|
|
100
99
|
/**
|
|
101
100
|
* Access an environmental service that may not exist.
|
|
102
101
|
*/
|
|
103
|
-
maybeGet<T extends object>(type:
|
|
102
|
+
maybeGet<T extends object>(type: Environmental.ServiceType<T>): T | undefined {
|
|
104
103
|
if (this.has(type)) {
|
|
105
104
|
return this.get(type);
|
|
106
105
|
}
|
|
107
106
|
}
|
|
108
107
|
|
|
109
108
|
/**
|
|
110
|
-
* Remove an environmental service
|
|
109
|
+
* Remove an environmental service and block further inheritance
|
|
111
110
|
*
|
|
112
111
|
* @param type the class of the service to remove
|
|
113
112
|
* @param instance optional instance expected, if existing instance does not match it is not deleted
|
|
114
113
|
*/
|
|
115
|
-
delete(type:
|
|
116
|
-
|
|
114
|
+
delete(type: Environmental.ServiceType, instance?: any) {
|
|
115
|
+
const localInstance = this.#services?.get(type);
|
|
116
|
+
|
|
117
|
+
// Remove instance and replace by null to prevent inheritance from parent
|
|
118
|
+
this.#services?.set(type, null);
|
|
119
|
+
|
|
120
|
+
if (localInstance === undefined || localInstance === null) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
if (instance !== undefined && localInstance !== instance) {
|
|
117
124
|
return;
|
|
118
125
|
}
|
|
119
|
-
this.#services?.delete(type);
|
|
120
|
-
this.#parent?.delete(type);
|
|
121
126
|
|
|
122
|
-
this.#deleted.emit(type,
|
|
127
|
+
this.#deleted.emit(type, localInstance);
|
|
123
128
|
|
|
124
129
|
const serviceEvents = this.#serviceEvents.get(type);
|
|
125
130
|
if (serviceEvents) {
|
|
126
|
-
serviceEvents.deleted.emit(
|
|
131
|
+
serviceEvents.deleted.emit(localInstance);
|
|
127
132
|
}
|
|
128
133
|
}
|
|
129
134
|
|
|
130
|
-
/**
|
|
131
|
-
* Prevent this environment from automatically instantiating or retrieving a service from parent environment.
|
|
132
|
-
*
|
|
133
|
-
* @param type the class of the service to block
|
|
134
|
-
*/
|
|
135
|
-
block(type: abstract new (...args: any[]) => any) {
|
|
136
|
-
const instance = this.#services?.get(type);
|
|
137
|
-
|
|
138
|
-
if (instance !== undefined && instance !== null) {
|
|
139
|
-
this.#services?.delete(type);
|
|
140
|
-
|
|
141
|
-
this.#deleted.emit(type, instance);
|
|
142
|
-
|
|
143
|
-
const serviceEvents = this.#serviceEvents.get(type);
|
|
144
|
-
if (serviceEvents) {
|
|
145
|
-
serviceEvents.deleted.emit(instance);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
this.#services?.set(type, null);
|
|
150
|
-
}
|
|
151
|
-
|
|
152
135
|
/**
|
|
153
136
|
* Remove and close an environmental service.
|
|
154
137
|
*/
|
|
155
138
|
close<T extends object>(
|
|
156
|
-
type:
|
|
139
|
+
type: Environmental.ServiceType<T>,
|
|
157
140
|
): T extends { close: () => MaybePromise<void> } ? MaybePromise<void> : void {
|
|
158
141
|
const instance = this.maybeGet(type);
|
|
142
|
+
this.delete(type, instance); // delete and block inheritance
|
|
159
143
|
if (instance !== undefined) {
|
|
160
|
-
this.delete(type, instance);
|
|
161
144
|
return (instance as Partial<Destructable>).close?.() as T extends { close: () => MaybePromise<void> }
|
|
162
145
|
? MaybePromise<void>
|
|
163
146
|
: void;
|
|
@@ -176,7 +159,7 @@ export class Environment {
|
|
|
176
159
|
/**
|
|
177
160
|
* Install a preinitialized version of an environmental service.
|
|
178
161
|
*/
|
|
179
|
-
set<T extends {}>(type:
|
|
162
|
+
set<T extends {}>(type: Environmental.ServiceType<T>, instance: T) {
|
|
180
163
|
if (!this.#services) {
|
|
181
164
|
this.#services = new Map();
|
|
182
165
|
}
|
|
@@ -222,7 +205,7 @@ export class Environment {
|
|
|
222
205
|
*
|
|
223
206
|
* This is a more convenient way to observe a specific service than {@link added} and {@link deleted}.
|
|
224
207
|
*/
|
|
225
|
-
eventsFor<T extends Environmental.
|
|
208
|
+
eventsFor<T extends Environmental.ServiceType>(type: T) {
|
|
226
209
|
let events = this.#serviceEvents.get(type);
|
|
227
210
|
if (events === undefined) {
|
|
228
211
|
events = {
|
|
@@ -241,8 +224,8 @@ export class Environment {
|
|
|
241
224
|
* {@link added} in the future if the service is added or replaced and/or {@link deleted} if the service is replaced
|
|
242
225
|
* or deleted.
|
|
243
226
|
*/
|
|
244
|
-
applyTo<T extends
|
|
245
|
-
type: T
|
|
227
|
+
applyTo<T extends object>(
|
|
228
|
+
type: Environmental.ServiceType<T>,
|
|
246
229
|
added?: (env: Environment, service: T) => MaybePromise<void>,
|
|
247
230
|
deleted?: (env: Environment, service: T) => MaybePromise<void>,
|
|
248
231
|
) {
|
|
@@ -22,10 +22,25 @@ export namespace Environmental {
|
|
|
22
22
|
construction?: Promise<any>;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
/**
|
|
26
|
+
* An object used for service identification.
|
|
27
|
+
*
|
|
28
|
+
* We use classes as the key for service registration. Classes serve as ideal keys because they are trivial to
|
|
29
|
+
* manage and allow us to manage services in a type-safe manner.
|
|
30
|
+
*
|
|
31
|
+
* Any class may be used as the service identifier; the only requirement is that a registered instance is a subclass
|
|
32
|
+
* of the {@link ServiceType}.
|
|
33
|
+
*
|
|
34
|
+
* Note that {@link Environment} only considers service available for the exact class under which they are
|
|
35
|
+
* registered. You cannot retrieve a service registered for a subclass of a {@link ServiceType} using the base
|
|
36
|
+
* class. You can however register the under both the base and derived {@link ServiceType}s.
|
|
37
|
+
*/
|
|
38
|
+
export type ServiceType<T extends object = object> = abstract new (...args: any[]) => T;
|
|
39
|
+
|
|
25
40
|
/**
|
|
26
41
|
* A factory for a {@link Service}.
|
|
27
42
|
*
|
|
28
|
-
* A "factory" is
|
|
43
|
+
* A "factory" is a concrete {@link ServiceType} with a static {@link create} method that performs instantiation.
|
|
29
44
|
*/
|
|
30
45
|
export interface Factory<T extends object = object> {
|
|
31
46
|
new (...args: any[]): T;
|
|
@@ -42,7 +57,7 @@ export namespace Environmental {
|
|
|
42
57
|
/**
|
|
43
58
|
* Events related to service lifecycle.
|
|
44
59
|
*/
|
|
45
|
-
export interface ServiceEvents<T extends
|
|
60
|
+
export interface ServiceEvents<T extends Environmental.ServiceType> {
|
|
46
61
|
added: Observable<[instance: InstanceType<T>]>;
|
|
47
62
|
deleted: Observable<[instance: InstanceType<T>]>;
|
|
48
63
|
}
|
package/src/log/Logger.ts
CHANGED
package/src/net/Network.ts
CHANGED
|
@@ -12,6 +12,10 @@ export class NetworkError extends MatterError {}
|
|
|
12
12
|
|
|
13
13
|
export class NoAddressAvailableError extends NetworkError {}
|
|
14
14
|
|
|
15
|
+
export class BindError extends NetworkError {}
|
|
16
|
+
|
|
17
|
+
export class AddressInUseError extends BindError {}
|
|
18
|
+
|
|
15
19
|
export const STANDARD_MATTER_PORT = 5540;
|
|
16
20
|
|
|
17
21
|
/**
|
package/src/net/ServerAddress.ts
CHANGED
|
@@ -84,6 +84,22 @@ export namespace ServerAddress {
|
|
|
84
84
|
return Diagnostic.squash(...diagnostic);
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
+
export function isEqual(a: ServerAddress, b: ServerAddress): boolean {
|
|
88
|
+
if (a.type !== b.type) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
if (a.type === "udp" && b.type === "udp") {
|
|
93
|
+
return a.ip === b.ip && a.port === b.port;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (a.type === "ble" && b.type === "ble") {
|
|
97
|
+
return a.peripheralAddress === b.peripheralAddress;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
|
|
87
103
|
export function definitionOf(address: ServerAddress): Definition {
|
|
88
104
|
return address;
|
|
89
105
|
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { AppAddress } from "#net/AppAddress.js";
|
|
8
|
+
import { Bytes } from "#util/Bytes.js";
|
|
9
|
+
import { MaybePromise } from "#util/Promises.js";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* A platform-independent HTTP endpoint implementation.
|
|
13
|
+
*
|
|
14
|
+
* This provides a modern WinterTC-style interface with a focus on simplifying platform-specific implementations.
|
|
15
|
+
*/
|
|
16
|
+
export interface HttpEndpoint {
|
|
17
|
+
/**
|
|
18
|
+
* Handler for normal HTTP requests.
|
|
19
|
+
*/
|
|
20
|
+
http?: HttpEndpoint.HttpHandler;
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Handler for WebSocket upgrade requests.
|
|
24
|
+
*/
|
|
25
|
+
ws?: HttpEndpoint.WsHandler;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Release resources for the endpoint.
|
|
29
|
+
*/
|
|
30
|
+
close(): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export namespace HttpEndpoint {
|
|
34
|
+
/**
|
|
35
|
+
* HTTP request callback.
|
|
36
|
+
*/
|
|
37
|
+
export type HttpHandler = (request: Request) => MaybePromise<void | Response>;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* WebSocket request callback.
|
|
41
|
+
*/
|
|
42
|
+
export type WsHandler = (request: Request, upgrade: () => Promise<WsConnection>) => MaybePromise<void>;
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* A WebSocket connection.
|
|
46
|
+
*/
|
|
47
|
+
export interface WsConnection extends ReadableWritablePair<WsMessage, WsMessage> {}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Raw WebSocket message payload.
|
|
51
|
+
*/
|
|
52
|
+
export type WsMessage = Bytes | string;
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Configuration options.
|
|
56
|
+
*/
|
|
57
|
+
export interface Options {
|
|
58
|
+
address: AppAddress.Definition;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { HttpEndpoint } from "./HttpEndpoint.js";
|
|
8
|
+
import type { HttpService } from "./HttpService.js";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Environmental component that creates HTTP endpoints.
|
|
12
|
+
*
|
|
13
|
+
* This component creates a dedicated HTTP server. Use {@link HttpService} for shared access to HTTP endpoints.
|
|
14
|
+
*/
|
|
15
|
+
export abstract class HttpEndpointFactory {
|
|
16
|
+
/**
|
|
17
|
+
* Indicates support for HTTP handlers.
|
|
18
|
+
*/
|
|
19
|
+
supportsHttp = true;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Indicates support for WebSocket handlers.
|
|
23
|
+
*/
|
|
24
|
+
supportsWs = true;
|
|
25
|
+
|
|
26
|
+
abstract create(options: HttpEndpoint.Options): Promise<HttpEndpoint>;
|
|
27
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { Logger } from "#log/Logger.js";
|
|
8
|
+
import { MatterAggregateError } from "#MatterError.js";
|
|
9
|
+
import { HttpEndpoint } from "./HttpEndpoint.js";
|
|
10
|
+
|
|
11
|
+
const logger = Logger.get("HttpEndpointGroup");
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* A collection of HTTP endpoints that support the same set of handlers.
|
|
15
|
+
*/
|
|
16
|
+
export class HttpEndpointGroup implements HttpEndpoint {
|
|
17
|
+
#endpoints: HttpEndpoint[];
|
|
18
|
+
|
|
19
|
+
constructor(endpoints: HttpEndpoint[]) {
|
|
20
|
+
this.#endpoints = endpoints;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
set http(handler: HttpEndpoint.HttpHandler) {
|
|
24
|
+
for (const endpoint of this.#endpoints) {
|
|
25
|
+
endpoint.http = handler;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
set ws(handler: HttpEndpoint.WsHandler) {
|
|
30
|
+
for (const endpoint of this.#endpoints) {
|
|
31
|
+
endpoint.ws = handler;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
async close(): Promise<void> {
|
|
36
|
+
try {
|
|
37
|
+
await MatterAggregateError.allSettled(this.#endpoints.map(endpoint => endpoint.close()));
|
|
38
|
+
} catch (e) {
|
|
39
|
+
logger.error("Error closing HTTP endpoints", e);
|
|
40
|
+
}
|
|
41
|
+
this.#endpoints = [];
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { Environment } from "#environment/Environment.js";
|
|
8
|
+
import { Environmental } from "#environment/Environmental.js";
|
|
9
|
+
import { ImplementationError } from "#MatterError.js";
|
|
10
|
+
import { AppAddress } from "#net/AppAddress.js";
|
|
11
|
+
import { HttpEndpoint } from "./HttpEndpoint.js";
|
|
12
|
+
import { HttpEndpointFactory } from "./HttpEndpointFactory.js";
|
|
13
|
+
import { HttpEndpointGroup } from "./HttpEndpointGroup.js";
|
|
14
|
+
import { HttpSharedEndpoint } from "./HttpSharedEndpoint.js";
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* An environmental service that manages shared access to a set of endpoints.
|
|
18
|
+
*/
|
|
19
|
+
export class HttpService {
|
|
20
|
+
#factory: HttpEndpointFactory;
|
|
21
|
+
#endpoints = {} as Record<string, HttpSharedEndpoint>;
|
|
22
|
+
|
|
23
|
+
constructor(factory: HttpEndpointFactory) {
|
|
24
|
+
this.#factory = factory;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async create(...addresses: AppAddress.Definition[]) {
|
|
28
|
+
if (addresses.length === 1) {
|
|
29
|
+
return this.#forAddress(addresses[0]);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const endpoints = Array<HttpEndpoint>();
|
|
33
|
+
|
|
34
|
+
try {
|
|
35
|
+
for (const address of addresses) {
|
|
36
|
+
endpoints.push(await this.#forAddress(address));
|
|
37
|
+
}
|
|
38
|
+
} catch (e) {
|
|
39
|
+
await Promise.allSettled(endpoints.map(endpoint => endpoint.close()));
|
|
40
|
+
throw e;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return new HttpEndpointGroup(endpoints);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async #forAddress(address: AppAddress.Definition) {
|
|
47
|
+
const addr = AppAddress.for(address);
|
|
48
|
+
if (addr.appProtocol !== "http" && addr.appProtocol !== "ws") {
|
|
49
|
+
throw new ImplementationError(`Unsupported address ${addr} for HTTP endpoint`);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const key = JSON.stringify(addr.transport);
|
|
53
|
+
let endpoint = this.#endpoints[key];
|
|
54
|
+
if (endpoint) {
|
|
55
|
+
if (endpoint.isTls !== addr.isTls) {
|
|
56
|
+
const addrIs = addr.isTls ? "encrypted" : "unencrypted";
|
|
57
|
+
const endpointIs = endpoint.isTls ? "encrypted" : "unencrypted";
|
|
58
|
+
throw new ImplementationError(
|
|
59
|
+
`Service address ${addr} is ${addrIs} but existing endpoint is ${endpointIs}`,
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
} else {
|
|
63
|
+
endpoint = new HttpSharedEndpoint(addr.isTls, () => this.#factory.create({ address }));
|
|
64
|
+
this.#endpoints[key] = endpoint;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
return await endpoint.use();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
static [Environmental.create](env: Environment) {
|
|
71
|
+
const instance = new HttpService(env.get(HttpEndpointFactory));
|
|
72
|
+
env.set(HttpService, instance);
|
|
73
|
+
return instance;
|
|
74
|
+
}
|
|
75
|
+
}
|