Created DefaultConfig to be used when embedding echovaule. Moved ACL and PubSub to internal packages with only the associated commands in the modules folder. Initialise ACL and PubSub when creating new EchoVault instance which removed the need to pass WithACL and WithPubSub options.

This commit is contained in:
Kelvin Mwinuka
2024-03-26 18:15:27 +08:00
parent fbc866f844
commit 88a8e2aae6
28 changed files with 640 additions and 888 deletions

View File

@@ -17,11 +17,9 @@ package main
import ( import (
"context" "context"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/pkg/commands" "github.com/echovault/echovault/pkg/commands"
"github.com/echovault/echovault/pkg/config"
"github.com/echovault/echovault/pkg/echovault" "github.com/echovault/echovault/pkg/echovault"
"github.com/echovault/echovault/pkg/modules/acl"
"github.com/echovault/echovault/pkg/modules/pubsub"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/pkg/utils"
"log" "log"
"os" "os"
@@ -30,7 +28,7 @@ import (
) )
func main() { func main() {
conf, err := config.Config() conf, err := config.GetConfig()
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
@@ -53,8 +51,6 @@ func main() {
echovault.WithContext(ctx), echovault.WithContext(ctx),
echovault.WithConfig(conf), echovault.WithConfig(conf),
echovault.WithCommands(commands.All()), echovault.WithCommands(commands.All()),
echovault.WithACL(acl.NewACL(conf)),
echovault.WithPubSub(pubsub.NewPubSub()),
) )
go server.Start(ctx) go server.Start(ctx)

View File

@@ -1,514 +1,4 @@
mode: set mode: set
github.com/echovault/echovault/pkg/modules/acl/acl.go:51.42,56.24 3 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:56.24,64.3 2 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:67.2,67.28 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:67.28,69.54 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:69.54,70.14 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:71.9,72.17 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:72.17,73.37 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:73.37,75.6 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:78.4,80.22 2 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:80.22,81.61 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:81.61,83.6 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:86.4,86.39 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:86.39,87.61 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:87.61,89.6 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:95.2,96.29 2 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:96.29,97.33 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:97.33,99.9 2 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:102.2,102.20 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:102.20,104.3 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:107.2,107.29 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:107.29,109.3 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:111.2,121.13 3 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:124.52,129.70 3 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:129.70,131.3 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:132.2,136.3 2 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:139.45,145.33 3 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:145.33,146.30 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:146.30,147.47 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:147.47,149.5 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:149.10,152.5 2 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:156.2,157.45 2 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:157.45,159.3 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:161.2,168.12 4 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:171.73,176.37 4 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:176.37,177.28 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:177.28,179.12 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:182.3,182.31 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:182.31,183.30 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:183.30,185.5 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:188.3,188.32 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:188.32,189.12 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:192.3,192.52 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:192.52,193.49 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:193.49,195.5 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:198.3,198.63 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:198.63,200.4 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:202.2,202.12 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:205.95,214.19 6 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:214.19,222.60 3 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:222.60,224.4 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:225.3,225.24 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:228.2,228.19 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:228.19,237.31 4 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:237.31,238.28 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:238.28,241.10 3 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:244.3,244.17 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:244.17,246.4 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:250.2,250.19 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:250.19,252.3 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:255.2,255.21 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:255.21,261.3 2 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:263.2,263.46 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:263.46,264.38 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:264.38,267.18 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:267.18,274.5 2 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:278.2,278.50 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:281.125,290.16 6 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:290.16,292.3 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:294.2,294.56 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:294.56,298.17 4 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:298.17,300.4 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:304.2,304.36 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:304.36,306.3 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:309.2,309.43 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:309.43,311.3 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:314.2,314.37 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:314.37,316.3 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:319.2,322.29 2 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:322.29,324.3 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:327.2,327.57 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:327.57,329.3 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:332.2,333.65 2 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:333.65,334.101 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:334.101,335.63 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:335.63,337.5 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:338.4,339.16 2 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:341.5,342.27 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:342.27,344.4 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:345.3,345.88 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:349.2,349.64 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:349.64,350.101 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:350.101,351.63 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:351.63,354.5 2 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:355.4,355.16 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:357.5,359.3 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:362.2,362.94 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:362.94,364.3 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:364.5,366.3 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:369.2,369.93 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:369.93,371.3 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:371.5,373.3 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:376.2,376.55 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:376.55,380.105 2 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:380.105,382.4 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:382.6,384.4 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:386.3,386.104 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:386.104,388.4 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:388.6,390.4 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:391.3,391.13 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:394.2,394.19 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:394.19,396.29 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:396.29,398.4 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:401.3,401.54 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:401.54,402.56 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:402.56,403.96 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:403.96,404.50 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:404.50,406.7 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:407.6,408.18 2 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:410.7,412.5 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:416.3,416.55 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:416.55,417.56 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:417.56,418.98 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:418.98,419.51 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:419.51,421.7 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:422.6,423.18 2 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:425.7,427.5 1 0
github.com/echovault/echovault/pkg/modules/acl/acl.go:431.2,431.12 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:434.32,438.33 3 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:438.33,443.31 5 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:443.31,444.37 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:444.37,446.5 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:448.3,448.25 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:451.2,451.29 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:451.29,452.33 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:452.33,454.4 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:458.29,460.2 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:462.31,464.2 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:466.30,468.2 1 1
github.com/echovault/echovault/pkg/modules/acl/acl.go:470.32,472.2 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:32.108,33.34 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:33.34,35.3 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:36.2,37.9 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:37.9,39.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:40.2,40.67 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:40.67,42.3 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:43.2,43.38 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:46.106,47.19 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:47.19,49.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:51.2,52.9 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:52.9,54.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:56.2,58.30 3 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:58.30,59.27 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:59.27,62.9 3 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:66.2,66.16 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:66.16,68.3 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:71.2,75.18 3 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:75.18,77.3 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:77.8,79.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:80.2,80.21 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:80.21,82.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:83.2,83.17 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:83.17,85.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:87.2,88.29 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:88.29,90.3 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:93.2,94.51 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:94.51,95.22 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:95.22,97.12 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:99.3,99.49 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:101.2,101.51 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:101.51,102.22 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:102.22,104.12 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:106.3,106.49 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:110.2,111.48 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:111.48,112.21 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:112.21,114.12 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:116.3,116.47 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:118.2,118.48 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:118.48,119.21 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:119.21,121.12 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:123.3,123.47 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:127.2,128.79 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:128.79,129.37 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:129.37,131.4 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:133.2,134.30 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:134.30,135.10 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:136.100,138.53 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:139.53,141.52 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:142.52,144.52 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:149.2,151.54 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:151.54,153.3 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:154.2,154.54 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:154.54,156.3 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:158.2,160.25 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:163.102,164.18 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:164.18,166.3 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:168.2,172.35 3 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:172.35,173.36 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:173.36,174.48 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:174.48,176.5 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:177.4,177.12 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:179.3,179.50 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:179.50,180.51 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:180.51,183.5 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:187.2,187.19 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:187.19,190.34 3 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:190.34,193.4 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:194.3,195.28 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:195.28,197.24 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:197.24,199.5 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:201.3,201.26 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:204.2,204.19 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:204.19,206.46 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:206.46,207.43 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:207.43,209.38 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:209.38,211.30 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:211.30,213.7 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:215.5,215.28 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:220.2,220.74 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:223.102,225.9 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:225.9,227.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:228.2,229.33 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:229.33,231.3 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:232.2,233.25 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:236.106,238.9 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:238.9,240.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:241.2,241.45 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:241.45,243.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:244.2,244.38 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:247.108,248.18 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:248.18,250.3 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:251.2,252.9 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:252.9,254.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:255.2,255.53 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:255.53,257.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:258.2,258.38 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:261.106,263.9 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:263.9,265.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:266.2,267.74 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:270.103,271.18 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:271.18,273.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:274.2,275.9 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:275.9,277.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:278.2,280.33 3 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:280.33,283.19 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:283.19,285.4 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:285.9,287.4 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:289.3,289.22 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:289.22,291.4 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:293.3,293.18 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:293.18,295.4 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:297.3,297.43 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:297.43,298.61 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:298.61,300.5 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:301.4,301.58 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:301.58,303.5 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:306.3,306.52 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:306.52,307.23 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:307.23,309.13 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:311.4,311.39 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:314.3,314.52 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:314.52,315.23 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:315.23,317.13 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:319.4,319.39 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:322.3,322.49 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:322.49,323.22 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:323.22,325.13 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:327.4,327.37 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:330.3,330.49 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:330.49,331.22 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:331.22,333.13 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:335.4,335.37 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:338.3,338.45 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:338.45,339.52 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:339.52,341.13 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:343.4,343.41 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:346.3,346.45 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:346.45,347.52 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:347.52,349.5 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:352.3,352.55 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:352.55,354.4 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:356.3,356.55 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:356.55,358.4 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:359.3,359.54 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:362.2,363.25 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:366.103,367.19 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:367.19,369.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:371.2,372.9 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:372.9,374.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:376.2,380.16 4 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:380.16,382.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:384.2,384.15 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:384.15,385.35 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:385.35,387.4 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:390.2,394.20 3 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:394.20,395.59 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:395.59,397.4 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:400.2,400.37 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:400.37,401.59 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:401.59,403.4 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:407.2,407.29 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:407.29,411.31 3 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:411.31,412.35 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:412.35,415.43 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:415.43,417.6 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:417.11,420.6 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:421.5,421.10 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:425.3,425.17 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:425.17,427.4 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:430.2,430.38 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:433.103,434.18 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:434.18,436.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:438.2,439.9 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:439.9,441.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:443.2,447.16 4 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:447.16,449.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:451.2,451.15 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:451.15,452.35 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:452.35,454.4 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:457.2,459.20 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:459.20,462.17 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:462.17,464.4 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:465.3,466.17 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:466.17,468.4 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:471.2,471.37 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:471.37,474.17 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:474.17,476.4 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:477.3,478.17 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:478.17,480.4 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:483.2,484.16 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:484.16,486.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:488.2,488.38 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:491.33,498.60 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:498.60,500.5 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:508.60,510.5 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:518.62,520.7 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:528.62,530.7 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:538.62,540.7 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:548.62,550.7 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:558.62,560.7 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:568.62,570.7 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:578.62,580.7 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:591.62,593.7 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:601.62,603.7 1 0
github.com/echovault/echovault/pkg/modules/acl/user.go:53.31,55.39 2 1
github.com/echovault/echovault/pkg/modules/acl/user.go:55.39,57.3 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:58.2,59.51 2 1
github.com/echovault/echovault/pkg/modules/acl/user.go:59.51,61.3 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:63.2,64.37 2 1
github.com/echovault/echovault/pkg/modules/acl/user.go:64.37,66.3 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:67.2,68.49 2 1
github.com/echovault/echovault/pkg/modules/acl/user.go:68.49,70.3 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:72.2,73.53 2 1
github.com/echovault/echovault/pkg/modules/acl/user.go:73.53,75.3 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:76.2,77.54 2 1
github.com/echovault/echovault/pkg/modules/acl/user.go:77.54,79.3 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:81.2,82.43 2 1
github.com/echovault/echovault/pkg/modules/acl/user.go:82.43,84.3 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:85.2,86.55 2 1
github.com/echovault/echovault/pkg/modules/acl/user.go:86.55,88.3 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:91.79,93.32 2 1
github.com/echovault/echovault/pkg/modules/acl/user.go:93.32,94.24 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:94.24,96.12 2 0
github.com/echovault/echovault/pkg/modules/acl/user.go:98.3,98.25 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:100.2,100.33 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:100.33,101.17 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:101.17,104.4 2 1
github.com/echovault/echovault/pkg/modules/acl/user.go:105.3,105.25 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:107.2,107.8 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:110.50,111.26 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:111.26,113.35 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:113.35,115.4 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:116.3,116.36 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:116.36,118.4 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:120.3,120.37 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:120.37,126.12 3 1
github.com/echovault/echovault/pkg/modules/acl/user.go:128.3,128.20 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:128.20,129.84 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:129.84,130.65 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:130.65,132.6 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:133.5,133.45 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:135.4,135.12 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:137.3,137.20 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:137.20,138.84 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:138.84,139.68 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:139.68,141.6 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:142.5,142.45 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:144.4,144.12 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:147.3,147.43 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:147.43,150.12 3 1
github.com/echovault/echovault/pkg/modules/acl/user.go:152.3,152.46 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:152.46,154.12 2 1
github.com/echovault/echovault/pkg/modules/acl/user.go:156.3,156.36 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:156.36,157.21 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:157.21,159.13 2 1
github.com/echovault/echovault/pkg/modules/acl/user.go:161.4,161.21 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:161.21,163.13 2 1
github.com/echovault/echovault/pkg/modules/acl/user.go:167.3,167.40 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:167.40,171.12 4 0
github.com/echovault/echovault/pkg/modules/acl/user.go:173.3,173.93 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:173.93,178.12 5 1
github.com/echovault/echovault/pkg/modules/acl/user.go:180.3,180.57 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:180.57,183.12 3 1
github.com/echovault/echovault/pkg/modules/acl/user.go:185.3,185.57 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:185.57,188.12 3 1
github.com/echovault/echovault/pkg/modules/acl/user.go:191.3,191.44 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:191.44,193.4 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:194.3,194.36 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:194.36,195.21 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:195.21,197.13 2 1
github.com/echovault/echovault/pkg/modules/acl/user.go:199.4,199.21 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:199.21,201.13 2 1
github.com/echovault/echovault/pkg/modules/acl/user.go:205.3,205.44 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:205.44,208.12 3 1
github.com/echovault/echovault/pkg/modules/acl/user.go:210.3,210.66 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:210.66,211.21 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:211.21,213.13 2 1
github.com/echovault/echovault/pkg/modules/acl/user.go:215.4,215.21 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:215.21,217.13 2 1
github.com/echovault/echovault/pkg/modules/acl/user.go:223.2,223.26 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:223.26,224.39 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:224.39,227.4 2 1
github.com/echovault/echovault/pkg/modules/acl/user.go:230.2,230.26 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:230.26,232.42 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:232.42,235.4 2 0
github.com/echovault/echovault/pkg/modules/acl/user.go:237.3,237.43 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:237.43,242.4 4 1
github.com/echovault/echovault/pkg/modules/acl/user.go:244.3,244.42 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:244.42,248.4 3 1
github.com/echovault/echovault/pkg/modules/acl/user.go:250.3,250.46 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:250.46,253.4 2 1
github.com/echovault/echovault/pkg/modules/acl/user.go:255.2,255.12 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:258.36,272.2 13 0
github.com/echovault/echovault/pkg/modules/acl/user.go:274.38,287.2 12 0
github.com/echovault/echovault/pkg/modules/acl/user.go:289.40,304.2 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:306.46,307.24 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:307.24,309.3 1 1
github.com/echovault/echovault/pkg/modules/acl/user.go:310.2,310.26 1 1
github.com/echovault/echovault/pkg/modules/connection/commands.go:25.108,26.18 1 1
github.com/echovault/echovault/pkg/modules/connection/commands.go:27.10,28.50 1 1
github.com/echovault/echovault/pkg/modules/connection/commands.go:29.9,30.34 1 1
github.com/echovault/echovault/pkg/modules/connection/commands.go:31.9,32.72 1 1
github.com/echovault/echovault/pkg/modules/connection/commands.go:36.33,43.60 1 0
github.com/echovault/echovault/pkg/modules/connection/commands.go:43.60,45.5 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:28.115,34.29 4 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:34.29,35.54 1 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:35.54,41.42 4 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:41.42,43.5 1 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:45.4,48.12 3 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:51.3,51.36 1 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:51.36,58.43 5 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:58.43,60.5 1 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:62.4,64.21 2 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:68.2,70.25 2 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:73.109,77.35 3 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:77.35,78.65 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:78.65,79.41 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:79.41,81.5 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:82.4,82.12 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:84.3,84.13 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:87.2,87.51 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:90.112,91.18 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:92.9,97.36 4 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:97.36,98.66 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:98.66,99.52 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:99.52,103.6 3 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:104.5,104.13 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:106.4,107.14 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:109.3,110.26 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:112.9,116.45 3 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:116.45,118.4 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:119.3,119.42 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:119.42,123.37 3 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:123.37,124.67 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:124.67,125.53 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:125.53,126.59 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:126.59,130.8 3 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:132.6,132.14 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:134.5,134.54 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:134.54,137.6 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:139.9,139.50 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:139.50,143.37 3 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:143.37,144.67 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:144.67,145.53 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:145.53,147.24 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:147.24,150.8 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:152.6,152.14 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:154.5,154.33 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:154.33,157.6 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:159.9,161.4 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:162.3,163.26 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:164.10,165.50 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:169.112,171.2 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:173.33,180.60 1 1
github.com/echovault/echovault/pkg/modules/admin/commands.go:180.60,180.86 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:188.60,190.5 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:197.62,197.88 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:205.62,205.88 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:214.62,214.88 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:224.60,226.5 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:227.113,228.49 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:228.49,230.6 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:231.5,231.41 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:239.60,241.5 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:242.113,244.18 2 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:244.18,246.6 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:247.5,247.53 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:255.60,257.5 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:258.113,259.47 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:259.47,261.6 1 0
github.com/echovault/echovault/pkg/modules/admin/commands.go:262.5,262.41 1 0
github.com/echovault/echovault/pkg/modules/hash/commands.go:30.105,32.16 2 1 github.com/echovault/echovault/pkg/modules/hash/commands.go:30.105,32.16 2 1
github.com/echovault/echovault/pkg/modules/hash/commands.go:32.16,34.3 1 1 github.com/echovault/echovault/pkg/modules/hash/commands.go:32.16,34.3 1 1
github.com/echovault/echovault/pkg/modules/hash/commands.go:36.2,39.25 3 1 github.com/echovault/echovault/pkg/modules/hash/commands.go:36.2,39.25 3 1
@@ -632,8 +122,8 @@ github.com/echovault/echovault/pkg/modules/hash/commands.go:327.17,328.41 1 1
github.com/echovault/echovault/pkg/modules/hash/commands.go:328.41,330.13 2 1 github.com/echovault/echovault/pkg/modules/hash/commands.go:328.41,330.13 2 1
github.com/echovault/echovault/pkg/modules/hash/commands.go:332.4,332.42 1 1 github.com/echovault/echovault/pkg/modules/hash/commands.go:332.4,332.42 1 1
github.com/echovault/echovault/pkg/modules/hash/commands.go:332.42,335.13 3 1 github.com/echovault/echovault/pkg/modules/hash/commands.go:332.42,335.13 3 1
github.com/echovault/echovault/pkg/modules/hash/commands.go:337.4,337.38 1 0 github.com/echovault/echovault/pkg/modules/hash/commands.go:337.4,337.38 1 1
github.com/echovault/echovault/pkg/modules/hash/commands.go:337.38,339.13 2 0 github.com/echovault/echovault/pkg/modules/hash/commands.go:337.38,339.13 2 1
github.com/echovault/echovault/pkg/modules/hash/commands.go:344.2,344.25 1 1 github.com/echovault/echovault/pkg/modules/hash/commands.go:344.2,344.25 1 1
github.com/echovault/echovault/pkg/modules/hash/commands.go:347.108,349.16 2 1 github.com/echovault/echovault/pkg/modules/hash/commands.go:347.108,349.16 2 1
github.com/echovault/echovault/pkg/modules/hash/commands.go:349.16,351.3 1 1 github.com/echovault/echovault/pkg/modules/hash/commands.go:349.16,351.3 1 1
@@ -1246,149 +736,326 @@ github.com/echovault/echovault/pkg/modules/list/key_funcs.go:82.2,82.30 1 1
github.com/echovault/echovault/pkg/modules/list/key_funcs.go:85.51,86.19 1 1 github.com/echovault/echovault/pkg/modules/list/key_funcs.go:85.51,86.19 1 1
github.com/echovault/echovault/pkg/modules/list/key_funcs.go:86.19,88.3 1 1 github.com/echovault/echovault/pkg/modules/list/key_funcs.go:86.19,88.3 1 1
github.com/echovault/echovault/pkg/modules/list/key_funcs.go:89.2,89.38 1 1 github.com/echovault/echovault/pkg/modules/list/key_funcs.go:89.2,89.38 1 1
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:36.51,37.32 1 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:28.115,34.29 4 1
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:37.32,39.3 1 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:34.29,35.54 1 1
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:42.57,43.32 1 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:35.54,41.42 4 1
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:43.32,46.3 2 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:41.42,43.5 1 1
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:49.61,60.33 3 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:45.4,48.12 3 1
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:60.33,62.3 1 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:51.3,51.36 1 1
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:64.2,64.16 1 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:51.36,58.43 5 1
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:67.28,68.12 1 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:58.43,60.5 1 1
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:68.12,69.7 1 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:62.4,64.21 2 1
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:69.7,74.40 3 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:68.2,70.25 2 1
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:74.40,75.30 1 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:73.109,77.35 3 0
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:75.30,80.21 1 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:77.35,78.65 1 0
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:80.21,82.7 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:78.65,79.41 1 0
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:86.4,86.33 1 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:79.41,81.5 1 0
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:91.51,94.40 3 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:82.4,82.12 1 0
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:94.40,96.3 1 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:84.3,84.13 1 0
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:97.2,98.11 2 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:87.2,87.51 1 0
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:101.53,104.40 3 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:90.112,91.18 1 0
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:104.40,106.3 1 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:92.9,97.36 4 0
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:107.2,108.13 2 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:97.36,98.66 1 0
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:111.44,113.2 1 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:98.66,99.52 1 0
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:115.36,119.2 3 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:99.52,103.6 3 0
github.com/echovault/echovault/pkg/modules/pubsub/channel.go:121.34,125.2 3 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:104.5,104.13 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:26.113,28.9 2 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:106.4,107.14 2 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:28.9,30.3 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:109.3,110.26 2 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:32.2,34.24 2 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:112.9,116.45 3 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:34.24,36.3 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:116.45,118.4 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:38.2,41.17 3 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:119.3,119.42 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:44.115,46.9 2 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:119.42,123.37 3 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:46.9,48.3 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:123.37,124.67 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:50.2,54.66 3 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:124.67,125.53 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:57.108,59.9 2 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:125.53,126.59 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:59.9,61.3 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:126.59,130.8 3 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:62.2,62.19 1 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:132.6,132.14 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:62.19,64.3 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:134.5,134.54 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:65.2,66.38 2 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:134.54,137.6 2 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:69.113,70.18 1 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:139.9,139.50 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:70.18,72.3 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:139.50,143.37 3 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:74.2,75.9 2 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:143.37,144.67 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:75.9,77.3 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:144.67,145.53 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:79.2,80.19 2 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:145.53,147.24 2 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:80.19,82.3 1 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:147.24,150.8 2 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:84.2,84.38 1 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:152.6,152.14 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:87.109,89.9 2 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:154.5,154.33 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:89.9,91.3 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:154.33,157.6 2 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:92.2,93.49 2 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:159.9,161.4 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:96.112,98.9 2 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:162.3,163.26 2 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:98.9,100.3 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:164.10,165.50 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:101.2,101.36 1 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:169.112,171.2 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:104.33,111.60 1 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:173.33,180.60 1 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:111.60,113.21 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:180.60,180.86 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:113.21,115.6 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:188.60,190.5 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:116.5,116.24 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:197.62,197.88 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:125.60,127.21 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:205.62,205.88 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:127.21,129.6 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:214.62,214.88 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:130.5,130.24 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:224.60,226.5 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:139.60,141.22 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:227.113,228.49 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:141.22,143.6 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:228.49,230.6 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:144.5,144.33 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:231.5,231.41 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:155.60,158.5 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:239.60,241.5 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:168.60,171.5 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:242.113,244.18 2 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:179.60,179.86 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:244.18,246.6 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:180.101,182.5 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:247.5,247.53 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:191.62,191.88 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:255.60,257.5 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:199.62,199.88 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:258.113,259.47 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:208.62,208.85 1 0 github.com/echovault/echovault/pkg/modules/admin/commands.go:259.47,261.6 1 0
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:34.26,39.2 1 1 github.com/echovault/echovault/pkg/modules/admin/commands.go:262.5,262.41 1 0
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:41.101,48.17 5 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:33.108,34.34 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:48.17,50.3 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:34.34,36.3 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:52.2,52.37 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:37.2,38.9 2 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:52.37,56.75 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:38.9,40.3 1 0
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:56.75,58.4 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:41.2,41.67 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:60.3,60.23 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:41.67,43.3 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:60.23,63.19 2 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:44.2,44.38 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:63.19,65.5 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:47.106,48.19 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:65.10,67.5 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:48.19,50.3 1 0
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:68.4,69.31 2 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:52.2,53.9 2 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:69.31,74.20 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:53.9,55.3 1 0
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:74.20,76.6 1 0 github.com/echovault/echovault/pkg/modules/acl/commands.go:57.2,59.30 3 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:78.4,78.46 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:59.30,60.27 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:79.9,81.47 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:60.27,63.9 3 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:81.47,86.20 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:67.2,67.16 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:86.20,88.6 1 0 github.com/echovault/echovault/pkg/modules/acl/commands.go:67.16,69.3 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:94.112,99.17 4 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:72.2,76.18 3 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:99.17,101.3 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:76.18,78.3 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:103.2,106.24 3 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:78.8,80.3 1 0
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:106.24,107.19 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:81.2,81.21 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:107.19,110.40 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:81.21,83.3 1 0
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:110.40,111.31 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:84.2,84.17 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:111.31,112.14 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:84.17,86.3 1 0
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:114.5,114.34 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:88.2,89.29 2 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:114.34,117.6 2 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:89.29,91.3 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:119.9,122.40 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:94.2,95.51 2 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:122.40,123.31 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:95.51,96.22 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:123.31,124.14 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:96.22,98.12 2 0
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:126.5,126.34 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:100.3,100.49 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:126.34,129.6 2 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:102.2,102.51 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:137.2,137.38 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:102.51,103.22 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:137.38,138.30 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:103.22,105.12 2 0
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:138.30,139.54 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:107.3,107.49 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:139.54,142.5 2 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:111.2,112.48 2 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:148.2,148.17 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:112.48,113.21 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:148.17,149.36 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:113.21,115.12 2 0
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:149.36,151.40 2 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:117.3,117.47 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:151.40,153.58 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:119.2,119.48 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:153.58,154.35 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:119.48,120.21 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:154.35,157.7 2 0 github.com/echovault/echovault/pkg/modules/acl/commands.go:120.21,122.12 2 0
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:158.6,158.14 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:124.3,124.47 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:161.5,161.30 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:128.2,129.79 2 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:161.30,162.35 1 0 github.com/echovault/echovault/pkg/modules/acl/commands.go:129.79,130.37 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:162.35,165.7 2 0 github.com/echovault/echovault/pkg/modules/acl/commands.go:130.37,132.4 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:171.2,172.39 2 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:134.2,135.30 2 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:172.39,174.3 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:135.30,136.10 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:176.2,176.20 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:137.100,139.53 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:179.84,183.38 3 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:140.53,142.52 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:183.38,185.29 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:143.52,145.52 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:185.29,186.35 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:150.2,152.54 2 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:186.35,188.5 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:152.54,154.3 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:189.4,189.12 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:155.2,155.54 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:192.3,192.41 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:155.54,157.3 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:192.41,194.4 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:159.2,161.25 2 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:198.51,205.19 5 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:164.102,165.18 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:205.19,206.39 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:165.18,167.3 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:206.39,207.26 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:169.2,173.35 3 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:207.26,210.5 2 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:173.35,174.36 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:212.3,213.21 2 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:174.36,175.48 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:216.2,218.38 2 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:175.48,177.5 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:218.38,220.78 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:178.4,178.12 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:220.78,223.12 3 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:180.3,180.50 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:226.3,226.50 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:180.50,181.51 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:226.50,229.4 2 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:181.51,184.5 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:232.2,232.53 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:188.2,188.19 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:235.32,240.38 4 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:188.19,191.34 3 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:240.38,241.51 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:191.34,194.4 2 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:241.51,243.4 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:195.3,196.28 2 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:245.2,245.14 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:196.28,198.24 2 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:248.52,253.35 4 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:198.24,200.5 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:253.35,255.66 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:202.3,202.26 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:255.66,257.4 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:205.2,205.19 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:258.3,258.20 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:205.19,207.46 2 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:258.20,260.12 2 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:207.46,208.43 1 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:262.3,262.106 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:208.43,210.38 2 1
github.com/echovault/echovault/pkg/modules/pubsub/pubsub.go:264.2,264.20 1 1 github.com/echovault/echovault/pkg/modules/acl/commands.go:210.38,212.30 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:212.30,214.7 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:216.5,216.28 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:221.2,221.74 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:224.102,226.9 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:226.9,228.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:229.2,230.33 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:230.33,232.3 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:233.2,234.25 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:237.106,239.9 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:239.9,241.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:242.2,242.45 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:242.45,244.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:245.2,245.38 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:248.108,249.18 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:249.18,251.3 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:252.2,253.9 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:253.9,255.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:256.2,256.53 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:256.53,258.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:259.2,259.38 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:262.106,264.9 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:264.9,266.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:267.2,268.74 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:271.103,272.18 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:272.18,274.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:275.2,276.9 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:276.9,278.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:279.2,281.33 3 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:281.33,284.19 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:284.19,286.4 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:286.9,288.4 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:290.3,290.22 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:290.22,292.4 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:294.3,294.18 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:294.18,296.4 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:298.3,298.43 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:298.43,299.61 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:299.61,301.5 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:302.4,302.58 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:302.58,304.5 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:307.3,307.52 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:307.52,308.23 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:308.23,310.13 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:312.4,312.39 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:315.3,315.52 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:315.52,316.23 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:316.23,318.13 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:320.4,320.39 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:323.3,323.49 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:323.49,324.22 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:324.22,326.13 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:328.4,328.37 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:331.3,331.49 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:331.49,332.22 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:332.22,334.13 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:336.4,336.37 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:339.3,339.45 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:339.45,340.52 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:340.52,342.13 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:344.4,344.41 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:347.3,347.45 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:347.45,348.52 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:348.52,350.5 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:353.3,353.55 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:353.55,355.4 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:357.3,357.55 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:357.55,359.4 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:360.3,360.54 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:363.2,364.25 2 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:367.103,368.19 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:368.19,370.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:372.2,373.9 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:373.9,375.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:377.2,381.16 4 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:381.16,383.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:385.2,385.15 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:385.15,386.35 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:386.35,388.4 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:391.2,395.20 3 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:395.20,396.59 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:396.59,398.4 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:401.2,401.37 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:401.37,402.59 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:402.59,404.4 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:408.2,408.29 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:408.29,412.31 3 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:412.31,413.35 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:413.35,416.43 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:416.43,418.6 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:418.11,421.6 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:422.5,422.10 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:426.3,426.17 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:426.17,428.4 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:431.2,431.38 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:434.103,435.18 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:435.18,437.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:439.2,440.9 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:440.9,442.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:444.2,448.16 4 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:448.16,450.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:452.2,452.15 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:452.15,453.35 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:453.35,455.4 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:458.2,460.20 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:460.20,463.17 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:463.17,465.4 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:466.3,467.17 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:467.17,469.4 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:472.2,472.37 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:472.37,475.17 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:475.17,477.4 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:478.3,479.17 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:479.17,481.4 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:484.2,485.16 2 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:485.16,487.3 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:489.2,489.38 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:492.33,499.60 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:499.60,501.5 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:509.60,511.5 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:519.62,521.7 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:529.62,531.7 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:539.62,541.7 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:549.62,551.7 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:559.62,561.7 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:569.62,571.7 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:579.62,581.7 1 1
github.com/echovault/echovault/pkg/modules/acl/commands.go:592.62,594.7 1 0
github.com/echovault/echovault/pkg/modules/acl/commands.go:602.62,604.7 1 0
github.com/echovault/echovault/pkg/modules/connection/commands.go:25.108,26.18 1 1
github.com/echovault/echovault/pkg/modules/connection/commands.go:27.10,28.50 1 1
github.com/echovault/echovault/pkg/modules/connection/commands.go:29.9,30.34 1 1
github.com/echovault/echovault/pkg/modules/connection/commands.go:31.9,32.72 1 1
github.com/echovault/echovault/pkg/modules/connection/commands.go:36.33,43.60 1 0
github.com/echovault/echovault/pkg/modules/connection/commands.go:43.60,45.5 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:27.113,29.9 2 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:29.9,31.3 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:33.2,35.24 2 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:35.24,37.3 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:39.2,42.17 3 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:45.115,47.9 2 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:47.9,49.3 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:51.2,55.66 3 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:58.108,60.9 2 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:60.9,62.3 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:63.2,63.19 1 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:63.19,65.3 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:66.2,67.38 2 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:70.113,71.18 1 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:71.18,73.3 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:75.2,76.9 2 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:76.9,78.3 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:80.2,81.19 2 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:81.19,83.3 1 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:85.2,85.38 1 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:88.109,90.9 2 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:90.9,92.3 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:93.2,94.49 2 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:97.112,99.9 2 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:99.9,101.3 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:102.2,102.36 1 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:105.33,112.60 1 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:112.60,114.21 1 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:114.21,116.6 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:117.5,117.24 1 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:126.60,128.21 1 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:128.21,130.6 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:131.5,131.24 1 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:140.60,142.22 1 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:142.22,144.6 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:145.5,145.33 1 1
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:156.60,159.5 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:169.60,172.5 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:180.60,180.86 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:181.101,183.5 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:192.62,192.88 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:200.62,200.88 1 0
github.com/echovault/echovault/pkg/modules/pubsub/commands.go:209.62,209.85 1 0
github.com/echovault/echovault/pkg/modules/set/commands.go:28.108,30.16 2 1 github.com/echovault/echovault/pkg/modules/set/commands.go:28.108,30.16 2 1
github.com/echovault/echovault/pkg/modules/set/commands.go:30.16,32.3 1 1 github.com/echovault/echovault/pkg/modules/set/commands.go:30.16,32.3 1 1
github.com/echovault/echovault/pkg/modules/set/commands.go:34.2,38.33 3 1 github.com/echovault/echovault/pkg/modules/set/commands.go:34.2,38.33 3 1

View File

@@ -22,8 +22,8 @@ services:
- MTLS=false - MTLS=false
- BOOTSTRAP_CLUSTER=false - BOOTSTRAP_CLUSTER=false
- ACL_CONFIG=/etc/config/echovault/acl.yml - ACL_CONFIG=/etc/config/echovault/acl.yml
- REQUIRE_PASS=false - REQUIRE_PASS=true
- PASSWORD=default_password - PASSWORD=password1
- FORWARD_COMMAND=false - FORWARD_COMMAND=false
- SNAPSHOT_THRESHOLD=1000 - SNAPSHOT_THRESHOLD=1000
- SNAPSHOT_INTERVAL=5m30s - SNAPSHOT_INTERVAL=5m30s

View File

@@ -20,7 +20,7 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/pkg/utils"
"github.com/gobwas/glob" "github.com/gobwas/glob"
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
@@ -44,11 +44,11 @@ type ACL struct {
Users []*User // List of ACL user profiles Users []*User // List of ACL user profiles
UsersMutex sync.RWMutex // RWMutex for concurrency control when accessing ACL profile list UsersMutex sync.RWMutex // RWMutex for concurrency control when accessing ACL profile list
Connections map[*net.Conn]Connection // Connections to the echovault that are currently registered with the ACL module Connections map[*net.Conn]Connection // Connections to the echovault that are currently registered with the ACL module
Config internal.Config // EchoVault configuration that contains the relevant ACL config options Config config.Config // EchoVault configuration that contains the relevant ACL config options
GlobPatterns map[string]glob.Glob GlobPatterns map[string]glob.Glob
} }
func NewACL(config internal.Config) *ACL { func NewACL(config config.Config) *ACL {
var users []*User var users []*User
// 1. Initialise default ACL user // 1. Initialise default ACL user
@@ -168,6 +168,13 @@ func (acl *ACL) SetUser(cmd []string) error {
return nil return nil
} }
func (acl *ACL) AddUsers(users []*User) {
acl.LockUsers()
defer acl.UnlockUsers()
acl.Users = append(acl.Users, users...)
}
func (acl *ACL) DeleteUser(_ context.Context, usernames []string) error { func (acl *ACL) DeleteUser(_ context.Context, usernames []string) error {
acl.LockUsers() acl.LockUsers()
defer acl.UnlockUsers() defer acl.UnlockUsers()

View File

@@ -12,13 +12,14 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
package internal package config
import ( import (
"encoding/json" "encoding/json"
"errors" "errors"
"flag" "flag"
"fmt" "fmt"
"github.com/echovault/echovault/internal"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/pkg/utils"
"log" "log"
"os" "os"
@@ -99,7 +100,7 @@ The options are 'always' for syncing on each command, 'everysec' to sync every s
flag.Func("max-memory", `Upper memory limit before triggering eviction. flag.Func("max-memory", `Upper memory limit before triggering eviction.
Supported units (kb, mb, gb, tb, pb). When 0 is passed, there will be no memory limit. Supported units (kb, mb, gb, tb, pb). When 0 is passed, there will be no memory limit.
There is no limit by default.`, func(memory string) error { There is no limit by default.`, func(memory string) error {
b, err := ParseMemory(memory) b, err := internal.ParseMemory(memory)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -0,0 +1,37 @@
package config
import (
"github.com/echovault/echovault/pkg/utils"
"time"
)
func DefaultConfig() Config {
return Config{
TLS: false,
MTLS: false,
CertKeyPairs: make([][]string, 0),
ClientCAs: make([]string, 0),
Port: 7480,
ServerID: "",
JoinAddr: "",
BindAddr: "localhost",
RaftBindPort: 7481,
MemberListBindPort: 7946,
InMemory: false,
DataDir: ".",
BootstrapCluster: false,
AclConfig: "",
ForwardCommand: false,
RequirePass: false,
Password: "",
SnapShotThreshold: 1000,
SnapshotInterval: 5 * time.Minute,
RestoreAOF: false,
RestoreSnapshot: false,
AOFSyncStrategy: "everysec",
MaxMemory: 0,
EvictionPolicy: utils.NoEviction,
EvictionSample: 20,
EvictionInterval: 100 * time.Millisecond,
}
}

View File

@@ -19,6 +19,7 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/pkg/utils"
"github.com/hashicorp/memberlist" "github.com/hashicorp/memberlist"
"github.com/hashicorp/raft" "github.com/hashicorp/raft"
@@ -31,7 +32,7 @@ type Delegate struct {
} }
type DelegateOpts struct { type DelegateOpts struct {
config internal.Config config config.Config
broadcastQueue *memberlist.TransmitLimitedQueue broadcastQueue *memberlist.TransmitLimitedQueue
addVoter func(id raft.ServerID, address raft.ServerAddress, prevIndex uint64, timeout time.Duration) error addVoter func(id raft.ServerID, address raft.ServerAddress, prevIndex uint64, timeout time.Duration) error
isRaftLeader func() bool isRaftLeader func() bool

View File

@@ -19,6 +19,7 @@ import (
"crypto/md5" "crypto/md5"
"fmt" "fmt"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config"
"log" "log"
"time" "time"
@@ -35,7 +36,7 @@ type NodeMeta struct {
} }
type Opts struct { type Opts struct {
Config internal.Config Config config.Config
HasJoinedCluster func() bool HasJoinedCluster func() bool
AddVoter func(id raft.ServerID, address raft.ServerAddress, prevIndex uint64, timeout time.Duration) error AddVoter func(id raft.ServerID, address raft.ServerAddress, prevIndex uint64, timeout time.Duration) error
RemoveRaftServer func(meta NodeMeta) error RemoveRaftServer func(meta NodeMeta) error

View File

@@ -88,6 +88,14 @@ func (ch *Channel) Start() {
}() }()
} }
func (ch *Channel) Name() string {
return ch.name
}
func (ch *Channel) Pattern() glob.Glob {
return ch.pattern
}
func (ch *Channel) Subscribe(conn *net.Conn) bool { func (ch *Channel) Subscribe(conn *net.Conn) bool {
ch.subscribersRWMut.Lock() ch.subscribersRWMut.Lock()
defer ch.subscribersRWMut.Unlock() defer ch.subscribersRWMut.Unlock()
@@ -115,11 +123,29 @@ func (ch *Channel) Publish(message string) {
func (ch *Channel) IsActive() bool { func (ch *Channel) IsActive() bool {
ch.subscribersRWMut.RLock() ch.subscribersRWMut.RLock()
defer ch.subscribersRWMut.RUnlock() defer ch.subscribersRWMut.RUnlock()
return len(ch.subscribers) > 0
active := len(ch.subscribers) > 0
return active
} }
func (ch *Channel) NumSubs() int { func (ch *Channel) NumSubs() int {
ch.subscribersRWMut.RLock() ch.subscribersRWMut.RLock()
defer ch.subscribersRWMut.RUnlock() defer ch.subscribersRWMut.RUnlock()
return len(ch.subscribers)
n := len(ch.subscribers)
return n
}
func (ch *Channel) Subscribers() map[*net.Conn]*resp.Conn {
ch.subscribersRWMut.RLock()
defer ch.subscribersRWMut.RUnlock()
subscribers := make(map[*net.Conn]*resp.Conn, len(ch.subscribers))
for k, v := range ch.subscribers {
subscribers[k] = v
}
return subscribers
} }

View File

@@ -263,3 +263,15 @@ func (ps *PubSub) NumSub(channels []string) []byte {
} }
return []byte(res) return []byte(res)
} }
func (ps *PubSub) GetAllChannels() []*Channel {
ps.channelsRWMut.RLock()
defer ps.channelsRWMut.RUnlock()
channels := make([]*Channel, len(ps.channels))
for i, channel := range ps.channels {
channels[i] = channel
}
return channels
}

View File

@@ -17,6 +17,7 @@ package raft
import ( import (
"encoding/json" "encoding/json"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/pkg/utils"
"github.com/hashicorp/raft" "github.com/hashicorp/raft"
"strconv" "strconv"
@@ -24,7 +25,7 @@ import (
) )
type SnapshotOpts struct { type SnapshotOpts struct {
config internal.Config config config.Config
data map[string]utils.KeyData data map[string]utils.KeyData
startSnapshot func() startSnapshot func()
finishSnapshot func() finishSnapshot func()

View File

@@ -19,6 +19,7 @@ import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/pkg/utils"
"github.com/hashicorp/raft" "github.com/hashicorp/raft"
"io" "io"
@@ -27,7 +28,7 @@ import (
) )
type FSMOpts struct { type FSMOpts struct {
Config internal.Config Config config.Config
EchoVault utils.EchoVault EchoVault utils.EchoVault
GetCommand func(command string) (utils.Command, error) GetCommand func(command string) (utils.Command, error)
DeleteKey func(ctx context.Context, key string) error DeleteKey func(ctx context.Context, key string) error

View File

@@ -18,7 +18,7 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/internal/memberlist" "github.com/echovault/echovault/internal/memberlist"
"log" "log"
"net" "net"
@@ -32,7 +32,7 @@ import (
) )
type Opts struct { type Opts struct {
Config internal.Config Config config.Config
EchoVault utils.EchoVault EchoVault utils.EchoVault
GetCommand func(command string) (utils.Command, error) GetCommand func(command string) (utils.Command, error)
DeleteKey func(ctx context.Context, key string) error DeleteKey func(ctx context.Context, key string) error

View File

@@ -1,8 +1,11 @@
package config package config
import "github.com/echovault/echovault/internal" import (
"github.com/echovault/echovault/internal/config"
)
// Config returns the default configuration. // DefaultConfig returns the default configuration.
func Config() (internal.Config, error) { // / This should be used when using EchoVault as an embedded library.
return internal.GetConfig() func DefaultConfig() config.Config {
return config.DefaultConfig()
} }

View File

@@ -21,9 +21,12 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/acl"
"github.com/echovault/echovault/internal/aof" "github.com/echovault/echovault/internal/aof"
"github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/internal/eviction" "github.com/echovault/echovault/internal/eviction"
"github.com/echovault/echovault/internal/memberlist" "github.com/echovault/echovault/internal/memberlist"
"github.com/echovault/echovault/internal/pubsub"
"github.com/echovault/echovault/internal/raft" "github.com/echovault/echovault/internal/raft"
"github.com/echovault/echovault/internal/snapshot" "github.com/echovault/echovault/internal/snapshot"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/pkg/utils"
@@ -38,7 +41,7 @@ import (
type EchoVault struct { type EchoVault struct {
// config holds the echovault configuration variables. // config holds the echovault configuration variables.
config internal.Config config config.Config
// The current index for the latest connection id. // The current index for the latest connection id.
// This number is incremented everytime there's a new connection and // This number is incremented everytime there's a new connection and
@@ -73,8 +76,8 @@ type EchoVault struct {
context context.Context context context.Context
ACL utils.ACL ACL *acl.ACL
PubSub utils.PubSub PubSub *pubsub.PubSub
snapshotInProgress atomic.Bool // Atomic boolean that's true when actively taking a snapshot. snapshotInProgress atomic.Bool // Atomic boolean that's true when actively taking a snapshot.
rewriteAOFInProgress atomic.Bool // Atomic boolean that's true when actively rewriting AOF file is in progress. rewriteAOFInProgress atomic.Bool // Atomic boolean that's true when actively rewriting AOF file is in progress.
@@ -91,24 +94,12 @@ func WithContext(ctx context.Context) func(echovault *EchoVault) {
} }
} }
func WithConfig(config internal.Config) func(echovault *EchoVault) { func WithConfig(config config.Config) func(echovault *EchoVault) {
return func(echovault *EchoVault) { return func(echovault *EchoVault) {
echovault.config = config echovault.config = config
} }
} }
func WithACL(acl utils.ACL) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.ACL = acl
}
}
func WithPubSub(pubsub utils.PubSub) func(echovault *EchoVault) {
return func(echovault *EchoVault) {
echovault.PubSub = pubsub
}
}
func WithCommands(commands []utils.Command) func(echovault *EchoVault) { func WithCommands(commands []utils.Command) func(echovault *EchoVault) {
return func(echovault *EchoVault) { return func(echovault *EchoVault) {
echovault.commands = commands echovault.commands = commands
@@ -119,6 +110,7 @@ func NewEchoVault(options ...func(echovault *EchoVault)) *EchoVault {
echovault := &EchoVault{ echovault := &EchoVault{
context: context.Background(), context: context.Background(),
commands: make([]utils.Command, 0), commands: make([]utils.Command, 0),
config: config.DefaultConfig(),
store: make(map[string]utils.KeyData), store: make(map[string]utils.KeyData),
keyLocks: make(map[string]*sync.RWMutex), keyLocks: make(map[string]*sync.RWMutex),
keyCreationLock: &sync.Mutex{}, keyCreationLock: &sync.Mutex{},
@@ -128,6 +120,12 @@ func NewEchoVault(options ...func(echovault *EchoVault)) *EchoVault {
option(echovault) option(echovault)
} }
// Set up ACL module
echovault.ACL = acl.NewACL(echovault.config)
// Set up Pub/Sub module
echovault.PubSub = pubsub.NewPubSub()
if echovault.isInCluster() { if echovault.isInCluster() {
echovault.raft = raft.NewRaft(raft.Opts{ echovault.raft = raft.NewRaft(raft.Opts{
Config: echovault.config, Config: echovault.config,

View File

@@ -19,6 +19,7 @@ import (
"encoding/json" "encoding/json"
"errors" "errors"
"fmt" "fmt"
internal_acl "github.com/echovault/echovault/internal/acl"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/pkg/utils"
"gopkg.in/yaml.v3" "gopkg.in/yaml.v3"
"log" "log"
@@ -33,7 +34,7 @@ func handleAuth(ctx context.Context, cmd []string, server utils.EchoVault, conn
if len(cmd) < 2 || len(cmd) > 3 { if len(cmd) < 2 || len(cmd) > 3 {
return nil, errors.New(utils.WrongArgsResponse) return nil, errors.New(utils.WrongArgsResponse)
} }
acl, ok := server.GetACL().(*ACL) acl, ok := server.GetACL().(*internal_acl.ACL)
if !ok { if !ok {
return nil, errors.New("could not load ACL") return nil, errors.New("could not load ACL")
} }
@@ -48,12 +49,12 @@ func handleGetUser(_ context.Context, cmd []string, server utils.EchoVault, _ *n
return nil, errors.New(utils.WrongArgsResponse) return nil, errors.New(utils.WrongArgsResponse)
} }
acl, ok := server.GetACL().(*ACL) acl, ok := server.GetACL().(*internal_acl.ACL)
if !ok { if !ok {
return nil, errors.New("could not load ACL") return nil, errors.New("could not load ACL")
} }
var user *User var user *internal_acl.User
userFound := false userFound := false
for _, u := range acl.Users { for _, u := range acl.Users {
if u.Username == cmd[2] { if u.Username == cmd[2] {
@@ -221,7 +222,7 @@ func handleCat(_ context.Context, cmd []string, server utils.EchoVault, _ *net.C
} }
func handleUsers(_ context.Context, _ []string, server utils.EchoVault, _ *net.Conn) ([]byte, error) { func handleUsers(_ context.Context, _ []string, server utils.EchoVault, _ *net.Conn) ([]byte, error) {
acl, ok := server.GetACL().(*ACL) acl, ok := server.GetACL().(*internal_acl.ACL)
if !ok { if !ok {
return nil, errors.New("could not load ACL") return nil, errors.New("could not load ACL")
} }
@@ -234,7 +235,7 @@ func handleUsers(_ context.Context, _ []string, server utils.EchoVault, _ *net.C
} }
func handleSetUser(_ context.Context, cmd []string, server utils.EchoVault, _ *net.Conn) ([]byte, error) { func handleSetUser(_ context.Context, cmd []string, server utils.EchoVault, _ *net.Conn) ([]byte, error) {
acl, ok := server.GetACL().(*ACL) acl, ok := server.GetACL().(*internal_acl.ACL)
if !ok { if !ok {
return nil, errors.New("could not load ACL") return nil, errors.New("could not load ACL")
} }
@@ -248,7 +249,7 @@ func handleDelUser(ctx context.Context, cmd []string, server utils.EchoVault, _
if len(cmd) < 3 { if len(cmd) < 3 {
return nil, errors.New(utils.WrongArgsResponse) return nil, errors.New(utils.WrongArgsResponse)
} }
acl, ok := server.GetACL().(*ACL) acl, ok := server.GetACL().(*internal_acl.ACL)
if !ok { if !ok {
return nil, errors.New("could not load ACL") return nil, errors.New("could not load ACL")
} }
@@ -259,7 +260,7 @@ func handleDelUser(ctx context.Context, cmd []string, server utils.EchoVault, _
} }
func handleWhoAmI(_ context.Context, _ []string, server utils.EchoVault, conn *net.Conn) ([]byte, error) { func handleWhoAmI(_ context.Context, _ []string, server utils.EchoVault, conn *net.Conn) ([]byte, error) {
acl, ok := server.GetACL().(*ACL) acl, ok := server.GetACL().(*internal_acl.ACL)
if !ok { if !ok {
return nil, errors.New("could not load ACL") return nil, errors.New("could not load ACL")
} }
@@ -271,7 +272,7 @@ func handleList(_ context.Context, cmd []string, server utils.EchoVault, _ *net.
if len(cmd) > 2 { if len(cmd) > 2 {
return nil, errors.New(utils.WrongArgsResponse) return nil, errors.New(utils.WrongArgsResponse)
} }
acl, ok := server.GetACL().(*ACL) acl, ok := server.GetACL().(*internal_acl.ACL)
if !ok { if !ok {
return nil, errors.New("could not load ACL") return nil, errors.New("could not load ACL")
} }
@@ -368,7 +369,7 @@ func handleLoad(_ context.Context, cmd []string, server utils.EchoVault, _ *net.
return nil, errors.New(utils.WrongArgsResponse) return nil, errors.New(utils.WrongArgsResponse)
} }
acl, ok := server.GetACL().(*ACL) acl, ok := server.GetACL().(*internal_acl.ACL)
if !ok { if !ok {
return nil, errors.New("could not load ACL") return nil, errors.New("could not load ACL")
} }
@@ -389,7 +390,7 @@ func handleLoad(_ context.Context, cmd []string, server utils.EchoVault, _ *net.
ext := path.Ext(f.Name()) ext := path.Ext(f.Name())
var users []*User var users []*internal_acl.User
if ext == ".json" { if ext == ".json" {
if err := json.NewDecoder(f).Decode(&users); err != nil { if err := json.NewDecoder(f).Decode(&users); err != nil {
@@ -435,7 +436,7 @@ func handleSave(_ context.Context, cmd []string, server utils.EchoVault, _ *net.
return nil, errors.New(utils.WrongArgsResponse) return nil, errors.New(utils.WrongArgsResponse)
} }
acl, ok := server.GetACL().(*ACL) acl, ok := server.GetACL().(*internal_acl.ACL)
if !ok { if !ok {
return nil, errors.New("could not load ACL") return nil, errors.New("could not load ACL")
} }

View File

@@ -18,7 +18,8 @@ import (
"context" "context"
"crypto/sha256" "crypto/sha256"
"fmt" "fmt"
"github.com/echovault/echovault/internal" internal_acl "github.com/echovault/echovault/internal/acl"
"github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/pkg/echovault" "github.com/echovault/echovault/pkg/echovault"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/pkg/utils"
"github.com/tidwall/resp" "github.com/tidwall/resp"
@@ -32,8 +33,6 @@ var bindAddr string
var port uint16 var port uint16
var mockServer *echovault.EchoVault var mockServer *echovault.EchoVault
var acl *ACL
func init() { func init() {
bindAddr = "localhost" bindAddr = "localhost"
port = 7490 port = 7490
@@ -46,7 +45,7 @@ func init() {
} }
func setUpServer(bindAddr string, port uint16, requirePass bool, aclConfig string) *echovault.EchoVault { func setUpServer(bindAddr string, port uint16, requirePass bool, aclConfig string) *echovault.EchoVault {
config := internal.Config{ conf := config.Config{
BindAddr: bindAddr, BindAddr: bindAddr,
Port: port, Port: port,
DataDir: "", DataDir: "",
@@ -56,43 +55,45 @@ func setUpServer(bindAddr string, port uint16, requirePass bool, aclConfig strin
AclConfig: aclConfig, AclConfig: aclConfig,
} }
acl = NewACL(config) mockServer := echovault.NewEchoVault(
acl.Users = append(acl.Users, generateInitialTestUsers()...) echovault.WithConfig(conf),
return echovault.NewEchoVault(
echovault.WithConfig(config),
echovault.WithACL(acl),
echovault.WithCommands(Commands()), echovault.WithCommands(Commands()),
) )
// Add the initial test users to the ACL module
acl := mockServer.GetACL().(*internal_acl.ACL)
acl.AddUsers(generateInitialTestUsers())
return mockServer
} }
func generateInitialTestUsers() []*User { func generateInitialTestUsers() []*internal_acl.User {
// User with both hash password and plaintext password // User with both hash password and plaintext password
withPasswordUser := CreateUser("with_password_user") withPasswordUser := internal_acl.CreateUser("with_password_user")
h := sha256.New() h := sha256.New()
h.Write([]byte("password3")) h.Write([]byte("password3"))
withPasswordUser.Passwords = []Password{ withPasswordUser.Passwords = []internal_acl.Password{
{PasswordType: PasswordPlainText, PasswordValue: "password2"}, {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "password2"},
{PasswordType: PasswordSHA256, PasswordValue: string(h.Sum(nil))}, {PasswordType: internal_acl.PasswordSHA256, PasswordValue: string(h.Sum(nil))},
} }
withPasswordUser.IncludedCategories = []string{"*"} withPasswordUser.IncludedCategories = []string{"*"}
withPasswordUser.IncludedCommands = []string{"*"} withPasswordUser.IncludedCommands = []string{"*"}
// User with NoPassword option // User with NoPassword option
noPasswordUser := CreateUser("no_password_user") noPasswordUser := internal_acl.CreateUser("no_password_user")
noPasswordUser.Passwords = []Password{ noPasswordUser.Passwords = []internal_acl.Password{
{PasswordType: PasswordPlainText, PasswordValue: "password4"}, {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "password4"},
} }
noPasswordUser.NoPassword = true noPasswordUser.NoPassword = true
// Disabled user // Disabled user
disabledUser := CreateUser("disabled_user") disabledUser := internal_acl.CreateUser("disabled_user")
disabledUser.Passwords = []Password{ disabledUser.Passwords = []internal_acl.Password{
{PasswordType: PasswordPlainText, PasswordValue: "password5"}, {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "password5"},
} }
disabledUser.Enabled = false disabledUser.Enabled = false
return []*User{ return []*internal_acl.User{
withPasswordUser, withPasswordUser,
noPasswordUser, noPasswordUser,
disabledUser, disabledUser,
@@ -123,7 +124,7 @@ func compareSlices[T comparable](res, expected []T) error {
} }
// compareUsers compares 2 users and checks if all their fields are equal // compareUsers compares 2 users and checks if all their fields are equal
func compareUsers(user1, user2 *User) error { func compareUsers(user1, user2 *internal_acl.User) error {
// Compare flags // Compare flags
if user1.Username != user2.Username { if user1.Username != user2.Username {
return fmt.Errorf("mismatched usernames \"%s\", and \"%s\"", user1.Username, user2.Username) return fmt.Errorf("mismatched usernames \"%s\", and \"%s\"", user1.Username, user2.Username)
@@ -140,14 +141,14 @@ func compareUsers(user1, user2 *User) error {
// Compare passwords // Compare passwords
for _, password1 := range user1.Passwords { for _, password1 := range user1.Passwords {
if !slices.ContainsFunc(user2.Passwords, func(password2 Password) bool { if !slices.ContainsFunc(user2.Passwords, func(password2 internal_acl.Password) bool {
return password1.PasswordType == password2.PasswordType && password1.PasswordValue == password2.PasswordValue return password1.PasswordType == password2.PasswordType && password1.PasswordValue == password2.PasswordValue
}) { }) {
return fmt.Errorf("found password %+v in user1 that was not found in user2", password1) return fmt.Errorf("found password %+v in user1 that was not found in user2", password1)
} }
} }
for _, password2 := range user2.Passwords { for _, password2 := range user2.Passwords {
if !slices.ContainsFunc(user1.Passwords, func(password1 Password) bool { if !slices.ContainsFunc(user1.Passwords, func(password1 internal_acl.Password) bool {
return password1.PasswordType == password2.PasswordType && password1.PasswordValue == password2.PasswordValue return password1.PasswordType == password2.PasswordType && password1.PasswordValue == password2.PasswordValue
}) { }) {
return fmt.Errorf("found password %+v in user2 that was not found in user1", password2) return fmt.Errorf("found password %+v in user2 that was not found in user1", password2)
@@ -448,7 +449,7 @@ func Test_HandleSetUser(t *testing.T) {
go func() { go func() {
mockServer.Start(context.Background()) mockServer.Start(context.Background())
}() }()
acl, ok := mockServer.GetACL().(*ACL) acl, ok := mockServer.GetACL().(*internal_acl.ACL)
if !ok { if !ok {
t.Error("error loading ACL module") t.Error("error loading ACL module")
} }
@@ -464,11 +465,11 @@ func Test_HandleSetUser(t *testing.T) {
r := resp.NewConn(conn) r := resp.NewConn(conn)
tests := []struct { tests := []struct {
presetUser *User presetUser *internal_acl.User
cmd []resp.Value cmd []resp.Value
wantRes string wantRes string
wantErr string wantErr string
wantUser *User wantUser *internal_acl.User
}{ }{
{ {
// 1. Create new enabled user // 1. Create new enabled user
@@ -481,8 +482,8 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_1") user := internal_acl.CreateUser("set_user_1")
user.Enabled = true user.Enabled = true
user.Normalise() user.Normalise()
return user return user
@@ -499,8 +500,8 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_2") user := internal_acl.CreateUser("set_user_2")
user.Enabled = false user.Enabled = false
user.Normalise() user.Normalise()
return user return user
@@ -521,14 +522,14 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_3") user := internal_acl.CreateUser("set_user_3")
user.Enabled = true user.Enabled = true
user.Passwords = []Password{ user.Passwords = []internal_acl.Password{
{PasswordType: PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_1"}, {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_1"},
{PasswordType: PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_2"}, {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_2"},
{PasswordType: PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_1")}, {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_1")},
{PasswordType: PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_2")}, {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_2")},
} }
user.Normalise() user.Normalise()
return user return user
@@ -536,14 +537,14 @@ func Test_HandleSetUser(t *testing.T) {
}, },
{ {
// 4. Remove plaintext and SHA256 password from existing user // 4. Remove plaintext and SHA256 password from existing user
presetUser: func() *User { presetUser: func() *internal_acl.User {
user := CreateUser("set_user_4") user := internal_acl.CreateUser("set_user_4")
user.Enabled = true user.Enabled = true
user.Passwords = []Password{ user.Passwords = []internal_acl.Password{
{PasswordType: PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_1"}, {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_1"},
{PasswordType: PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_2"}, {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_2"},
{PasswordType: PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_1")}, {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_1")},
{PasswordType: PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_2")}, {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_2")},
} }
user.Normalise() user.Normalise()
return user return user
@@ -558,12 +559,12 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_4") user := internal_acl.CreateUser("set_user_4")
user.Enabled = true user.Enabled = true
user.Passwords = []Password{ user.Passwords = []internal_acl.Password{
{PasswordType: PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_1"}, {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "set_user_3_plaintext_password_1"},
{PasswordType: PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_1")}, {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("set_user_3_hash_password_1")},
} }
user.Normalise() user.Normalise()
return user return user
@@ -581,8 +582,8 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_5") user := internal_acl.CreateUser("set_user_5")
user.Enabled = true user.Enabled = true
user.ExcludedCommands = []string{"*"} user.ExcludedCommands = []string{"*"}
user.ExcludedCategories = []string{"*"} user.ExcludedCategories = []string{"*"}
@@ -602,8 +603,8 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_6") user := internal_acl.CreateUser("set_user_6")
user.Enabled = true user.Enabled = true
user.IncludedCategories = []string{"*"} user.IncludedCategories = []string{"*"}
user.ExcludedCategories = []string{} user.ExcludedCategories = []string{}
@@ -623,8 +624,8 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_7") user := internal_acl.CreateUser("set_user_7")
user.Enabled = true user.Enabled = true
user.IncludedCategories = []string{"*"} user.IncludedCategories = []string{"*"}
user.ExcludedCategories = []string{} user.ExcludedCategories = []string{}
@@ -649,8 +650,8 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_8") user := internal_acl.CreateUser("set_user_8")
user.Enabled = true user.Enabled = true
user.IncludedCategories = []string{utils.WriteCategory, utils.ReadCategory, utils.PubSubCategory} user.IncludedCategories = []string{utils.WriteCategory, utils.ReadCategory, utils.PubSubCategory}
user.ExcludedCategories = []string{utils.AdminCategory, utils.ConnectionCategory, utils.DangerousCategory} user.ExcludedCategories = []string{utils.AdminCategory, utils.ConnectionCategory, utils.DangerousCategory}
@@ -670,8 +671,8 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_9") user := internal_acl.CreateUser("set_user_9")
user.Enabled = true user.Enabled = true
user.NoKeys = true user.NoKeys = true
user.IncludedReadKeys = []string{} user.IncludedReadKeys = []string{}
@@ -700,8 +701,8 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_10") user := internal_acl.CreateUser("set_user_10")
user.Enabled = true user.Enabled = true
user.NoKeys = false user.NoKeys = false
user.IncludedReadKeys = []string{"key1", "key2", "key3", "key4", "key5", "key6"} user.IncludedReadKeys = []string{"key1", "key2", "key3", "key4", "key5", "key6"}
@@ -722,8 +723,8 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_11") user := internal_acl.CreateUser("set_user_11")
user.Enabled = true user.Enabled = true
user.IncludedPubSubChannels = []string{"*"} user.IncludedPubSubChannels = []string{"*"}
user.ExcludedPubSubChannels = []string{} user.ExcludedPubSubChannels = []string{}
@@ -743,8 +744,8 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_12") user := internal_acl.CreateUser("set_user_12")
user.Enabled = true user.Enabled = true
user.IncludedPubSubChannels = []string{"*"} user.IncludedPubSubChannels = []string{"*"}
user.ExcludedPubSubChannels = []string{} user.ExcludedPubSubChannels = []string{}
@@ -767,8 +768,8 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_13") user := internal_acl.CreateUser("set_user_13")
user.Enabled = true user.Enabled = true
user.IncludedPubSubChannels = []string{"channel1", "channel2"} user.IncludedPubSubChannels = []string{"channel1", "channel2"}
user.ExcludedPubSubChannels = []string{"channel3", "channel4"} user.ExcludedPubSubChannels = []string{"channel3", "channel4"}
@@ -788,8 +789,8 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_14") user := internal_acl.CreateUser("set_user_14")
user.Enabled = true user.Enabled = true
user.IncludedCommands = []string{"*"} user.IncludedCommands = []string{"*"}
user.ExcludedCommands = []string{} user.ExcludedCommands = []string{}
@@ -814,8 +815,8 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_15") user := internal_acl.CreateUser("set_user_15")
user.Enabled = true user.Enabled = true
user.IncludedCommands = []string{"acl|getuser", "acl|setuser", "acl|deluser"} user.IncludedCommands = []string{"acl|getuser", "acl|setuser", "acl|deluser"}
user.ExcludedCommands = []string{"rewriteaof", "save", "publish"} user.ExcludedCommands = []string{"rewriteaof", "save", "publish"}
@@ -838,24 +839,24 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_16") user := internal_acl.CreateUser("set_user_16")
user.Enabled = true user.Enabled = true
user.NoPassword = true user.NoPassword = true
user.Passwords = []Password{} user.Passwords = []internal_acl.Password{}
user.Normalise() user.Normalise()
return user return user
}(), }(),
}, },
{ {
// 17. Delete all existing users passwords using 'nopass' // 17. Delete all existing users passwords using 'nopass'
presetUser: func() *User { presetUser: func() *internal_acl.User {
user := CreateUser("set_user_17") user := internal_acl.CreateUser("set_user_17")
user.Enabled = true user.Enabled = true
user.NoPassword = true user.NoPassword = true
user.Passwords = []Password{ user.Passwords = []internal_acl.Password{
{PasswordType: PasswordPlainText, PasswordValue: "password1"}, {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "password1"},
{PasswordType: PasswordSHA256, PasswordValue: generateSHA256Password("password2")}, {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("password2")},
} }
user.Normalise() user.Normalise()
return user return user
@@ -869,24 +870,24 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_17") user := internal_acl.CreateUser("set_user_17")
user.Enabled = true user.Enabled = true
user.NoPassword = true user.NoPassword = true
user.Passwords = []Password{} user.Passwords = []internal_acl.Password{}
user.Normalise() user.Normalise()
return user return user
}(), }(),
}, },
{ {
// 18. Clear all of an existing user's passwords using 'resetpass' // 18. Clear all of an existing user's passwords using 'resetpass'
presetUser: func() *User { presetUser: func() *internal_acl.User {
user := CreateUser("set_user_18") user := internal_acl.CreateUser("set_user_18")
user.Enabled = true user.Enabled = true
user.NoPassword = true user.NoPassword = true
user.Passwords = []Password{ user.Passwords = []internal_acl.Password{
{PasswordType: PasswordPlainText, PasswordValue: "password1"}, {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "password1"},
{PasswordType: PasswordSHA256, PasswordValue: generateSHA256Password("password2")}, {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("password2")},
} }
user.Normalise() user.Normalise()
return user return user
@@ -900,19 +901,19 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_18") user := internal_acl.CreateUser("set_user_18")
user.Enabled = true user.Enabled = true
user.NoPassword = true user.NoPassword = true
user.Passwords = []Password{} user.Passwords = []internal_acl.Password{}
user.Normalise() user.Normalise()
return user return user
}(), }(),
}, },
{ {
// 19. Clear all of an existing user's command privileges using 'nocommands' // 19. Clear all of an existing user's command privileges using 'nocommands'
presetUser: func() *User { presetUser: func() *internal_acl.User {
user := CreateUser("set_user_19") user := internal_acl.CreateUser("set_user_19")
user.Enabled = true user.Enabled = true
user.IncludedCommands = []string{"acl|getuser", "acl|setuser", "acl|deluser"} user.IncludedCommands = []string{"acl|getuser", "acl|setuser", "acl|deluser"}
user.ExcludedCommands = []string{"rewriteaof", "save"} user.ExcludedCommands = []string{"rewriteaof", "save"}
@@ -928,8 +929,8 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_19") user := internal_acl.CreateUser("set_user_19")
user.Enabled = true user.Enabled = true
user.IncludedCommands = []string{} user.IncludedCommands = []string{}
user.ExcludedCommands = []string{"*"} user.ExcludedCommands = []string{"*"}
@@ -941,8 +942,8 @@ func Test_HandleSetUser(t *testing.T) {
}, },
{ {
// 20. Clear all of an existing user's allowed keys using 'resetkeys' // 20. Clear all of an existing user's allowed keys using 'resetkeys'
presetUser: func() *User { presetUser: func() *internal_acl.User {
user := CreateUser("set_user_20") user := internal_acl.CreateUser("set_user_20")
user.Enabled = true user.Enabled = true
user.IncludedWriteKeys = []string{"key1", "key2", "key3", "key4", "key5", "key6"} user.IncludedWriteKeys = []string{"key1", "key2", "key3", "key4", "key5", "key6"}
user.IncludedReadKeys = []string{"key1", "key2", "key3", "key7", "key8", "key9"} user.IncludedReadKeys = []string{"key1", "key2", "key3", "key7", "key8", "key9"}
@@ -958,8 +959,8 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_20") user := internal_acl.CreateUser("set_user_20")
user.Enabled = true user.Enabled = true
user.NoKeys = true user.NoKeys = true
user.IncludedReadKeys = []string{} user.IncludedReadKeys = []string{}
@@ -970,8 +971,8 @@ func Test_HandleSetUser(t *testing.T) {
}, },
{ {
// 21. Allow user to access all channels using 'resetchannels' // 21. Allow user to access all channels using 'resetchannels'
presetUser: func() *User { presetUser: func() *internal_acl.User {
user := CreateUser("set_user_21") user := internal_acl.CreateUser("set_user_21")
user.IncludedPubSubChannels = []string{"channel1", "channel2"} user.IncludedPubSubChannels = []string{"channel1", "channel2"}
user.ExcludedPubSubChannels = []string{"channel3", "channel4"} user.ExcludedPubSubChannels = []string{"channel3", "channel4"}
user.Normalise() user.Normalise()
@@ -985,8 +986,8 @@ func Test_HandleSetUser(t *testing.T) {
}, },
wantRes: "OK", wantRes: "OK",
wantErr: "", wantErr: "",
wantUser: func() *User { wantUser: func() *internal_acl.User {
user := CreateUser("set_user_21") user := internal_acl.CreateUser("set_user_21")
user.IncludedPubSubChannels = []string{} user.IncludedPubSubChannels = []string{}
user.ExcludedPubSubChannels = []string{"*"} user.ExcludedPubSubChannels = []string{"*"}
user.Normalise() user.Normalise()
@@ -1019,7 +1020,7 @@ func Test_HandleSetUser(t *testing.T) {
continue continue
} }
expectedUser := test.wantUser expectedUser := test.wantUser
currUserIdx := slices.IndexFunc(acl.Users, func(user *User) bool { currUserIdx := slices.IndexFunc(acl.Users, func(user *internal_acl.User) bool {
return user.Username == expectedUser.Username return user.Username == expectedUser.Username
}) })
if currUserIdx == -1 { if currUserIdx == -1 {
@@ -1037,7 +1038,7 @@ func Test_HandleGetUser(t *testing.T) {
go func() { go func() {
mockServer.Start(context.Background()) mockServer.Start(context.Background())
}() }()
acl, _ := mockServer.GetACL().(*ACL) acl, _ := mockServer.GetACL().(*internal_acl.ACL)
conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port))
if err != nil { if err != nil {
@@ -1050,20 +1051,20 @@ func Test_HandleGetUser(t *testing.T) {
r := resp.NewConn(conn) r := resp.NewConn(conn)
tests := []struct { tests := []struct {
presetUser *User presetUser *internal_acl.User
cmd []resp.Value cmd []resp.Value
wantRes []resp.Value wantRes []resp.Value
wantErr string wantErr string
}{ }{
{ // 1. Get the user and all their details { // 1. Get the user and all their details
presetUser: &User{ presetUser: &internal_acl.User{
Username: "get_user_1", Username: "get_user_1",
Enabled: true, Enabled: true,
NoPassword: false, NoPassword: false,
NoKeys: false, NoKeys: false,
Passwords: []Password{ Passwords: []internal_acl.Password{
{PasswordType: PasswordPlainText, PasswordValue: "get_user_password_1"}, {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "get_user_password_1"},
{PasswordType: PasswordSHA256, PasswordValue: generateSHA256Password("get_user_password_2")}, {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("get_user_password_2")},
}, },
IncludedCategories: []string{utils.WriteCategory, utils.ReadCategory, utils.PubSubCategory}, IncludedCategories: []string{utils.WriteCategory, utils.ReadCategory, utils.PubSubCategory},
ExcludedCategories: []string{utils.AdminCategory, utils.ConnectionCategory, utils.DangerousCategory}, ExcludedCategories: []string{utils.AdminCategory, utils.ConnectionCategory, utils.DangerousCategory},
@@ -1183,7 +1184,7 @@ func Test_HandleDelUser(t *testing.T) {
go func() { go func() {
mockServer.Start(context.Background()) mockServer.Start(context.Background())
}() }()
acl, _ := mockServer.GetACL().(*ACL) acl, _ := mockServer.GetACL().(*internal_acl.ACL)
conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port))
if err != nil { if err != nil {
@@ -1196,14 +1197,14 @@ func Test_HandleDelUser(t *testing.T) {
r := resp.NewConn(conn) r := resp.NewConn(conn)
tests := []struct { tests := []struct {
presetUser *User presetUser *internal_acl.User
cmd []resp.Value cmd []resp.Value
wantRes string wantRes string
wantErr string wantErr string
}{ }{
{ {
// 1. Delete existing user while skipping default user and non-existent user // 1. Delete existing user while skipping default user and non-existent user
presetUser: CreateUser("user_to_delete"), presetUser: internal_acl.CreateUser("user_to_delete"),
cmd: []resp.Value{ cmd: []resp.Value{
resp.StringValue("ACL"), resp.StringValue("ACL"),
resp.StringValue("DELUSER"), resp.StringValue("DELUSER"),
@@ -1241,13 +1242,13 @@ func Test_HandleDelUser(t *testing.T) {
continue continue
} }
// Check that default user still exists in the list of users // Check that default user still exists in the list of users
if !slices.ContainsFunc(acl.Users, func(user *User) bool { if !slices.ContainsFunc(acl.Users, func(user *internal_acl.User) bool {
return user.Username == "default" return user.Username == "default"
}) { }) {
t.Error("could not find user with username \"default\" in the ACL after deleting user") t.Error("could not find user with username \"default\" in the ACL after deleting user")
} }
// Check that the deleted user is no longer in the list // Check that the deleted user is no longer in the list
if slices.ContainsFunc(acl.Users, func(user *User) bool { if slices.ContainsFunc(acl.Users, func(user *internal_acl.User) bool {
return user.Username == "user_to_delete" return user.Username == "user_to_delete"
}) { }) {
t.Error("deleted user found in the ACL") t.Error("deleted user found in the ACL")
@@ -1324,7 +1325,7 @@ func Test_HandleList(t *testing.T) {
go func() { go func() {
mockServer.Start(context.Background()) mockServer.Start(context.Background())
}() }()
acl, _ := mockServer.GetACL().(*ACL) acl, _ := mockServer.GetACL().(*internal_acl.ACL)
conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port)) conn, err := net.Dial("tcp", fmt.Sprintf("%s:%d", bindAddr, port))
if err != nil { if err != nil {
@@ -1337,21 +1338,21 @@ func Test_HandleList(t *testing.T) {
r := resp.NewConn(conn) r := resp.NewConn(conn)
tests := []struct { tests := []struct {
presetUsers []*User presetUsers []*internal_acl.User
cmd []resp.Value cmd []resp.Value
wantRes []string wantRes []string
wantErr string wantErr string
}{ }{
{ // 1. Get the user and all their details { // 1. Get the user and all their details
presetUsers: []*User{ presetUsers: []*internal_acl.User{
{ {
Username: "list_user_1", Username: "list_user_1",
Enabled: true, Enabled: true,
NoPassword: false, NoPassword: false,
NoKeys: false, NoKeys: false,
Passwords: []Password{ Passwords: []internal_acl.Password{
{PasswordType: PasswordPlainText, PasswordValue: "list_user_password_1"}, {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "list_user_password_1"},
{PasswordType: PasswordSHA256, PasswordValue: generateSHA256Password("list_user_password_2")}, {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("list_user_password_2")},
}, },
IncludedCategories: []string{utils.WriteCategory, utils.ReadCategory, utils.PubSubCategory}, IncludedCategories: []string{utils.WriteCategory, utils.ReadCategory, utils.PubSubCategory},
ExcludedCategories: []string{utils.AdminCategory, utils.ConnectionCategory, utils.DangerousCategory}, ExcludedCategories: []string{utils.AdminCategory, utils.ConnectionCategory, utils.DangerousCategory},
@@ -1367,7 +1368,7 @@ func Test_HandleList(t *testing.T) {
Enabled: true, Enabled: true,
NoPassword: true, NoPassword: true,
NoKeys: true, NoKeys: true,
Passwords: []Password{}, Passwords: []internal_acl.Password{},
IncludedCategories: []string{utils.WriteCategory, utils.ReadCategory, utils.PubSubCategory}, IncludedCategories: []string{utils.WriteCategory, utils.ReadCategory, utils.PubSubCategory},
ExcludedCategories: []string{utils.AdminCategory, utils.ConnectionCategory, utils.DangerousCategory}, ExcludedCategories: []string{utils.AdminCategory, utils.ConnectionCategory, utils.DangerousCategory},
IncludedCommands: []string{"acl|setuser", "acl|getuser", "acl|deluser"}, IncludedCommands: []string{"acl|setuser", "acl|getuser", "acl|deluser"},
@@ -1382,9 +1383,9 @@ func Test_HandleList(t *testing.T) {
Enabled: true, Enabled: true,
NoPassword: false, NoPassword: false,
NoKeys: false, NoKeys: false,
Passwords: []Password{ Passwords: []internal_acl.Password{
{PasswordType: PasswordPlainText, PasswordValue: "list_user_password_3"}, {PasswordType: internal_acl.PasswordPlainText, PasswordValue: "list_user_password_3"},
{PasswordType: PasswordSHA256, PasswordValue: generateSHA256Password("list_user_password_4")}, {PasswordType: internal_acl.PasswordSHA256, PasswordValue: generateSHA256Password("list_user_password_4")},
}, },
IncludedCategories: []string{utils.WriteCategory, utils.ReadCategory, utils.PubSubCategory}, IncludedCategories: []string{utils.WriteCategory, utils.ReadCategory, utils.PubSubCategory},
ExcludedCategories: []string{utils.AdminCategory, utils.ConnectionCategory, utils.DangerousCategory}, ExcludedCategories: []string{utils.AdminCategory, utils.ConnectionCategory, utils.DangerousCategory},

View File

@@ -18,7 +18,7 @@ import (
"bytes" "bytes"
"context" "context"
"fmt" "fmt"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/pkg/echovault" "github.com/echovault/echovault/pkg/echovault"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/pkg/utils"
"github.com/tidwall/resp" "github.com/tidwall/resp"
@@ -27,7 +27,7 @@ import (
func Test_CommandsHandler(t *testing.T) { func Test_CommandsHandler(t *testing.T) {
mockServer := echovault.NewEchoVault( mockServer := echovault.NewEchoVault(
echovault.WithConfig(internal.Config{ echovault.WithConfig(config.Config{
DataDir: "", DataDir: "",
EvictionPolicy: utils.NoEviction, EvictionPolicy: utils.NoEviction,
}), }),

View File

@@ -18,7 +18,7 @@ import (
"bytes" "bytes"
"context" "context"
"errors" "errors"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/pkg/echovault" "github.com/echovault/echovault/pkg/echovault"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/pkg/utils"
"github.com/tidwall/resp" "github.com/tidwall/resp"
@@ -29,7 +29,7 @@ var mockServer *echovault.EchoVault
func init() { func init() {
mockServer = echovault.NewEchoVault( mockServer = echovault.NewEchoVault(
echovault.WithConfig(internal.Config{ echovault.WithConfig(config.Config{
DataDir: "", DataDir: "",
EvictionPolicy: utils.NoEviction, EvictionPolicy: utils.NoEviction,
}), }),

View File

@@ -19,7 +19,7 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/pkg/echovault" "github.com/echovault/echovault/pkg/echovault"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/pkg/utils"
"github.com/tidwall/resp" "github.com/tidwall/resp"
@@ -31,7 +31,7 @@ var mockServer *echovault.EchoVault
func init() { func init() {
mockServer = echovault.NewEchoVault( mockServer = echovault.NewEchoVault(
echovault.WithConfig(internal.Config{ echovault.WithConfig(config.Config{
DataDir: "", DataDir: "",
EvictionPolicy: utils.NoEviction, EvictionPolicy: utils.NoEviction,
}), }),

View File

@@ -19,7 +19,7 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/pkg/echovault" "github.com/echovault/echovault/pkg/echovault"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/pkg/utils"
"github.com/tidwall/resp" "github.com/tidwall/resp"
@@ -31,7 +31,7 @@ var mockServer *echovault.EchoVault
func init() { func init() {
mockServer = echovault.NewEchoVault( mockServer = echovault.NewEchoVault(
echovault.WithConfig(internal.Config{ echovault.WithConfig(config.Config{
DataDir: "", DataDir: "",
EvictionPolicy: utils.NoEviction, EvictionPolicy: utils.NoEviction,
}), }),

View File

@@ -19,7 +19,7 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/pkg/echovault" "github.com/echovault/echovault/pkg/echovault"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/pkg/utils"
"github.com/tidwall/resp" "github.com/tidwall/resp"
@@ -30,7 +30,7 @@ var mockServer *echovault.EchoVault
func init() { func init() {
mockServer = echovault.NewEchoVault( mockServer = echovault.NewEchoVault(
echovault.WithConfig(internal.Config{ echovault.WithConfig(config.Config{
DataDir: "", DataDir: "",
EvictionPolicy: utils.NoEviction, EvictionPolicy: utils.NoEviction,
}), }),

View File

@@ -18,13 +18,14 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
internal_pubsub "github.com/echovault/echovault/internal/pubsub"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/pkg/utils"
"net" "net"
"strings" "strings"
) )
func handleSubscribe(ctx context.Context, cmd []string, server utils.EchoVault, conn *net.Conn) ([]byte, error) { func handleSubscribe(ctx context.Context, cmd []string, server utils.EchoVault, conn *net.Conn) ([]byte, error) {
pubsub, ok := server.GetPubSub().(*PubSub) pubsub, ok := server.GetPubSub().(*internal_pubsub.PubSub)
if !ok { if !ok {
return nil, errors.New("could not load pubsub module") return nil, errors.New("could not load pubsub module")
} }
@@ -42,7 +43,7 @@ func handleSubscribe(ctx context.Context, cmd []string, server utils.EchoVault,
} }
func handleUnsubscribe(ctx context.Context, cmd []string, server utils.EchoVault, conn *net.Conn) ([]byte, error) { func handleUnsubscribe(ctx context.Context, cmd []string, server utils.EchoVault, conn *net.Conn) ([]byte, error) {
pubsub, ok := server.GetPubSub().(*PubSub) pubsub, ok := server.GetPubSub().(*internal_pubsub.PubSub)
if !ok { if !ok {
return nil, errors.New("could not load pubsub module") return nil, errors.New("could not load pubsub module")
} }
@@ -55,7 +56,7 @@ func handleUnsubscribe(ctx context.Context, cmd []string, server utils.EchoVault
} }
func handlePublish(ctx context.Context, cmd []string, server utils.EchoVault, _ *net.Conn) ([]byte, error) { func handlePublish(ctx context.Context, cmd []string, server utils.EchoVault, _ *net.Conn) ([]byte, error) {
pubsub, ok := server.GetPubSub().(*PubSub) pubsub, ok := server.GetPubSub().(*internal_pubsub.PubSub)
if !ok { if !ok {
return nil, errors.New("could not load pubsub module") return nil, errors.New("could not load pubsub module")
} }
@@ -71,7 +72,7 @@ func handlePubSubChannels(_ context.Context, cmd []string, server utils.EchoVaul
return nil, errors.New(utils.WrongArgsResponse) return nil, errors.New(utils.WrongArgsResponse)
} }
pubsub, ok := server.GetPubSub().(*PubSub) pubsub, ok := server.GetPubSub().(*internal_pubsub.PubSub)
if !ok { if !ok {
return nil, errors.New("could not load pubsub module") return nil, errors.New("could not load pubsub module")
} }
@@ -85,7 +86,7 @@ func handlePubSubChannels(_ context.Context, cmd []string, server utils.EchoVaul
} }
func handlePubSubNumPat(_ context.Context, _ []string, server utils.EchoVault, _ *net.Conn) ([]byte, error) { func handlePubSubNumPat(_ context.Context, _ []string, server utils.EchoVault, _ *net.Conn) ([]byte, error) {
pubsub, ok := server.GetPubSub().(*PubSub) pubsub, ok := server.GetPubSub().(*internal_pubsub.PubSub)
if !ok { if !ok {
return nil, errors.New("could not load pubsub module") return nil, errors.New("could not load pubsub module")
} }
@@ -94,7 +95,7 @@ func handlePubSubNumPat(_ context.Context, _ []string, server utils.EchoVault, _
} }
func handlePubSubNumSubs(_ context.Context, cmd []string, server utils.EchoVault, _ *net.Conn) ([]byte, error) { func handlePubSubNumSubs(_ context.Context, cmd []string, server utils.EchoVault, _ *net.Conn) ([]byte, error) {
pubsub, ok := server.GetPubSub().(*PubSub) pubsub, ok := server.GetPubSub().(*internal_pubsub.PubSub)
if !ok { if !ok {
return nil, errors.New("could not load pubsub module") return nil, errors.New("could not load pubsub module")
} }

View File

@@ -18,7 +18,8 @@ import (
"bytes" "bytes"
"context" "context"
"fmt" "fmt"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal/config"
internal_pubsub "github.com/echovault/echovault/internal/pubsub"
"github.com/echovault/echovault/pkg/echovault" "github.com/echovault/echovault/pkg/echovault"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/pkg/utils"
"github.com/tidwall/resp" "github.com/tidwall/resp"
@@ -28,25 +29,24 @@ import (
"time" "time"
) )
var pubsub *PubSub var pubsub *internal_pubsub.PubSub
var mockServer *echovault.EchoVault var mockServer *echovault.EchoVault
var bindAddr = "localhost" var bindAddr = "localhost"
var port uint16 = 7490 var port uint16 = 7490
func init() { func init() {
pubsub = NewPubSub() mockServer = setUpServer(bindAddr, port)
mockServer = setUpServer(pubsub, bindAddr, port) pubsub = mockServer.GetPubSub().(*internal_pubsub.PubSub)
go func() { go func() {
mockServer.Start(context.Background()) mockServer.Start(context.Background())
}() }()
} }
func setUpServer(pubsub *PubSub, bindAddr string, port uint16) *echovault.EchoVault { func setUpServer(bindAddr string, port uint16) *echovault.EchoVault {
return echovault.NewEchoVault( return echovault.NewEchoVault(
echovault.WithPubSub(pubsub),
echovault.WithCommands(Commands()), echovault.WithCommands(Commands()),
echovault.WithConfig(internal.Config{ echovault.WithConfig(config.Config{
BindAddr: bindAddr, BindAddr: bindAddr,
Port: port, Port: port,
DataDir: "", DataDir: "",
@@ -85,20 +85,20 @@ func Test_HandleSubscribe(t *testing.T) {
} }
for _, channel := range channels { for _, channel := range channels {
// Check if the channel exists in the pubsub module // Check if the channel exists in the pubsub module
if !slices.ContainsFunc(pubsub.channels, func(c *Channel) bool { if !slices.ContainsFunc(pubsub.GetAllChannels(), func(c *internal_pubsub.Channel) bool {
return c.name == channel return c.Name() == channel
}) { }) {
t.Errorf("expected pubsub to contain channel \"%s\" but it was not found", channel) t.Errorf("expected pubsub to contain channel \"%s\" but it was not found", channel)
} }
for _, c := range pubsub.channels { for _, c := range pubsub.GetAllChannels() {
if c.name == channel { if c.Name() == channel {
// Check if channel has nil pattern // Check if channel has nil pattern
if c.pattern != nil { if c.Pattern() != nil {
t.Errorf("expected channel \"%s\" to have nil pattern, found pattern \"%s\"", channel, c.name) t.Errorf("expected channel \"%s\" to have nil pattern, found pattern \"%s\"", channel, c.Name())
} }
// Check if the channel has all the connections from above // Check if the channel has all the connections from above
for _, conn := range connections { for _, conn := range connections {
if _, ok := c.subscribers[conn]; !ok { if _, ok := c.Subscribers()[conn]; !ok {
t.Errorf("could not find all expected connection in the \"%s\"", channel) t.Errorf("could not find all expected connection in the \"%s\"", channel)
} }
} }
@@ -115,20 +115,20 @@ func Test_HandleSubscribe(t *testing.T) {
} }
for _, pattern := range patterns { for _, pattern := range patterns {
// Check if pattern channel exists in pubsub module // Check if pattern channel exists in pubsub module
if !slices.ContainsFunc(pubsub.channels, func(c *Channel) bool { if !slices.ContainsFunc(pubsub.GetAllChannels(), func(c *internal_pubsub.Channel) bool {
return c.name == pattern return c.Name() == pattern
}) { }) {
t.Errorf("expected pubsub to contain pattern channel \"%s\" but it was not found", pattern) t.Errorf("expected pubsub to contain pattern channel \"%s\" but it was not found", pattern)
} }
for _, c := range pubsub.channels { for _, c := range pubsub.GetAllChannels() {
if c.name == pattern { if c.Name() == pattern {
// Check if channel has non-nil pattern // Check if channel has non-nil pattern
if c.pattern == nil { if c.Pattern() == nil {
t.Errorf("expected channel \"%s\" to have pattern \"%s\", found nil pattern", pattern, c.name) t.Errorf("expected channel \"%s\" to have pattern \"%s\", found nil pattern", pattern, c.Name())
} }
// Check if the channel has all the connections from above // Check if the channel has all the connections from above
for _, conn := range connections { for _, conn := range connections {
if _, ok := c.subscribers[conn]; !ok { if _, ok := c.Subscribers()[conn]; !ok {
t.Errorf("could not find all expected connection in the \"%s\"", pattern) t.Errorf("could not find all expected connection in the \"%s\"", pattern)
} }
} }
@@ -280,14 +280,14 @@ func Test_HandleUnsubscribe(t *testing.T) {
verifyResponse(res, test.expectedResponses["pattern"]) verifyResponse(res, test.expectedResponses["pattern"])
for _, channel := range append(test.unSubChannels, test.unSubPatterns...) { for _, channel := range append(test.unSubChannels, test.unSubPatterns...) {
for _, pubsubChannel := range pubsub.channels { for _, pubsubChannel := range pubsub.GetAllChannels() {
if pubsubChannel.name == channel { if pubsubChannel.Name() == channel {
// Assert that target connection is no longer in the unsub channels and patterns // Assert that target connection is no longer in the unsub channels and patterns
if _, ok := pubsubChannel.subscribers[test.targetConn]; ok { if _, ok := pubsubChannel.Subscribers()[test.targetConn]; ok {
t.Errorf("found unexpected target connection after unsubscrining in channel \"%s\"", channel) t.Errorf("found unexpected target connection after unsubscrining in channel \"%s\"", channel)
} }
for _, conn := range test.otherConnections { for _, conn := range test.otherConnections {
if _, ok := pubsubChannel.subscribers[conn]; !ok { if _, ok := pubsubChannel.Subscribers()[conn]; !ok {
t.Errorf("did not find expected other connection in channel \"%s\"", channel) t.Errorf("did not find expected other connection in channel \"%s\"", channel)
} }
} }
@@ -297,9 +297,9 @@ func Test_HandleUnsubscribe(t *testing.T) {
// Assert that the target connection is still in the remain channels and patterns // Assert that the target connection is still in the remain channels and patterns
for _, channel := range append(test.remainChannels, test.remainPatterns...) { for _, channel := range append(test.remainChannels, test.remainPatterns...) {
for _, pubsubChannel := range pubsub.channels { for _, pubsubChannel := range pubsub.GetAllChannels() {
if pubsubChannel.name == channel { if pubsubChannel.Name() == channel {
if _, ok := pubsubChannel.subscribers[test.targetConn]; !ok { if _, ok := pubsubChannel.Subscribers()[test.targetConn]; !ok {
t.Errorf("could not find expected target connection in channel \"%s\"", channel) t.Errorf("could not find expected target connection in channel \"%s\"", channel)
} }
} }
@@ -496,8 +496,7 @@ func Test_HandlePubSubChannels(t *testing.T) {
go func() { go func() {
// Create separate mock echovault for this test // Create separate mock echovault for this test
var port uint16 = 7590 var port uint16 = 7590
pubsub = NewPubSub() mockServer := setUpServer(bindAddr, port)
mockServer := setUpServer(pubsub, bindAddr, port)
ctx := context.WithValue(context.Background(), "test_name", "PUBSUB CHANNELS") ctx := context.WithValue(context.Background(), "test_name", "PUBSUB CHANNELS")
@@ -632,8 +631,7 @@ func Test_HandleNumPat(t *testing.T) {
go func() { go func() {
// Create separate mock echovault for this test // Create separate mock echovault for this test
var port uint16 = 7591 var port uint16 = 7591
pubsub = NewPubSub() mockServer := setUpServer(bindAddr, port)
mockServer := setUpServer(pubsub, bindAddr, port)
ctx := context.WithValue(context.Background(), "test_name", "PUBSUB NUMPAT") ctx := context.WithValue(context.Background(), "test_name", "PUBSUB NUMPAT")
@@ -727,8 +725,7 @@ func Test_HandleNumSub(t *testing.T) {
go func() { go func() {
// Create separate mock echovault for this test // Create separate mock echovault for this test
var port uint16 = 7591 var port uint16 = 7591
pubsub = NewPubSub() mockServer := setUpServer(bindAddr, port)
mockServer := setUpServer(pubsub, bindAddr, port)
ctx := context.WithValue(context.Background(), "test_name", "PUBSUB NUMSUB") ctx := context.WithValue(context.Background(), "test_name", "PUBSUB NUMSUB")

View File

@@ -19,7 +19,7 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/pkg/echovault" "github.com/echovault/echovault/pkg/echovault"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/pkg/utils"
"github.com/tidwall/resp" "github.com/tidwall/resp"
@@ -31,7 +31,7 @@ var mockServer *echovault.EchoVault
func init() { func init() {
mockServer = echovault.NewEchoVault( mockServer = echovault.NewEchoVault(
echovault.WithConfig(internal.Config{ echovault.WithConfig(config.Config{
DataDir: "", DataDir: "",
EvictionPolicy: utils.NoEviction, EvictionPolicy: utils.NoEviction,
}), }),

View File

@@ -19,7 +19,7 @@ import (
"context" "context"
"errors" "errors"
"fmt" "fmt"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/pkg/echovault" "github.com/echovault/echovault/pkg/echovault"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/pkg/utils"
"github.com/tidwall/resp" "github.com/tidwall/resp"
@@ -33,7 +33,7 @@ var mockServer *echovault.EchoVault
func init() { func init() {
mockServer = echovault.NewEchoVault( mockServer = echovault.NewEchoVault(
echovault.WithConfig(internal.Config{ echovault.WithConfig(config.Config{
DataDir: "", DataDir: "",
EvictionPolicy: utils.NoEviction, EvictionPolicy: utils.NoEviction,
}), }),

View File

@@ -20,6 +20,7 @@ import (
"errors" "errors"
"fmt" "fmt"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/pkg/echovault" "github.com/echovault/echovault/pkg/echovault"
"github.com/echovault/echovault/pkg/utils" "github.com/echovault/echovault/pkg/utils"
"github.com/tidwall/resp" "github.com/tidwall/resp"
@@ -31,7 +32,7 @@ var mockServer *echovault.EchoVault
func init() { func init() {
mockServer = echovault.NewEchoVault( mockServer = echovault.NewEchoVault(
echovault.WithConfig(internal.Config{ echovault.WithConfig(config.Config{
DataDir: "", DataDir: "",
EvictionPolicy: utils.NoEviction, EvictionPolicy: utils.NoEviction,
}), }),