@matter/protocol 0.12.6-alpha.0-20250304-03716637c → 0.13.0-alpha.0-20250304-d4a7592a4
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/common/Scanner.d.ts +25 -1
- package/dist/cjs/common/Scanner.d.ts.map +1 -1
- package/dist/cjs/common/Scanner.js +18 -1
- package/dist/cjs/common/Scanner.js.map +1 -1
- package/dist/cjs/mdns/MdnsBroadcaster.js +3 -3
- package/dist/cjs/mdns/MdnsConsts.d.ts.map +1 -1
- package/dist/cjs/mdns/MdnsScanner.d.ts.map +1 -1
- package/dist/cjs/mdns/MdnsScanner.js +1 -1
- package/dist/cjs/mdns/MdnsScanner.js.map +1 -1
- package/dist/cjs/peer/ControllerCommissioningFlow.d.ts.map +1 -1
- package/dist/cjs/peer/ControllerCommissioningFlow.js +55 -55
- package/dist/cjs/peer/ControllerCommissioningFlow.js.map +1 -1
- package/dist/cjs/session/Session.d.ts +33 -1
- package/dist/cjs/session/Session.d.ts.map +1 -1
- package/dist/cjs/session/Session.js +16 -3
- package/dist/cjs/session/Session.js.map +1 -1
- package/dist/cjs/session/SessionManager.d.ts.map +1 -1
- package/dist/cjs/session/SessionManager.js +14 -4
- package/dist/cjs/session/SessionManager.js.map +1 -1
- package/dist/cjs/session/case/CaseMessages.d.ts +15 -0
- package/dist/cjs/session/case/CaseMessages.d.ts.map +1 -1
- package/dist/cjs/session/case/CaseMessenger.d.ts +15 -0
- package/dist/cjs/session/case/CaseMessenger.d.ts.map +1 -1
- package/dist/cjs/session/pase/PaseClient.d.ts.map +1 -1
- package/dist/cjs/session/pase/PaseClient.js +7 -1
- package/dist/cjs/session/pase/PaseClient.js.map +1 -1
- package/dist/cjs/session/pase/PaseMessages.d.ts +21 -0
- package/dist/cjs/session/pase/PaseMessages.d.ts.map +1 -1
- package/dist/cjs/session/pase/PaseMessages.js +6 -1
- package/dist/cjs/session/pase/PaseMessages.js.map +1 -1
- package/dist/cjs/session/pase/PaseMessenger.d.ts +10 -0
- package/dist/cjs/session/pase/PaseMessenger.d.ts.map +1 -1
- package/dist/cjs/session/pase/PaseServer.d.ts.map +1 -1
- package/dist/cjs/session/pase/PaseServer.js +8 -2
- package/dist/cjs/session/pase/PaseServer.js.map +1 -1
- package/dist/esm/common/Scanner.d.ts +25 -1
- package/dist/esm/common/Scanner.d.ts.map +1 -1
- package/dist/esm/common/Scanner.js +18 -1
- package/dist/esm/common/Scanner.js.map +1 -1
- package/dist/esm/mdns/MdnsBroadcaster.js +3 -3
- package/dist/esm/mdns/MdnsConsts.d.ts.map +1 -1
- package/dist/esm/mdns/MdnsScanner.d.ts.map +1 -1
- package/dist/esm/mdns/MdnsScanner.js +1 -1
- package/dist/esm/mdns/MdnsScanner.js.map +1 -1
- package/dist/esm/peer/ControllerCommissioningFlow.d.ts.map +1 -1
- package/dist/esm/peer/ControllerCommissioningFlow.js +55 -55
- package/dist/esm/peer/ControllerCommissioningFlow.js.map +1 -1
- package/dist/esm/session/Session.d.ts +33 -1
- package/dist/esm/session/Session.d.ts.map +1 -1
- package/dist/esm/session/Session.js +16 -3
- package/dist/esm/session/Session.js.map +1 -1
- package/dist/esm/session/SessionManager.d.ts.map +1 -1
- package/dist/esm/session/SessionManager.js +15 -4
- package/dist/esm/session/SessionManager.js.map +1 -1
- package/dist/esm/session/case/CaseMessages.d.ts +15 -0
- package/dist/esm/session/case/CaseMessages.d.ts.map +1 -1
- package/dist/esm/session/case/CaseMessenger.d.ts +15 -0
- package/dist/esm/session/case/CaseMessenger.d.ts.map +1 -1
- package/dist/esm/session/pase/PaseClient.d.ts.map +1 -1
- package/dist/esm/session/pase/PaseClient.js +7 -1
- package/dist/esm/session/pase/PaseClient.js.map +1 -1
- package/dist/esm/session/pase/PaseMessages.d.ts +21 -0
- package/dist/esm/session/pase/PaseMessages.d.ts.map +1 -1
- package/dist/esm/session/pase/PaseMessages.js +16 -2
- package/dist/esm/session/pase/PaseMessages.js.map +1 -1
- package/dist/esm/session/pase/PaseMessenger.d.ts +10 -0
- package/dist/esm/session/pase/PaseMessenger.d.ts.map +1 -1
- package/dist/esm/session/pase/PaseServer.d.ts.map +1 -1
- package/dist/esm/session/pase/PaseServer.js +8 -2
- package/dist/esm/session/pase/PaseServer.js.map +1 -1
- package/package.json +6 -6
- package/src/common/Scanner.ts +18 -2
- package/src/mdns/MdnsBroadcaster.ts +3 -3
- package/src/mdns/MdnsScanner.ts +3 -2
- package/src/peer/ControllerCommissioningFlow.ts +55 -52
- package/src/session/Session.ts +50 -1
- package/src/session/SessionManager.ts +20 -2
- package/src/session/pase/PaseClient.ts +10 -1
- package/src/session/pase/PaseMessages.ts +17 -1
- package/src/session/pase/PaseServer.ts +11 -1
|
@@ -29,6 +29,11 @@ export declare class PaseServerMessenger extends SecureChannelMessenger {
|
|
|
29
29
|
interactionModelRevision: import("#types").OptionalFieldType<number>;
|
|
30
30
|
specificationVersion: import("#types").OptionalFieldType<number>;
|
|
31
31
|
maxPathsPerInvoke: import("#types").OptionalFieldType<number>;
|
|
32
|
+
supportedTransports: import("#types").OptionalFieldType<import("#types").TypeFromPartialBitSchema<{
|
|
33
|
+
tcpClient: import("#types").BitFlag;
|
|
34
|
+
tcpServer: import("#types").BitFlag;
|
|
35
|
+
}>>;
|
|
36
|
+
maxTcpMessageSize: import("#types").OptionalFieldType<number>;
|
|
32
37
|
}>>;
|
|
33
38
|
}>;
|
|
34
39
|
}>;
|
|
@@ -61,6 +66,11 @@ export declare class PaseClientMessenger extends SecureChannelMessenger {
|
|
|
61
66
|
interactionModelRevision: import("#types").OptionalFieldType<number>;
|
|
62
67
|
specificationVersion: import("#types").OptionalFieldType<number>;
|
|
63
68
|
maxPathsPerInvoke: import("#types").OptionalFieldType<number>;
|
|
69
|
+
supportedTransports: import("#types").OptionalFieldType<import("#types").TypeFromPartialBitSchema<{
|
|
70
|
+
tcpClient: import("#types").BitFlag;
|
|
71
|
+
tcpServer: import("#types").BitFlag;
|
|
72
|
+
}>>;
|
|
73
|
+
maxTcpMessageSize: import("#types").OptionalFieldType<number>;
|
|
64
74
|
}>>;
|
|
65
75
|
}>;
|
|
66
76
|
}>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaseMessenger.d.ts","sourceRoot":"","sources":["../../../../src/session/pase/PaseMessenger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAqB,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAEH,sBAAsB,EACzB,MAAM,+CAA+C,CAAC;AACvD,OAAO,EACH,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACxB,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,aAAa,6BAAiD,CAAC;AAE5E,KAAK,iBAAiB,GAAG,cAAc,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACrE,KAAK,kBAAkB,GAAG,cAAc,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACvE,KAAK,SAAS,GAAG,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC;AACrD,KAAK,SAAS,GAAG,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC;AACrD,KAAK,SAAS,GAAG,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC;AAErD,qBAAa,mBAAoB,SAAQ,sBAAsB;IACrD,qBAAqB
|
|
1
|
+
{"version":3,"file":"PaseMessenger.d.ts","sourceRoot":"","sources":["../../../../src/session/pase/PaseMessenger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAqB,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAEH,sBAAsB,EACzB,MAAM,+CAA+C,CAAC;AACvD,OAAO,EACH,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACxB,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,aAAa,6BAAiD,CAAC;AAE5E,KAAK,iBAAiB,GAAG,cAAc,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACrE,KAAK,kBAAkB,GAAG,cAAc,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACvE,KAAK,SAAS,GAAG,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC;AACrD,KAAK,SAAS,GAAG,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC;AACrD,KAAK,SAAS,GAAG,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC;AAErD,qBAAa,mBAAoB,SAAQ,sBAAsB;IACrD,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;IAQrB,sBAAsB,CAAC,QAAQ,EAAE,kBAAkB;IAMzD,aAAa;;;IAIb,aAAa,CAAC,SAAS,EAAE,SAAS;IAIlC,aAAa;;;CAGhB;AAED,qBAAa,mBAAoB,SAAQ,sBAAsB;IAC3D,qBAAqB,CAAC,OAAO,EAAE,iBAAiB;IAM1C,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;IAQ5B,aAAa,CAAC,SAAS,EAAE,SAAS;IAIlC,aAAa;;;;IAIb,aAAa,CAAC,SAAS,EAAE,SAAS;CAGrC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PaseServer.d.ts","sourceRoot":"","sources":["../../../../src/session/pase/PaseServer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAKH,eAAe,EACf,eAAe,EAKlB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE,OAAO,EAAuB,mBAAmB,EAAiB,MAAM,oBAAoB,CAAC;AAS7F,qBAAa,oCAAqC,SAAQ,eAAe;CAAG;AAE5E,qBAAa,UAAW,YAAW,eAAe;;IAsB1C,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IAxBrC,QAAQ,CAAC,EAAE,KAA8B;WAK5B,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe;IAKrG,MAAM,CAAC,qBAAqB,CACxB,QAAQ,EAAE,cAAc,EACxB,iBAAiB,EAAE,UAAU,EAC7B,eAAe,CAAC,EAAE,eAAe;gBAQzB,QAAQ,EAAE,cAAc,EACf,EAAE,EAAE,MAAM,EACV,CAAC,EAAE,UAAU,EACb,eAAe,CAAC,EAAE,eAAe,YAAA;IAGhD,aAAa,CAAC,QAAQ,EAAE,eAAe;YA0B/B,oBAAoB;
|
|
1
|
+
{"version":3,"file":"PaseServer.d.ts","sourceRoot":"","sources":["../../../../src/session/pase/PaseServer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAKH,eAAe,EACf,eAAe,EAKlB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE,OAAO,EAAuB,mBAAmB,EAAiB,MAAM,oBAAoB,CAAC;AAS7F,qBAAa,oCAAqC,SAAQ,eAAe;CAAG;AAE5E,qBAAa,UAAW,YAAW,eAAe;;IAsB1C,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IAxBrC,QAAQ,CAAC,EAAE,KAA8B;WAK5B,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe;IAKrG,MAAM,CAAC,qBAAqB,CACxB,QAAQ,EAAE,cAAc,EACxB,iBAAiB,EAAE,UAAU,EAC7B,eAAe,CAAC,EAAE,eAAe;gBAQzB,QAAQ,EAAE,cAAc,EACf,EAAE,EAAE,MAAM,EACV,CAAC,EAAE,UAAU,EACb,eAAe,CAAC,EAAE,eAAe,YAAA;IAGhD,aAAa,CAAC,QAAQ,EAAE,eAAe;YA0B/B,oBAAoB;IA6F5B,aAAa,CAAC,SAAS,EAAE,mBAAmB,EAAE,SAAS,UAAO;IAU9D,KAAK;CAGd"}
|
|
@@ -94,13 +94,19 @@ class PaseServer {
|
|
|
94
94
|
}
|
|
95
95
|
const responderSessionId = await this.sessions.getNextAvailableSessionId();
|
|
96
96
|
const responderRandom = Crypto.getRandom();
|
|
97
|
+
const responderSessionParams = this.sessions.sessionParameters;
|
|
98
|
+
const tcpSupported = responderSessionParams.supportedTransports?.tcpClient || responderSessionParams.supportedTransports?.tcpServer || false;
|
|
97
99
|
const responsePayload = await messenger.sendPbkdfParamResponse({
|
|
98
100
|
initiatorRandom,
|
|
99
101
|
responderRandom,
|
|
100
102
|
responderSessionId,
|
|
101
103
|
pbkdfParameters: hasPbkdfParameters ? void 0 : this.pbkdfParameters,
|
|
102
|
-
responderSessionParams:
|
|
103
|
-
|
|
104
|
+
responderSessionParams: {
|
|
105
|
+
...responderSessionParams,
|
|
106
|
+
// The MAX_TCP_MESSAGE_SIZE field SHALL only be present if the SUPPORTED_TRANSPORTS field
|
|
107
|
+
// indicates that TCP is supported.
|
|
108
|
+
maxTcpMessageSize: tcpSupported ? responderSessionParams.maxTcpMessageSize : void 0
|
|
109
|
+
}
|
|
104
110
|
});
|
|
105
111
|
const spake2p = Spake2p.create(Crypto.hash([SPAKE_CONTEXT, requestPayload, responsePayload]), this.w0);
|
|
106
112
|
const { x: X } = await messenger.readPasePake1();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../src/session/pase/PaseServer.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA,EACI;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,OACG;AAEP,SAAS,QAAQ,oBAAoB,kCAAkC;AAGvE,SAAS,kCAAkC;AAC3C,SAAS,qBAAqB,qBAAqB,qBAAqB;AAExE,MAAM,EAAE,gBAAgB,IAAI;AAE5B,MAAM,SAAS,OAAO,IAAI,YAAY;AAEtC,MAAM,0BAA0B;AAChC,MAAM,gCAAgC;AAE/B,MAAM,6CAA6C,gBAAgB;AAAC;AAEpE,MAAM,WAAsC;AAAA,EAqB/C,YACY,UACS,IACA,GACA,iBACnB;AAJU;AACS;AACA;AACA;AAAA,EAClB;AAAA,EAzBM,KAAK;AAAA,EAEd;AAAA,EACA,iBAAiB;AAAA,EAEjB,aAAa,QAAQ,UAA0B,cAAsB,iBAAkC;AACnG,UAAM,EAAE,IAAI,EAAE,IAAI,MAAM,QAAQ,WAAW,iBAAiB,YAAY;AACxE,WAAO,IAAI,WAAW,UAAU,IAAI,GAAG,eAAe;AAAA,EAC1D;AAAA,EAEA,OAAO,sBACH,UACA,mBACA,iBACF;AACE,UAAM,KAAK,gBAAgB,kBAAkB,MAAM,GAAG,EAAE,CAAC;AACzD,UAAM,IAAI,kBAAkB,MAAM,IAAI,KAAK,EAAE;AAC7C,WAAO,IAAI,WAAW,UAAU,IAAI,GAAG,eAAe;AAAA,EAC1D;AAAA,EASA,MAAM,cAAc,UAA2B;AAC3C,UAAM,YAAY,IAAI,oBAAoB,QAAQ;AAClD,QAAI;AACA,YAAM,KAAK,qBAAqB,SAAS;AAAA,IAC7C,SAAS,OAAO;AACZ,WAAK;AACL,aAAO;AAAA,QACH,oDAAoD,KAAK,cAAc,IAAI,6BAA6B;AAAA,QACxG;AAAA,MACJ;AAGA,YAAM,YAAY,EAAE,iBAAiB;AACrC,YAAM,KAAK,cAAc,WAAW,SAAS;AAE7C,UAAI,KAAK,kBAAkB,+BAA+B;AACtD,cAAM,IAAI;AAAA,UACN;AAAA,QACJ;AAAA,MACJ;AAAA,IACJ,UAAE;AAEE,YAAM,SAAS,QAAQ,QAAQ;AAAA,IACnC;AAAA,EACJ;AAAA,EAEA,MAAc,qBAAqB,WAAgC;AAK/D,QAAI,KAAK,SAAS,eAAe,GAAG;AAChC,YAAM,IAAI;AAAA,QACN;AAAA,MACJ;AAAA,IACJ;AAEA,QAAI,KAAK,kBAAkB,UAAa,KAAK,cAAc,WAAW;AAClE,YAAM,IAAI;AAAA,QACN;AAAA,MACJ;AAAA,IACJ;AAEA,WAAO,KAAK,iCAAiC,UAAU,eAAe,CAAC,GAAG;AAE1E,SAAK,gBAAgB,KAAK;AAAA,MAAS;AAAA,MAAwB;AAAA,MAAyB,MAChF,KAAK,cAAc,SAAS;AAAA,IAChC,EAAE,MAAM;AAGR,UAAM;AAAA,MACF;AAAA,MACA,SAAS;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,oBAAoB;AAAA,MACxB;AAAA,IACJ,IAAI,MAAM,UAAU,sBAAsB;AAC1C,QAAI,eAAe,qBAAqB;AACpC,YAAM,IAAI,oBAAoB,2BAA2B,UAAU,GAAG;AAAA,IAC1E;AAEA,UAAM,qBAAqB,MAAM,KAAK,SAAS,0BAA0B;AACzE,UAAM,kBAAkB,OAAO,UAAU;AAEzC,UAAM,kBAAkB,MAAM,UAAU,uBAAuB;AAAA,MAC3D;AAAA,MACA;AAAA,MACA;AAAA,MACA,iBAAiB,qBAAqB,SAAY,KAAK;AAAA,MACvD,wBAAwB,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matter/protocol",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.0-alpha.0-20250304-d4a7592a4",
|
|
4
4
|
"description": "Low-level APIs for Matter interaction",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"iot",
|
|
@@ -40,14 +40,14 @@
|
|
|
40
40
|
"#*": "./src/*"
|
|
41
41
|
},
|
|
42
42
|
"dependencies": {
|
|
43
|
-
"@matter/general": "0.
|
|
44
|
-
"@matter/model": "0.
|
|
45
|
-
"@matter/types": "0.
|
|
43
|
+
"@matter/general": "0.13.0-alpha.0-20250304-d4a7592a4",
|
|
44
|
+
"@matter/model": "0.13.0-alpha.0-20250304-d4a7592a4",
|
|
45
|
+
"@matter/types": "0.13.0-alpha.0-20250304-d4a7592a4",
|
|
46
46
|
"@noble/curves": "^1.8.1"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@matter/tools": "0.
|
|
50
|
-
"@matter/testing": "0.
|
|
49
|
+
"@matter/tools": "0.13.0-alpha.0-20250304-d4a7592a4",
|
|
50
|
+
"@matter/testing": "0.13.0-alpha.0-20250304-d4a7592a4"
|
|
51
51
|
},
|
|
52
52
|
"files": [
|
|
53
53
|
"dist/**/*",
|
package/src/common/Scanner.ts
CHANGED
|
@@ -5,9 +5,25 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { BasicSet, ChannelType, Environment, Environmental, Lifespan, ServerAddress, ServerAddressIp } from "#general";
|
|
8
|
-
import { DiscoveryCapabilitiesBitmap, NodeId, TypeFromPartialBitSchema, VendorId } from "#types";
|
|
8
|
+
import { BitFlag, BitmapSchema, DiscoveryCapabilitiesBitmap, NodeId, TypeFromPartialBitSchema, VendorId } from "#types";
|
|
9
9
|
import { Fabric } from "../fabric/Fabric.js";
|
|
10
10
|
|
|
11
|
+
export const SupportedTransportsBitmap = {
|
|
12
|
+
// Bit 0 is reserved
|
|
13
|
+
/**
|
|
14
|
+
* TCP Client
|
|
15
|
+
* The advertising Node implements the TCP Client mode and MAY connect to a peer Node that is a TCP Server.
|
|
16
|
+
*/
|
|
17
|
+
tcpClient: BitFlag(1),
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* TCP Server
|
|
21
|
+
* The advertising Node implements the TCP Server mode and SHALL listen for incoming TCP connections.
|
|
22
|
+
*/
|
|
23
|
+
tcpServer: BitFlag(2),
|
|
24
|
+
};
|
|
25
|
+
export const SupportedTransportsSchema = BitmapSchema(SupportedTransportsBitmap);
|
|
26
|
+
|
|
11
27
|
/**
|
|
12
28
|
* All information exposed by a commissionable device via announcements.
|
|
13
29
|
* The properties are named identical as in the Matter specification.
|
|
@@ -41,7 +57,7 @@ export type DiscoveryData = {
|
|
|
41
57
|
SAT?: number;
|
|
42
58
|
|
|
43
59
|
/** TCP supported */
|
|
44
|
-
T?: number;
|
|
60
|
+
T?: number; // SupportedTransportsBitmap but comes in as number, so converted on usage
|
|
45
61
|
|
|
46
62
|
/** ICD Long Idle Time operating mode supported */
|
|
47
63
|
ICD?: number;
|
|
@@ -231,7 +231,7 @@ export class MdnsBroadcaster {
|
|
|
231
231
|
`SII=${sessionIdleInterval}` /* Session Idle Interval */,
|
|
232
232
|
`SAI=${sessionActiveInterval}` /* Session Active Interval */,
|
|
233
233
|
`SAT=${sessionActiveThreshold}` /* Session Active Threshold */,
|
|
234
|
-
//`T=${TCP_SUPPORTED}` /* TCP not supported */,
|
|
234
|
+
//`T=${TCP_SUPPORTED}` /* TODO TCP not supported */,
|
|
235
235
|
`D=${discriminator}` /* Discriminator */,
|
|
236
236
|
`CM=${mode}` /* Commission Mode */,
|
|
237
237
|
`PH=${PairingHintBitmapSchema.encode(pairingHint)}` /* Pairing Hint */,
|
|
@@ -324,7 +324,7 @@ export class MdnsBroadcaster {
|
|
|
324
324
|
`SII=${sessionIdleInterval}` /* Session Idle Interval */,
|
|
325
325
|
`SAI=${sessionActiveInterval}` /* Session Active Interval */,
|
|
326
326
|
`SAT=${sessionActiveThreshold}` /* Session Active Threshold */,
|
|
327
|
-
//`T=${TCP_SUPPORTED}` /* TCP not supported */,
|
|
327
|
+
//`T=${TCP_SUPPORTED}` /* TODO TCP not supported */,
|
|
328
328
|
//`ICD=${ICD_SUPPORTED}` /* ICD not supported */,
|
|
329
329
|
],
|
|
330
330
|
deviceMatterQname,
|
|
@@ -387,7 +387,7 @@ export class MdnsBroadcaster {
|
|
|
387
387
|
`SII=${sessionIdleInterval}` /* Session Idle Interval */,
|
|
388
388
|
`SAI=${sessionActiveInterval}` /* Session Active Interval */,
|
|
389
389
|
`SAT=${sessionActiveThreshold}` /* Session Active Threshold */,
|
|
390
|
-
//`T=${TCP_SUPPORTED}` /* TCP not supported */,
|
|
390
|
+
//`T=${TCP_SUPPORTED}` /* TODO TCP not supported */,
|
|
391
391
|
//`ICD=${ICD_SUPPORTED}` /* ICD not supported */,
|
|
392
392
|
]),
|
|
393
393
|
];
|
package/src/mdns/MdnsScanner.ts
CHANGED
|
@@ -1316,8 +1316,9 @@ export class MdnsScanner implements Scanner {
|
|
|
1316
1316
|
// Fill in some defaults for convenience
|
|
1317
1317
|
if (result.T === undefined) {
|
|
1318
1318
|
result.T = 0; // TCP not supported
|
|
1319
|
-
} else if (result.T
|
|
1320
|
-
// Value 1 is reserved and should be handled as 0 according to Matter spec
|
|
1319
|
+
} else if (!(result.T & ~1 & 6)) {
|
|
1320
|
+
// Value 1 is reserved and should be handled as 0 according to Matter spec,
|
|
1321
|
+
// else check if tcpClient (Bit 1) or tcpServer (Bit 2) or both are supported, all other values are invalid
|
|
1321
1322
|
result.T = 0; // TCP not supported
|
|
1322
1323
|
}
|
|
1323
1324
|
if (result.ICD === undefined) {
|
|
@@ -313,47 +313,50 @@ export class ControllerCommissioningFlow {
|
|
|
313
313
|
|
|
314
314
|
// Step 1: is outside of this class and requires to have relevant information needed by next steps
|
|
315
315
|
// Step 2: is about discovery which is already done before this starts here
|
|
316
|
-
// Step 3:
|
|
316
|
+
// TODO Step 3-5: Commissioner handles/prepares for T&C Ack, if supported
|
|
317
|
+
// Step 6: is the PASE session establishment which is done before this starts here
|
|
317
318
|
|
|
318
319
|
this.#commissioningSteps.push({
|
|
319
|
-
stepNumber:
|
|
320
|
+
stepNumber: 7,
|
|
320
321
|
subStepNumber: 1,
|
|
321
322
|
name: "GeneralCommissioning.ArmFailsafe",
|
|
322
323
|
stepLogic: () => this.#armFailsafe(),
|
|
323
324
|
});
|
|
324
325
|
|
|
325
326
|
this.#commissioningSteps.push({
|
|
326
|
-
stepNumber:
|
|
327
|
+
stepNumber: 8,
|
|
327
328
|
subStepNumber: 1,
|
|
328
329
|
name: "GeneralCommissioning.ConfigureRegulatoryInformation",
|
|
329
330
|
stepLogic: () => this.#configureRegulatoryInformation(),
|
|
330
331
|
});
|
|
331
332
|
|
|
332
333
|
this.#commissioningSteps.push({
|
|
333
|
-
stepNumber:
|
|
334
|
+
stepNumber: 8,
|
|
334
335
|
subStepNumber: 2,
|
|
335
336
|
name: "TimeSynchronization.SynchronizeTime",
|
|
336
337
|
stepLogic: () => this.#synchronizeTime(),
|
|
337
338
|
});
|
|
338
339
|
|
|
340
|
+
// TODO Step 9: If device and Controller supports T&C Feature then User consent is handled
|
|
341
|
+
|
|
339
342
|
this.#commissioningSteps.push({
|
|
340
|
-
stepNumber:
|
|
343
|
+
stepNumber: 10,
|
|
341
344
|
subStepNumber: 1,
|
|
342
345
|
name: "OperationalCredentials.DeviceAttestation",
|
|
343
346
|
stepLogic: () => this.#deviceAttestation(),
|
|
344
347
|
});
|
|
345
348
|
|
|
346
349
|
this.#commissioningSteps.push({
|
|
347
|
-
stepNumber:
|
|
350
|
+
stepNumber: 11, // includes 11-13
|
|
348
351
|
subStepNumber: 1,
|
|
349
352
|
name: "OperationalCredentials.Certificates",
|
|
350
353
|
stepLogic: () => this.#certificates(),
|
|
351
354
|
});
|
|
352
355
|
|
|
353
|
-
// TODO Step
|
|
356
|
+
// TODO Step 14: TimeSynchronization.SetTrustedTimeSource if supported
|
|
354
357
|
|
|
355
358
|
this.#commissioningSteps.push({
|
|
356
|
-
stepNumber:
|
|
359
|
+
stepNumber: 15,
|
|
357
360
|
subStepNumber: 1,
|
|
358
361
|
name: "AccessControl",
|
|
359
362
|
stepLogic: () => this.#configureAccessControlLists(),
|
|
@@ -362,14 +365,14 @@ export class ControllerCommissioningFlow {
|
|
|
362
365
|
// Care about Network commissioning only when we are on BLE, because else we are already on IP network
|
|
363
366
|
if (this.#interactionClient.channelType === ChannelType.BLE) {
|
|
364
367
|
this.#commissioningSteps.push({
|
|
365
|
-
stepNumber:
|
|
368
|
+
stepNumber: 16,
|
|
366
369
|
subStepNumber: 1,
|
|
367
370
|
name: "NetworkCommissioning.Validate",
|
|
368
371
|
stepLogic: () => this.#validateNetwork(),
|
|
369
372
|
});
|
|
370
373
|
if (this.#commissioningOptions.wifiNetwork !== undefined) {
|
|
371
374
|
this.#commissioningSteps.push({
|
|
372
|
-
stepNumber:
|
|
375
|
+
stepNumber: 16, // includes step 17
|
|
373
376
|
subStepNumber: 2,
|
|
374
377
|
name: "NetworkCommissioning.Wifi",
|
|
375
378
|
reArmFailsafe: true,
|
|
@@ -378,7 +381,7 @@ export class ControllerCommissioningFlow {
|
|
|
378
381
|
}
|
|
379
382
|
if (this.#commissioningOptions.threadNetwork !== undefined) {
|
|
380
383
|
this.#commissioningSteps.push({
|
|
381
|
-
stepNumber:
|
|
384
|
+
stepNumber: 16, // includes step 17
|
|
382
385
|
subStepNumber: 3,
|
|
383
386
|
name: "NetworkCommissioning.Thread",
|
|
384
387
|
reArmFailsafe: true,
|
|
@@ -392,7 +395,7 @@ export class ControllerCommissioningFlow {
|
|
|
392
395
|
}
|
|
393
396
|
|
|
394
397
|
this.#commissioningSteps.push({
|
|
395
|
-
stepNumber:
|
|
398
|
+
stepNumber: 18, // includes step 19 (CASE connection)
|
|
396
399
|
subStepNumber: 1,
|
|
397
400
|
name: "Reconnect",
|
|
398
401
|
reArmFailsafe: true,
|
|
@@ -400,14 +403,14 @@ export class ControllerCommissioningFlow {
|
|
|
400
403
|
});
|
|
401
404
|
|
|
402
405
|
this.#commissioningSteps.push({
|
|
403
|
-
stepNumber:
|
|
406
|
+
stepNumber: 20,
|
|
404
407
|
subStepNumber: 1,
|
|
405
408
|
name: "GeneralCommissioning.Complete",
|
|
406
409
|
stepLogic: () => this.#completeCommissioning(),
|
|
407
410
|
});
|
|
408
411
|
|
|
409
412
|
this.#commissioningSteps.push({
|
|
410
|
-
stepNumber:
|
|
413
|
+
stepNumber: 99, // Should be allowed in Step 13, but Tasmota is not supporting this
|
|
411
414
|
subStepNumber: 1,
|
|
412
415
|
name: "OperationalCredentials.UpdateFabricLabel",
|
|
413
416
|
stepLogic: () => this.#updateFabricLabel(),
|
|
@@ -531,7 +534,7 @@ export class ControllerCommissioningFlow {
|
|
|
531
534
|
}
|
|
532
535
|
|
|
533
536
|
/**
|
|
534
|
-
* Step
|
|
537
|
+
* Step 7
|
|
535
538
|
* Commissioner SHALL re-arm the Fail-safe timer on the Commissionee to the desired commissioning
|
|
536
539
|
* timeout within 60 seconds of the completion of PASE session establishment, using the
|
|
537
540
|
* ArmFailSafe command (see Section 11.10.6.2, “ArmFailSafe Command”). A Commissioner MAY
|
|
@@ -579,7 +582,7 @@ export class ControllerCommissioningFlow {
|
|
|
579
582
|
}
|
|
580
583
|
|
|
581
584
|
/**
|
|
582
|
-
* Step
|
|
585
|
+
* Step 8 - 1
|
|
583
586
|
* Commissioner SHALL configure regulatory information if the Commissionee has at least one instance of
|
|
584
587
|
* the Network Commissioning cluster on any endpoint with either the WI (i.e. Wi-Fi) or TH (i.e. Thread)
|
|
585
588
|
* feature flags set in its FeatureMap, Commissioner SHALL configure regulatory information in the
|
|
@@ -650,7 +653,7 @@ export class ControllerCommissioningFlow {
|
|
|
650
653
|
}
|
|
651
654
|
|
|
652
655
|
/**
|
|
653
|
-
* Step
|
|
656
|
+
* Step 8 - 2
|
|
654
657
|
* Commissioner SHOULD configure UTC time, timezone, and DST offset, if the Commissionee supports the
|
|
655
658
|
* time synchronization cluster.
|
|
656
659
|
* ▪ The Commissioner SHOULD configure UTC time using the SetUTCTime command.
|
|
@@ -675,7 +678,7 @@ export class ControllerCommissioningFlow {
|
|
|
675
678
|
}
|
|
676
679
|
|
|
677
680
|
/**
|
|
678
|
-
* Step
|
|
681
|
+
* Step 10
|
|
679
682
|
* Commissioner SHALL establish the authenticity of the Commissionee as a certified Matter device
|
|
680
683
|
* (see Section 6.2.3, “Device Attestation Procedure”).
|
|
681
684
|
*/
|
|
@@ -721,20 +724,20 @@ export class ControllerCommissioningFlow {
|
|
|
721
724
|
}
|
|
722
725
|
|
|
723
726
|
/**
|
|
724
|
-
* Step
|
|
725
|
-
*
|
|
726
|
-
*
|
|
727
|
-
*
|
|
728
|
-
*
|
|
729
|
-
*
|
|
730
|
-
*
|
|
731
|
-
*
|
|
732
|
-
*
|
|
733
|
-
*
|
|
734
|
-
*
|
|
735
|
-
*
|
|
736
|
-
*
|
|
737
|
-
*
|
|
727
|
+
* Step 11-13
|
|
728
|
+
* 11: Following the Device Attestation Procedure yielding a decision to proceed with commissioning, the Commissioner
|
|
729
|
+
* SHALL request operational CSR from Commissionee using the CSRRequest command (see Section 11.17.6.5,
|
|
730
|
+
* “CSRRequest Command”). The CSRRequest command will cause the generation of a new operational key pair at the
|
|
731
|
+
* Commissionee.
|
|
732
|
+
* 12: Commissioner SHALL generate or otherwise obtain an Operational Certificate containing Operational ID after
|
|
733
|
+
* receiving the CSRResponse command from the Commissionee (see Section 11.17.6.5, “CSRRequest Command”), using
|
|
734
|
+
* implementation-specific means.
|
|
735
|
+
* 13: Commissioner SHALL install operational credentials (see Figure 40, “Node Operational Credentials
|
|
736
|
+
* flow”) on the Commissionee using the AddTrustedRootCertificate and AddNOC commands,
|
|
737
|
+
* and SHALL use the UpdateFabricLabel command to set a string that the user can recognize and
|
|
738
|
+
* relate to this Commissioner/Administrator.
|
|
739
|
+
* The AdminVendorId field of the AddNOC command SHALL be set to a value for which the Vendor Schema in
|
|
740
|
+
* DCL contains the name and other information of the Commissioner’s manufacturer.
|
|
738
741
|
*/
|
|
739
742
|
async #certificates() {
|
|
740
743
|
const operationalCredentialsClusterClient = this.#getClusterClient(OperationalCredentials.Cluster);
|
|
@@ -786,7 +789,7 @@ export class ControllerCommissioningFlow {
|
|
|
786
789
|
}
|
|
787
790
|
|
|
788
791
|
/**
|
|
789
|
-
* Step
|
|
792
|
+
* Step 13-2 (we do as 99 at the end because)
|
|
790
793
|
* The Administrator having established a CASE session with the Commissionee over the operational network in the
|
|
791
794
|
* previous steps SHALL invoke the CommissioningComplete command (see Section 11.9.6.6,
|
|
792
795
|
* “CommissioningComplete Command”). A success response after invocation of the CommissioningComplete command ends
|
|
@@ -822,7 +825,7 @@ export class ControllerCommissioningFlow {
|
|
|
822
825
|
}
|
|
823
826
|
|
|
824
827
|
/**
|
|
825
|
-
* Step
|
|
828
|
+
* Step 15
|
|
826
829
|
* Commissioner MAY configure the Access Control List (see Access Control Cluster) on the Commissionee in any way
|
|
827
830
|
* it sees fit, if the singular entry added by the AddNOC command in the previous step granting Administer
|
|
828
831
|
* privilege over CASE authentication type for the Node ID provided with the command is not sufficient to express
|
|
@@ -838,16 +841,17 @@ export class ControllerCommissioningFlow {
|
|
|
838
841
|
}
|
|
839
842
|
|
|
840
843
|
/**
|
|
841
|
-
* Step
|
|
842
|
-
*
|
|
843
|
-
*
|
|
844
|
-
*
|
|
845
|
-
*
|
|
846
|
-
*
|
|
847
|
-
*
|
|
848
|
-
*
|
|
849
|
-
*
|
|
850
|
-
*
|
|
844
|
+
* Step 16-17
|
|
845
|
+
* 16: If the Commissionee both supports it and requires it, the Commissioner SHALL configure the operational network
|
|
846
|
+
* at the Commissionee using commands such as AddOrUpdateWiFiNetwork (see Section 11.8.7.3, “AddOrUpdateWiFiNetwork
|
|
847
|
+
* Command”) and AddOrUpdateThreadNetwork (see Section 11.8.7.4, “AddOrUpdateThreadNetwork Command”).
|
|
848
|
+
* A Commissionee requires network commissioning if it is not already on the desired operational network.
|
|
849
|
+
* A Commissionee supports network commissioning if it has any NetworkCommissioning cluster instances.
|
|
850
|
+
* A Commissioner MAY learn about the networks visible to the Commissionee using ScanNetworks command
|
|
851
|
+
* (see Section 11.8.7.1, “ScanNetworks Command”).
|
|
852
|
+
* 17: The Commissioner SHALL trigger the Commissionee to connect to the operational network using ConnectNetwork
|
|
853
|
+
* command (see Section 11.8.7.9, “ConnectNetwork Command”) unless the Commissionee is already on the desired
|
|
854
|
+
* operational network.
|
|
851
855
|
*/
|
|
852
856
|
async #validateNetwork() {
|
|
853
857
|
if (
|
|
@@ -1158,13 +1162,12 @@ export class ControllerCommissioningFlow {
|
|
|
1158
1162
|
}
|
|
1159
1163
|
|
|
1160
1164
|
/**
|
|
1161
|
-
* Step
|
|
1162
|
-
*
|
|
1163
|
-
*
|
|
1164
|
-
*
|
|
1165
|
-
*
|
|
1166
|
-
*
|
|
1167
|
-
*
|
|
1165
|
+
* Step 18-19
|
|
1166
|
+
* 18: Finalization of the Commissioning process begins. An Administrator configured in the ACL of the Commissionee
|
|
1167
|
+
* by the Commissioner SHALL use Operational Discovery to discover the Commissionee. This Administrator MAY be
|
|
1168
|
+
* the Commissioner itself, or another Node to which the Commissioner has delegated the task.
|
|
1169
|
+
* 19: The Administrator SHALL open a CASE (see Section 4.13.2, “Certificate Authenticated Session Establishment
|
|
1170
|
+
* (CASE)”) session with the Commissionee over the operational network.
|
|
1168
1171
|
*/
|
|
1169
1172
|
async #reconnectWithDevice() {
|
|
1170
1173
|
const isConcurrentFlow = this.#collectedCommissioningData.supportsConcurrentConnection !== false;
|
|
@@ -1226,7 +1229,7 @@ export class ControllerCommissioningFlow {
|
|
|
1226
1229
|
}
|
|
1227
1230
|
|
|
1228
1231
|
/**
|
|
1229
|
-
* Step
|
|
1232
|
+
* Step 20
|
|
1230
1233
|
* The Administrator having established a CASE session with the Commissionee over the operational network in the
|
|
1231
1234
|
* previous steps SHALL invoke the CommissioningComplete command (see Section 11.9.6.6,
|
|
1232
1235
|
* “CommissioningComplete Command”). A success response after invocation of the CommissioningComplete command ends
|
package/src/session/Session.ts
CHANGED
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import { AsyncObservable, Time } from "#general";
|
|
8
|
-
import { NodeId } from "#types";
|
|
8
|
+
import { NodeId, TypeFromPartialBitSchema } from "#types";
|
|
9
9
|
import { DecodedMessage, DecodedPacket, Message, Packet } from "../codec/MessageCodec.js";
|
|
10
|
+
import { SupportedTransportsBitmap } from "../common/Scanner.js";
|
|
10
11
|
import { Fabric } from "../fabric/Fabric.js";
|
|
11
12
|
import { MessageCounter } from "../protocol/MessageCounter.js";
|
|
12
13
|
import { MessageReceptionState } from "../protocol/MessageReceptionState.js";
|
|
@@ -45,14 +46,52 @@ export const FALLBACK_SPECIFICATION_VERSION = 0;
|
|
|
45
46
|
*/
|
|
46
47
|
export const FALLBACK_MAX_PATHS_PER_INVOKE = 1;
|
|
47
48
|
|
|
49
|
+
export const FALLBACK_MAX_TCP_MESSAGE_SIZE = 64000;
|
|
50
|
+
|
|
48
51
|
export interface SessionParameters {
|
|
52
|
+
/**
|
|
53
|
+
* Minimum amount of time between sender retries when the destination node is Idle.
|
|
54
|
+
* This SHALL be greater than or equal to the maximum amount of time a node may be
|
|
55
|
+
* non-responsive to incoming messages when Idle.
|
|
56
|
+
* Default: 500ms
|
|
57
|
+
*/
|
|
49
58
|
idleIntervalMs: number;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Minimum amount of time between sender retries when the destination node is Active.
|
|
62
|
+
* This SHALL be greater than or equal to the maximum amount of time a node may be
|
|
63
|
+
* non-responsive to incoming messages when Active.
|
|
64
|
+
* Default: 300ms
|
|
65
|
+
*/
|
|
50
66
|
activeIntervalMs: number;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Minimum amount of time the node SHOULD stay active after network activity.
|
|
70
|
+
* Default: 4000ms
|
|
71
|
+
*/
|
|
51
72
|
activeThresholdMs: number;
|
|
73
|
+
|
|
74
|
+
/** Version of Data Model for the Session parameters side where it appears. */
|
|
52
75
|
dataModelRevision: number;
|
|
76
|
+
|
|
77
|
+
/** Version of Interaction Model for the Session parameters side where it appears. */
|
|
53
78
|
interactionModelRevision: number;
|
|
79
|
+
|
|
80
|
+
/** Version of Specification for the Session parameters side where it appears. */
|
|
54
81
|
specificationVersion: number;
|
|
82
|
+
|
|
83
|
+
/** The maximum number of elements in the InvokeRequests list that the Node is able to process. */
|
|
55
84
|
maxPathsPerInvoke: number;
|
|
85
|
+
|
|
86
|
+
/** A bitmap of the supported transport protocols in addition to MRP. */
|
|
87
|
+
supportedTransports: TypeFromPartialBitSchema<typeof SupportedTransportsBitmap>;
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Maximum size of the message carried over TCP, excluding the framing message length
|
|
91
|
+
* field, that the node is capable of receiving from its peer.
|
|
92
|
+
* Default: 64000 bytes
|
|
93
|
+
*/
|
|
94
|
+
maxTcpMessageSize: number; // matter message and protocol overhead and such
|
|
56
95
|
}
|
|
57
96
|
|
|
58
97
|
export type SessionParameterOptions = Partial<SessionParameters>;
|
|
@@ -73,6 +112,8 @@ export abstract class Session {
|
|
|
73
112
|
protected readonly maxPathsPerInvoke: number;
|
|
74
113
|
protected readonly messageCounter: MessageCounter;
|
|
75
114
|
protected readonly messageReceptionState: MessageReceptionState;
|
|
115
|
+
protected readonly supportedTransports: TypeFromPartialBitSchema<typeof SupportedTransportsBitmap>;
|
|
116
|
+
protected readonly maxTcpMessageSize: number;
|
|
76
117
|
|
|
77
118
|
/**
|
|
78
119
|
* If the ExchangeManager performs async work to clean up a session it sets this promise. This is because
|
|
@@ -101,6 +142,8 @@ export abstract class Session {
|
|
|
101
142
|
interactionModelRevision = FALLBACK_INTERACTIONMODEL_REVISION,
|
|
102
143
|
specificationVersion = FALLBACK_SPECIFICATION_VERSION,
|
|
103
144
|
maxPathsPerInvoke = FALLBACK_MAX_PATHS_PER_INVOKE,
|
|
145
|
+
supportedTransports = {}, // no TCP support by default
|
|
146
|
+
maxTcpMessageSize = FALLBACK_MAX_TCP_MESSAGE_SIZE,
|
|
104
147
|
} = {},
|
|
105
148
|
setActiveTimestamp,
|
|
106
149
|
} = args;
|
|
@@ -114,6 +157,8 @@ export abstract class Session {
|
|
|
114
157
|
this.interactionModelRevision = interactionModelRevision;
|
|
115
158
|
this.specificationVersion = specificationVersion;
|
|
116
159
|
this.maxPathsPerInvoke = maxPathsPerInvoke;
|
|
160
|
+
this.supportedTransports = supportedTransports;
|
|
161
|
+
this.maxTcpMessageSize = maxTcpMessageSize;
|
|
117
162
|
if (setActiveTimestamp) {
|
|
118
163
|
this.activeTimestamp = this.timestamp;
|
|
119
164
|
}
|
|
@@ -155,6 +200,8 @@ export abstract class Session {
|
|
|
155
200
|
interactionModelRevision,
|
|
156
201
|
specificationVersion,
|
|
157
202
|
maxPathsPerInvoke,
|
|
203
|
+
supportedTransports,
|
|
204
|
+
maxTcpMessageSize,
|
|
158
205
|
} = this;
|
|
159
206
|
return {
|
|
160
207
|
idleIntervalMs,
|
|
@@ -164,6 +211,8 @@ export abstract class Session {
|
|
|
164
211
|
interactionModelRevision,
|
|
165
212
|
specificationVersion,
|
|
166
213
|
maxPathsPerInvoke,
|
|
214
|
+
supportedTransports,
|
|
215
|
+
maxTcpMessageSize,
|
|
167
216
|
};
|
|
168
217
|
}
|
|
169
218
|
|
|
@@ -26,6 +26,7 @@ import { Subscription } from "#interaction/Subscription.js";
|
|
|
26
26
|
import { Specification } from "#model";
|
|
27
27
|
import { PeerAddress, PeerAddressMap } from "#peer/PeerAddress.js";
|
|
28
28
|
import { CaseAuthenticatedTag, DEFAULT_MAX_PATHS_PER_INVOKE, FabricId, FabricIndex, NodeId } from "#types";
|
|
29
|
+
import { SupportedTransportsSchema } from "../common/Scanner.js";
|
|
29
30
|
import { Fabric } from "../fabric/Fabric.js";
|
|
30
31
|
import { MessageCounter } from "../protocol/MessageCounter.js";
|
|
31
32
|
import { InsecureSession } from "./InsecureSession.js";
|
|
@@ -34,6 +35,7 @@ import {
|
|
|
34
35
|
FALLBACK_DATAMODEL_REVISION,
|
|
35
36
|
FALLBACK_INTERACTIONMODEL_REVISION,
|
|
36
37
|
FALLBACK_MAX_PATHS_PER_INVOKE,
|
|
38
|
+
FALLBACK_MAX_TCP_MESSAGE_SIZE,
|
|
37
39
|
FALLBACK_SPECIFICATION_VERSION,
|
|
38
40
|
Session,
|
|
39
41
|
SESSION_ACTIVE_INTERVAL_MS,
|
|
@@ -53,6 +55,8 @@ const DEFAULT_SESSION_PARAMETERS = {
|
|
|
53
55
|
interactionModelRevision: Specification.INTERACTION_MODEL_REVISION,
|
|
54
56
|
specificationVersion: Specification.SPECIFICATION_VERSION,
|
|
55
57
|
maxPathsPerInvoke: DEFAULT_MAX_PATHS_PER_INVOKE,
|
|
58
|
+
supportedTransports: {},
|
|
59
|
+
maxTcpMessageSize: FALLBACK_MAX_TCP_MESSAGE_SIZE,
|
|
56
60
|
};
|
|
57
61
|
|
|
58
62
|
export const UNICAST_UNSECURE_SESSION_ID = 0x0000;
|
|
@@ -80,6 +84,8 @@ type ResumptionStorageRecord = {
|
|
|
80
84
|
interactionModelRevision: number;
|
|
81
85
|
specificationVersion: number;
|
|
82
86
|
maxPathsPerInvoke: number;
|
|
87
|
+
supportedTransports?: number;
|
|
88
|
+
maxTcpMessageSize?: number;
|
|
83
89
|
};
|
|
84
90
|
caseAuthenticatedTags?: CaseAuthenticatedTag[];
|
|
85
91
|
};
|
|
@@ -115,7 +121,7 @@ export class SessionManager {
|
|
|
115
121
|
#resumptionRecords = new PeerAddressMap<ResumptionRecord>();
|
|
116
122
|
readonly #globalUnencryptedMessageCounter = new MessageCounter();
|
|
117
123
|
readonly #subscriptionsChanged = Observable<[session: SecureSession, subscription: Subscription]>();
|
|
118
|
-
#sessionParameters;
|
|
124
|
+
#sessionParameters: SessionParameters;
|
|
119
125
|
readonly #resubmissionStarted = Observable<[session: Session]>();
|
|
120
126
|
readonly #construction: Construction<SessionManager>;
|
|
121
127
|
readonly #observers = new ObserverGroup();
|
|
@@ -443,7 +449,12 @@ export class SessionManager {
|
|
|
443
449
|
resumptionId,
|
|
444
450
|
fabricId: fabric.fabricId,
|
|
445
451
|
peerNodeId: peerNodeId,
|
|
446
|
-
sessionParameters
|
|
452
|
+
sessionParameters: {
|
|
453
|
+
...sessionParameters,
|
|
454
|
+
supportedTransports: sessionParameters.supportedTransports
|
|
455
|
+
? SupportedTransportsSchema.encode(sessionParameters.supportedTransports)
|
|
456
|
+
: undefined,
|
|
457
|
+
},
|
|
447
458
|
caseAuthenticatedTags,
|
|
448
459
|
}) as ResumptionStorageRecord,
|
|
449
460
|
),
|
|
@@ -473,6 +484,8 @@ export class SessionManager {
|
|
|
473
484
|
interactionModelRevision,
|
|
474
485
|
specificationVersion,
|
|
475
486
|
maxPathsPerInvoke,
|
|
487
|
+
supportedTransports,
|
|
488
|
+
maxTcpMessageSize,
|
|
476
489
|
} = {},
|
|
477
490
|
caseAuthenticatedTags,
|
|
478
491
|
}) => {
|
|
@@ -503,6 +516,11 @@ export class SessionManager {
|
|
|
503
516
|
interactionModelRevision: interactionModelRevision ?? FALLBACK_INTERACTIONMODEL_REVISION,
|
|
504
517
|
specificationVersion: specificationVersion ?? FALLBACK_SPECIFICATION_VERSION,
|
|
505
518
|
maxPathsPerInvoke: maxPathsPerInvoke ?? FALLBACK_MAX_PATHS_PER_INVOKE,
|
|
519
|
+
supportedTransports:
|
|
520
|
+
supportedTransports !== undefined
|
|
521
|
+
? SupportedTransportsSchema.decode(supportedTransports)
|
|
522
|
+
: {},
|
|
523
|
+
maxTcpMessageSize: maxTcpMessageSize ?? FALLBACK_MAX_TCP_MESSAGE_SIZE,
|
|
506
524
|
},
|
|
507
525
|
caseAuthenticatedTags,
|
|
508
526
|
});
|