mirror of
https://github.com/chirpstack/chirpstack.git
synced 2025-07-13 21:39:43 +00:00
Compare commits
19 Commits
api/go/v4.
...
v4.13.0-te
Author | SHA1 | Date | |
---|---|---|---|
e8d001441c | |||
10e7907251 | |||
39df55afb4 | |||
038e45e8f0 | |||
5cf1120f20 | |||
b8e14058f2 | |||
10731c2be5 | |||
f1d46b1bc9 | |||
c954cd3645 | |||
188ef3d8f3 | |||
0cff864f60 | |||
156f42ab82 | |||
c8b496d33f | |||
8d2faf2d15 | |||
55d9ce0359 | |||
d002f5c97b | |||
9cf12a187c | |||
1b5e5972f4 | |||
330f5dcae0 |
294
Cargo.lock
generated
294
Cargo.lock
generated
@ -46,6 +46,12 @@ dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "allocator-api2"
|
||||
version = "0.2.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923"
|
||||
|
||||
[[package]]
|
||||
name = "amq-protocol"
|
||||
version = "7.2.2"
|
||||
@ -229,7 +235,7 @@ checksum = "965c2d33e53cb6b267e148a4cb0760bc01f4904c1cd4bb4002a085bb016d1490"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
"synstructure",
|
||||
]
|
||||
|
||||
@ -241,7 +247,7 @@ checksum = "3109e49b1e4909e9db6515a30c633684d68cdeaa252f215214cb4fa1a5bfee2c"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
"synstructure",
|
||||
]
|
||||
|
||||
@ -253,7 +259,7 @@ checksum = "7b18050c2cd6fe86c3a76584ef5e0baf286d038cda203eb6223df2cc413565f7"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -301,14 +307,15 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "async-executor"
|
||||
version = "1.13.1"
|
||||
version = "1.13.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec"
|
||||
checksum = "bb812ffb58524bdd10860d7d974e2f01cc0950c2438a74ee5ec2e2280c6c4ffa"
|
||||
dependencies = [
|
||||
"async-task",
|
||||
"concurrent-queue",
|
||||
"fastrand 2.3.0",
|
||||
"futures-lite 2.6.0",
|
||||
"pin-project-lite",
|
||||
"slab",
|
||||
]
|
||||
|
||||
@ -459,7 +466,7 @@ checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -522,7 +529,7 @@ checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -553,9 +560,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "axum"
|
||||
version = "0.8.3"
|
||||
version = "0.8.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "de45108900e1f9b9242f7f2e254aa3e2c029c921c258fe9e6b4217eeebd54288"
|
||||
checksum = "021e862c184ae977658b36c4500f7feac3221ca5da43e3f25bd04ab6c79a29b5"
|
||||
dependencies = [
|
||||
"axum-core",
|
||||
"bytes",
|
||||
@ -629,7 +636,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "backend"
|
||||
version = "4.12.0-test.4"
|
||||
version = "4.13.0-test.1"
|
||||
dependencies = [
|
||||
"aes-kw",
|
||||
"anyhow",
|
||||
@ -637,7 +644,7 @@ dependencies = [
|
||||
"chrono",
|
||||
"hex",
|
||||
"httpmock",
|
||||
"rand 0.9.0",
|
||||
"rand 0.9.1",
|
||||
"reqwest",
|
||||
"serde",
|
||||
"serde_json",
|
||||
@ -728,7 +735,7 @@ dependencies = [
|
||||
"regex",
|
||||
"rustc-hash 1.1.0",
|
||||
"shlex",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
"which",
|
||||
]
|
||||
|
||||
@ -801,9 +808,9 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a"
|
||||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.2.19"
|
||||
version = "1.2.21"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8e3a13707ac958681c13b39b458c073d0d9bc8a22cb1b2f4c8e55eb72c13f362"
|
||||
checksum = "8691782945451c1c383942c4874dbe63814f61cb57ef773cda2972682b7bb3c0"
|
||||
dependencies = [
|
||||
"shlex",
|
||||
]
|
||||
@ -831,7 +838,7 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724"
|
||||
|
||||
[[package]]
|
||||
name = "chirpstack"
|
||||
version = "4.12.0-test.4"
|
||||
version = "4.13.0-test.1"
|
||||
dependencies = [
|
||||
"aes",
|
||||
"anyhow",
|
||||
@ -873,12 +880,12 @@ dependencies = [
|
||||
"pbjson-types",
|
||||
"pbkdf2",
|
||||
"pem",
|
||||
"petgraph 0.7.1",
|
||||
"petgraph 0.8.1",
|
||||
"pin-project",
|
||||
"prometheus-client",
|
||||
"prost",
|
||||
"prost-types",
|
||||
"rand 0.9.0",
|
||||
"rand 0.9.1",
|
||||
"rcgen",
|
||||
"rdkafka",
|
||||
"redis",
|
||||
@ -923,7 +930,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "chirpstack_api"
|
||||
version = "4.12.0-test.4"
|
||||
version = "4.13.0-test.1"
|
||||
dependencies = [
|
||||
"hex",
|
||||
"pbjson",
|
||||
@ -931,7 +938,7 @@ dependencies = [
|
||||
"pbjson-types",
|
||||
"prost",
|
||||
"prost-types",
|
||||
"rand 0.9.0",
|
||||
"rand 0.9.1",
|
||||
"serde",
|
||||
"tokio",
|
||||
"tonic",
|
||||
@ -940,7 +947,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "chirpstack_integration"
|
||||
version = "4.12.0-test.4"
|
||||
version = "4.13.0-test.1"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"async-trait",
|
||||
@ -956,9 +963,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "chrono"
|
||||
version = "0.4.40"
|
||||
version = "0.4.41"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1a7964611d71df112cb1730f2ee67324fcf4d0fc6606acbbe9bfe06df124637c"
|
||||
checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d"
|
||||
dependencies = [
|
||||
"android-tzdata",
|
||||
"iana-time-zone",
|
||||
@ -992,9 +999,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap"
|
||||
version = "4.5.36"
|
||||
version = "4.5.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2df961d8c8a0d08aa9945718ccf584145eee3f3aa06cddbeac12933781102e04"
|
||||
checksum = "eccb054f56cbd38340b380d4a8e69ef1f02f1af43db2f0cc817a4774d80ae071"
|
||||
dependencies = [
|
||||
"clap_builder",
|
||||
"clap_derive",
|
||||
@ -1002,9 +1009,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "clap_builder"
|
||||
version = "4.5.36"
|
||||
version = "4.5.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "132dbda40fb6753878316a489d5a1242a8ef2f0d9e47ba01c951ea8aa7d013a5"
|
||||
checksum = "efd9466fac8543255d3b1fcad4762c5e116ffe808c8a3043d4263cd4fd4862a2"
|
||||
dependencies = [
|
||||
"anstream",
|
||||
"anstyle",
|
||||
@ -1021,7 +1028,7 @@ dependencies = [
|
||||
"heck",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1199,7 +1206,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1223,7 +1230,7 @@ dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"strsim",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1234,7 +1241,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
|
||||
dependencies = [
|
||||
"darling_core",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1286,9 +1293,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "der"
|
||||
version = "0.7.9"
|
||||
version = "0.7.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f55bf8e7b65898637379c1b74eb1551107c8294ed26d855ceb9fd1a09cfc9bc0"
|
||||
checksum = "e7c1832837b905bbfb5101e07cc24c8deddf52f93225eee6ead5f4d63d53ddcb"
|
||||
dependencies = [
|
||||
"const-oid",
|
||||
"der_derive",
|
||||
@ -1333,7 +1340,7 @@ checksum = "8034092389675178f570469e6c3b0465d3d30b4505c294a6550db47f3c17ad18"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1364,7 +1371,7 @@ dependencies = [
|
||||
"darling",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1374,14 +1381,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c"
|
||||
dependencies = [
|
||||
"derive_builder_core",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "diesel"
|
||||
version = "2.2.9"
|
||||
version = "2.2.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "34d3950690ba3a6910126162b47e775e203006d4242a15de912bec6c0a695153"
|
||||
checksum = "ff3e1edb1f37b4953dd5176916347289ed43d7119cc2e6c7c3f7849ff44ea506"
|
||||
dependencies = [
|
||||
"bigdecimal",
|
||||
"bitflags 2.9.0",
|
||||
@ -1415,15 +1422,15 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "diesel_derives"
|
||||
version = "2.2.4"
|
||||
version = "2.2.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a93958254b70bea63b4187ff73d10180599d9d8d177071b7f91e6da4e0c0ad55"
|
||||
checksum = "68d4216021b3ea446fd2047f5c8f8fe6e98af34508a254a01e4d6bc1e844f84d"
|
||||
dependencies = [
|
||||
"diesel_table_macro_syntax",
|
||||
"dsl_auto_type",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1443,7 +1450,7 @@ version = "0.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "209c735641a413bc68c4923a9d6ad4bcb3ca306b794edaa7eb0b3228a99ffb25"
|
||||
dependencies = [
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1487,7 +1494,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1513,7 +1520,7 @@ dependencies = [
|
||||
"heck",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1735,6 +1742,12 @@ version = "1.0.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
|
||||
|
||||
[[package]]
|
||||
name = "foldhash"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
|
||||
|
||||
[[package]]
|
||||
name = "form_urlencoded"
|
||||
version = "1.2.1"
|
||||
@ -1838,7 +1851,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -1932,9 +1945,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "getrandom"
|
||||
version = "0.2.15"
|
||||
version = "0.2.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7"
|
||||
checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"js-sys",
|
||||
@ -2035,9 +2048,14 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
|
||||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.15.2"
|
||||
version = "0.15.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289"
|
||||
checksum = "84b26c544d002229e640969970a2e74021aadf6e2f96372b9c58eff97de08eb3"
|
||||
dependencies = [
|
||||
"allocator-api2",
|
||||
"equivalent",
|
||||
"foldhash",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "heck"
|
||||
@ -2437,7 +2455,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -2485,7 +2503,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cea70ddb795996207ad57735b50c5982d8844f38ba9ee5f1aedcfb708a2aa11e"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown 0.15.2",
|
||||
"hashbrown 0.15.3",
|
||||
"serde",
|
||||
]
|
||||
|
||||
@ -2707,9 +2725,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "libm"
|
||||
version = "0.2.11"
|
||||
version = "0.2.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa"
|
||||
checksum = "c9627da5196e5d8ed0b0495e61e518847578da83483c37288316d9b2e03a7f72"
|
||||
|
||||
[[package]]
|
||||
name = "libredox"
|
||||
@ -2723,9 +2741,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "libsqlite3-sys"
|
||||
version = "0.32.0"
|
||||
version = "0.33.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fbb8270bb4060bd76c6e96f20c52d80620f1d82a3470885694e41e0f81ef6fe7"
|
||||
checksum = "947e6816f7825b2b45027c2c32e7085da9934defa535de4a6a46b10a4d5257fa"
|
||||
dependencies = [
|
||||
"pkg-config",
|
||||
"vcpkg",
|
||||
@ -2776,7 +2794,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "lrwn"
|
||||
version = "4.12.0-test.4"
|
||||
version = "4.13.0-test.1"
|
||||
dependencies = [
|
||||
"aes",
|
||||
"anyhow",
|
||||
@ -2789,7 +2807,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "lrwn_filters"
|
||||
version = "4.12.0-test.4"
|
||||
version = "4.13.0-test.1"
|
||||
dependencies = [
|
||||
"hex",
|
||||
"lrwn",
|
||||
@ -3020,7 +3038,7 @@ dependencies = [
|
||||
"proc-macro-crate",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -3031,7 +3049,7 @@ checksum = "51e219e79014df21a225b1860a479e2dcd7cbd9130f4defd4bd0e191ea31d67d"
|
||||
dependencies = [
|
||||
"base64 0.22.1",
|
||||
"chrono",
|
||||
"getrandom 0.2.15",
|
||||
"getrandom 0.2.16",
|
||||
"http 1.3.1",
|
||||
"rand 0.8.5",
|
||||
"reqwest",
|
||||
@ -3297,7 +3315,7 @@ dependencies = [
|
||||
"pest_meta",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -3331,6 +3349,18 @@ dependencies = [
|
||||
"indexmap 2.9.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "petgraph"
|
||||
version = "0.8.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7a98c6720655620a521dcc722d0ad66cd8afd5d86e34a89ef691c50b7b24de06"
|
||||
dependencies = [
|
||||
"fixedbitset 0.5.7",
|
||||
"hashbrown 0.15.3",
|
||||
"indexmap 2.9.0",
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "phf"
|
||||
version = "0.11.3"
|
||||
@ -3372,7 +3402,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -3481,7 +3511,7 @@ dependencies = [
|
||||
"hmac",
|
||||
"md-5",
|
||||
"memchr",
|
||||
"rand 0.9.0",
|
||||
"rand 0.9.1",
|
||||
"sha2",
|
||||
"stringprep",
|
||||
]
|
||||
@ -3525,7 +3555,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "664ec5419c51e34154eec046ebcba56312d5a2fc3b09a06da188e1ad21afadf6"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -3565,14 +3595,14 @@ dependencies = [
|
||||
"proc-macro-error-attr2",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.94"
|
||||
version = "1.0.95"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a31971752e70b8b2686d7e46ec17fb38dad4051d94024c88df49b667caea9c84"
|
||||
checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
@ -3597,7 +3627,7 @@ checksum = "440f724eba9f6996b75d63681b0a92b06947f1457076d503a4d2e2c8f56442b8"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -3626,7 +3656,7 @@ dependencies = [
|
||||
"prost",
|
||||
"prost-types",
|
||||
"regex",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
"tempfile",
|
||||
]
|
||||
|
||||
@ -3640,7 +3670,7 @@ dependencies = [
|
||||
"itertools 0.14.0",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -3674,13 +3704,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "quinn-proto"
|
||||
version = "0.11.10"
|
||||
version = "0.11.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b820744eb4dc9b57a3398183639c511b5a26d2ed702cedd3febaa1393caa22cc"
|
||||
checksum = "bcbafbbdbb0f638fe3f35f3c56739f77a8a1d070cb25603226c83339b391472b"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"getrandom 0.3.2",
|
||||
"rand 0.9.0",
|
||||
"rand 0.9.1",
|
||||
"ring",
|
||||
"rustc-hash 2.1.1",
|
||||
"rustls 0.23.26",
|
||||
@ -3694,9 +3724,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "quinn-udp"
|
||||
version = "0.5.11"
|
||||
version = "0.5.12"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "541d0f57c6ec747a90738a52741d3221f7960e8ac2f0ff4b1a63680e033b4ab5"
|
||||
checksum = "ee4e529991f949c5e25755532370b8af5d114acae52326361d68d47af64aa842"
|
||||
dependencies = [
|
||||
"cfg_aliases",
|
||||
"libc",
|
||||
@ -3734,13 +3764,12 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rand"
|
||||
version = "0.9.0"
|
||||
version = "0.9.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3779b94aeb87e8bd4e834cee3650289ee9e0d5677f976ecdb6d219e5f4f6cd94"
|
||||
checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97"
|
||||
dependencies = [
|
||||
"rand_chacha 0.9.0",
|
||||
"rand_core 0.9.3",
|
||||
"zerocopy",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -3769,7 +3798,7 @@ version = "0.6.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
|
||||
dependencies = [
|
||||
"getrandom 0.2.15",
|
||||
"getrandom 0.2.16",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -3853,7 +3882,7 @@ dependencies = [
|
||||
"num-bigint",
|
||||
"percent-encoding",
|
||||
"pin-project-lite",
|
||||
"rand 0.9.0",
|
||||
"rand 0.9.1",
|
||||
"rustls 0.23.26",
|
||||
"rustls-native-certs 0.8.1",
|
||||
"ryu",
|
||||
@ -3880,7 +3909,7 @@ version = "0.4.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43"
|
||||
dependencies = [
|
||||
"getrandom 0.2.15",
|
||||
"getrandom 0.2.16",
|
||||
"libredox",
|
||||
"thiserror 1.0.69",
|
||||
]
|
||||
@ -3982,7 +4011,7 @@ checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"cfg-if",
|
||||
"getrandom 0.2.15",
|
||||
"getrandom 0.2.16",
|
||||
"libc",
|
||||
"untrusted",
|
||||
"windows-sys 0.52.0",
|
||||
@ -4023,7 +4052,7 @@ dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"rquickjs-core",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -4095,7 +4124,7 @@ dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"rust-embed-utils",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
"walkdir",
|
||||
]
|
||||
|
||||
@ -4174,9 +4203,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "rustix"
|
||||
version = "1.0.5"
|
||||
version = "1.0.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d97817398dd4bb2e6da002002db259209759911da105da92bec29ccb12cf58bf"
|
||||
checksum = "c71e83d6afe7ff64890ec6b71d6a69bb8a610ab78ce364b3352876bb4c801266"
|
||||
dependencies = [
|
||||
"bitflags 2.9.0",
|
||||
"errno",
|
||||
@ -4407,7 +4436,7 @@ checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -4499,7 +4528,7 @@ dependencies = [
|
||||
"darling",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -4523,9 +4552,9 @@ checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d"
|
||||
|
||||
[[package]]
|
||||
name = "sha2"
|
||||
version = "0.10.8"
|
||||
version = "0.10.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8"
|
||||
checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"cpufeatures",
|
||||
@ -4572,9 +4601,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "signal-hook-registry"
|
||||
version = "1.4.2"
|
||||
version = "1.4.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
|
||||
checksum = "9203b8055f63a2a00e2f593bb0510367fe707d7ff1e5c872de2f537b339e5410"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
@ -4733,9 +4762,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.100"
|
||||
version = "2.0.101"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b09a44accad81e1ba1cd74a32461ba89dee89095ba17b32f5d03683b1b1fc2a0"
|
||||
checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@ -4753,13 +4782,13 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "synstructure"
|
||||
version = "0.13.1"
|
||||
version = "0.13.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
|
||||
checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -4780,7 +4809,7 @@ dependencies = [
|
||||
"fastrand 2.3.0",
|
||||
"getrandom 0.3.2",
|
||||
"once_cell",
|
||||
"rustix 1.0.5",
|
||||
"rustix 1.0.7",
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
@ -4821,7 +4850,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -4832,7 +4861,7 @@ checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -4928,7 +4957,7 @@ checksum = "2d2e76690929402faae40aebdda620a2c0e25dd6d3b9afe48867dfd95991f4bd"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -4967,7 +4996,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -4989,7 +5018,7 @@ dependencies = [
|
||||
"pin-project-lite",
|
||||
"postgres-protocol",
|
||||
"postgres-types",
|
||||
"rand 0.9.0",
|
||||
"rand 0.9.1",
|
||||
"socket2 0.5.9",
|
||||
"tokio",
|
||||
"tokio-util",
|
||||
@ -5059,9 +5088,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "tokio-util"
|
||||
version = "0.7.14"
|
||||
version = "0.7.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034"
|
||||
checksum = "66a539a9ad6d5d281510d5bd368c973d636c02dbf8a67300bfb6b950696ad7df"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"futures-core",
|
||||
@ -5072,9 +5101,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "toml"
|
||||
version = "0.8.20"
|
||||
version = "0.8.22"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cd87a5cdd6ffab733b2f74bc4fd7ee5fff6634124999ac278c35fc78c6120148"
|
||||
checksum = "05ae329d1f08c4d17a59bed7ff5b5a769d062e64a62d34a3261b219e62cd5aae"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"serde_spanned",
|
||||
@ -5084,26 +5113,33 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "toml_datetime"
|
||||
version = "0.6.8"
|
||||
version = "0.6.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41"
|
||||
checksum = "3da5db5a963e24bc68be8b17b6fa82814bb22ee8660f192bb182771d498f09a3"
|
||||
dependencies = [
|
||||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_edit"
|
||||
version = "0.22.24"
|
||||
version = "0.22.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "17b4795ff5edd201c7cd6dca065ae59972ce77d1b80fa0a84d94950ece7d1474"
|
||||
checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e"
|
||||
dependencies = [
|
||||
"indexmap 2.9.0",
|
||||
"serde",
|
||||
"serde_spanned",
|
||||
"toml_datetime",
|
||||
"toml_write",
|
||||
"winnow",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "toml_write"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bfb942dfe1d8e29a7ee7fcbde5bd2b9a25fb89aa70caea2eba3bee836ff41076"
|
||||
|
||||
[[package]]
|
||||
name = "tonic"
|
||||
version = "0.13.0"
|
||||
@ -5144,7 +5180,7 @@ dependencies = [
|
||||
"prost-build",
|
||||
"prost-types",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -5247,7 +5283,7 @@ checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -5456,7 +5492,7 @@ dependencies = [
|
||||
"proc-macro-error2",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -5551,7 +5587,7 @@ dependencies = [
|
||||
"log",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
|
||||
@ -5586,7 +5622,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
"wasm-bindgen-backend",
|
||||
"wasm-bindgen-shared",
|
||||
]
|
||||
@ -5622,9 +5658,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "webpki-roots"
|
||||
version = "0.26.8"
|
||||
version = "0.26.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2210b291f7ea53617fbafcc4939f10914214ec15aace5ba62293a668f322c5c9"
|
||||
checksum = "37493cadf42a2a939ed404698ded7fb378bf301b5011f973361779a3a74f8c93"
|
||||
dependencies = [
|
||||
"rustls-pki-types",
|
||||
]
|
||||
@ -5704,7 +5740,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -5715,7 +5751,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -5976,9 +6012,9 @@ checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
|
||||
|
||||
[[package]]
|
||||
name = "winnow"
|
||||
version = "0.7.6"
|
||||
version = "0.7.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "63d3fcd9bba44b03821e7d699eeee959f3126dcc4aa8e4ae18ec617c2a5cea10"
|
||||
checksum = "9e27d6ad3dac991091e4d35de9ba2d2d00647c5d0fc26c5496dee55984ae111b"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
]
|
||||
@ -6080,28 +6116,28 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
"synstructure",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy"
|
||||
version = "0.8.24"
|
||||
version = "0.8.25"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "2586fea28e186957ef732a5f8b3be2da217d65c5969d4b1e17f973ebbe876879"
|
||||
checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb"
|
||||
dependencies = [
|
||||
"zerocopy-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerocopy-derive"
|
||||
version = "0.8.24"
|
||||
version = "0.8.25"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be"
|
||||
checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -6121,7 +6157,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
"synstructure",
|
||||
]
|
||||
|
||||
@ -6142,7 +6178,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -6164,5 +6200,5 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.100",
|
||||
"syn 2.0.101",
|
||||
]
|
||||
|
2532
api/go/gw/gw.pb.go
vendored
2532
api/go/gw/gw.pb.go
vendored
File diff suppressed because it is too large
Load Diff
8
api/grpc-web/package.json
vendored
8
api/grpc-web/package.json
vendored
@ -1,16 +1,16 @@
|
||||
{
|
||||
"name": "@chirpstack/chirpstack-api-grpc-web",
|
||||
"version": "4.12.0-test.4",
|
||||
"version": "4.13.0-test.1",
|
||||
"description": "Chirpstack gRPC-web API",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"grpc-tools": "^1.12.4",
|
||||
"grpc-tools": "^1.13.0",
|
||||
"ts-protoc-gen": "^0.15.0",
|
||||
"typescript": "^5.1.6"
|
||||
"typescript": "^5.8.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@types/google-protobuf": "^3.15.12",
|
||||
"google-protobuf": "^3.21.2",
|
||||
"google-protobuf": "^3.21.4",
|
||||
"grpc-web": "^1.5.0"
|
||||
}
|
||||
}
|
||||
|
23
api/grpc-web/yarn.lock
vendored
23
api/grpc-web/yarn.lock
vendored
@ -146,15 +146,20 @@ glob@^7.1.3:
|
||||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
google-protobuf@^3.15.5, google-protobuf@^3.21.2:
|
||||
google-protobuf@^3.15.5:
|
||||
version "3.21.2"
|
||||
resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.2.tgz#4580a2bea8bbb291ee579d1fefb14d6fa3070ea4"
|
||||
integrity sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==
|
||||
|
||||
grpc-tools@^1.12.4:
|
||||
version "1.12.4"
|
||||
resolved "https://registry.yarnpkg.com/grpc-tools/-/grpc-tools-1.12.4.tgz#a044c9e8157941033ea7a5f144c2dc9dc4501de4"
|
||||
integrity sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==
|
||||
google-protobuf@^3.21.4:
|
||||
version "3.21.4"
|
||||
resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.4.tgz#2f933e8b6e5e9f8edde66b7be0024b68f77da6c9"
|
||||
integrity sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==
|
||||
|
||||
grpc-tools@^1.13.0:
|
||||
version "1.13.0"
|
||||
resolved "https://registry.yarnpkg.com/grpc-tools/-/grpc-tools-1.13.0.tgz#a4fea8eebce51fb9fec00055a3e52016dfd5af89"
|
||||
integrity sha512-7CbkJ1yWPfX0nHjbYG58BQThNhbICXBZynzCUxCb3LzX5X9B3hQbRY2STiRgIEiLILlK9fgl0z0QVGwPCdXf5g==
|
||||
dependencies:
|
||||
"@mapbox/node-pre-gyp" "^1.0.5"
|
||||
|
||||
@ -376,10 +381,10 @@ ts-protoc-gen@^0.15.0:
|
||||
dependencies:
|
||||
google-protobuf "^3.15.5"
|
||||
|
||||
typescript@^5.1.6:
|
||||
version "5.4.3"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.3.tgz#5c6fedd4c87bee01cd7a528a30145521f8e0feff"
|
||||
integrity sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==
|
||||
typescript@^5.8.3:
|
||||
version "5.8.3"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e"
|
||||
integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==
|
||||
|
||||
util-deprecate@^1.0.1:
|
||||
version "1.0.2"
|
||||
|
2
api/java/build.gradle.kts
vendored
2
api/java/build.gradle.kts
vendored
@ -8,7 +8,7 @@ plugins {
|
||||
}
|
||||
|
||||
group = "io.chirpstack"
|
||||
version = "4.12.0-test.4"
|
||||
version = "4.13.0-test.1"
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
|
12
api/js/package.json
vendored
12
api/js/package.json
vendored
@ -1,17 +1,17 @@
|
||||
{
|
||||
"name": "@chirpstack/chirpstack-api",
|
||||
"version": "4.12.0-test.4",
|
||||
"version": "4.13.0-test.1",
|
||||
"description": "Chirpstack JS and TS API",
|
||||
"license": "MIT",
|
||||
"devDependencies": {
|
||||
"grpc-tools": "^1.12.4",
|
||||
"grpc-tools": "^1.13.0",
|
||||
"ts-protoc-gen": "^0.15.0",
|
||||
"typescript": "^5.1.6"
|
||||
"typescript": "^5.8.3"
|
||||
},
|
||||
"dependencies": {
|
||||
"@grpc/grpc-js": "^1.10.4",
|
||||
"@grpc/grpc-js": "^1.13.3",
|
||||
"@mapbox/node-pre-gyp": "^1.0.11",
|
||||
"@types/google-protobuf": "^3.15.6",
|
||||
"google-protobuf": "^3.21.2"
|
||||
"@types/google-protobuf": "^3.15.12",
|
||||
"google-protobuf": "^3.21.4"
|
||||
}
|
||||
}
|
||||
|
39
api/js/yarn.lock
vendored
39
api/js/yarn.lock
vendored
@ -2,10 +2,10 @@
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@grpc/grpc-js@^1.10.4":
|
||||
version "1.10.9"
|
||||
resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.10.9.tgz#468cc1549a3fe37b760a16745fb7685d91f4f10c"
|
||||
integrity sha512-5tcgUctCG0qoNyfChZifz2tJqbRbXVO9J7X6duFcOjY3HUNCxg5D0ZCK7EP9vIcZ0zRpLU9bWkyCqVCLZ46IbQ==
|
||||
"@grpc/grpc-js@^1.13.3":
|
||||
version "1.13.3"
|
||||
resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.13.3.tgz#6ad08d186c2a8651697085f790c5c68eaca45904"
|
||||
integrity sha512-FTXHdOoPbZrBjlVLHuKbDZnsTxXv2BlHF57xw6LuThXacXvtkahEPED0CKMk6obZDf65Hv4k3z62eyPNpvinIg==
|
||||
dependencies:
|
||||
"@grpc/proto-loader" "^0.7.13"
|
||||
"@js-sdsl/ordered-map" "^4.4.2"
|
||||
@ -93,10 +93,10 @@
|
||||
resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
|
||||
integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==
|
||||
|
||||
"@types/google-protobuf@^3.15.6":
|
||||
version "3.15.6"
|
||||
resolved "https://registry.yarnpkg.com/@types/google-protobuf/-/google-protobuf-3.15.6.tgz#674a69493ef2c849b95eafe69167ea59079eb504"
|
||||
integrity sha512-pYVNNJ+winC4aek+lZp93sIKxnXt5qMkuKmaqS3WGuTq0Bw1ZDYNBgzG5kkdtwcv+GmYJGo3yEg6z2cKKAiEdw==
|
||||
"@types/google-protobuf@^3.15.12":
|
||||
version "3.15.12"
|
||||
resolved "https://registry.yarnpkg.com/@types/google-protobuf/-/google-protobuf-3.15.12.tgz#eb2ba0eddd65712211a2b455dc6071d665ccf49b"
|
||||
integrity sha512-40um9QqwHjRS92qnOaDpL7RmDK15NuZYo9HihiJRbYkMQZlWnuH8AdvbMy8/o6lgLmKbDUKa+OALCltHdbOTpQ==
|
||||
|
||||
"@types/node@>=13.7.0":
|
||||
version "20.4.8"
|
||||
@ -265,15 +265,20 @@ glob@^7.1.3:
|
||||
once "^1.3.0"
|
||||
path-is-absolute "^1.0.0"
|
||||
|
||||
google-protobuf@^3.15.5, google-protobuf@^3.21.2:
|
||||
google-protobuf@^3.15.5:
|
||||
version "3.21.2"
|
||||
resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.2.tgz#4580a2bea8bbb291ee579d1fefb14d6fa3070ea4"
|
||||
integrity sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA==
|
||||
|
||||
grpc-tools@^1.12.4:
|
||||
version "1.12.4"
|
||||
resolved "https://registry.yarnpkg.com/grpc-tools/-/grpc-tools-1.12.4.tgz#a044c9e8157941033ea7a5f144c2dc9dc4501de4"
|
||||
integrity sha512-5+mLAJJma3BjnW/KQp6JBjUMgvu7Mu3dBvBPd1dcbNIb+qiR0817zDpgPjS7gRb+l/8EVNIa3cB02xI9JLToKg==
|
||||
google-protobuf@^3.21.4:
|
||||
version "3.21.4"
|
||||
resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.4.tgz#2f933e8b6e5e9f8edde66b7be0024b68f77da6c9"
|
||||
integrity sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==
|
||||
|
||||
grpc-tools@^1.13.0:
|
||||
version "1.13.0"
|
||||
resolved "https://registry.yarnpkg.com/grpc-tools/-/grpc-tools-1.13.0.tgz#a4fea8eebce51fb9fec00055a3e52016dfd5af89"
|
||||
integrity sha512-7CbkJ1yWPfX0nHjbYG58BQThNhbICXBZynzCUxCb3LzX5X9B3hQbRY2STiRgIEiLILlK9fgl0z0QVGwPCdXf5g==
|
||||
dependencies:
|
||||
"@mapbox/node-pre-gyp" "^1.0.5"
|
||||
|
||||
@ -523,10 +528,10 @@ ts-protoc-gen@^0.15.0:
|
||||
dependencies:
|
||||
google-protobuf "^3.15.5"
|
||||
|
||||
typescript@^5.1.6:
|
||||
version "5.1.6"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.1.6.tgz#02f8ac202b6dad2c0dd5e0913745b47a37998274"
|
||||
integrity sha512-zaWCozRZ6DLEWAWFrVDz1H6FVXzUSfTy5FUMWsQlU8Ym5JP9eO4xkTIROFCQvhQf61z6O/G6ugw3SgAnvvm+HA==
|
||||
typescript@^5.8.3:
|
||||
version "5.8.3"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e"
|
||||
integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==
|
||||
|
||||
util-deprecate@^1.0.1:
|
||||
version "1.0.2"
|
||||
|
2
api/kotlin/build.gradle.kts
vendored
2
api/kotlin/build.gradle.kts
vendored
@ -9,7 +9,7 @@ plugins {
|
||||
}
|
||||
|
||||
group = "io.chirpstack"
|
||||
version = "4.12.0-test.4"
|
||||
version = "4.13.0-test.1"
|
||||
|
||||
repositories {
|
||||
mavenCentral()
|
||||
|
2
api/php/composer.json
vendored
2
api/php/composer.json
vendored
@ -3,7 +3,7 @@
|
||||
"description": "Chirpstack PHP API",
|
||||
"license": "MIT",
|
||||
"type": "library",
|
||||
"version": "4.12.0-test.4",
|
||||
"version": "4.13.0-test.1",
|
||||
"require": {
|
||||
"php": ">=7.0.0",
|
||||
"grpc/grpc": "^v1.57.0",
|
||||
|
125
api/proto/gw/gw.proto
vendored
125
api/proto/gw/gw.proto
vendored
@ -104,6 +104,82 @@ enum TxAckStatus {
|
||||
DUTY_CYCLE_OVERFLOW = 11;
|
||||
}
|
||||
|
||||
// Gateway events as reported by the ChirpStack Concentratord ZMQ interface.
|
||||
message Event {
|
||||
oneof event {
|
||||
// Uplink frame.
|
||||
UplinkFrame uplink_frame = 1;
|
||||
|
||||
// Gateway stats.
|
||||
GatewayStats gateway_stats = 2;
|
||||
|
||||
// Gateway Mesh Event.
|
||||
MeshEvent mesh = 3;
|
||||
}
|
||||
}
|
||||
|
||||
// Commands that can be sent to the ChirpStack Concentratord ZMQ interface.
|
||||
message Command {
|
||||
oneof command {
|
||||
// Downlink frame.
|
||||
DownlinkFrame send_downlink_frame = 1;
|
||||
|
||||
// Gateway configuration.
|
||||
GatewayConfiguration set_gateway_configuration = 2;
|
||||
|
||||
// Get Gateway ID.
|
||||
GetGatewayIdRequest get_gateway_id = 3;
|
||||
|
||||
// Get location.
|
||||
GetLocationRequest get_location = 4;
|
||||
|
||||
// Gateway Mesh Command.
|
||||
MeshCommand mesh = 5;
|
||||
}
|
||||
}
|
||||
|
||||
message MeshEvent {
|
||||
// Gateway ID (of the Border Gateway).
|
||||
string gateway_id = 1;
|
||||
|
||||
// Relay ID.
|
||||
string relay_id = 2;
|
||||
|
||||
// Timestamp (second precision).
|
||||
google.protobuf.Timestamp time = 3;
|
||||
|
||||
// Mesh events.
|
||||
repeated MeshEventItem events = 4;
|
||||
}
|
||||
|
||||
message MeshEventItem {
|
||||
oneof event {
|
||||
// Proprietary Mesh event.
|
||||
MeshEventProprietary proprietary = 1;
|
||||
|
||||
// Mesh heartbeat.
|
||||
MeshEventHeartbeat heartbeat = 2;
|
||||
}
|
||||
}
|
||||
|
||||
message MeshCommand {
|
||||
// Gateway ID (of the Border Gateway).
|
||||
string gateway_id = 1;
|
||||
|
||||
// Relay ID.
|
||||
string relay_id = 2;
|
||||
|
||||
// Mesh events.
|
||||
repeated MeshCommandItem commands = 3;
|
||||
}
|
||||
|
||||
message MeshCommandItem {
|
||||
oneof command {
|
||||
// Proprietary Mesh command.
|
||||
MeshCommandProprietary proprietary = 1;
|
||||
}
|
||||
}
|
||||
|
||||
message Modulation {
|
||||
oneof parameters {
|
||||
// LoRa modulation information.
|
||||
@ -611,6 +687,23 @@ message GatewayConfiguration {
|
||||
google.protobuf.Duration stats_interval = 4;
|
||||
}
|
||||
|
||||
message GetGatewayIdRequest {}
|
||||
|
||||
message GetGatewayIdResponse {
|
||||
// Gateway ID.
|
||||
string gateway_id = 1;
|
||||
}
|
||||
|
||||
message GetLocationRequest {}
|
||||
|
||||
message GetLocationResponse {
|
||||
// Location.
|
||||
common.Location location = 1;
|
||||
|
||||
// Last updated at.
|
||||
google.protobuf.Timestamp updated_at = 2;
|
||||
}
|
||||
|
||||
message ChannelConfiguration {
|
||||
// Frequency (Hz).
|
||||
uint32 frequency = 1;
|
||||
@ -751,21 +844,13 @@ message ConnState {
|
||||
}
|
||||
|
||||
// Gateway Mesh heartbeat (sent periodically by the Relay Gateways).
|
||||
message MeshHeartbeat {
|
||||
// Gateway ID (of the Border Gateway).
|
||||
string gateway_id = 1;
|
||||
|
||||
// Relay ID.
|
||||
string relay_id = 2;
|
||||
|
||||
// Timestamp (second precision).
|
||||
google.protobuf.Timestamp time = 3;
|
||||
message MeshEventHeartbeat {
|
||||
|
||||
// Relay path.
|
||||
repeated MeshHeartbeatRelayPath relay_path = 4;
|
||||
repeated MeshEventHeartbeatRelayPath relay_path = 4;
|
||||
}
|
||||
|
||||
message MeshHeartbeatRelayPath {
|
||||
message MeshEventHeartbeatRelayPath {
|
||||
// Relay ID.
|
||||
string relay_id = 1;
|
||||
|
||||
@ -775,3 +860,21 @@ message MeshHeartbeatRelayPath {
|
||||
// SNR.
|
||||
int32 snr = 3;
|
||||
}
|
||||
|
||||
// Proprietary mesh event.
|
||||
message MeshEventProprietary {
|
||||
// Event type.
|
||||
uint32 event_type = 1;
|
||||
|
||||
// Payload.
|
||||
bytes payload = 2;
|
||||
}
|
||||
|
||||
// Proprietary mesh command.
|
||||
message MeshCommandProprietary {
|
||||
// Command type.
|
||||
uint32 command_type = 1;
|
||||
|
||||
// Payload.
|
||||
bytes payload = 2;
|
||||
}
|
||||
|
3
api/proto/internal/internal.proto
vendored
3
api/proto/internal/internal.proto
vendored
@ -142,6 +142,9 @@ message DeviceSession {
|
||||
|
||||
// Relay state.
|
||||
Relay relay = 41;
|
||||
|
||||
// Pending mac-commands.
|
||||
map<uint32, bytes> mac_command_pending = 43;
|
||||
}
|
||||
|
||||
message UplinkAdrHistory {
|
||||
|
2
api/python/src/setup.py
vendored
2
api/python/src/setup.py
vendored
@ -18,7 +18,7 @@ CLASSIFIERS = [
|
||||
|
||||
setup(
|
||||
name='chirpstack-api',
|
||||
version = "4.12.0-test.4",
|
||||
version = "4.13.0-test.1",
|
||||
url='https://github.com/brocaar/chirpstack-api',
|
||||
author='Orne Brocaar',
|
||||
author_email='info@brocaar.com',
|
||||
|
2
api/rust/Cargo.toml
vendored
2
api/rust/Cargo.toml
vendored
@ -1,7 +1,7 @@
|
||||
[package]
|
||||
name = "chirpstack_api"
|
||||
description = "ChirpStack Protobuf / gRPC API definitions."
|
||||
version = "4.12.0-test.4"
|
||||
version = "4.13.0-test.1"
|
||||
authors = ["Orne Brocaar <info@brocaar.com>"]
|
||||
license = "MIT"
|
||||
homepage = "https://www.chirpstack.io"
|
||||
|
125
api/rust/proto/chirpstack/gw/gw.proto
vendored
125
api/rust/proto/chirpstack/gw/gw.proto
vendored
@ -104,6 +104,82 @@ enum TxAckStatus {
|
||||
DUTY_CYCLE_OVERFLOW = 11;
|
||||
}
|
||||
|
||||
// Gateway events as reported by the ChirpStack Concentratord ZMQ interface.
|
||||
message Event {
|
||||
oneof event {
|
||||
// Uplink frame.
|
||||
UplinkFrame uplink_frame = 1;
|
||||
|
||||
// Gateway stats.
|
||||
GatewayStats gateway_stats = 2;
|
||||
|
||||
// Gateway Mesh Event.
|
||||
MeshEvent mesh = 3;
|
||||
}
|
||||
}
|
||||
|
||||
// Commands that can be sent to the ChirpStack Concentratord ZMQ interface.
|
||||
message Command {
|
||||
oneof command {
|
||||
// Downlink frame.
|
||||
DownlinkFrame send_downlink_frame = 1;
|
||||
|
||||
// Gateway configuration.
|
||||
GatewayConfiguration set_gateway_configuration = 2;
|
||||
|
||||
// Get Gateway ID.
|
||||
GetGatewayIdRequest get_gateway_id = 3;
|
||||
|
||||
// Get location.
|
||||
GetLocationRequest get_location = 4;
|
||||
|
||||
// Gateway Mesh Command.
|
||||
MeshCommand mesh = 5;
|
||||
}
|
||||
}
|
||||
|
||||
message MeshEvent {
|
||||
// Gateway ID (of the Border Gateway).
|
||||
string gateway_id = 1;
|
||||
|
||||
// Relay ID.
|
||||
string relay_id = 2;
|
||||
|
||||
// Timestamp (second precision).
|
||||
google.protobuf.Timestamp time = 3;
|
||||
|
||||
// Mesh events.
|
||||
repeated MeshEventItem events = 4;
|
||||
}
|
||||
|
||||
message MeshEventItem {
|
||||
oneof event {
|
||||
// Proprietary Mesh event.
|
||||
MeshEventProprietary proprietary = 1;
|
||||
|
||||
// Mesh heartbeat.
|
||||
MeshEventHeartbeat heartbeat = 2;
|
||||
}
|
||||
}
|
||||
|
||||
message MeshCommand {
|
||||
// Gateway ID (of the Border Gateway).
|
||||
string gateway_id = 1;
|
||||
|
||||
// Relay ID.
|
||||
string relay_id = 2;
|
||||
|
||||
// Mesh events.
|
||||
repeated MeshCommandItem commands = 3;
|
||||
}
|
||||
|
||||
message MeshCommandItem {
|
||||
oneof command {
|
||||
// Proprietary Mesh command.
|
||||
MeshCommandProprietary proprietary = 1;
|
||||
}
|
||||
}
|
||||
|
||||
message Modulation {
|
||||
oneof parameters {
|
||||
// LoRa modulation information.
|
||||
@ -611,6 +687,23 @@ message GatewayConfiguration {
|
||||
google.protobuf.Duration stats_interval = 4;
|
||||
}
|
||||
|
||||
message GetGatewayIdRequest {}
|
||||
|
||||
message GetGatewayIdResponse {
|
||||
// Gateway ID.
|
||||
string gateway_id = 1;
|
||||
}
|
||||
|
||||
message GetLocationRequest {}
|
||||
|
||||
message GetLocationResponse {
|
||||
// Location.
|
||||
common.Location location = 1;
|
||||
|
||||
// Last updated at.
|
||||
google.protobuf.Timestamp updated_at = 2;
|
||||
}
|
||||
|
||||
message ChannelConfiguration {
|
||||
// Frequency (Hz).
|
||||
uint32 frequency = 1;
|
||||
@ -751,21 +844,13 @@ message ConnState {
|
||||
}
|
||||
|
||||
// Gateway Mesh heartbeat (sent periodically by the Relay Gateways).
|
||||
message MeshHeartbeat {
|
||||
// Gateway ID (of the Border Gateway).
|
||||
string gateway_id = 1;
|
||||
|
||||
// Relay ID.
|
||||
string relay_id = 2;
|
||||
|
||||
// Timestamp (second precision).
|
||||
google.protobuf.Timestamp time = 3;
|
||||
message MeshEventHeartbeat {
|
||||
|
||||
// Relay path.
|
||||
repeated MeshHeartbeatRelayPath relay_path = 4;
|
||||
repeated MeshEventHeartbeatRelayPath relay_path = 4;
|
||||
}
|
||||
|
||||
message MeshHeartbeatRelayPath {
|
||||
message MeshEventHeartbeatRelayPath {
|
||||
// Relay ID.
|
||||
string relay_id = 1;
|
||||
|
||||
@ -775,3 +860,21 @@ message MeshHeartbeatRelayPath {
|
||||
// SNR.
|
||||
int32 snr = 3;
|
||||
}
|
||||
|
||||
// Proprietary mesh event.
|
||||
message MeshEventProprietary {
|
||||
// Event type.
|
||||
uint32 event_type = 1;
|
||||
|
||||
// Payload.
|
||||
bytes payload = 2;
|
||||
}
|
||||
|
||||
// Proprietary mesh command.
|
||||
message MeshCommandProprietary {
|
||||
// Command type.
|
||||
uint32 command_type = 1;
|
||||
|
||||
// Payload.
|
||||
bytes payload = 2;
|
||||
}
|
||||
|
@ -142,6 +142,9 @@ message DeviceSession {
|
||||
|
||||
// Relay state.
|
||||
Relay relay = 41;
|
||||
|
||||
// Pending mac-commands.
|
||||
map<uint32, bytes> mac_command_pending = 43;
|
||||
}
|
||||
|
||||
message UplinkAdrHistory {
|
||||
|
9
api/rust/src/lib.rs
vendored
9
api/rust/src/lib.rs
vendored
@ -1,14 +1,17 @@
|
||||
pub use prost;
|
||||
pub use prost_types;
|
||||
|
||||
#[cfg(feature = "json")]
|
||||
pub use pbjson_types;
|
||||
pub use prost;
|
||||
#[cfg(feature = "api")]
|
||||
pub use tonic;
|
||||
|
||||
#[cfg(feature = "api")]
|
||||
pub mod api;
|
||||
#[cfg(feature = "internal")]
|
||||
pub mod internal;
|
||||
|
||||
pub mod common;
|
||||
pub mod gw;
|
||||
pub mod integration;
|
||||
#[cfg(feature = "internal")]
|
||||
pub mod internal;
|
||||
pub mod stream;
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "backend"
|
||||
version = "4.12.0-test.4"
|
||||
version = "4.13.0-test.1"
|
||||
authors = ["Orne Brocaar <info@brocaar.com>"]
|
||||
edition = "2018"
|
||||
publish = false
|
||||
|
@ -3,13 +3,13 @@
|
||||
description = "Library for building external ChirpStack integrations"
|
||||
homepage = "https://www.chirpstack.io/"
|
||||
license = "MIT"
|
||||
version = "4.12.0-test.4"
|
||||
version = "4.13.0-test.1"
|
||||
authors = ["Orne Brocaar <info@brocaar.com>"]
|
||||
edition = "2021"
|
||||
repository = "https://github.com/chirpstack/chirpstack"
|
||||
|
||||
[dependencies]
|
||||
chirpstack_api = { path = "../api/rust", version = "4.12.0-test.4" }
|
||||
chirpstack_api = { path = "../api/rust", version = "4.13.0-test.1" }
|
||||
redis = { version = "0.29", features = [
|
||||
"cluster-async",
|
||||
"tokio-rustls-comp",
|
||||
|
@ -3,7 +3,7 @@
|
||||
description = "ChirpStack is an open-source LoRaWAN(TM) Network Server"
|
||||
repository = "https://github.com/chirpstack/chirpstack"
|
||||
homepage = "https://www.chirpstack.io/"
|
||||
version = "4.12.0-test.4"
|
||||
version = "4.13.0-test.1"
|
||||
authors = ["Orne Brocaar <info@brocaar.com>"]
|
||||
edition = "2021"
|
||||
publish = false
|
||||
@ -145,7 +145,7 @@
|
||||
base64 = "0.22"
|
||||
async-recursion = "1.1"
|
||||
regex = "1.11"
|
||||
petgraph = "0.7"
|
||||
petgraph = "0.8"
|
||||
prometheus-client = "0.23"
|
||||
pin-project = "1.1"
|
||||
scoped-futures = { version = "0.1", features = ["std"] }
|
||||
|
@ -352,6 +352,7 @@ pub struct AmqpIntegration {
|
||||
pub url: String,
|
||||
pub json: bool,
|
||||
pub event_routing_key: String,
|
||||
pub exchange: String,
|
||||
}
|
||||
|
||||
impl Default for AmqpIntegration {
|
||||
@ -361,6 +362,7 @@ impl Default for AmqpIntegration {
|
||||
json: true,
|
||||
event_routing_key: "application.{{application_id}}.device.{{dev_eui}}.event.{{event}}"
|
||||
.to_string(),
|
||||
exchange: "amq.topic".to_string(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -707,7 +707,8 @@ impl Data {
|
||||
fn set_phy_payloads(&mut self) -> Result<()> {
|
||||
trace!("Setting downlink PHYPayloads");
|
||||
let mut f_pending = self.more_device_queue_items;
|
||||
let ds = self.device.get_device_session()?;
|
||||
let dev_addr = self.device.get_dev_addr()?;
|
||||
let ds = self.device.get_device_session_mut()?;
|
||||
|
||||
for item in self.downlink_frame_items.iter_mut() {
|
||||
let mut mac_size: usize = 0;
|
||||
@ -729,6 +730,8 @@ impl Data {
|
||||
for mac in &**mac_set {
|
||||
mac_commands.push(mac.clone());
|
||||
}
|
||||
|
||||
mac_command::set_pending(ds, mac_set)?;
|
||||
}
|
||||
|
||||
// LoRaWAN MHDR
|
||||
@ -740,7 +743,7 @@ impl Data {
|
||||
// LoRaWAN MAC payload
|
||||
let mut mac_pl = lrwn::MACPayload {
|
||||
fhdr: lrwn::FHDR {
|
||||
devaddr: self.device.get_dev_addr()?,
|
||||
devaddr: dev_addr,
|
||||
f_cnt: ds.n_f_cnt_down,
|
||||
f_ctrl: lrwn::FCtrl {
|
||||
adr: !self.network_conf.adr_disabled,
|
||||
@ -1196,8 +1199,6 @@ impl Data {
|
||||
if let Some(block) =
|
||||
maccommand::new_channel::request(3, ¤t_channels, &wanted_channels)
|
||||
{
|
||||
mac_command::set_pending(&self.device.dev_eui, lrwn::CID::NewChannelReq, &block)
|
||||
.await?;
|
||||
self.mac_commands.push(block);
|
||||
}
|
||||
|
||||
@ -1207,7 +1208,7 @@ impl Data {
|
||||
// Note: this must come before ADR!
|
||||
async fn _request_channel_mask_reconfiguration(&mut self) -> Result<()> {
|
||||
trace!("Requesting channel-mask reconfiguration");
|
||||
let ds = self.device.get_device_session()?;
|
||||
let ds = self.device.get_device_session_mut()?;
|
||||
|
||||
let enabled_uplink_channel_indices: Vec<usize> = ds
|
||||
.enabled_uplink_channel_indices
|
||||
@ -1239,7 +1240,6 @@ impl Data {
|
||||
.collect(),
|
||||
);
|
||||
|
||||
mac_command::set_pending(&self.device.dev_eui, lrwn::CID::LinkADRReq, &set).await?;
|
||||
self.mac_commands.push(set);
|
||||
|
||||
Ok(())
|
||||
@ -1257,12 +1257,15 @@ impl Data {
|
||||
.get_data_rate(self.uplink_frame_set.as_ref().unwrap().dr)?;
|
||||
|
||||
let ufs = self.uplink_frame_set.as_ref().unwrap();
|
||||
let ds = self.device.get_device_session()?;
|
||||
let dev_eui = self.device.dev_eui;
|
||||
let device_variables = self.device.variables.into_hashmap();
|
||||
let ds = self.device.get_device_session_mut()?;
|
||||
|
||||
let req = adr::Request {
|
||||
dev_eui,
|
||||
device_variables,
|
||||
region_config_id: ufs.region_config_id.clone(),
|
||||
region_common_name: ufs.region_common_name,
|
||||
dev_eui: self.device.dev_eui,
|
||||
mac_version: self.device_profile.mac_version,
|
||||
reg_params_revision: self.device_profile.reg_params_revision,
|
||||
adr: ds.adr,
|
||||
@ -1291,7 +1294,6 @@ impl Data {
|
||||
max_dr: self.network_conf.max_dr,
|
||||
uplink_history: ds.uplink_adr_history.clone(),
|
||||
skip_f_cnt_check: ds.skip_f_cnt_check,
|
||||
device_variables: self.device.variables.into_hashmap(),
|
||||
};
|
||||
|
||||
let resp = adr::handle(&self.device_profile.adr_algorithm_id, &req).await;
|
||||
@ -1304,24 +1306,14 @@ impl Data {
|
||||
{
|
||||
let mut adr_set = false;
|
||||
for set in self.mac_commands.iter_mut() {
|
||||
let mut is_link_adr_set = false;
|
||||
|
||||
for mac in &mut **set {
|
||||
if let lrwn::MACCommand::LinkADRReq(pl) = mac {
|
||||
pl.dr = resp.dr;
|
||||
pl.tx_power = resp.tx_power_index;
|
||||
pl.redundancy.nb_rep = resp.nb_trans;
|
||||
|
||||
adr_set = true;
|
||||
is_link_adr_set = true;
|
||||
}
|
||||
}
|
||||
|
||||
if is_link_adr_set {
|
||||
// We need to update the pending mac-command.
|
||||
mac_command::set_pending(&self.device.dev_eui, lrwn::CID::LinkADRReq, set)
|
||||
.await?;
|
||||
}
|
||||
}
|
||||
|
||||
// There was no existing LinkADRReq to be sent, we need to construct a new one.
|
||||
@ -1358,7 +1350,6 @@ impl Data {
|
||||
},
|
||||
)]);
|
||||
|
||||
mac_command::set_pending(&self.device.dev_eui, lrwn::CID::LinkADRReq, &set).await?;
|
||||
self.mac_commands.push(set);
|
||||
}
|
||||
}
|
||||
@ -1406,7 +1397,7 @@ impl Data {
|
||||
async fn _request_rejoin_param_setup(&mut self) -> Result<()> {
|
||||
trace!("Requesting rejoin param setup");
|
||||
|
||||
let ds = self.device.get_device_session()?;
|
||||
let ds = self.device.get_device_session_mut()?;
|
||||
|
||||
// Rejoin-request is disabled or device does not support LoRaWAN 1.1.
|
||||
if !self.network_conf.rejoin_request.enabled
|
||||
@ -1423,8 +1414,6 @@ impl Data {
|
||||
self.network_conf.rejoin_request.max_time_n,
|
||||
self.network_conf.rejoin_request.max_count_n,
|
||||
);
|
||||
mac_command::set_pending(&self.device.dev_eui, lrwn::CID::RejoinParamSetupReq, &set)
|
||||
.await?;
|
||||
self.mac_commands.push(set);
|
||||
}
|
||||
|
||||
@ -1434,7 +1423,7 @@ impl Data {
|
||||
async fn _set_ping_slot_parameters(&mut self) -> Result<()> {
|
||||
trace!("Setting ping-slot parameters");
|
||||
|
||||
let ds = self.device.get_device_session()?;
|
||||
let ds = self.device.get_device_session_mut()?;
|
||||
|
||||
if !self.device_profile.supports_class_b {
|
||||
return Ok(());
|
||||
@ -1447,8 +1436,6 @@ impl Data {
|
||||
self.network_conf.class_b.ping_slot_dr,
|
||||
self.network_conf.class_b.ping_slot_frequency,
|
||||
);
|
||||
mac_command::set_pending(&self.device.dev_eui, lrwn::CID::PingSlotChannelReq, &set)
|
||||
.await?;
|
||||
self.mac_commands.push(set);
|
||||
}
|
||||
|
||||
@ -1457,7 +1444,7 @@ impl Data {
|
||||
|
||||
async fn _set_rx_parameters(&mut self) -> Result<()> {
|
||||
trace!("Setting rx parameters");
|
||||
let ds = self.device.get_device_session()?;
|
||||
let ds = self.device.get_device_session_mut()?;
|
||||
|
||||
if ds.rx2_frequency != self.network_conf.rx2_frequency
|
||||
|| ds.rx2_dr as u8 != self.network_conf.rx2_dr
|
||||
@ -1468,8 +1455,6 @@ impl Data {
|
||||
self.network_conf.rx2_frequency,
|
||||
self.network_conf.rx2_dr,
|
||||
);
|
||||
mac_command::set_pending(&self.device.dev_eui, lrwn::CID::RxParamSetupReq, &set)
|
||||
.await?;
|
||||
self.mac_commands.push(set);
|
||||
}
|
||||
|
||||
@ -1481,8 +1466,6 @@ impl Data {
|
||||
|
||||
if dev_rx1_delay != req_rx1_delay {
|
||||
let set = maccommand::rx_timing_setup::request(req_rx1_delay);
|
||||
mac_command::set_pending(&self.device.dev_eui, lrwn::CID::RxTimingSetupReq, &set)
|
||||
.await?;
|
||||
self.mac_commands.push(set);
|
||||
}
|
||||
|
||||
@ -1491,7 +1474,7 @@ impl Data {
|
||||
|
||||
async fn _set_tx_parameters(&mut self) -> Result<()> {
|
||||
trace!("Setting tx parameters");
|
||||
let ds = self.device.get_device_session()?;
|
||||
let ds = self.device.get_device_session_mut()?;
|
||||
|
||||
if !self
|
||||
.region_conf
|
||||
@ -1512,8 +1495,6 @@ impl Data {
|
||||
self.network_conf.downlink_dwell_time_400ms,
|
||||
uplink_eirp_index,
|
||||
);
|
||||
mac_command::set_pending(&self.device.dev_eui, lrwn::CID::TxParamSetupReq, &set)
|
||||
.await?;
|
||||
self.mac_commands.push(set);
|
||||
}
|
||||
|
||||
@ -1567,8 +1548,8 @@ impl Data {
|
||||
|| rd.uplink_limit_reload_rate
|
||||
!= device.relay_ed_uplink_limit_reload_rate as u32
|
||||
{
|
||||
let d = device::get(&device.dev_eui).await?;
|
||||
let ds = match d.get_device_session() {
|
||||
let mut d = device::get(&device.dev_eui).await?;
|
||||
let ds = match d.get_device_session_mut() {
|
||||
Ok(v) => v,
|
||||
Err(_) => {
|
||||
// It is valid that the device is no longer activated.
|
||||
@ -1595,13 +1576,17 @@ impl Data {
|
||||
},
|
||||
),
|
||||
]);
|
||||
mac_command::set_pending(
|
||||
&dev_eui,
|
||||
lrwn::CID::UpdateUplinkListReq,
|
||||
&set,
|
||||
self.mac_commands.push(set);
|
||||
|
||||
// Update device-session of device.
|
||||
device::partial_update(
|
||||
d.dev_eui,
|
||||
&device::DeviceChangeset {
|
||||
device_session: Some(d.device_session.clone()),
|
||||
..Default::default()
|
||||
},
|
||||
)
|
||||
.await?;
|
||||
self.mac_commands.push(set);
|
||||
|
||||
rd.dev_addr = dev_addr.to_vec();
|
||||
rd.root_wor_s_key = root_wor_s_key.to_vec();
|
||||
@ -1651,8 +1636,6 @@ impl Data {
|
||||
root_wor_s_key,
|
||||
},
|
||||
)]);
|
||||
mac_command::set_pending(&dev_eui, lrwn::CID::UpdateUplinkListReq, &set)
|
||||
.await?;
|
||||
self.mac_commands.push(set);
|
||||
|
||||
ds.relay
|
||||
@ -1788,8 +1771,6 @@ impl Data {
|
||||
|
||||
if !commands.is_empty() {
|
||||
let set = lrwn::MACCommandSet::new(commands);
|
||||
mac_command::set_pending(&self.device.dev_eui, lrwn::CID::CtrlUplinkListReq, &set)
|
||||
.await?;
|
||||
self.mac_commands.push(set);
|
||||
}
|
||||
|
||||
@ -1799,7 +1780,6 @@ impl Data {
|
||||
async fn _configure_fwd_limit_req(&mut self) -> Result<()> {
|
||||
trace!("Configuring Relay Fwd Limit");
|
||||
|
||||
let dev_eui = self.device.dev_eui;
|
||||
let ds = self.device.get_device_session_mut()?;
|
||||
let relay_params = self.device_profile.relay_params.clone().unwrap_or_default();
|
||||
|
||||
@ -1843,7 +1823,6 @@ impl Data {
|
||||
},
|
||||
},
|
||||
)]);
|
||||
mac_command::set_pending(&dev_eui, lrwn::CID::ConfigureFwdLimitReq, &set).await?;
|
||||
self.mac_commands.push(set);
|
||||
}
|
||||
|
||||
@ -1915,7 +1894,6 @@ impl Data {
|
||||
}
|
||||
|
||||
let set = lrwn::MACCommandSet::new(commands);
|
||||
mac_command::set_pending(&self.device.dev_eui, lrwn::CID::FilterListReq, &set).await?;
|
||||
self.mac_commands.push(set);
|
||||
|
||||
// The deletes needs to be processed before we can add new entries.
|
||||
@ -1944,8 +1922,6 @@ impl Data {
|
||||
filter_list_eui: vec![],
|
||||
},
|
||||
)]);
|
||||
mac_command::set_pending(&self.device.dev_eui, lrwn::CID::FilterListReq, &set)
|
||||
.await?;
|
||||
self.mac_commands.push(set);
|
||||
|
||||
// Return because we can't add multiple sets and if we would combine
|
||||
@ -1977,7 +1953,6 @@ impl Data {
|
||||
filter_list_eui: eui,
|
||||
},
|
||||
)]);
|
||||
mac_command::set_pending(&dev_eui, lrwn::CID::FilterListReq, &set).await?;
|
||||
self.mac_commands.push(set);
|
||||
|
||||
f.join_eui = device.join_eui.to_vec();
|
||||
@ -2009,7 +1984,6 @@ impl Data {
|
||||
filter_list_eui: eui,
|
||||
},
|
||||
)]);
|
||||
mac_command::set_pending(&dev_eui, lrwn::CID::FilterListReq, &set).await?;
|
||||
self.mac_commands.push(set);
|
||||
|
||||
ds.relay
|
||||
@ -2037,7 +2011,6 @@ impl Data {
|
||||
async fn _update_relay_conf(&mut self) -> Result<()> {
|
||||
trace!("Updating Relay Conf");
|
||||
|
||||
let dev_eui = self.device.dev_eui;
|
||||
let ds = self.device.get_device_session_mut()?;
|
||||
let relay_params = self.device_profile.relay_params.clone().unwrap_or_default();
|
||||
|
||||
@ -2075,7 +2048,6 @@ impl Data {
|
||||
second_ch_freq: relay_params.second_channel_freq,
|
||||
},
|
||||
)]);
|
||||
mac_command::set_pending(&dev_eui, lrwn::CID::RelayConfReq, &set).await?;
|
||||
self.mac_commands.push(set);
|
||||
}
|
||||
|
||||
@ -2087,7 +2059,6 @@ impl Data {
|
||||
async fn _update_end_device_conf(&mut self) -> Result<()> {
|
||||
trace!("Updating End Device Conf");
|
||||
|
||||
let dev_eui = self.device.dev_eui;
|
||||
let ds = self.device.get_device_session_mut()?;
|
||||
let relay_params = self.device_profile.relay_params.clone().unwrap_or_default();
|
||||
|
||||
@ -2124,7 +2095,6 @@ impl Data {
|
||||
second_ch_freq: relay_params.second_channel_freq,
|
||||
},
|
||||
)]);
|
||||
mac_command::set_pending(&dev_eui, lrwn::CID::EndDeviceConfReq, &set).await?;
|
||||
self.mac_commands.push(set);
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,4 @@
|
||||
use std::collections::HashMap;
|
||||
use std::io::Cursor;
|
||||
use std::sync::{LazyLock, RwLock};
|
||||
use std::time::Duration;
|
||||
|
||||
@ -352,7 +351,7 @@ async fn message_callback(
|
||||
.inc();
|
||||
let mut event = match json {
|
||||
true => serde_json::from_slice(&p.payload)?,
|
||||
false => chirpstack_api::gw::UplinkFrame::decode(&mut Cursor::new(&p.payload))?,
|
||||
false => chirpstack_api::gw::UplinkFrame::decode(p.payload.as_ref())?,
|
||||
};
|
||||
|
||||
if v4_migrate {
|
||||
@ -377,7 +376,7 @@ async fn message_callback(
|
||||
.inc();
|
||||
let mut event = match json {
|
||||
true => serde_json::from_slice(&p.payload)?,
|
||||
false => chirpstack_api::gw::GatewayStats::decode(&mut Cursor::new(&p.payload))?,
|
||||
false => chirpstack_api::gw::GatewayStats::decode(p.payload.as_ref())?,
|
||||
};
|
||||
|
||||
if v4_migrate {
|
||||
@ -401,7 +400,7 @@ async fn message_callback(
|
||||
.inc();
|
||||
let mut event = match json {
|
||||
true => serde_json::from_slice(&p.payload)?,
|
||||
false => chirpstack_api::gw::DownlinkTxAck::decode(&mut Cursor::new(&p.payload))?,
|
||||
false => chirpstack_api::gw::DownlinkTxAck::decode(p.payload.as_ref())?,
|
||||
};
|
||||
|
||||
if v4_migrate {
|
||||
@ -410,18 +409,18 @@ async fn message_callback(
|
||||
|
||||
set_gateway_json(&event.gateway_id, json);
|
||||
tokio::spawn(downlink::tx_ack::TxAck::handle(event));
|
||||
} else if topic.ends_with("/mesh-heartbeat") {
|
||||
} else if topic.ends_with("/mesh") {
|
||||
EVENT_COUNTER
|
||||
.get_or_create(&EventLabels {
|
||||
event: "mesh-heartbeat".to_string(),
|
||||
event: "mesh".to_string(),
|
||||
})
|
||||
.inc();
|
||||
let event = match json {
|
||||
true => serde_json::from_slice(&p.payload)?,
|
||||
false => chirpstack_api::gw::MeshHeartbeat::decode(&mut Cursor::new(&p.payload))?,
|
||||
false => chirpstack_api::gw::MeshEvent::decode(p.payload.as_ref())?,
|
||||
};
|
||||
|
||||
tokio::spawn(uplink::mesh::MeshHeartbeat::handle(event));
|
||||
tokio::spawn(uplink::mesh::Mesh::handle(event));
|
||||
} else {
|
||||
return Err(anyhow!("Unknown event type"));
|
||||
}
|
||||
|
@ -27,6 +27,7 @@ pub struct Integration<'a> {
|
||||
templates: Handlebars<'a>,
|
||||
json: bool,
|
||||
url: String,
|
||||
exchange: String,
|
||||
}
|
||||
|
||||
#[derive(Serialize)]
|
||||
@ -49,6 +50,7 @@ impl<'a> Integration<'a> {
|
||||
templates,
|
||||
url: conf.url.clone(),
|
||||
json: conf.json,
|
||||
exchange: conf.exchange.clone(),
|
||||
};
|
||||
i.connect().await?;
|
||||
|
||||
@ -90,7 +92,7 @@ impl<'a> Integration<'a> {
|
||||
.as_ref()
|
||||
.unwrap()
|
||||
.basic_publish(
|
||||
"amq.topic",
|
||||
&self.exchange,
|
||||
&routing_key,
|
||||
BasicPublishOptions::default(),
|
||||
b,
|
||||
|
@ -77,7 +77,7 @@ pub async fn handle_uplink(
|
||||
);
|
||||
|
||||
// Get pending mac-command block, this could return None.
|
||||
let pending = match mac_command::get_pending(&dev.dev_eui, cid).await {
|
||||
let pending = match mac_command::get_pending(dev.get_device_session_mut()?, cid).await {
|
||||
Ok(v) => v,
|
||||
Err(e) => {
|
||||
error!(dev_eui = %dev.dev_eui, cid = %cid, error = %e, "Get pending mac-command block error");
|
||||
@ -85,13 +85,6 @@ pub async fn handle_uplink(
|
||||
}
|
||||
};
|
||||
|
||||
// Delete the pending mac-command.
|
||||
if pending.is_some() {
|
||||
if let Err(e) = mac_command::delete_pending(&dev.dev_eui, cid).await {
|
||||
error!(dev_eui = %dev.dev_eui, cid = %cid, error = %e, "Delete pending mac-command error");
|
||||
}
|
||||
}
|
||||
|
||||
// Handle the mac-command, which might return a block to answer the uplink mac-command
|
||||
// request.
|
||||
let res = match handle(
|
||||
|
@ -327,6 +327,15 @@ pub async fn get_for_phypayload_and_incr_f_cnt_up(
|
||||
return Err(Error::InvalidPayload("MacPayload".to_string()));
|
||||
};
|
||||
|
||||
// We calculate the scheduler_run_after timestamp, such that we can update
|
||||
// it directly when updating the device-session (to update the frame-counter).
|
||||
// This way, we limit the risk of overlapping Class-A downlinks with Class-B / -C
|
||||
// downlinks.
|
||||
let conf = config::get();
|
||||
let scheduler_run_after = Utc::now()
|
||||
+ Duration::from_std(conf.network.scheduler.class_a_lock_duration)
|
||||
.map_err(anyhow::Error::new)?;
|
||||
|
||||
let mut c = get_async_db_conn().await?;
|
||||
|
||||
db_transaction::<ValidationStatus, Error, _>(&mut c, |c| {
|
||||
@ -427,10 +436,20 @@ pub async fn get_for_phypayload_and_incr_f_cnt_up(
|
||||
let ds_f_cnt_up = ds.f_cnt_up;
|
||||
ds.f_cnt_up = full_f_cnt + 1;
|
||||
|
||||
let _ = diesel::update(device::dsl::device.find(d.dev_eui))
|
||||
.set(device::device_session.eq(&ds.clone()))
|
||||
.execute(c)
|
||||
.await?;
|
||||
if scheduler_run_after > d.scheduler_run_after.unwrap_or_default() {
|
||||
let _ = diesel::update(device::dsl::device.find(d.dev_eui))
|
||||
.set((
|
||||
device::device_session.eq(&ds.clone()),
|
||||
device::scheduler_run_after.eq(&scheduler_run_after),
|
||||
))
|
||||
.execute(c)
|
||||
.await?;
|
||||
} else {
|
||||
let _ = diesel::update(device::dsl::device.find(d.dev_eui))
|
||||
.set(device::device_session.eq(&ds.clone()))
|
||||
.execute(c)
|
||||
.await?;
|
||||
}
|
||||
|
||||
// We do return the device-session with original frame-counter
|
||||
ds.f_cnt_up = ds_f_cnt_up;
|
||||
|
@ -24,7 +24,10 @@ pub async fn save(df: &internal::DownlinkFrame) -> Result<()> {
|
||||
|
||||
pub async fn get_and_del(id: u32) -> Result<internal::DownlinkFrame, Error> {
|
||||
let key = redis_key(format!("frame:{}", id));
|
||||
let v: Vec<u8> = redis::cmd("GETDEL")
|
||||
let (v, _): (Vec<u8>, u8) = redis::pipe()
|
||||
.cmd("GET")
|
||||
.arg(key.clone())
|
||||
.cmd("DEL")
|
||||
.arg(key)
|
||||
.query_async(&mut get_async_redis_conn().await?)
|
||||
.await?;
|
||||
|
@ -1,34 +1,24 @@
|
||||
use anyhow::Result;
|
||||
use tracing::info;
|
||||
|
||||
use super::{get_async_redis_conn, redis_key};
|
||||
use crate::config;
|
||||
use lrwn::EUI64;
|
||||
use chirpstack_api::internal;
|
||||
|
||||
pub async fn set_pending(dev_eui: &EUI64, cid: lrwn::CID, set: &lrwn::MACCommandSet) -> Result<()> {
|
||||
let conf = config::get();
|
||||
|
||||
let key = redis_key(format!("device:{}:mac:pending:{}", dev_eui, cid.to_u8()));
|
||||
let ttl = conf.network.device_session_ttl.as_millis() as usize;
|
||||
pub fn set_pending(ds: &mut internal::DeviceSession, set: &lrwn::MACCommandSet) -> Result<()> {
|
||||
let cid = set.cid()?;
|
||||
let b = set.to_vec()?;
|
||||
|
||||
() = redis::cmd("PSETEX")
|
||||
.arg(key)
|
||||
.arg(ttl)
|
||||
.arg(b)
|
||||
.query_async(&mut get_async_redis_conn().await?)
|
||||
.await?;
|
||||
|
||||
info!(dev_eui = %dev_eui, cid = %cid, "Pending mac-command block set");
|
||||
ds.mac_command_pending.insert(cid.to_u8().into(), b);
|
||||
info!(cid = %cid, "Pending mac-command block set");
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn get_pending(dev_eui: &EUI64, cid: lrwn::CID) -> Result<Option<lrwn::MACCommandSet>> {
|
||||
let key = redis_key(format!("device:{}:mac:pending:{}", dev_eui, cid.to_u8()));
|
||||
let b: Vec<u8> = redis::cmd("GET")
|
||||
.arg(key)
|
||||
.query_async(&mut get_async_redis_conn().await?)
|
||||
.await?;
|
||||
pub async fn get_pending(
|
||||
ds: &mut internal::DeviceSession,
|
||||
cid: lrwn::CID,
|
||||
) -> Result<Option<lrwn::MACCommandSet>> {
|
||||
let b = ds
|
||||
.mac_command_pending
|
||||
.remove(&cid.to_u8().into())
|
||||
.unwrap_or_default();
|
||||
|
||||
let out = if !b.is_empty() {
|
||||
let mut mac = lrwn::MACCommandSet::from_slice(&b);
|
||||
@ -44,49 +34,3 @@ pub async fn get_pending(dev_eui: &EUI64, cid: lrwn::CID) -> Result<Option<lrwn:
|
||||
|
||||
Ok(out)
|
||||
}
|
||||
|
||||
pub async fn delete_pending(dev_eui: &EUI64, cid: lrwn::CID) -> Result<()> {
|
||||
let key = redis_key(format!("device:{}:mac:pending:{}", dev_eui, cid.to_u8()));
|
||||
|
||||
() = redis::cmd("DEL")
|
||||
.arg(key)
|
||||
.query_async(&mut get_async_redis_conn().await?)
|
||||
.await?;
|
||||
|
||||
info!(dev_eui = %dev_eui, cid = %cid, "Pending mac-command block deleted");
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
pub mod test {
|
||||
use super::*;
|
||||
use crate::test;
|
||||
|
||||
#[tokio::test]
|
||||
async fn test_mac_command() {
|
||||
let _guard = test::prepare().await;
|
||||
|
||||
let dev_eui = EUI64::from_be_bytes([1, 2, 3, 4, 5, 6, 7, 8]);
|
||||
let mac = lrwn::MACCommandSet::new(vec![lrwn::MACCommand::DevStatusReq]);
|
||||
|
||||
// set
|
||||
set_pending(&dev_eui, lrwn::CID::DevStatusReq, &mac)
|
||||
.await
|
||||
.unwrap();
|
||||
|
||||
// get
|
||||
let mac_get = get_pending(&dev_eui, lrwn::CID::DevStatusReq)
|
||||
.await
|
||||
.unwrap();
|
||||
assert_eq!(mac, mac_get.unwrap());
|
||||
|
||||
// delete
|
||||
delete_pending(&dev_eui, lrwn::CID::DevStatusReq)
|
||||
.await
|
||||
.unwrap();
|
||||
let resp = get_pending(&dev_eui, lrwn::CID::DevStatusReq)
|
||||
.await
|
||||
.unwrap();
|
||||
assert!(resp.is_none());
|
||||
}
|
||||
}
|
||||
|
@ -4230,33 +4230,30 @@ async fn test_lorawan_10_adr() {
|
||||
name: "acknowledgement of pending adr request".into(),
|
||||
dev_eui: dev.dev_eui,
|
||||
device_queue_items: vec![],
|
||||
before_func: Some(Box::new(move || {
|
||||
let dev_eui = dev.dev_eui;
|
||||
Box::pin(async move {
|
||||
mac_command::set_pending(
|
||||
&dev_eui,
|
||||
lrwn::CID::LinkADRReq,
|
||||
&lrwn::MACCommandSet::new(vec![lrwn::MACCommand::LinkADRReq(
|
||||
lrwn::LinkADRReqPayload {
|
||||
dr: 0,
|
||||
tx_power: 3,
|
||||
ch_mask: lrwn::ChMask::new([
|
||||
true, true, true, false, false, false, false, false, false,
|
||||
false, false, false, false, false, false, false,
|
||||
]),
|
||||
redundancy: lrwn::Redundancy {
|
||||
ch_mask_cntl: 0,
|
||||
nb_rep: 1,
|
||||
},
|
||||
},
|
||||
)]),
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
})
|
||||
})),
|
||||
before_func: None,
|
||||
after_func: None,
|
||||
device_session: Some(ds.clone()),
|
||||
device_session: Some({
|
||||
let mut ds = ds.clone();
|
||||
mac_command::set_pending(
|
||||
&mut ds,
|
||||
&lrwn::MACCommandSet::new(vec![lrwn::MACCommand::LinkADRReq(
|
||||
lrwn::LinkADRReqPayload {
|
||||
dr: 0,
|
||||
tx_power: 3,
|
||||
ch_mask: lrwn::ChMask::new([
|
||||
true, true, true, false, false, false, false, false, false, false,
|
||||
false, false, false, false, false, false,
|
||||
]),
|
||||
redundancy: lrwn::Redundancy {
|
||||
ch_mask_cntl: 0,
|
||||
nb_rep: 1,
|
||||
},
|
||||
},
|
||||
)]),
|
||||
)
|
||||
.unwrap();
|
||||
ds
|
||||
}),
|
||||
tx_info: tx_info.clone(),
|
||||
rx_info: rx_info.clone(),
|
||||
phy_payload: lrwn::PhyPayload {
|
||||
@ -4298,33 +4295,30 @@ async fn test_lorawan_10_adr() {
|
||||
name: "negative acknowledgement of pending adr request".into(),
|
||||
dev_eui: dev.dev_eui,
|
||||
device_queue_items: vec![],
|
||||
before_func: Some(Box::new(move || {
|
||||
let dev_eui = dev.dev_eui;
|
||||
Box::pin(async move {
|
||||
mac_command::set_pending(
|
||||
&dev_eui,
|
||||
lrwn::CID::LinkADRReq,
|
||||
&lrwn::MACCommandSet::new(vec![lrwn::MACCommand::LinkADRReq(
|
||||
lrwn::LinkADRReqPayload {
|
||||
dr: 0,
|
||||
tx_power: 3,
|
||||
ch_mask: lrwn::ChMask::new([
|
||||
true, true, true, false, false, false, false, false, false,
|
||||
false, false, false, false, false, false, false,
|
||||
]),
|
||||
redundancy: lrwn::Redundancy {
|
||||
ch_mask_cntl: 0,
|
||||
nb_rep: 1,
|
||||
},
|
||||
},
|
||||
)]),
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
})
|
||||
})),
|
||||
before_func: None,
|
||||
after_func: None,
|
||||
device_session: Some(ds.clone()),
|
||||
device_session: Some({
|
||||
let mut ds = ds.clone();
|
||||
mac_command::set_pending(
|
||||
&mut ds,
|
||||
&lrwn::MACCommandSet::new(vec![lrwn::MACCommand::LinkADRReq(
|
||||
lrwn::LinkADRReqPayload {
|
||||
dr: 0,
|
||||
tx_power: 3,
|
||||
ch_mask: lrwn::ChMask::new([
|
||||
true, true, true, false, false, false, false, false, false, false,
|
||||
false, false, false, false, false, false,
|
||||
]),
|
||||
redundancy: lrwn::Redundancy {
|
||||
ch_mask_cntl: 0,
|
||||
nb_rep: 1,
|
||||
},
|
||||
},
|
||||
)]),
|
||||
)
|
||||
.unwrap();
|
||||
ds
|
||||
}),
|
||||
tx_info: tx_info.clone(),
|
||||
rx_info: rx_info.clone(),
|
||||
phy_payload: lrwn::PhyPayload {
|
||||
@ -4540,33 +4534,30 @@ async fn test_lorawan_10_adr() {
|
||||
name: "new channel re-configuration ack-ed".into(),
|
||||
dev_eui: dev.dev_eui,
|
||||
device_queue_items: vec![],
|
||||
before_func: Some(Box::new(move || {
|
||||
let dev_eui = dev.dev_eui;
|
||||
Box::pin(async move {
|
||||
mac_command::set_pending(
|
||||
&dev_eui,
|
||||
lrwn::CID::LinkADRReq,
|
||||
&lrwn::MACCommandSet::new(vec![lrwn::MACCommand::LinkADRReq(
|
||||
lrwn::LinkADRReqPayload {
|
||||
dr: 0,
|
||||
tx_power: 1,
|
||||
ch_mask: lrwn::ChMask::new([
|
||||
true, true, true, false, false, false, false, false, false,
|
||||
false, false, false, false, false, false, false,
|
||||
]),
|
||||
redundancy: lrwn::Redundancy {
|
||||
ch_mask_cntl: 0,
|
||||
nb_rep: 0,
|
||||
},
|
||||
},
|
||||
)]),
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
})
|
||||
})),
|
||||
before_func: None,
|
||||
after_func: None,
|
||||
device_session: Some(ds_7chan.clone()),
|
||||
device_session: Some({
|
||||
let mut ds = ds_7chan.clone();
|
||||
mac_command::set_pending(
|
||||
&mut ds,
|
||||
&lrwn::MACCommandSet::new(vec![lrwn::MACCommand::LinkADRReq(
|
||||
lrwn::LinkADRReqPayload {
|
||||
dr: 0,
|
||||
tx_power: 1,
|
||||
ch_mask: lrwn::ChMask::new([
|
||||
true, true, true, false, false, false, false, false, false, false,
|
||||
false, false, false, false, false, false,
|
||||
]),
|
||||
redundancy: lrwn::Redundancy {
|
||||
ch_mask_cntl: 0,
|
||||
nb_rep: 0,
|
||||
},
|
||||
},
|
||||
)]),
|
||||
)
|
||||
.unwrap();
|
||||
ds
|
||||
}),
|
||||
tx_info: tx_info.clone(),
|
||||
rx_info: rx_info.clone(),
|
||||
phy_payload: lrwn::PhyPayload {
|
||||
@ -4606,33 +4597,30 @@ async fn test_lorawan_10_adr() {
|
||||
name: "new channel re-configuration not ack-ed".into(),
|
||||
dev_eui: dev.dev_eui,
|
||||
device_queue_items: vec![],
|
||||
before_func: Some(Box::new(move || {
|
||||
let dev_eui = dev.dev_eui;
|
||||
Box::pin(async move {
|
||||
mac_command::set_pending(
|
||||
&dev_eui,
|
||||
lrwn::CID::LinkADRReq,
|
||||
&lrwn::MACCommandSet::new(vec![lrwn::MACCommand::LinkADRReq(
|
||||
lrwn::LinkADRReqPayload {
|
||||
dr: 0,
|
||||
tx_power: 1,
|
||||
ch_mask: lrwn::ChMask::new([
|
||||
true, true, true, false, false, false, false, false, false,
|
||||
false, false, false, false, false, false, false,
|
||||
]),
|
||||
redundancy: lrwn::Redundancy {
|
||||
ch_mask_cntl: 0,
|
||||
nb_rep: 0,
|
||||
},
|
||||
},
|
||||
)]),
|
||||
)
|
||||
.await
|
||||
.unwrap();
|
||||
})
|
||||
})),
|
||||
before_func: None,
|
||||
after_func: None,
|
||||
device_session: Some(ds_7chan.clone()),
|
||||
device_session: Some({
|
||||
let mut ds = ds_7chan.clone();
|
||||
mac_command::set_pending(
|
||||
&mut ds,
|
||||
&lrwn::MACCommandSet::new(vec![lrwn::MACCommand::LinkADRReq(
|
||||
lrwn::LinkADRReqPayload {
|
||||
dr: 0,
|
||||
tx_power: 1,
|
||||
ch_mask: lrwn::ChMask::new([
|
||||
true, true, true, false, false, false, false, false, false, false,
|
||||
false, false, false, false, false, false,
|
||||
]),
|
||||
redundancy: lrwn::Redundancy {
|
||||
ch_mask_cntl: 0,
|
||||
nb_rep: 0,
|
||||
},
|
||||
},
|
||||
)]),
|
||||
)
|
||||
.unwrap();
|
||||
ds
|
||||
}),
|
||||
tx_info: tx_info.clone(),
|
||||
rx_info: rx_info.clone(),
|
||||
phy_payload: lrwn::PhyPayload {
|
||||
|
@ -2,7 +2,7 @@ use std::collections::HashMap;
|
||||
use std::str::FromStr;
|
||||
|
||||
use anyhow::{Context, Result};
|
||||
use chrono::{DateTime, Duration, Local, Utc};
|
||||
use chrono::{DateTime, Local, Utc};
|
||||
use tracing::{debug, error, info, span, trace, warn, Instrument, Level};
|
||||
|
||||
use super::error::Error;
|
||||
@ -126,7 +126,6 @@ impl Data {
|
||||
ctx.set_device_info()?;
|
||||
ctx.set_device_gateway_rx_info()?;
|
||||
ctx.handle_retransmission_reset().await?;
|
||||
ctx.set_scheduler_run_after().await?;
|
||||
ctx.decrypt_f_opts_mac_commands()?;
|
||||
ctx.decrypt_frm_payload()?;
|
||||
ctx.log_uplink_frame_set().await?;
|
||||
@ -522,36 +521,6 @@ impl Data {
|
||||
Err(Error::Abort)
|
||||
}
|
||||
|
||||
// For Class-B and Class-C devices, set the scheduler_run_after timestamp to avoid collisions with
|
||||
// the Class-A downlink and Class-B/C scheduler.
|
||||
async fn set_scheduler_run_after(&mut self) -> Result<()> {
|
||||
let dev = self.device.as_mut().unwrap();
|
||||
let conf = config::get();
|
||||
|
||||
if dev.enabled_class == DeviceClass::B || dev.enabled_class == DeviceClass::C {
|
||||
trace!("Setting scheduler_run_after for device");
|
||||
let scheduler_run_after =
|
||||
Utc::now() + Duration::from_std(conf.network.scheduler.class_a_lock_duration)?;
|
||||
|
||||
// Only set the new scheduler_run_after if it is currently None
|
||||
// or when the current value is before the calculated scheduler_run_after.
|
||||
if dev.scheduler_run_after.is_none()
|
||||
|| scheduler_run_after > dev.scheduler_run_after.unwrap()
|
||||
{
|
||||
*dev = device::partial_update(
|
||||
dev.dev_eui,
|
||||
&device::DeviceChangeset {
|
||||
scheduler_run_after: Some(Some(scheduler_run_after)),
|
||||
..Default::default()
|
||||
},
|
||||
)
|
||||
.await?;
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn filter_rx_info_by_tenant(&mut self) -> Result<()> {
|
||||
trace!("Filtering rx_info by tenant_id");
|
||||
|
||||
|
@ -14,14 +14,15 @@ use crate::storage::{
|
||||
};
|
||||
use lrwn::EUI64;
|
||||
|
||||
pub struct MeshHeartbeat {
|
||||
pub struct Mesh {
|
||||
gateway_id: EUI64,
|
||||
relay_id: RelayId,
|
||||
mesh_stats: gw::MeshHeartbeat,
|
||||
time: DateTime<Utc>,
|
||||
mesh_event: gw::MeshEvent,
|
||||
}
|
||||
|
||||
impl MeshHeartbeat {
|
||||
pub async fn handle(s: gw::MeshHeartbeat) {
|
||||
impl Mesh {
|
||||
pub async fn handle(s: gw::MeshEvent) {
|
||||
let gateway_id = match EUI64::from_str(&s.gateway_id) {
|
||||
Ok(v) => v,
|
||||
Err(e) => {
|
||||
@ -38,9 +39,9 @@ impl MeshHeartbeat {
|
||||
}
|
||||
};
|
||||
|
||||
let span = span!(Level::INFO, "mesh_stats", gateway_id = %gateway_id, relay_id = %relay_id);
|
||||
let span = span!(Level::INFO, "mesh", gateway_id = %gateway_id, relay_id = %relay_id);
|
||||
|
||||
if let Err(e) = MeshHeartbeat::_handle(gateway_id, relay_id, s)
|
||||
if let Err(e) = Mesh::_handle(gateway_id, relay_id, s)
|
||||
.instrument(span)
|
||||
.await
|
||||
{
|
||||
@ -48,52 +49,61 @@ impl MeshHeartbeat {
|
||||
Some(Error::NotFound(_)) => {
|
||||
let conf = config::get();
|
||||
if !conf.gateway.allow_unknown_gateways {
|
||||
error!(error = %e.full(), "Handle mesh-stats error");
|
||||
error!(error = %e.full(), "Handle mesh error");
|
||||
}
|
||||
}
|
||||
Some(_) | None => {
|
||||
error!(error = %e.full(), "Handle mesh-stats error");
|
||||
error!(error = %e.full(), "Handle mesh error");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async fn _handle(gateway_id: EUI64, relay_id: RelayId, s: gw::MeshHeartbeat) -> Result<()> {
|
||||
let mut ctx = MeshHeartbeat {
|
||||
async fn _handle(gateway_id: EUI64, relay_id: RelayId, s: gw::MeshEvent) -> Result<()> {
|
||||
let ctx = Mesh {
|
||||
gateway_id,
|
||||
relay_id,
|
||||
mesh_stats: s,
|
||||
time: s
|
||||
.time
|
||||
.ok_or_else(|| anyhow!("Time field is empty"))?
|
||||
.try_into()
|
||||
.map_err(|e| anyhow!("Covert time error: {}", e))?,
|
||||
mesh_event: s,
|
||||
};
|
||||
|
||||
ctx.update_or_create_relay_gateway().await?;
|
||||
ctx.handle_events().await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn update_or_create_relay_gateway(&mut self) -> Result<()> {
|
||||
trace!("Getting Border Gateway");
|
||||
let border_gw = gateway::get(&self.gateway_id).await?;
|
||||
async fn handle_events(&self) -> Result<()> {
|
||||
trace!("Handling mesh events");
|
||||
|
||||
let ts: DateTime<Utc> = match &self.mesh_stats.time {
|
||||
Some(v) => (*v)
|
||||
.try_into()
|
||||
.map_err(|e| anyhow!("Convert time error: {}", e))?,
|
||||
None => {
|
||||
warn!("Stats message does not have time field set");
|
||||
return Ok(());
|
||||
for event in &self.mesh_event.events {
|
||||
match &event.event {
|
||||
Some(gw::mesh_event_item::Event::Proprietary(_)) | None => continue,
|
||||
Some(gw::mesh_event_item::Event::Heartbeat(v)) => self._handle_heartbeat(v).await?,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn _handle_heartbeat(&self, _pl: &gw::MeshEventHeartbeat) -> Result<()> {
|
||||
trace!("Handling heartbeat event");
|
||||
|
||||
let border_gw = gateway::get(&self.gateway_id).await?;
|
||||
|
||||
match gateway::get_relay_gateway(border_gw.tenant_id.into(), self.relay_id).await {
|
||||
Ok(mut v) => {
|
||||
if let Some(last_seen_at) = v.last_seen_at {
|
||||
if last_seen_at > ts {
|
||||
warn!("Time is less than last seen timestamp, ignoring stats");
|
||||
if last_seen_at > self.time {
|
||||
warn!("Time is less than last seen timestamp, ignoring heartbeat");
|
||||
return Ok(());
|
||||
}
|
||||
}
|
||||
|
||||
v.last_seen_at = Some(ts);
|
||||
v.last_seen_at = Some(self.time);
|
||||
v.region_config_id = border_gw
|
||||
.properties
|
||||
.get("region_config_id")
|
||||
@ -106,7 +116,7 @@ impl MeshHeartbeat {
|
||||
tenant_id: border_gw.tenant_id,
|
||||
relay_id: self.relay_id,
|
||||
name: self.relay_id.to_string(),
|
||||
last_seen_at: Some(ts),
|
||||
last_seen_at: Some(self.time),
|
||||
..Default::default()
|
||||
})
|
||||
.await?;
|
||||
|
@ -6,11 +6,11 @@ RUN apt-get update && \
|
||||
libprotobuf-dev
|
||||
|
||||
ENV MUSL_PREFIX=aarch64-linux-musl
|
||||
ENV SQLITE_VERSION=3460000
|
||||
ENV SQLITE_VERSION=3490100
|
||||
|
||||
RUN echo "Building SQLite" && \
|
||||
cd /tmp && \
|
||||
curl -fLO "https://sqlite.org/2024/sqlite-autoconf-$SQLITE_VERSION.tar.gz" && \
|
||||
curl -fLO "https://sqlite.org/2025/sqlite-autoconf-$SQLITE_VERSION.tar.gz" && \
|
||||
tar xvzf "sqlite-autoconf-$SQLITE_VERSION.tar.gz" && cd "sqlite-autoconf-$SQLITE_VERSION" && \
|
||||
env CC=$MUSL_PREFIX-gcc ./configure --host=aarch64-linux --enable-static --prefix=/usr/local/$MUSL_PREFIX-target && \
|
||||
make && make install && \
|
||||
|
@ -6,11 +6,11 @@ RUN apt-get update && \
|
||||
libprotobuf-dev
|
||||
|
||||
ENV MUSL_PREFIX=arm-linux-musleabihf
|
||||
ENV SQLITE_VERSION=3460000
|
||||
ENV SQLITE_VERSION=3490100
|
||||
|
||||
RUN echo "Building SQLite" && \
|
||||
cd /tmp && \
|
||||
curl -fLO "https://sqlite.org/2024/sqlite-autoconf-$SQLITE_VERSION.tar.gz" && \
|
||||
curl -fLO "https://sqlite.org/2025/sqlite-autoconf-$SQLITE_VERSION.tar.gz" && \
|
||||
tar xvzf "sqlite-autoconf-$SQLITE_VERSION.tar.gz" && cd "sqlite-autoconf-$SQLITE_VERSION" && \
|
||||
env CC=$MUSL_PREFIX-gcc ./configure --host=arm-linux --enable-static --prefix=/usr/local/$MUSL_PREFIX-target && \
|
||||
make && make install && \
|
||||
|
@ -6,11 +6,11 @@ RUN apt-get update && \
|
||||
libprotobuf-dev
|
||||
|
||||
ENV MUSL_PREFIX=x86_64-linux-musl
|
||||
ENV SQLITE_VERSION=3460000
|
||||
ENV SQLITE_VERSION=3490100
|
||||
|
||||
RUN echo "Building SQLite" && \
|
||||
cd /tmp && \
|
||||
curl -fLO "https://sqlite.org/2024/sqlite-autoconf-$SQLITE_VERSION.tar.gz" && \
|
||||
curl -fLO "https://sqlite.org/2025/sqlite-autoconf-$SQLITE_VERSION.tar.gz" && \
|
||||
tar xvzf "sqlite-autoconf-$SQLITE_VERSION.tar.gz" && cd "sqlite-autoconf-$SQLITE_VERSION" && \
|
||||
env CC=$MUSL_PREFIX-gcc ./configure --enable-static --prefix=/usr/local/$MUSL_PREFIX-target && \
|
||||
make && make install && \
|
||||
|
@ -3,7 +3,7 @@
|
||||
description = "Library for filtering LoRaWAN payloads on DevAddr and JoinEUIs prefixes"
|
||||
homepage = "https://www.chirpstack.io/"
|
||||
license = "MIT"
|
||||
version = "4.12.0-test.4"
|
||||
version = "4.13.0-test.1"
|
||||
authors = ["Orne Brocaar <info@brocaar.com>"]
|
||||
edition = "2021"
|
||||
repository = "https://github.com/chirpstack/chirpstack"
|
||||
|
@ -3,7 +3,7 @@
|
||||
description = "Library for encoding / decoding LoRaWAN frames."
|
||||
homepage = "https://www.chirpstack.io"
|
||||
license = "MIT"
|
||||
version = "4.12.0-test.4"
|
||||
version = "4.13.0-test.1"
|
||||
authors = ["Orne Brocaar <info@brocaar.com>"]
|
||||
edition = "2018"
|
||||
repository = "https://github.com/chirpstack/chirpstack"
|
||||
|
@ -402,6 +402,15 @@ impl MACCommandSet {
|
||||
MACCommandSet(macs)
|
||||
}
|
||||
|
||||
// This reads the CID from the first mac-command in the set. It is assumed
|
||||
// that all mac-commands in the set share the same CID.
|
||||
pub fn cid(&self) -> Result<CID> {
|
||||
self.0
|
||||
.first()
|
||||
.map(|v| v.cid())
|
||||
.ok_or_else(|| anyhow!("Set is empty"))
|
||||
}
|
||||
|
||||
pub fn size(&self) -> Result<usize> {
|
||||
let b = self.to_vec()?;
|
||||
Ok(b.len())
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "chirpstack-ui",
|
||||
"version": "4.12.0-test.4",
|
||||
"version": "4.13.0-test.1",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
@ -18,12 +18,12 @@
|
||||
"@fortawesome/fontawesome-svg-core": "^6.7.2",
|
||||
"@fortawesome/free-solid-svg-icons": "^6.7.2",
|
||||
"@fortawesome/react-fontawesome": "^0.2.2",
|
||||
"ace-builds": "^1.36.4",
|
||||
"antd": "^5.23.3",
|
||||
"buffer": "^6.0.3",
|
||||
"chart.js": "^4.4.7",
|
||||
"chartjs-adapter-date-fns": "^3.0.0",
|
||||
"chartjs-chart-matrix": "^2.0.1",
|
||||
"codemirror": "^5.65.16",
|
||||
"date-fns": "^3.6.0",
|
||||
"events": "^3.3.0",
|
||||
"google-palette": "^1.1.1",
|
||||
@ -32,8 +32,8 @@
|
||||
"leaflet": "^1.9.4",
|
||||
"leaflet.awesome-markers": "^2.0.5",
|
||||
"react": "^18.3.1",
|
||||
"react-ace": "^13.0.0",
|
||||
"react-chartjs-2": "^5.2.0",
|
||||
"react-codemirror2": "^8.0.0",
|
||||
"react-dom": "^18.3.1",
|
||||
"react-json-tree": "^0.19.0",
|
||||
"react-leaflet": "^4.2.1",
|
||||
@ -43,7 +43,6 @@
|
||||
},
|
||||
"devDependencies": {
|
||||
"@testing-library/jest-dom": "^6.4.6",
|
||||
"@types/codemirror": "^5.60.15",
|
||||
"@types/events": "^3.0.3",
|
||||
"@types/leaflet": "^1.9.12",
|
||||
"@types/leaflet.awesome-markers": "^2.0.28",
|
||||
@ -56,7 +55,7 @@
|
||||
"eslint-plugin-react-hooks": "^4.6.2",
|
||||
"eslint-plugin-react-refresh": "^0.4.7",
|
||||
"prettier": "^3.3.2",
|
||||
"typescript": "^5.2.2",
|
||||
"vite": "^6.2.6"
|
||||
"typescript": "^5.8.3",
|
||||
"vite": "^6.2.7"
|
||||
}
|
||||
}
|
||||
|
@ -1,10 +1,11 @@
|
||||
import { useState, useEffect } from "react";
|
||||
import { Controlled as CodeMirror } from "react-codemirror2";
|
||||
import type { Editor, EditorChange } from "codemirror";
|
||||
|
||||
import { Form } from "antd";
|
||||
import AceEditor from "react-ace";
|
||||
|
||||
import "codemirror/mode/javascript/javascript";
|
||||
import "ace-builds/src-noconflict/mode-javascript";
|
||||
import "ace-builds/src-noconflict/mode-json";
|
||||
import "ace-builds/src-noconflict/theme-github";
|
||||
|
||||
interface IProps {
|
||||
label?: string;
|
||||
@ -12,40 +13,35 @@ interface IProps {
|
||||
required?: boolean;
|
||||
disabled?: boolean;
|
||||
tooltip?: string;
|
||||
mode?: string;
|
||||
}
|
||||
|
||||
function CodeEditor(props: IProps) {
|
||||
const form = Form.useFormInstance();
|
||||
const [value, setValue] = useState<string>("");
|
||||
const [reloadKey, setReloadKey] = useState<number>(1);
|
||||
|
||||
useEffect(() => {
|
||||
setValue(form.getFieldValue(props.name));
|
||||
setReloadKey(k => k + 1);
|
||||
setValue(form.getFieldValue(props.name) || "");
|
||||
}, [form, props]);
|
||||
|
||||
const handleChange = (editor: Editor, data: EditorChange, newCode: string) => {
|
||||
setValue(newCode);
|
||||
const onChange = (newValue: string) => {
|
||||
setValue(newValue);
|
||||
form.setFieldsValue({
|
||||
[props.name]: newCode,
|
||||
[props.name]: newValue,
|
||||
});
|
||||
};
|
||||
|
||||
const codeMirrorOptions = {
|
||||
lineNumbers: true,
|
||||
mode: "javascript",
|
||||
theme: "base16-light",
|
||||
readOnly: props.disabled,
|
||||
};
|
||||
|
||||
return (
|
||||
<Form.Item label={props.label} name={props.name} tooltip={props.tooltip}>
|
||||
<div style={{ border: "1px solid #cccccc" }}>
|
||||
<CodeMirror
|
||||
key={`code-editor-refresh-${reloadKey}`}
|
||||
<AceEditor
|
||||
mode={props.mode || "javascript"}
|
||||
theme="github"
|
||||
onChange={onChange}
|
||||
value={value}
|
||||
options={codeMirrorOptions}
|
||||
onBeforeChange={handleChange}
|
||||
width="100%"
|
||||
height="600px"
|
||||
editorProps={{ $blockScrolling: true }}
|
||||
/>
|
||||
</div>
|
||||
</Form.Item>
|
||||
|
@ -12,8 +12,6 @@ import "antd/dist/reset.css";
|
||||
import "leaflet/dist/leaflet.css";
|
||||
import "leaflet.awesome-markers/dist/leaflet.awesome-markers.css";
|
||||
import "@fortawesome/fontawesome-free/css/all.css";
|
||||
import "codemirror/lib/codemirror.css";
|
||||
import "codemirror/theme/base16-light.css";
|
||||
import "./index.css";
|
||||
|
||||
Chart.register(MatrixController, MatrixElement, ...registerables);
|
||||
|
@ -268,7 +268,7 @@ function DeviceQueue(props: IProps) {
|
||||
</Form.Item>
|
||||
</Tabs.TabPane>
|
||||
<Tabs.TabPane tab="JSON" key="3">
|
||||
<CodeEditor name="json" />
|
||||
<CodeEditor name="json" mode="json" />
|
||||
</Tabs.TabPane>
|
||||
</Tabs>
|
||||
<Button type="primary" htmlType="submit">
|
||||
|
@ -168,7 +168,9 @@ function FuotaDeploymentLayout(props: IProps) {
|
||||
description="Are you sure you want to start the deploymen? Once started, you will not be able to make changes."
|
||||
onConfirm={startFuotaDeployment}
|
||||
>
|
||||
<Button type="primary" disabled={getFuotaDeploymentResponse.getStartedAt() !== undefined}>Start deployment</Button>
|
||||
<Button type="primary" disabled={getFuotaDeploymentResponse.getStartedAt() !== undefined}>
|
||||
Start deployment
|
||||
</Button>
|
||||
</Popconfirm>
|
||||
<DeleteConfirm typ="FUOTA deployment" confirm={d.getName()} onConfirm={deleteFuotaDeployment}>
|
||||
<Button danger type="primary">
|
||||
|
@ -8,6 +8,7 @@ import { DeleteTenantRequest } from "@chirpstack/chirpstack-api-grpc-web/api/ten
|
||||
|
||||
import TenantStore from "../../stores/TenantStore";
|
||||
import DeleteConfirm from "../../components/DeleteConfirm";
|
||||
import SessionStore from "../../stores/SessionStore";
|
||||
import Admin from "../../components/Admin";
|
||||
import EditTenant from "./EditTenant";
|
||||
import TenantDashboard from "./TenantDashboard";
|
||||
@ -23,6 +24,7 @@ function TenantLayout({ tenant }: { tenant: Tenant }) {
|
||||
req.setId(tenant.getId());
|
||||
|
||||
TenantStore.delete(req, () => {
|
||||
SessionStore.setTenantId("");
|
||||
navigate("/tenants");
|
||||
});
|
||||
};
|
||||
|
71
ui/yarn.lock
71
ui/yarn.lock
@ -127,10 +127,10 @@
|
||||
regenerator-runtime "^0.14.0"
|
||||
|
||||
"@chirpstack/chirpstack-api-grpc-web@file:../api/grpc-web":
|
||||
version "4.12.0-test.3"
|
||||
version "4.12.0"
|
||||
dependencies:
|
||||
"@types/google-protobuf" "^3.15.12"
|
||||
google-protobuf "^3.21.2"
|
||||
google-protobuf "^3.21.4"
|
||||
grpc-web "^1.5.0"
|
||||
|
||||
"@ctrl/tinycolor@^3.4.0":
|
||||
@ -667,13 +667,6 @@
|
||||
lodash "^4.17.21"
|
||||
redent "^3.0.0"
|
||||
|
||||
"@types/codemirror@^5.60.15":
|
||||
version "5.60.15"
|
||||
resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-5.60.15.tgz#0f82be6f4126d1e59cf4c4830e56dcd49d3c3e8a"
|
||||
integrity sha512-dTOvwEQ+ouKJ/rE9LT1Ue2hmP6H1mZv5+CCnNWu2qtiOe2LQa9lCprEY20HxiDmV/Bxh+dXjywmy5aKvoGjULA==
|
||||
dependencies:
|
||||
"@types/tern" "*"
|
||||
|
||||
"@types/debug@^4.0.0":
|
||||
version "4.1.12"
|
||||
resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917"
|
||||
@ -764,13 +757,6 @@
|
||||
"@types/prop-types" "*"
|
||||
csstype "^3.0.2"
|
||||
|
||||
"@types/tern@*":
|
||||
version "0.23.9"
|
||||
resolved "https://registry.yarnpkg.com/@types/tern/-/tern-0.23.9.tgz#6f6093a4a9af3e6bb8dde528e024924d196b367c"
|
||||
integrity sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==
|
||||
dependencies:
|
||||
"@types/estree" "*"
|
||||
|
||||
"@types/unist@*", "@types/unist@^3.0.0":
|
||||
version "3.0.3"
|
||||
resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c"
|
||||
@ -884,6 +870,11 @@
|
||||
dependencies:
|
||||
"@swc/core" "^1.11.21"
|
||||
|
||||
ace-builds@^1.36.3, ace-builds@^1.36.4:
|
||||
version "1.40.1"
|
||||
resolved "https://registry.yarnpkg.com/ace-builds/-/ace-builds-1.40.1.tgz#68421283088f0e075f3375cb3d46bb86ad6ddc6e"
|
||||
integrity sha512-32uwJNwmhqpnYtr6oq8RoO1D6F6tnxisv5f9w2XPX3vi4QruuHNikadHUiHvnxLAV1n5Azv4LFtpItQ5dD1eRw==
|
||||
|
||||
acorn-jsx@^5.3.2:
|
||||
version "5.3.2"
|
||||
resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
|
||||
@ -1099,11 +1090,6 @@ classnames@2.x, classnames@^2.2.1, classnames@^2.2.3, classnames@^2.2.5, classna
|
||||
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b"
|
||||
integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==
|
||||
|
||||
codemirror@^5.65.16:
|
||||
version "5.65.19"
|
||||
resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.65.19.tgz#71016c701d6a4b6e1982b0f6e7186be65e49653d"
|
||||
integrity sha512-+aFkvqhaAVr1gferNMuN8vkTSrWIFvzlMV9I2KBLCWS2WpZ2+UAkZjlMZmEuT+gcXTi6RrGQCkWq1/bDtGqhIA==
|
||||
|
||||
color-convert@^2.0.1:
|
||||
version "2.0.1"
|
||||
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
|
||||
@ -1214,6 +1200,11 @@ devlop@^1.0.0, devlop@^1.1.0:
|
||||
dependencies:
|
||||
dequal "^2.0.0"
|
||||
|
||||
diff-match-patch@^1.0.5:
|
||||
version "1.0.5"
|
||||
resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.5.tgz#abb584d5f10cd1196dfc55aa03701592ae3f7b37"
|
||||
integrity sha512-IayShXAgj/QMXgB0IWmKx+rOPuGMhqm5w6jvFxmVenXKIzRqTAAsbBPT3kWQeGANj3jGgvcvv4yK6SxqYmikgw==
|
||||
|
||||
dir-glob@^3.0.1:
|
||||
version "3.0.1"
|
||||
resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
|
||||
@ -1513,7 +1504,7 @@ google-palette@^1.1.1:
|
||||
resolved "https://registry.yarnpkg.com/google-palette/-/google-palette-1.1.1.tgz#671b3b932c8393271b67da908ccd7f2c48e84cc7"
|
||||
integrity sha512-yZiM5oLl8lCZzf06IMOGdDkxqvCMd9HNFcCiOMqWgGGiGzC22vWBVhKJNvykXXbeC0NAElNH97jA/y0bq6TCrA==
|
||||
|
||||
google-protobuf@^3.21.2:
|
||||
google-protobuf@^3.21.4:
|
||||
version "3.21.4"
|
||||
resolved "https://registry.yarnpkg.com/google-protobuf/-/google-protobuf-3.21.4.tgz#2f933e8b6e5e9f8edde66b7be0024b68f77da6c9"
|
||||
integrity sha512-MnG7N936zcKTco4Jd2PX2U96Kf9PxygAPKBug+74LHzmHXmceN16MmRcdgZv+DGef/S9YvQAfRsNCn4cjf9yyQ==
|
||||
@ -1755,6 +1746,16 @@ lodash-es@^4.17.21:
|
||||
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
|
||||
integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
|
||||
|
||||
lodash.get@^4.4.2:
|
||||
version "4.4.2"
|
||||
resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99"
|
||||
integrity sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==
|
||||
|
||||
lodash.isequal@^4.5.0:
|
||||
version "4.5.0"
|
||||
resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
|
||||
integrity sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==
|
||||
|
||||
lodash.merge@^4.6.2:
|
||||
version "4.6.2"
|
||||
resolved "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
|
||||
@ -2610,6 +2611,17 @@ rc-virtual-list@^3.14.2, rc-virtual-list@^3.5.1, rc-virtual-list@^3.5.2:
|
||||
rc-resize-observer "^1.0.0"
|
||||
rc-util "^5.36.0"
|
||||
|
||||
react-ace@^13.0.0:
|
||||
version "13.0.0"
|
||||
resolved "https://registry.yarnpkg.com/react-ace/-/react-ace-13.0.0.tgz#e69c2aa4ccf1a81c758adba9ba2b4b3e3d929a69"
|
||||
integrity sha512-PPk2O/ArHzDtbnK82QImfHYXwuiitRgHJf5AxwMQh9zciojbWsPmKJm1tMgWOYLCtGEz8/Dh3MxRxrXe7QcstQ==
|
||||
dependencies:
|
||||
ace-builds "^1.36.3"
|
||||
diff-match-patch "^1.0.5"
|
||||
lodash.get "^4.4.2"
|
||||
lodash.isequal "^4.5.0"
|
||||
prop-types "^15.8.1"
|
||||
|
||||
react-base16-styling@^0.10.0:
|
||||
version "0.10.0"
|
||||
resolved "https://registry.yarnpkg.com/react-base16-styling/-/react-base16-styling-0.10.0.tgz#5d5f019bd4dc5870c3e92fd9d5410533a0bbb0c6"
|
||||
@ -2625,11 +2637,6 @@ react-chartjs-2@^5.2.0:
|
||||
resolved "https://registry.yarnpkg.com/react-chartjs-2/-/react-chartjs-2-5.3.0.tgz#2d3286339a742bc7f77b5829c33ebab215f714cc"
|
||||
integrity sha512-UfZZFnDsERI3c3CZGxzvNJd02SHjaSJ8kgW1djn65H1KK8rehwTjyrRKOG3VTMG8wtHZ5rgAO5oTHtHi9GCCmw==
|
||||
|
||||
react-codemirror2@^8.0.0:
|
||||
version "8.0.1"
|
||||
resolved "https://registry.yarnpkg.com/react-codemirror2/-/react-codemirror2-8.0.1.tgz#a229c9dda2a6ee9ea18bdb8a4c33a1b2df823613"
|
||||
integrity sha512-ZALowE5sGK1t66i0Fm1hoJLWT/iZHNjaAmcjwgYl9gyl2v1sqWwxzWHLmgq6K9KCk7p5+I+U3jMF1vsLaIkrmA==
|
||||
|
||||
react-dom@^18.3.1:
|
||||
version "18.3.1"
|
||||
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.3.1.tgz#c2265d79511b57d479b3dd3fdfa51536494c5cb4"
|
||||
@ -2967,7 +2974,7 @@ type-fest@^0.20.2:
|
||||
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
|
||||
integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
|
||||
|
||||
typescript@^5.2.2:
|
||||
typescript@^5.8.3:
|
||||
version "5.8.3"
|
||||
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.8.3.tgz#92f8a3e5e3cf497356f4178c34cd65a7f5e8440e"
|
||||
integrity sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==
|
||||
@ -3051,10 +3058,10 @@ vfile@^6.0.0:
|
||||
"@types/unist" "^3.0.0"
|
||||
vfile-message "^4.0.0"
|
||||
|
||||
vite@^6.2.6:
|
||||
version "6.2.6"
|
||||
resolved "https://registry.yarnpkg.com/vite/-/vite-6.2.6.tgz#7f0ccf2fdc0c1eda079ce258508728e2473d3f61"
|
||||
integrity sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==
|
||||
vite@^6.2.7:
|
||||
version "6.2.7"
|
||||
resolved "https://registry.yarnpkg.com/vite/-/vite-6.2.7.tgz#699fb6e4b3e65d749480e0087cdbe3f3f0de00fa"
|
||||
integrity sha512-qg3LkeuinTrZoJHHF94coSaTfIPyBYoywp+ys4qu20oSJFbKMYoIJo0FWJT9q6Vp49l6z9IsJRbHdcGtiKbGoQ==
|
||||
dependencies:
|
||||
esbuild "^0.25.0"
|
||||
postcss "^8.5.3"
|
||||
|
Reference in New Issue
Block a user