@floegence/flowersec-core 3.2.1 → 4.0.0
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 +57 -200
- package/THIRD_PARTY_NOTICES.md +11 -11
- package/dist/browser/index.d.ts +0 -5
- package/dist/browser/index.js +0 -3
- package/dist/cli.js +93 -64
- package/dist/facade.d.ts +0 -17
- package/dist/facade.js +0 -11
- package/dist/generated/unicode151.d.ts +2 -0
- package/dist/generated/unicode151.js +83 -0
- package/dist/interop/proxyServerPeer.js +34 -20
- package/dist/interop/serverParityPeer.js +11 -252
- package/dist/node/acceptor.d.ts +1 -57
- package/dist/node/acceptor.js +3 -420
- package/dist/node/acceptorV3.js +2 -2
- package/dist/node/connectSessionV3.js +2 -2
- package/dist/node/index.d.ts +2 -17
- package/dist/node/index.js +1 -9
- package/dist/node/nativeTransportAddon.d.ts +7 -36
- package/dist/node/nativeTransportAddon.js +7 -27
- package/dist/node/proxyServer.d.ts +2 -2
- package/dist/node/proxyServer.js +2 -2
- package/dist/node/rawQuicAdapterV3.d.ts +2 -2
- package/dist/node/rawQuicAdapterV3.js +1 -1
- package/dist/node/rawQuicServerV3.d.ts +2 -2
- package/dist/node/rawQuicServerV3.js +1 -1
- package/dist/node/rawQuicTls.d.ts +2 -0
- package/dist/node/{rawQuicAdapter.js → rawQuicTls.js} +30 -45
- package/dist/node/tunnelRuntimeV3.js +2 -2
- package/dist/proxy/integration.d.ts +5 -5
- package/dist/proxy/integration.js +2 -2
- package/dist/public/streamHandlers.d.ts +0 -3
- package/dist/public/streamHandlers.js +2 -4
- package/dist/public/streamMetadata.js +2 -2
- package/dist/runtime/errors.d.ts +2 -2
- package/dist/testSupport/tlsFixture.d.ts +2 -0
- package/dist/testSupport/tlsFixture.js +8 -0
- package/dist/utils/errors.d.ts +0 -2
- package/dist/utils/errors.js +0 -80
- package/dist/v3/artifact.js +17 -3
- package/dist/v3/carrier.d.ts +2 -2
- package/dist/v3/protocol.js +2 -103
- package/dist/v3/retryDisposition.d.ts +2 -2
- package/dist/v3/retryDisposition.js +0 -7
- package/dist/vendor/tr46.d.ts +4 -0
- package/dist/vendor/tr46.js +37 -32
- package/package.json +19 -17
- package/sbom/cyclonedx.json +62 -62
- package/sbom/spdx.json +65 -65
- package/dist/browser/connectSession.d.ts +0 -13
- package/dist/browser/connectSession.js +0 -40
- package/dist/browser/runtimeCapability.d.ts +0 -13
- package/dist/browser/runtimeCapability.js +0 -27
- package/dist/browser/sessionRuntime.d.ts +0 -2
- package/dist/browser/sessionRuntime.js +0 -21
- package/dist/browser/v2.d.ts +0 -3
- package/dist/browser/v2.js +0 -2
- package/dist/browser/webTransportClient.d.ts +0 -8
- package/dist/browser/webTransportClient.js +0 -55
- package/dist/connectionController.d.ts +0 -55
- package/dist/connectionController.js +0 -441
- package/dist/connector/adapters/rawQuicCandidate.d.ts +0 -5
- package/dist/connector/adapters/rawQuicCandidate.js +0 -71
- package/dist/connector/adapters/webSocketCandidate.d.ts +0 -7
- package/dist/connector/adapters/webSocketCandidate.js +0 -116
- package/dist/connector/adapters/webTransportCandidate.d.ts +0 -5
- package/dist/connector/adapters/webTransportCandidate.js +0 -73
- package/dist/connector/admissionCommit.d.ts +0 -31
- package/dist/connector/admissionCommit.js +0 -239
- package/dist/connector/sessionAcceptor.d.ts +0 -38
- package/dist/connector/sessionAcceptor.js +0 -158
- package/dist/connector/sessionConfig.d.ts +0 -3
- package/dist/connector/sessionConfig.js +0 -30
- package/dist/connector/sessionConnector.d.ts +0 -47
- package/dist/connector/sessionConnector.js +0 -606
- package/dist/node/connectSession.d.ts +0 -23
- package/dist/node/connectSession.js +0 -93
- package/dist/node/controlplane.d.ts +0 -137
- package/dist/node/controlplane.js +0 -443
- package/dist/node/rawQuicAdapter.d.ts +0 -9
- package/dist/node/rawQuicServer.d.ts +0 -24
- package/dist/node/rawQuicServer.js +0 -37
- package/dist/node/runtimeCapability.d.ts +0 -14
- package/dist/node/runtimeCapability.js +0 -24
- package/dist/node/sessionRuntime.d.ts +0 -2
- package/dist/node/sessionRuntime.js +0 -13
- package/dist/node/tunnelRuntime.d.ts +0 -42
- package/dist/node/tunnelRuntime.js +0 -559
- package/dist/node/v2.d.ts +0 -11
- package/dist/node/v2.js +0 -6
- package/dist/node/webSocketServer.d.ts +0 -24
- package/dist/node/webSocketServer.js +0 -135
- package/dist/public/artifact.d.ts +0 -11
- package/dist/public/artifact.js +0 -44
- package/dist/public/artifactLease.d.ts +0 -10
- package/dist/public/artifactLease.js +0 -41
- package/dist/public/connectError.d.ts +0 -6
- package/dist/public/connectError.js +0 -9
- package/dist/transport/webSocketAdapter.d.ts +0 -31
- package/dist/transport/webSocketAdapter.js +0 -370
- package/dist/transport/webTransportAdapter.d.ts +0 -27
- package/dist/transport/webTransportAdapter.js +0 -534
- package/dist/v2/admissionError.d.ts +0 -4
- package/dist/v2/admissionError.js +0 -8
- package/dist/v2/artifact.d.ts +0 -128
- package/dist/v2/artifact.js +0 -1131
- package/dist/v2/artifactLease.d.ts +0 -1
- package/dist/v2/artifactLease.js +0 -7
- package/dist/v2/capability.d.ts +0 -29
- package/dist/v2/capability.js +0 -190
- package/dist/v2/carrier.d.ts +0 -84
- package/dist/v2/carrier.js +0 -411
- package/dist/v2/contract.d.ts +0 -46
- package/dist/v2/contract.js +0 -1
- package/dist/v2/handshake.d.ts +0 -80
- package/dist/v2/handshake.js +0 -470
- package/dist/v2/index.d.ts +0 -14
- package/dist/v2/index.js +0 -7
- package/dist/v2/opaqueArtifact.d.ts +0 -1
- package/dist/v2/opaqueArtifact.js +0 -2
- package/dist/v2/protocol.d.ts +0 -99
- package/dist/v2/protocol.js +0 -737
- package/dist/v2/publicSession.d.ts +0 -1
- package/dist/v2/publicSession.js +0 -281
- package/dist/v2/retryDisposition.d.ts +0 -16
- package/dist/v2/retryDisposition.js +0 -30
- package/dist/v2/session.d.ts +0 -310
- package/dist/v2/session.js +0 -2127
- package/dist/v2/streamLifetimeLedger.d.ts +0 -31
- package/dist/v2/streamLifetimeLedger.js +0 -131
- package/dist/v2/streamMetadata.d.ts +0 -1
- package/dist/v2/streamMetadata.js +0 -7
- package/dist/v2/unreliableMessage.d.ts +0 -43
- package/dist/v2/unreliableMessage.js +0 -254
package/dist/facade.js
CHANGED
|
@@ -1,19 +1,8 @@
|
|
|
1
|
-
export * as v2 from "./v2/index.js";
|
|
2
1
|
export { SessionError, UnreliableMessageError } from "./public/contract.js";
|
|
3
2
|
export { createStreamMetadata, StreamMetadataError } from "./public/streamMetadata.js";
|
|
4
3
|
export { HandlerRegistrationError, StreamHandlers, } from "./public/streamHandlers.js";
|
|
5
4
|
export { ArtifactHandleV3 as Artifact, ArtifactParseErrorV3 as ArtifactError, createArtifactLeaseV3 as createArtifactLease, parseArtifactV3 as parseArtifact, } from "./v3/publicApi.js";
|
|
6
|
-
/** @deprecated Use Artifact, ArtifactError, createArtifactLease, and parseArtifact. */
|
|
7
|
-
export { ArtifactHandleV3, ArtifactParseErrorV3, createArtifactLeaseV3, parseArtifactV3, } from "./v3/publicApi.js";
|
|
8
5
|
export { ArtifactLeaseV3 as ArtifactLease, ArtifactLeaseV3Error as ArtifactLeaseError, } from "./v3/artifactLease.js";
|
|
9
|
-
/** @deprecated Use ArtifactLease and ArtifactLeaseError. */
|
|
10
|
-
export { ArtifactLeaseV3, ArtifactLeaseV3Error } from "./v3/artifactLease.js";
|
|
11
6
|
export { connectionDiagnosticV3 as connectionDiagnostic } from "./v3/connectionController.js";
|
|
12
|
-
/** @deprecated Use connectionDiagnostic. */
|
|
13
|
-
export { connectionDiagnosticV3 } from "./v3/connectionController.js";
|
|
14
7
|
export { ConnectionControllerV3Error as ConnectionControllerError, } from "./v3/connectionController.js";
|
|
15
|
-
/** @deprecated Use ConnectionControllerError. */
|
|
16
|
-
export { ConnectionControllerV3Error } from "./v3/connectionController.js";
|
|
17
8
|
export { ConnectErrorV3 as ConnectError } from "./v3/security.js";
|
|
18
|
-
/** @deprecated Use ConnectError. */
|
|
19
|
-
export { ConnectErrorV3 } from "./v3/security.js";
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Code generated by testdata/unicode15_1/generate_tables.mjs; DO NOT EDIT.
|
|
2
|
+
export const UNICODE_15_1_VERSION = "15.1.0";
|
|
3
|
+
const ASSIGNED_RANGES_HEX = "00000000037700037A00037F00038400038A00038C00038C00038E0003A10003A300052F00053100055600055900058A00058D00058F0005910005C7" +
|
|
4
|
+
"0005D00005EA0005EF0005F400060000070D00070F00074A00074D0007B10007C00007FA0007FD00082D00083000083E00084000085B00085E00085E" +
|
|
5
|
+
"00086000086A00087000088E00089000089100089800098300098500098C00098F0009900009930009A80009AA0009B00009B20009B20009B60009B9" +
|
|
6
|
+
"0009BC0009C40009C70009C80009CB0009CE0009D70009D70009DC0009DD0009DF0009E30009E60009FE000A01000A03000A05000A0A000A0F000A10" +
|
|
7
|
+
"000A13000A28000A2A000A30000A32000A33000A35000A36000A38000A39000A3C000A3C000A3E000A42000A47000A48000A4B000A4D000A51000A51" +
|
|
8
|
+
"000A59000A5C000A5E000A5E000A66000A76000A81000A83000A85000A8D000A8F000A91000A93000AA8000AAA000AB0000AB2000AB3000AB5000AB9" +
|
|
9
|
+
"000ABC000AC5000AC7000AC9000ACB000ACD000AD0000AD0000AE0000AE3000AE6000AF1000AF9000AFF000B01000B03000B05000B0C000B0F000B10" +
|
|
10
|
+
"000B13000B28000B2A000B30000B32000B33000B35000B39000B3C000B44000B47000B48000B4B000B4D000B55000B57000B5C000B5D000B5F000B63" +
|
|
11
|
+
"000B66000B77000B82000B83000B85000B8A000B8E000B90000B92000B95000B99000B9A000B9C000B9C000B9E000B9F000BA3000BA4000BA8000BAA" +
|
|
12
|
+
"000BAE000BB9000BBE000BC2000BC6000BC8000BCA000BCD000BD0000BD0000BD7000BD7000BE6000BFA000C00000C0C000C0E000C10000C12000C28" +
|
|
13
|
+
"000C2A000C39000C3C000C44000C46000C48000C4A000C4D000C55000C56000C58000C5A000C5D000C5D000C60000C63000C66000C6F000C77000C8C" +
|
|
14
|
+
"000C8E000C90000C92000CA8000CAA000CB3000CB5000CB9000CBC000CC4000CC6000CC8000CCA000CCD000CD5000CD6000CDD000CDE000CE0000CE3" +
|
|
15
|
+
"000CE6000CEF000CF1000CF3000D00000D0C000D0E000D10000D12000D44000D46000D48000D4A000D4F000D54000D63000D66000D7F000D81000D83" +
|
|
16
|
+
"000D85000D96000D9A000DB1000DB3000DBB000DBD000DBD000DC0000DC6000DCA000DCA000DCF000DD4000DD6000DD6000DD8000DDF000DE6000DEF" +
|
|
17
|
+
"000DF2000DF4000E01000E3A000E3F000E5B000E81000E82000E84000E84000E86000E8A000E8C000EA3000EA5000EA5000EA7000EBD000EC0000EC4" +
|
|
18
|
+
"000EC6000EC6000EC8000ECE000ED0000ED9000EDC000EDF000F00000F47000F49000F6C000F71000F97000F99000FBC000FBE000FCC000FCE000FDA" +
|
|
19
|
+
"0010000010C50010C70010C70010CD0010CD0010D000124800124A00124D00125000125600125800125800125A00125D00126000128800128A00128D" +
|
|
20
|
+
"0012900012B00012B20012B50012B80012BE0012C00012C00012C20012C50012C80012D60012D800131000131200131500131800135A00135D00137C" +
|
|
21
|
+
"0013800013990013A00013F50013F80013FD00140000169C0016A00016F800170000171500171F00173600174000175300176000176C00176E001770" +
|
|
22
|
+
"0017720017730017800017DD0017E00017E90017F00017F90018000018190018200018780018800018AA0018B00018F500190000191E00192000192B" +
|
|
23
|
+
"00193000193B00194000194000194400196D0019700019740019800019AB0019B00019C90019D00019DA0019DE001A1B001A1E001A5E001A60001A7C" +
|
|
24
|
+
"001A7F001A89001A90001A99001AA0001AAD001AB0001ACE001B00001B4C001B50001B7E001B80001BF3001BFC001C37001C3B001C49001C4D001C88" +
|
|
25
|
+
"001C90001CBA001CBD001CC7001CD0001CFA001D00001F15001F18001F1D001F20001F45001F48001F4D001F50001F57001F59001F59001F5B001F5B" +
|
|
26
|
+
"001F5D001F5D001F5F001F7D001F80001FB4001FB6001FC4001FC6001FD3001FD6001FDB001FDD001FEF001FF2001FF4001FF6001FFE002000002064" +
|
|
27
|
+
"00206600207100207400208E00209000209C0020A00020C00020D00020F000210000218B00219000242600244000244A002460002B73002B76002B95" +
|
|
28
|
+
"002B97002CF3002CF9002D25002D27002D27002D2D002D2D002D30002D67002D6F002D70002D7F002D96002DA0002DA6002DA8002DAE002DB0002DB6" +
|
|
29
|
+
"002DB8002DBE002DC0002DC6002DC8002DCE002DD0002DD6002DD8002DDE002DE0002E5D002E80002E99002E9B002EF3002F00002FD5002FF000303F" +
|
|
30
|
+
"0030410030960030990030FF00310500312F00313100318E0031900031E30031EF00321E00322000A48C00A49000A4C600A4D000A62B00A64000A6F7" +
|
|
31
|
+
"00A70000A7CA00A7D000A7D100A7D300A7D300A7D500A7D900A7F200A82C00A83000A83900A84000A87700A88000A8C500A8CE00A8D900A8E000A953" +
|
|
32
|
+
"00A95F00A97C00A98000A9CD00A9CF00A9D900A9DE00A9FE00AA0000AA3600AA4000AA4D00AA5000AA5900AA5C00AAC200AADB00AAF600AB0100AB06" +
|
|
33
|
+
"00AB0900AB0E00AB1100AB1600AB2000AB2600AB2800AB2E00AB3000AB6B00AB7000ABED00ABF000ABF900AC0000D7A300D7B000D7C600D7CB00D7FB" +
|
|
34
|
+
"00D80000FA6D00FA7000FAD900FB0000FB0600FB1300FB1700FB1D00FB3600FB3800FB3C00FB3E00FB3E00FB4000FB4100FB4300FB4400FB4600FBC2" +
|
|
35
|
+
"00FBD300FD8F00FD9200FDC700FDCF00FE1900FE2000FE5200FE5400FE6600FE6800FE6B00FE7000FE7400FE7600FEFC00FEFF00FEFF00FF0100FFBE" +
|
|
36
|
+
"00FFC200FFC700FFCA00FFCF00FFD200FFD700FFDA00FFDC00FFE000FFE600FFE800FFEE00FFF901000B01000D01002601002801003A01003C01003D" +
|
|
37
|
+
"01003F01004D01005001005D0100800100FA01010001010201010701013301013701018E01019001019C0101A00101A00101D00101FD01028001029C" +
|
|
38
|
+
"0102A00102D00102E00102FB01030001032301032D01034A01035001037A01038001039D01039F0103C30103C80103D501040001049D0104A00104A9" +
|
|
39
|
+
"0104B00104D30104D80104FB01050001052701053001056301056F01057A01057C01058A01058C0105920105940105950105970105A10105A30105B1" +
|
|
40
|
+
"0105B30105B90105BB0105BC0106000107360107400107550107600107670107800107850107870107B00107B20107BA010800010805010808010808" +
|
|
41
|
+
"01080A01083501083701083801083C01083C01083F01085501085701089E0108A70108AF0108E00108F20108F40108F50108FB01091B01091F010939" +
|
|
42
|
+
"01093F01093F0109800109B70109BC0109CF0109D2010A03010A05010A06010A0C010A13010A15010A17010A19010A35010A38010A3A010A3F010A48" +
|
|
43
|
+
"010A50010A58010A60010A9F010AC0010AE6010AEB010AF6010B00010B35010B39010B55010B58010B72010B78010B91010B99010B9C010BA9010BAF" +
|
|
44
|
+
"010C00010C48010C80010CB2010CC0010CF2010CFA010D27010D30010D39010E60010E7E010E80010EA9010EAB010EAD010EB0010EB1010EFD010F27" +
|
|
45
|
+
"010F30010F59010F70010F89010FB0010FCB010FE0010FF601100001104D01105201107501107F0110C20110CD0110CD0110D00110E80110F00110F9" +
|
|
46
|
+
"0111000111340111360111470111500111760111800111DF0111E10111F401120001121101121301124101128001128601128801128801128A01128D" +
|
|
47
|
+
"01128F01129D01129F0112A90112B00112EA0112F00112F901130001130301130501130C01130F01131001131301132801132A011330011332011333" +
|
|
48
|
+
"01133501133901133B01134401134701134801134B01134D01135001135001135701135701135D01136301136601136C01137001137401140001145B" +
|
|
49
|
+
"01145D0114610114800114C70114D00114D90115800115B50115B80115DD01160001164401165001165901166001166C0116800116B90116C00116C9" +
|
|
50
|
+
"01170001171A01171D01172B01173001174601180001183B0118A00118F20118FF01190601190901190901190C011913011915011916011918011935" +
|
|
51
|
+
"01193701193801193B0119460119500119590119A00119A70119AA0119D70119DA0119E4011A00011A47011A50011AA2011AB0011AF8011B00011B09" +
|
|
52
|
+
"011C00011C08011C0A011C36011C38011C45011C50011C6C011C70011C8F011C92011CA7011CA9011CB6011D00011D06011D08011D09011D0B011D36" +
|
|
53
|
+
"011D3A011D3A011D3C011D3D011D3F011D47011D50011D59011D60011D65011D67011D68011D6A011D8E011D90011D91011D93011D98011DA0011DA9" +
|
|
54
|
+
"011EE0011EF8011F00011F10011F12011F3A011F3E011F59011FB0011FB0011FC0011FF1011FFF01239901240001246E012470012474012480012543" +
|
|
55
|
+
"012F90012FF2013000013455014400014646016800016A38016A40016A5E016A60016A69016A6E016ABE016AC0016AC9016AD0016AED016AF0016AF5" +
|
|
56
|
+
"016B00016B45016B50016B59016B5B016B61016B63016B77016B7D016B8F016E40016E9A016F00016F4A016F4F016F87016F8F016F9F016FE0016FE4" +
|
|
57
|
+
"016FF0016FF10170000187F7018800018CD5018D00018D0801AFF001AFF301AFF501AFFB01AFFD01AFFE01B00001B12201B13201B13201B15001B152" +
|
|
58
|
+
"01B15501B15501B16401B16701B17001B2FB01BC0001BC6A01BC7001BC7C01BC8001BC8801BC9001BC9901BC9C01BCA301CF0001CF2D01CF3001CF46" +
|
|
59
|
+
"01CF5001CFC301D00001D0F501D10001D12601D12901D1EA01D20001D24501D2C001D2D301D2E001D2F301D30001D35601D36001D37801D40001D454" +
|
|
60
|
+
"01D45601D49C01D49E01D49F01D4A201D4A201D4A501D4A601D4A901D4AC01D4AE01D4B901D4BB01D4BB01D4BD01D4C301D4C501D50501D50701D50A" +
|
|
61
|
+
"01D50D01D51401D51601D51C01D51E01D53901D53B01D53E01D54001D54401D54601D54601D54A01D55001D55201D6A501D6A801D7CB01D7CE01DA8B" +
|
|
62
|
+
"01DA9B01DA9F01DAA101DAAF01DF0001DF1E01DF2501DF2A01E00001E00601E00801E01801E01B01E02101E02301E02401E02601E02A01E03001E06D" +
|
|
63
|
+
"01E08F01E08F01E10001E12C01E13001E13D01E14001E14901E14E01E14F01E29001E2AE01E2C001E2F901E2FF01E2FF01E4D001E4F901E7E001E7E6" +
|
|
64
|
+
"01E7E801E7EB01E7ED01E7EE01E7F001E7FE01E80001E8C401E8C701E8D601E90001E94B01E95001E95901E95E01E95F01EC7101ECB401ED0101ED3D" +
|
|
65
|
+
"01EE0001EE0301EE0501EE1F01EE2101EE2201EE2401EE2401EE2701EE2701EE2901EE3201EE3401EE3701EE3901EE3901EE3B01EE3B01EE4201EE42" +
|
|
66
|
+
"01EE4701EE4701EE4901EE4901EE4B01EE4B01EE4D01EE4F01EE5101EE5201EE5401EE5401EE5701EE5701EE5901EE5901EE5B01EE5B01EE5D01EE5D" +
|
|
67
|
+
"01EE5F01EE5F01EE6101EE6201EE6401EE6401EE6701EE6A01EE6C01EE7201EE7401EE7701EE7901EE7C01EE7E01EE7E01EE8001EE8901EE8B01EE9B" +
|
|
68
|
+
"01EEA101EEA301EEA501EEA901EEAB01EEBB01EEF001EEF101F00001F02B01F03001F09301F0A001F0AE01F0B101F0BF01F0C101F0CF01F0D101F0F5" +
|
|
69
|
+
"01F10001F1AD01F1E601F20201F21001F23B01F24001F24801F25001F25101F26001F26501F30001F6D701F6DC01F6EC01F6F001F6FC01F70001F776" +
|
|
70
|
+
"01F77B01F7D901F7E001F7EB01F7F001F7F001F80001F80B01F81001F84701F85001F85901F86001F88701F89001F8AD01F8B001F8B101F90001FA53" +
|
|
71
|
+
"01FA6001FA6D01FA7001FA7C01FA8001FA8801FA9001FABD01FABF01FAC501FACE01FADB01FAE001FAE801FAF001FAF801FB0001FB9201FB9401FBCA" +
|
|
72
|
+
"01FBF001FBF901FFFE02A6DF02A70002B73902B74002B81D02B82002CEA102CEB002EBE002EBF002EE5D02F80002FA1D02FFFE03134A0313500323AF" +
|
|
73
|
+
"03FFFE03FFFF04FFFE04FFFF05FFFE05FFFF06FFFE06FFFF07FFFE07FFFF08FFFE08FFFF09FFFE09FFFF0AFFFE0AFFFF0BFFFE0BFFFF0CFFFE0CFFFF" +
|
|
74
|
+
"0DFFFE0DFFFF0E00010E00010E00200E007F0E01000E01EF0EFFFE10FFFF";
|
|
75
|
+
export function unicode151Assigned(codePoint) {
|
|
76
|
+
for (let offset = 0; offset < ASSIGNED_RANGES_HEX.length; offset += 12) {
|
|
77
|
+
const start = Number.parseInt(ASSIGNED_RANGES_HEX.slice(offset, offset + 6), 16);
|
|
78
|
+
const end = Number.parseInt(ASSIGNED_RANGES_HEX.slice(offset + 6, offset + 12), 16);
|
|
79
|
+
if (codePoint >= start && codePoint <= end)
|
|
80
|
+
return true;
|
|
81
|
+
}
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
import { createAcceptor, parseArtifact, ProxyServer, SessionHandlers, } from "../node/index.js";
|
|
4
|
+
import { testCertificatePEM, testPrivateKeyPEM } from "../testSupport/tlsFixture.js";
|
|
2
5
|
const ORIGIN = "https://app.example";
|
|
3
6
|
const args = process.argv.slice(2);
|
|
4
7
|
if (args.length !== 2 || args[0] !== "--upstream" || args[1] === undefined) {
|
|
5
8
|
throw new Error("usage: proxyServerPeer --upstream http://127.0.0.1:<port>");
|
|
6
9
|
}
|
|
7
|
-
|
|
10
|
+
await run(args[1]).catch((error) => {
|
|
8
11
|
console.error(error instanceof Error ? error.stack ?? error.message : String(error));
|
|
9
12
|
process.exitCode = 1;
|
|
10
13
|
});
|
|
@@ -34,7 +37,7 @@ async function run(upstream) {
|
|
|
34
37
|
});
|
|
35
38
|
const handlers = new SessionHandlers({ maxConcurrentStreams: 4 });
|
|
36
39
|
proxy.register(handlers);
|
|
37
|
-
let
|
|
40
|
+
let trustedArtifact;
|
|
38
41
|
const acceptor = await createAcceptor({
|
|
39
42
|
listeners: [{
|
|
40
43
|
carrier: "websocket",
|
|
@@ -42,34 +45,26 @@ async function run(upstream) {
|
|
|
42
45
|
host: "127.0.0.1",
|
|
43
46
|
port: 0,
|
|
44
47
|
allowedOrigins: [ORIGIN],
|
|
48
|
+
tls: { certificate: testCertificatePEM, privateKey: testPrivateKeyPEM },
|
|
45
49
|
}],
|
|
46
|
-
maxInboundStreams:
|
|
47
|
-
authorize: async (
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
const artifact = parseArtifact(record.artifactJSON);
|
|
51
|
-
authorizeRuntime(request, record, "proxy-matrix-node");
|
|
52
|
-
return { decision: "allow", artifact };
|
|
53
|
-
},
|
|
50
|
+
maxInboundStreams: 16,
|
|
51
|
+
authorize: async () => trustedArtifact === undefined
|
|
52
|
+
? { accepted: false, retryable: false, reason: "invalid_credential" }
|
|
53
|
+
: { accepted: true, artifact: trustedArtifact },
|
|
54
54
|
resolveHandlers: () => handlers,
|
|
55
55
|
});
|
|
56
56
|
try {
|
|
57
57
|
const address = acceptor.addresses()[0];
|
|
58
58
|
if (address === undefined)
|
|
59
59
|
throw new Error("Node ProxyServer listener did not bind");
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
endpoints: createEndpointSet(`ws://127.0.0.1:${address.port}/flowersec/v2/direct`),
|
|
63
|
-
rendezvousGroupId: "browser-proxy-node",
|
|
64
|
-
listenerAudience: "browser-proxy-matrix",
|
|
65
|
-
upstreamAddress: `${address.host}:${address.port}`,
|
|
66
|
-
});
|
|
67
|
-
record = issued.authorizationRecord();
|
|
60
|
+
const artifactJSON = await issueArtifact(`wss://localhost:${address.port}/flowersec/v3/direct`);
|
|
61
|
+
trustedArtifact = parseArtifact(artifactJSON);
|
|
68
62
|
const acceptedPromise = acceptor.accept();
|
|
69
63
|
process.stdout.write(`${JSON.stringify({
|
|
70
64
|
runtime: "node-typescript",
|
|
71
|
-
artifact_json:
|
|
65
|
+
artifact_json: artifactJSON,
|
|
72
66
|
origin: ORIGIN,
|
|
67
|
+
trust_pem: testCertificatePEM,
|
|
73
68
|
})}\n`);
|
|
74
69
|
const accepted = await acceptedPromise;
|
|
75
70
|
const serving = accepted.serve().catch((error) => error);
|
|
@@ -81,3 +76,22 @@ async function run(upstream) {
|
|
|
81
76
|
await acceptor.close();
|
|
82
77
|
}
|
|
83
78
|
}
|
|
79
|
+
async function issueArtifact(endpoint) {
|
|
80
|
+
const child = spawn("go", ["run", "./internal/cmd/parity-artifact-issuer"], {
|
|
81
|
+
cwd: fileURLToPath(new URL("../../../flowersec-go", import.meta.url)),
|
|
82
|
+
env: { ...process.env, FLOWERSEC_SERVER_PARITY_PEER: "1" },
|
|
83
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
84
|
+
});
|
|
85
|
+
child.stdin.end(`${JSON.stringify({ mode: "direct", endpoint })}\n`);
|
|
86
|
+
const stdout = [];
|
|
87
|
+
const stderr = [];
|
|
88
|
+
child.stdout.on("data", (chunk) => stdout.push(chunk));
|
|
89
|
+
child.stderr.on("data", (chunk) => stderr.push(chunk));
|
|
90
|
+
const code = await new Promise((resolve) => child.once("exit", resolve));
|
|
91
|
+
if (code !== 0)
|
|
92
|
+
throw new Error(`proxy artifact issuer failed: ${Buffer.concat(stderr).toString("utf8")}`);
|
|
93
|
+
const response = JSON.parse(Buffer.concat(stdout).toString("utf8"));
|
|
94
|
+
if (response.artifact_json === undefined)
|
|
95
|
+
throw new Error("proxy artifact issuer omitted artifact");
|
|
96
|
+
return response.artifact_json;
|
|
97
|
+
}
|
|
@@ -3,21 +3,14 @@ import { createPrivateKey, createPublicKey, X509Certificate } from "node:crypto"
|
|
|
3
3
|
import { spawn } from "node:child_process";
|
|
4
4
|
import { fileURLToPath } from "node:url";
|
|
5
5
|
import { createStreamMetadata, } from "../public/streamMetadata.js";
|
|
6
|
-
import {
|
|
7
|
-
import { createTunnelRuntime } from "../node/tunnelRuntime.js";
|
|
8
|
-
import { createArtifactLease } from "../public/artifactLease.js";
|
|
9
|
-
import { parseArtifact } from "../public/artifact.js";
|
|
10
|
-
import { connect } from "../node/connectSession.js";
|
|
11
|
-
import { Issuer, createEndpointSet } from "../node/controlplane.js";
|
|
6
|
+
import { RPCHandlers, SessionHandlersV3 } from "../node/acceptor.js";
|
|
12
7
|
import { SessionError } from "../public/contract.js";
|
|
13
8
|
import { createAcceptorV3 } from "../node/acceptorV3.js";
|
|
14
9
|
import { createTunnelRuntimeV3 } from "../node/tunnelRuntimeV3.js";
|
|
15
10
|
import { verifyTunnelAuthorizationGrantV3 } from "../node/runtimeAuthorizationV3.js";
|
|
16
11
|
import { connectV3 } from "../node/connectSessionV3.js";
|
|
17
12
|
import { createArtifactLeaseV3, parseArtifactV3 } from "../v3/publicApi.js";
|
|
18
|
-
import { SessionHandlersV3 } from "../node/acceptor.js";
|
|
19
13
|
const RUNTIME = "node-typescript";
|
|
20
|
-
const PROTOCOL = process.env.FLOWERSEC_PARITY_PROTOCOL ?? "v2";
|
|
21
14
|
const ORIGIN = process.env.FLOWERSEC_PARITY_ORIGIN ?? "https://client.example";
|
|
22
15
|
const ECHO_RPC = 7001;
|
|
23
16
|
const NOTIFY_RPC = 7002;
|
|
@@ -73,9 +66,7 @@ class ExecutedCases {
|
|
|
73
66
|
}
|
|
74
67
|
function createHandlers(path) {
|
|
75
68
|
const rpcHandlers = new RPCHandlers();
|
|
76
|
-
const sessionHandlers =
|
|
77
|
-
? new SessionHandlersV3({ maxConcurrentStreams: 16 })
|
|
78
|
-
: new SessionHandlers({ maxConcurrentStreams: 16 });
|
|
69
|
+
const sessionHandlers = new SessionHandlersV3({ maxConcurrentStreams: 16 });
|
|
79
70
|
const notifications = new SignalQueue();
|
|
80
71
|
const activeStreams = { value: 0 };
|
|
81
72
|
const executed = new ExecutedCases();
|
|
@@ -339,16 +330,9 @@ function pem(label, encoded) {
|
|
|
339
330
|
return `-----BEGIN ${label}-----\n${lines.join("\n")}\n-----END ${label}-----\n`;
|
|
340
331
|
}
|
|
341
332
|
async function connectArtifact(artifactJSON, relay, rpcHandlers) {
|
|
342
|
-
return await connect(createArtifactLease(parseArtifact(artifactJSON), async () => undefined), {
|
|
343
|
-
origin: relay.origin,
|
|
344
|
-
tls: { ca: relay.trust_pem },
|
|
345
|
-
rpcHandlers,
|
|
346
|
-
});
|
|
347
|
-
}
|
|
348
|
-
async function connectArtifactV3(artifactJSON, relay, rpcHandlers) {
|
|
349
333
|
return await connectV3(createArtifactLeaseV3(parseArtifactV3(artifactJSON), async () => undefined), { origin: relay.origin, roots: relay.trust_pem, rpcHandlers });
|
|
350
334
|
}
|
|
351
|
-
async function
|
|
335
|
+
async function issue(input) {
|
|
352
336
|
const goRoot = fileURLToPath(new URL("../../../flowersec-go", import.meta.url));
|
|
353
337
|
const child = spawn("go", ["run", "./internal/cmd/parity-artifact-issuer"], {
|
|
354
338
|
cwd: goRoot,
|
|
@@ -366,69 +350,10 @@ async function issueV3(input) {
|
|
|
366
350
|
return JSON.parse(Buffer.concat(stdout).toString("utf8"));
|
|
367
351
|
}
|
|
368
352
|
async function runServer(tls, carrier) {
|
|
369
|
-
if (PROTOCOL === "v3")
|
|
370
|
-
return await runServerV3(tls, carrier);
|
|
371
|
-
const issuedByLookup = new Map();
|
|
372
|
-
const state = createHandlers("direct");
|
|
373
|
-
const acceptor = await createAcceptor({
|
|
374
|
-
listeners: [directListenerOptions(carrier, tls)],
|
|
375
|
-
maxInboundStreams: 16,
|
|
376
|
-
authorize: async (request) => {
|
|
377
|
-
const artifact = issuedByLookup.get(request.lookupKey());
|
|
378
|
-
return artifact === undefined
|
|
379
|
-
? { decision: "reject", reason: "invalid_credential" }
|
|
380
|
-
: { decision: "allow", artifact };
|
|
381
|
-
},
|
|
382
|
-
resolveHandlers: () => state.sessionHandlers,
|
|
383
|
-
});
|
|
384
|
-
try {
|
|
385
|
-
const address = acceptor.addresses()[0];
|
|
386
|
-
if (address === undefined)
|
|
387
|
-
throw new Error(`direct ${carrier} listener did not bind`);
|
|
388
|
-
const issued = new Issuer().issueDirect({
|
|
389
|
-
session: { channelId: "node-direct-parity", maxInboundStreams: 16 },
|
|
390
|
-
endpoints: createEndpointSet(endpointURL(carrier, "direct", address.port)),
|
|
391
|
-
rendezvousGroupId: "node-direct-parity",
|
|
392
|
-
listenerAudience: "server-parity",
|
|
393
|
-
upstreamAddress: "127.0.0.1:1",
|
|
394
|
-
});
|
|
395
|
-
const artifactJSON = decoder.decode(issued.artifactJSON());
|
|
396
|
-
issuedByLookup.set(issued.lookupKey(), parseArtifact(artifactJSON));
|
|
397
|
-
const accepting = acceptor.accept();
|
|
398
|
-
writeJSON({
|
|
399
|
-
type: "ready",
|
|
400
|
-
runtime: RUNTIME,
|
|
401
|
-
carrier,
|
|
402
|
-
path: "direct",
|
|
403
|
-
artifact_json: artifactJSON,
|
|
404
|
-
trust_pem: tls.tls.root_certificate_pem,
|
|
405
|
-
origin: ORIGIN,
|
|
406
|
-
});
|
|
407
|
-
const accepted = await accepting;
|
|
408
|
-
state.executed.record("admission");
|
|
409
|
-
const serving = accepted.serve().catch((error) => error);
|
|
410
|
-
if (process.env.FLOWERSEC_PARITY_CLIENT_PROFILE !== undefined) {
|
|
411
|
-
await externalServer(accepted.session, state);
|
|
412
|
-
}
|
|
413
|
-
else {
|
|
414
|
-
await exerciseServer(accepted.session, state, "direct", true, carrier);
|
|
415
|
-
}
|
|
416
|
-
await serving;
|
|
417
|
-
await accepted.close().catch(() => undefined);
|
|
418
|
-
if (state.activeStreams.value !== 0)
|
|
419
|
-
throw new Error(`direct server cleanup left ${state.activeStreams.value} streams`);
|
|
420
|
-
state.executed.record("cleanup");
|
|
421
|
-
writeJSON(result("server-result", "direct", state.executed.snapshot(), carrier));
|
|
422
|
-
}
|
|
423
|
-
finally {
|
|
424
|
-
await acceptor.close();
|
|
425
|
-
}
|
|
426
|
-
}
|
|
427
|
-
async function runServerV3(tls, carrier) {
|
|
428
353
|
const state = createHandlers("direct");
|
|
429
354
|
let trustedArtifact;
|
|
430
355
|
const acceptor = await createAcceptorV3({
|
|
431
|
-
listeners: [
|
|
356
|
+
listeners: [directListenerOptions(carrier, tls)],
|
|
432
357
|
maxInboundStreams: 16,
|
|
433
358
|
authorize: async () => trustedArtifact === undefined
|
|
434
359
|
? { accepted: false, retryable: false, reason: "invalid_credential" }
|
|
@@ -439,7 +364,7 @@ async function runServerV3(tls, carrier) {
|
|
|
439
364
|
const address = acceptor.addresses()[0];
|
|
440
365
|
if (address === undefined)
|
|
441
366
|
throw new Error(`direct ${carrier} listener did not bind`);
|
|
442
|
-
const issued = await
|
|
367
|
+
const issued = await issue({ mode: "direct", endpoint: endpointURL(carrier, "direct", address.port) });
|
|
443
368
|
if (issued.artifact_json === undefined)
|
|
444
369
|
throw new Error("v3 parity issuer omitted direct artifact");
|
|
445
370
|
trustedArtifact = parseArtifactV3(issued.artifact_json);
|
|
@@ -476,9 +401,7 @@ async function runClient(input, carrier) {
|
|
|
476
401
|
ready.artifact_json === "")
|
|
477
402
|
throw new Error("invalid direct ready message");
|
|
478
403
|
const state = createHandlers("direct");
|
|
479
|
-
const session =
|
|
480
|
-
? await connectArtifactV3(ready.artifact_json, ready, state.rpcHandlers)
|
|
481
|
-
: await connectArtifact(ready.artifact_json, ready, state.rpcHandlers);
|
|
404
|
+
const session = await connectArtifact(ready.artifact_json, ready, state.rpcHandlers);
|
|
482
405
|
state.executed.record("admission");
|
|
483
406
|
await exerciseClient(session, state, "direct", carrier);
|
|
484
407
|
await session.close().catch((error) => {
|
|
@@ -492,94 +415,12 @@ async function runClient(input, carrier) {
|
|
|
492
415
|
writeJSON(result("client-result", "direct", state.executed.snapshot(), carrier));
|
|
493
416
|
}
|
|
494
417
|
async function runRelay(tls, input, carrier) {
|
|
495
|
-
if (PROTOCOL === "v3")
|
|
496
|
-
return await runRelayV3(tls, input, carrier);
|
|
497
|
-
const decisions = new Map();
|
|
498
|
-
const released = new Set();
|
|
499
|
-
const executed = new ExecutedCases();
|
|
500
|
-
const runtime = createTunnelRuntime({
|
|
501
|
-
listeners: [tunnelListenerOptions(carrier, tls)],
|
|
502
|
-
maxInboundStreams: 16,
|
|
503
|
-
maxPendingLegs: 16,
|
|
504
|
-
maxActivePairs: 8,
|
|
505
|
-
authorize: async (request) => decisions.get(request.lookupKey()) ?? {
|
|
506
|
-
decision: "reject",
|
|
507
|
-
reason: "invalid_credential",
|
|
508
|
-
},
|
|
509
|
-
release: (leaseId) => {
|
|
510
|
-
released.add(leaseId);
|
|
511
|
-
},
|
|
512
|
-
});
|
|
513
|
-
try {
|
|
514
|
-
await runtime.start();
|
|
515
|
-
const address = runtime.addresses()[0];
|
|
516
|
-
if (address === undefined)
|
|
517
|
-
throw new Error(`tunnel ${carrier} listener did not bind`);
|
|
518
|
-
writeJSON({
|
|
519
|
-
type: "relay-ready",
|
|
520
|
-
runtime: RUNTIME,
|
|
521
|
-
carrier,
|
|
522
|
-
path: "tunnel",
|
|
523
|
-
endpoint_url: endpointURL(carrier, "tunnel", address.port),
|
|
524
|
-
trust_pem: tls.tls.root_certificate_pem,
|
|
525
|
-
trust_roots_der: [tls.tls.root_certificate_der_base64],
|
|
526
|
-
server_certificate_der: tls.tls.leaf_certificate_der_base64,
|
|
527
|
-
origin: ORIGIN,
|
|
528
|
-
});
|
|
529
|
-
const configure = await input.next();
|
|
530
|
-
if (configure.type !== "configure" ||
|
|
531
|
-
!Array.isArray(configure.authorizations) ||
|
|
532
|
-
configure.authorizations.length === 0)
|
|
533
|
-
throw new Error("invalid tunnel relay configuration");
|
|
534
|
-
for (const item of configure.authorizations) {
|
|
535
|
-
if (item.decision !== "allow" ||
|
|
536
|
-
item.credentialId === "" ||
|
|
537
|
-
item.leaseId === "" ||
|
|
538
|
-
item.expectedPeerEndpointInstanceId === "" ||
|
|
539
|
-
item.expiresAtUnixSeconds <= Math.floor(Date.now() / 1000)) {
|
|
540
|
-
throw new Error("invalid secret-free tunnel authorization");
|
|
541
|
-
}
|
|
542
|
-
decisions.set(item.credentialId, {
|
|
543
|
-
decision: "allow",
|
|
544
|
-
credentialId: item.credentialId,
|
|
545
|
-
leaseId: item.leaseId,
|
|
546
|
-
expiresAtUnixSeconds: item.expiresAtUnixSeconds,
|
|
547
|
-
expectedPeerEndpointInstanceId: item.expectedPeerEndpointInstanceId,
|
|
548
|
-
allowReplacement: item.allowReplacement,
|
|
549
|
-
});
|
|
550
|
-
}
|
|
551
|
-
const close = await input.next();
|
|
552
|
-
if (close.type !== "close")
|
|
553
|
-
throw new Error("invalid tunnel relay close command");
|
|
554
|
-
executed.record("close");
|
|
555
|
-
}
|
|
556
|
-
finally {
|
|
557
|
-
await runtime.close();
|
|
558
|
-
executed.record("cancel");
|
|
559
|
-
}
|
|
560
|
-
if (released.size !== decisions.size)
|
|
561
|
-
throw new Error(`relay cleanup released ${released.size} of ${decisions.size} leases`);
|
|
562
|
-
executed.record("admission", "pairing", "opaque-forwarding");
|
|
563
|
-
if (carrier === "raw-quic")
|
|
564
|
-
executed.record("datagram-forwarding");
|
|
565
|
-
executed.record("cleanup");
|
|
566
|
-
writeJSON({
|
|
567
|
-
type: "relay-result",
|
|
568
|
-
runtime: RUNTIME,
|
|
569
|
-
carrier,
|
|
570
|
-
path: "tunnel",
|
|
571
|
-
cases: executed.snapshot(),
|
|
572
|
-
observed_plaintext: false,
|
|
573
|
-
released_leases: released.size,
|
|
574
|
-
});
|
|
575
|
-
}
|
|
576
|
-
async function runRelayV3(tls, input, carrier) {
|
|
577
418
|
const authorizations = new Map();
|
|
578
419
|
const verificationRecords = new Map();
|
|
579
420
|
const released = new Set();
|
|
580
421
|
const executed = new ExecutedCases();
|
|
581
422
|
const runtime = createTunnelRuntimeV3({
|
|
582
|
-
listeners: [
|
|
423
|
+
listeners: [tunnelListenerOptions(carrier, tls)],
|
|
583
424
|
maxInboundStreams: 16,
|
|
584
425
|
maxPendingLegs: 16,
|
|
585
426
|
maxActivePairs: 8,
|
|
@@ -605,7 +446,7 @@ async function runRelayV3(tls, input, carrier) {
|
|
|
605
446
|
throw new Error(`tunnel ${carrier} listener did not bind`);
|
|
606
447
|
writeJSON({
|
|
607
448
|
type: "relay-ready", runtime: RUNTIME, carrier, path: "tunnel",
|
|
608
|
-
endpoint_url:
|
|
449
|
+
endpoint_url: endpointURL(carrier, "tunnel", address.port),
|
|
609
450
|
trust_pem: tls.tls.root_certificate_pem,
|
|
610
451
|
trust_roots_der: [tls.tls.root_certificate_der_base64],
|
|
611
452
|
server_certificate_der: tls.tls.leaf_certificate_der_base64,
|
|
@@ -642,59 +483,10 @@ async function runRelayV3(tls, input, carrier) {
|
|
|
642
483
|
});
|
|
643
484
|
}
|
|
644
485
|
async function runTunnelEndpointB(input, carrier) {
|
|
645
|
-
if (PROTOCOL === "v3")
|
|
646
|
-
return await runTunnelEndpointBV3(input, carrier);
|
|
647
486
|
const envelope = await input.next();
|
|
648
487
|
const { topology, relay } = envelope;
|
|
649
488
|
validateTunnelDimensions(topology, relay, "endpoint_b", carrier);
|
|
650
|
-
const
|
|
651
|
-
session: { channelId: `parity-${topology.id}`, maxInboundStreams: 16 },
|
|
652
|
-
endpoints: createEndpointSet(relay.endpoint_url),
|
|
653
|
-
rendezvousGroupId: topology.id,
|
|
654
|
-
listenerAudience: "server-parity",
|
|
655
|
-
firstEndpointId: `${topology.id}-a`,
|
|
656
|
-
secondEndpointId: `${topology.id}-b`,
|
|
657
|
-
});
|
|
658
|
-
const firstJSON = decoder.decode(pair.first.artifactJSON());
|
|
659
|
-
const secondJSON = decoder.decode(pair.second.artifactJSON());
|
|
660
|
-
const ready = {
|
|
661
|
-
type: "endpoint-b-ready",
|
|
662
|
-
runtime: RUNTIME,
|
|
663
|
-
carrier,
|
|
664
|
-
path: "tunnel",
|
|
665
|
-
endpoint_a_artifact_json: firstJSON,
|
|
666
|
-
endpoint_b_artifact_json: secondJSON,
|
|
667
|
-
relay,
|
|
668
|
-
authorizations: [
|
|
669
|
-
authorizationWire(pair.first, firstJSON, "lease-endpoint-a"),
|
|
670
|
-
authorizationWire(pair.second, secondJSON, "lease-endpoint-b"),
|
|
671
|
-
],
|
|
672
|
-
};
|
|
673
|
-
writeJSON(ready);
|
|
674
|
-
const command = await input.next();
|
|
675
|
-
if (command.type !== "connect")
|
|
676
|
-
throw new Error("endpoint B did not receive connect command");
|
|
677
|
-
const state = createHandlers("tunnel");
|
|
678
|
-
const session = await connectArtifact(secondJSON, relay, state.rpcHandlers);
|
|
679
|
-
state.executed.record("admission");
|
|
680
|
-
if (process.env.FLOWERSEC_PARITY_CLIENT_PROFILE !== undefined) {
|
|
681
|
-
await externalServer(session, state);
|
|
682
|
-
}
|
|
683
|
-
else {
|
|
684
|
-
await exerciseServer(session, state, "tunnel", false, carrier);
|
|
685
|
-
}
|
|
686
|
-
await session.close().catch(() => undefined);
|
|
687
|
-
state.executed.record("close");
|
|
688
|
-
if (state.activeStreams.value !== 0)
|
|
689
|
-
throw new Error(`endpoint B cleanup left ${state.activeStreams.value} streams`);
|
|
690
|
-
state.executed.record("cleanup");
|
|
691
|
-
writeJSON(result("endpoint-b-result", "tunnel", state.executed.snapshot(), carrier));
|
|
692
|
-
}
|
|
693
|
-
async function runTunnelEndpointBV3(input, carrier) {
|
|
694
|
-
const envelope = await input.next();
|
|
695
|
-
const { topology, relay } = envelope;
|
|
696
|
-
validateTunnelDimensions(topology, relay, "endpoint_b", carrier);
|
|
697
|
-
const issued = await issueV3({ mode: "tunnel", endpoint: relay.endpoint_url, topology_id: topology.id });
|
|
489
|
+
const issued = await issue({ mode: "tunnel", endpoint: relay.endpoint_url, topology_id: topology.id });
|
|
698
490
|
if (issued.endpoint_a_artifact_json === undefined || issued.endpoint_b_artifact_json === undefined ||
|
|
699
491
|
issued.authorizations === undefined || issued.verification_records === undefined) {
|
|
700
492
|
throw new Error("v3 parity issuer omitted tunnel material");
|
|
@@ -710,7 +502,7 @@ async function runTunnelEndpointBV3(input, carrier) {
|
|
|
710
502
|
if (command.type !== "connect")
|
|
711
503
|
throw new Error("endpoint B did not receive connect command");
|
|
712
504
|
const state = createHandlers("tunnel");
|
|
713
|
-
const session = await
|
|
505
|
+
const session = await connectArtifact(ready.endpoint_b_artifact_json, relay, state.rpcHandlers);
|
|
714
506
|
state.executed.record("admission");
|
|
715
507
|
if (process.env.FLOWERSEC_PARITY_CLIENT_PROFILE !== undefined) {
|
|
716
508
|
await externalServer(session, state);
|
|
@@ -750,9 +542,7 @@ async function runTunnelEndpointA(input, carrier) {
|
|
|
750
542
|
ready.endpoint_a_artifact_json === "")
|
|
751
543
|
throw new Error("invalid endpoint B ready message");
|
|
752
544
|
const state = createHandlers("tunnel");
|
|
753
|
-
const session =
|
|
754
|
-
? await connectArtifactV3(ready.endpoint_a_artifact_json, ready.relay, state.rpcHandlers)
|
|
755
|
-
: await connectArtifact(ready.endpoint_a_artifact_json, ready.relay, state.rpcHandlers);
|
|
545
|
+
const session = await connectArtifact(ready.endpoint_a_artifact_json, ready.relay, state.rpcHandlers);
|
|
756
546
|
state.executed.record("admission");
|
|
757
547
|
await exerciseClient(session, state, "tunnel", carrier);
|
|
758
548
|
await session.close().catch(() => undefined);
|
|
@@ -773,20 +563,6 @@ function validateTunnelDimensions(topology, relay, endpoint, carrier) {
|
|
|
773
563
|
throw new Error("invalid tunnel topology dimensions");
|
|
774
564
|
}
|
|
775
565
|
}
|
|
776
|
-
function authorizationWire(issued, artifactJSON, leaseId) {
|
|
777
|
-
const artifact = JSON.parse(artifactJSON);
|
|
778
|
-
if (!Number.isSafeInteger(artifact.session.init_expire_at_unix_s) ||
|
|
779
|
-
artifact.path.expected_peer_endpoint_instance_id === "")
|
|
780
|
-
throw new Error("issued tunnel artifact omitted relay claims");
|
|
781
|
-
return {
|
|
782
|
-
decision: "allow",
|
|
783
|
-
credentialId: issued.lookupKey(),
|
|
784
|
-
leaseId,
|
|
785
|
-
expiresAtUnixSeconds: artifact.session.init_expire_at_unix_s,
|
|
786
|
-
expectedPeerEndpointInstanceId: artifact.path.expected_peer_endpoint_instance_id,
|
|
787
|
-
allowReplacement: false,
|
|
788
|
-
};
|
|
789
|
-
}
|
|
790
566
|
function result(type, path, cases, carrier) {
|
|
791
567
|
return {
|
|
792
568
|
type,
|
|
@@ -819,11 +595,6 @@ function parseArguments(arguments_) {
|
|
|
819
595
|
return { role, carrier: arguments_[2] };
|
|
820
596
|
}
|
|
821
597
|
function endpointURL(carrier, path, port) {
|
|
822
|
-
return carrier === "websocket"
|
|
823
|
-
? `wss://localhost:${port}/flowersec/v2/${path}`
|
|
824
|
-
: `quic://127.0.0.1:${port}`;
|
|
825
|
-
}
|
|
826
|
-
function endpointURLV3(carrier, path, port) {
|
|
827
598
|
return carrier === "websocket"
|
|
828
599
|
? `wss://localhost:${port}/flowersec/v3/${path}`
|
|
829
600
|
: `quic://127.0.0.1:${port}`;
|
|
@@ -840,18 +611,6 @@ function tunnelListenerOptions(carrier, tls) {
|
|
|
840
611
|
? { carrier, host: "127.0.0.1", port: 0, tls: material, allowedOrigins: [ORIGIN] }
|
|
841
612
|
: { carrier: "raw_quic", host: "127.0.0.1", port: 0, tls: material };
|
|
842
613
|
}
|
|
843
|
-
function directListenerOptionsV3(carrier, tls) {
|
|
844
|
-
const material = { certificate: tls.tls.certificate_chain_pem, privateKey: tls.tls.private_key_pem };
|
|
845
|
-
return carrier === "websocket"
|
|
846
|
-
? { carrier, path: "direct", host: "127.0.0.1", port: 0, tls: material, allowedOrigins: [ORIGIN] }
|
|
847
|
-
: { carrier: "raw_quic", path: "direct", host: "127.0.0.1", port: 0, tls: material };
|
|
848
|
-
}
|
|
849
|
-
function tunnelListenerOptionsV3(carrier, tls) {
|
|
850
|
-
const material = { certificate: tls.tls.certificate_chain_pem, privateKey: tls.tls.private_key_pem };
|
|
851
|
-
return carrier === "websocket"
|
|
852
|
-
? { carrier, host: "127.0.0.1", port: 0, tls: material, allowedOrigins: [ORIGIN] }
|
|
853
|
-
: { carrier: "raw_quic", host: "127.0.0.1", port: 0, tls: material };
|
|
854
|
-
}
|
|
855
614
|
async function main() {
|
|
856
615
|
const { role, carrier } = parseArguments(process.argv.slice(2));
|
|
857
616
|
switch (role) {
|
package/dist/node/acceptor.d.ts
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { type DirectAuthorizationDecision, type RuntimeAuthorizationRequest } from "./controlplane.js";
|
|
1
|
+
import type { JsonValue } from "../public/contract.js";
|
|
3
2
|
import { type StreamHandler, type StreamHandlerOptions } from "../public/streamHandlers.js";
|
|
4
|
-
export type { RuntimeAuthorizationRequest } from "./controlplane.js";
|
|
5
3
|
export { HandlerRegistrationError } from "../public/streamHandlers.js";
|
|
6
4
|
export type { StreamHandler } from "../public/streamHandlers.js";
|
|
7
|
-
export type AuthorizationDecision = DirectAuthorizationDecision;
|
|
8
5
|
export type RPCHandlerResult = Readonly<{
|
|
9
6
|
payload: JsonValue;
|
|
10
7
|
}> | Readonly<{
|
|
@@ -25,15 +22,6 @@ export declare class RPCHandlers {
|
|
|
25
22
|
handleRPC(typeId: number, handler: RPCHandler): void;
|
|
26
23
|
handleNotification(typeId: number, handler: NotificationHandler): void;
|
|
27
24
|
}
|
|
28
|
-
export declare class SessionHandlers {
|
|
29
|
-
private readonly streamHandlerRegistrarBrand;
|
|
30
|
-
private readonly sessionHandlersV2Brand;
|
|
31
|
-
constructor(options?: SessionHandlerOptions);
|
|
32
|
-
handleRPC(typeId: number, handler: RPCHandler): void;
|
|
33
|
-
handleNotification(typeId: number, handler: NotificationHandler): void;
|
|
34
|
-
handleStream(kind: string, handler: StreamHandler): void;
|
|
35
|
-
}
|
|
36
|
-
/** Strict-v3 accepted-session handlers. */
|
|
37
25
|
export declare class SessionHandlersV3 {
|
|
38
26
|
private readonly streamHandlerRegistrarBrand;
|
|
39
27
|
private readonly sessionHandlersV3Brand;
|
|
@@ -46,47 +34,3 @@ export type FrozenRPCHandlers = Readonly<{
|
|
|
46
34
|
requests: ReadonlyMap<number, RPCHandler>;
|
|
47
35
|
notifications: ReadonlyMap<number, NotificationHandler>;
|
|
48
36
|
}>;
|
|
49
|
-
export type AcceptorListener = Readonly<{
|
|
50
|
-
carrier: "websocket";
|
|
51
|
-
path: "direct";
|
|
52
|
-
host: string;
|
|
53
|
-
port: number;
|
|
54
|
-
tls?: Readonly<{
|
|
55
|
-
certificate: string;
|
|
56
|
-
privateKey: string;
|
|
57
|
-
}>;
|
|
58
|
-
allowedOrigins: readonly string[];
|
|
59
|
-
}> | Readonly<{
|
|
60
|
-
carrier: "raw_quic";
|
|
61
|
-
path: "direct";
|
|
62
|
-
host: string;
|
|
63
|
-
port: number;
|
|
64
|
-
tls: Readonly<{
|
|
65
|
-
certificate: string;
|
|
66
|
-
privateKey: string;
|
|
67
|
-
}>;
|
|
68
|
-
}>;
|
|
69
|
-
export type AcceptorOptions = Readonly<{
|
|
70
|
-
listeners: readonly AcceptorListener[];
|
|
71
|
-
maxInboundStreams: number;
|
|
72
|
-
cleanupTimeoutMs?: number;
|
|
73
|
-
authorize(request: RuntimeAuthorizationRequest, options: OperationOptions): Promise<AuthorizationDecision>;
|
|
74
|
-
release?(leaseId: string): Promise<void> | void;
|
|
75
|
-
resolveHandlers?(request: RuntimeAuthorizationRequest, options: OperationOptions): Promise<SessionHandlers> | SessionHandlers;
|
|
76
|
-
}>;
|
|
77
|
-
export declare class AcceptedSession {
|
|
78
|
-
private constructor();
|
|
79
|
-
get session(): Session;
|
|
80
|
-
serve(options?: OperationOptions): Promise<void>;
|
|
81
|
-
close(): Promise<void>;
|
|
82
|
-
}
|
|
83
|
-
export declare class Acceptor {
|
|
84
|
-
private constructor();
|
|
85
|
-
addresses(): readonly Readonly<{
|
|
86
|
-
host: string;
|
|
87
|
-
port: number;
|
|
88
|
-
}>[];
|
|
89
|
-
accept(operation?: OperationOptions): Promise<AcceptedSession>;
|
|
90
|
-
close(): Promise<void>;
|
|
91
|
-
}
|
|
92
|
-
export declare function createAcceptor(options: AcceptorOptions): Promise<Acceptor>;
|