Added makefile command to build modules for admins module tests.

Implemented more sensible logic for testing the COMMANDS command instead of just printing each returned command.
Implemented tests for MODULE LOAD, MODULE UNLOAD, and MODULE LIST commands.
Implemented testdata folder cleanup after finishing admin command tests.
This commit is contained in:
Kelvin Clement Mwinuka
2024-05-08 23:17:45 +08:00
parent 291d4e9451
commit d28bda98bb
9 changed files with 853 additions and 372 deletions

View File

@@ -13,10 +13,11 @@ run:
make build && docker-compose up --build make build && docker-compose up --build
test-unit: test-unit:
env CGO_ENABLED=1 CC=x86_64-linux-musl-gcc GOOS=linux GOARCH=amd64 DEST=internal/modules/admin/testdata/modules make build-modules && \ CGO_ENABLED=1 go build -buildmode=plugin -o internal/modules/admin/testdata/modules/module_set/module_set.so ./volumes/modules/module_set/module_set.go && \
CGO_ENABLED=1 go build -buildmode=plugin -o internal/modules/admin/testdata/modules/module_get/module_get.so ./volumes/modules/module_get/module_get.go && \
go clean -testcache && \ go clean -testcache && \
env CGO_ENABLED=1 go test ./... -coverprofile coverage/coverage.out CGO_ENABLED=1 go test ./... -coverprofile coverage/coverage.out
test-race: test-race:
env CGO_ENABLED=1 CC=x86_64-linux-musl-gcc GOOS=linux GOARCH=amd64 DEST=internal/modules/admin/testdata/modules make build-modules && \
go clean -testcache && go test ./... --race go clean -testcache && go test ./... --race

View File

@@ -959,48 +959,50 @@ github.com/echovault/echovault/echovault/modules.go:131.3,131.18 1 0
github.com/echovault/echovault/echovault/modules.go:135.2,135.34 1 0 github.com/echovault/echovault/echovault/modules.go:135.2,135.34 1 0
github.com/echovault/echovault/echovault/modules.go:135.34,138.3 2 0 github.com/echovault/echovault/echovault/modules.go:135.34,138.3 2 0
github.com/echovault/echovault/echovault/modules.go:140.2,140.72 1 0 github.com/echovault/echovault/echovault/modules.go:140.2,140.72 1 0
github.com/echovault/echovault/echovault/plugin.go:35.72,37.16 2 0 github.com/echovault/echovault/echovault/plugin.go:35.72,40.16 4 0
github.com/echovault/echovault/echovault/plugin.go:37.16,39.3 1 0 github.com/echovault/echovault/echovault/plugin.go:40.16,42.3 1 0
github.com/echovault/echovault/echovault/plugin.go:41.2,42.16 2 0 github.com/echovault/echovault/echovault/plugin.go:44.2,45.16 2 0
github.com/echovault/echovault/echovault/plugin.go:42.16,44.3 1 0 github.com/echovault/echovault/echovault/plugin.go:45.16,47.3 1 0
github.com/echovault/echovault/echovault/plugin.go:45.2,46.9 2 0 github.com/echovault/echovault/echovault/plugin.go:48.2,49.9 2 0
github.com/echovault/echovault/echovault/plugin.go:46.9,48.3 1 0 github.com/echovault/echovault/echovault/plugin.go:49.9,51.3 1 0
github.com/echovault/echovault/echovault/plugin.go:50.2,51.16 2 0 github.com/echovault/echovault/echovault/plugin.go:53.2,54.16 2 0
github.com/echovault/echovault/echovault/plugin.go:51.16,53.3 1 0 github.com/echovault/echovault/echovault/plugin.go:54.16,56.3 1 0
github.com/echovault/echovault/echovault/plugin.go:54.2,55.9 2 0 github.com/echovault/echovault/echovault/plugin.go:57.2,58.9 2 0
github.com/echovault/echovault/echovault/plugin.go:55.9,57.3 1 0 github.com/echovault/echovault/echovault/plugin.go:58.9,60.3 1 0
github.com/echovault/echovault/echovault/plugin.go:59.2,60.16 2 0 github.com/echovault/echovault/echovault/plugin.go:62.2,63.16 2 0
github.com/echovault/echovault/echovault/plugin.go:60.16,62.3 1 0 github.com/echovault/echovault/echovault/plugin.go:63.16,65.3 1 0
github.com/echovault/echovault/echovault/plugin.go:63.2,64.9 2 0 github.com/echovault/echovault/echovault/plugin.go:66.2,67.9 2 0
github.com/echovault/echovault/echovault/plugin.go:64.9,66.3 1 0 github.com/echovault/echovault/echovault/plugin.go:67.9,69.3 1 0
github.com/echovault/echovault/echovault/plugin.go:68.2,69.16 2 0 github.com/echovault/echovault/echovault/plugin.go:71.2,72.16 2 0
github.com/echovault/echovault/echovault/plugin.go:69.16,71.3 1 0 github.com/echovault/echovault/echovault/plugin.go:72.16,74.3 1 0
github.com/echovault/echovault/echovault/plugin.go:72.2,73.9 2 0 github.com/echovault/echovault/echovault/plugin.go:75.2,76.9 2 0
github.com/echovault/echovault/echovault/plugin.go:73.9,75.3 1 0 github.com/echovault/echovault/echovault/plugin.go:76.9,78.3 1 0
github.com/echovault/echovault/echovault/plugin.go:77.2,78.16 2 0 github.com/echovault/echovault/echovault/plugin.go:80.2,81.16 2 0
github.com/echovault/echovault/echovault/plugin.go:78.16,80.3 1 0 github.com/echovault/echovault/echovault/plugin.go:81.16,83.3 1 0
github.com/echovault/echovault/echovault/plugin.go:81.2,82.9 2 0 github.com/echovault/echovault/echovault/plugin.go:84.2,85.9 2 0
github.com/echovault/echovault/echovault/plugin.go:82.9,84.3 1 0 github.com/echovault/echovault/echovault/plugin.go:85.9,87.3 1 0
github.com/echovault/echovault/echovault/plugin.go:86.2,87.16 2 0 github.com/echovault/echovault/echovault/plugin.go:89.2,90.16 2 0
github.com/echovault/echovault/echovault/plugin.go:87.16,89.3 1 0 github.com/echovault/echovault/echovault/plugin.go:90.16,92.3 1 0
github.com/echovault/echovault/echovault/plugin.go:90.2,103.9 2 0 github.com/echovault/echovault/echovault/plugin.go:93.2,106.9 2 0
github.com/echovault/echovault/echovault/plugin.go:103.9,105.3 1 0 github.com/echovault/echovault/echovault/plugin.go:106.9,108.3 1 0
github.com/echovault/echovault/echovault/plugin.go:107.2,113.31 3 0 github.com/echovault/echovault/echovault/plugin.go:111.2,111.91 1 0
github.com/echovault/echovault/echovault/plugin.go:113.31,116.36 2 0 github.com/echovault/echovault/echovault/plugin.go:111.91,113.3 1 0
github.com/echovault/echovault/echovault/plugin.go:116.36,118.5 1 0 github.com/echovault/echovault/echovault/plugin.go:116.2,119.31 1 0
github.com/echovault/echovault/echovault/plugin.go:119.4,119.15 1 0 github.com/echovault/echovault/echovault/plugin.go:119.31,122.36 2 0
github.com/echovault/echovault/echovault/plugin.go:124.83,126.18 2 0 github.com/echovault/echovault/echovault/plugin.go:122.36,124.5 1 0
github.com/echovault/echovault/echovault/plugin.go:126.18,128.5 1 0 github.com/echovault/echovault/echovault/plugin.go:125.4,125.15 1 0
github.com/echovault/echovault/echovault/plugin.go:129.4,133.10 1 0 github.com/echovault/echovault/echovault/plugin.go:130.83,132.18 2 0
github.com/echovault/echovault/echovault/plugin.go:135.72,148.4 1 0 github.com/echovault/echovault/echovault/plugin.go:132.18,134.5 1 0
github.com/echovault/echovault/echovault/plugin.go:151.2,151.12 1 0 github.com/echovault/echovault/echovault/plugin.go:135.4,139.10 1 0
github.com/echovault/echovault/echovault/plugin.go:159.54,162.91 3 0 github.com/echovault/echovault/echovault/plugin.go:141.72,155.4 1 0
github.com/echovault/echovault/echovault/plugin.go:162.91,164.3 1 0 github.com/echovault/echovault/echovault/plugin.go:158.2,158.12 1 0
github.com/echovault/echovault/echovault/plugin.go:170.49,174.42 4 0 github.com/echovault/echovault/echovault/plugin.go:166.54,169.91 3 0
github.com/echovault/echovault/echovault/plugin.go:174.42,175.61 1 0 github.com/echovault/echovault/echovault/plugin.go:169.91,171.3 1 0
github.com/echovault/echovault/echovault/plugin.go:175.61,177.4 1 0 github.com/echovault/echovault/echovault/plugin.go:177.49,181.42 4 0
github.com/echovault/echovault/echovault/plugin.go:177.6,179.4 1 0 github.com/echovault/echovault/echovault/plugin.go:181.42,182.61 1 0
github.com/echovault/echovault/echovault/plugin.go:181.2,181.16 1 0 github.com/echovault/echovault/echovault/plugin.go:182.61,184.4 1 0
github.com/echovault/echovault/echovault/plugin.go:184.6,186.4 1 0
github.com/echovault/echovault/echovault/plugin.go:188.2,188.16 1 0
github.com/echovault/echovault/echovault/test_helpers.go:9.35,16.2 2 1 github.com/echovault/echovault/echovault/test_helpers.go:9.35,16.2 2 1
github.com/echovault/echovault/echovault/test_helpers.go:18.95,19.61 1 1 github.com/echovault/echovault/echovault/test_helpers.go:18.95,19.61 1 1
github.com/echovault/echovault/echovault/test_helpers.go:19.61,21.3 1 0 github.com/echovault/echovault/echovault/test_helpers.go:19.61,21.3 1 0
@@ -1008,54 +1010,6 @@ github.com/echovault/echovault/echovault/test_helpers.go:22.2,22.57 1 1
github.com/echovault/echovault/echovault/test_helpers.go:22.57,24.3 1 0 github.com/echovault/echovault/echovault/test_helpers.go:22.57,24.3 1 0
github.com/echovault/echovault/echovault/test_helpers.go:25.2,26.12 2 1 github.com/echovault/echovault/echovault/test_helpers.go:25.2,26.12 2 1
github.com/echovault/echovault/echovault/test_helpers.go:29.95,34.2 4 1 github.com/echovault/echovault/echovault/test_helpers.go:29.95,34.2 4 1
github.com/echovault/echovault/internal/aof/engine.go:50.56,51.30 1 1
github.com/echovault/echovault/internal/aof/engine.go:51.30,53.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:56.57,57.30 1 1
github.com/echovault/echovault/internal/aof/engine.go:57.30,59.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:62.59,63.30 1 1
github.com/echovault/echovault/internal/aof/engine.go:63.30,65.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:68.58,69.30 1 1
github.com/echovault/echovault/internal/aof/engine.go:69.30,71.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:74.59,75.30 1 1
github.com/echovault/echovault/internal/aof/engine.go:75.30,77.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:80.82,81.30 1 1
github.com/echovault/echovault/internal/aof/engine.go:81.30,83.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:86.89,87.30 1 1
github.com/echovault/echovault/internal/aof/engine.go:87.30,89.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:92.73,93.30 1 1
github.com/echovault/echovault/internal/aof/engine.go:93.30,95.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:98.82,99.30 1 1
github.com/echovault/echovault/internal/aof/engine.go:99.30,101.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:104.78,105.30 1 1
github.com/echovault/echovault/internal/aof/engine.go:105.30,107.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:110.69,118.29 1 1
github.com/echovault/echovault/internal/aof/engine.go:118.30,118.31 0 0
github.com/echovault/echovault/internal/aof/engine.go:119.30,119.31 0 0
github.com/echovault/echovault/internal/aof/engine.go:120.57,120.71 1 0
github.com/echovault/echovault/internal/aof/engine.go:121.63,121.64 0 0
github.com/echovault/echovault/internal/aof/engine.go:122.44,122.45 0 0
github.com/echovault/echovault/internal/aof/engine.go:127.2,127.33 1 1
github.com/echovault/echovault/internal/aof/engine.go:127.33,129.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:132.2,139.16 2 1
github.com/echovault/echovault/internal/aof/engine.go:139.16,141.3 1 0
github.com/echovault/echovault/internal/aof/engine.go:142.2,152.16 3 1
github.com/echovault/echovault/internal/aof/engine.go:152.16,154.3 1 0
github.com/echovault/echovault/internal/aof/engine.go:155.2,159.12 2 1
github.com/echovault/echovault/internal/aof/engine.go:159.12,160.7 1 1
github.com/echovault/echovault/internal/aof/engine.go:160.7,162.54 2 1
github.com/echovault/echovault/internal/aof/engine.go:162.54,164.5 1 0
github.com/echovault/echovault/internal/aof/engine.go:168.2,168.20 1 1
github.com/echovault/echovault/internal/aof/engine.go:171.52,173.2 1 1
github.com/echovault/echovault/internal/aof/engine.go:175.42,183.62 5 1
github.com/echovault/echovault/internal/aof/engine.go:183.62,185.3 1 0
github.com/echovault/echovault/internal/aof/engine.go:188.2,188.54 1 1
github.com/echovault/echovault/internal/aof/engine.go:188.54,190.3 1 0
github.com/echovault/echovault/internal/aof/engine.go:192.2,192.12 1 1
github.com/echovault/echovault/internal/aof/engine.go:195.39,196.55 1 1
github.com/echovault/echovault/internal/aof/engine.go:196.55,198.3 1 0
github.com/echovault/echovault/internal/aof/engine.go:199.2,199.53 1 1
github.com/echovault/echovault/internal/aof/engine.go:199.53,201.3 1 0
github.com/echovault/echovault/internal/aof/engine.go:202.2,202.12 1 1
github.com/echovault/echovault/internal/aof/log/store.go:46.60,47.34 1 1 github.com/echovault/echovault/internal/aof/log/store.go:46.60,47.34 1 1
github.com/echovault/echovault/internal/aof/log/store.go:47.34,49.3 1 1 github.com/echovault/echovault/internal/aof/log/store.go:47.34,49.3 1 1
github.com/echovault/echovault/internal/aof/log/store.go:52.61,53.34 1 1 github.com/echovault/echovault/internal/aof/log/store.go:52.61,53.34 1 1
@@ -1080,7 +1034,7 @@ github.com/echovault/echovault/internal/aof/log/store.go:106.2,106.51 1 1
github.com/echovault/echovault/internal/aof/log/store.go:106.51,107.13 1 1 github.com/echovault/echovault/internal/aof/log/store.go:106.51,107.13 1 1
github.com/echovault/echovault/internal/aof/log/store.go:107.13,108.8 1 1 github.com/echovault/echovault/internal/aof/log/store.go:107.13,108.8 1 1
github.com/echovault/echovault/internal/aof/log/store.go:108.8,110.40 2 1 github.com/echovault/echovault/internal/aof/log/store.go:108.8,110.40 2 1
github.com/echovault/echovault/internal/aof/log/store.go:110.40,113.11 3 1 github.com/echovault/echovault/internal/aof/log/store.go:110.40,113.11 3 0
github.com/echovault/echovault/internal/aof/log/store.go:115.5,116.41 2 0 github.com/echovault/echovault/internal/aof/log/store.go:115.5,116.41 2 0
github.com/echovault/echovault/internal/aof/log/store.go:121.2,121.19 1 1 github.com/echovault/echovault/internal/aof/log/store.go:121.2,121.19 1 1
github.com/echovault/echovault/internal/aof/log/store.go:124.55,126.21 1 1 github.com/echovault/echovault/internal/aof/log/store.go:124.55,126.21 1 1
@@ -1200,6 +1154,54 @@ github.com/echovault/echovault/internal/eviction/lru.go:92.73,94.3 1 0
github.com/echovault/echovault/internal/eviction/lru.go:95.2,95.19 1 0 github.com/echovault/echovault/internal/eviction/lru.go:95.2,95.19 1 0
github.com/echovault/echovault/internal/eviction/lru.go:95.19,97.3 1 0 github.com/echovault/echovault/internal/eviction/lru.go:95.19,97.3 1 0
github.com/echovault/echovault/internal/eviction/lru.go:100.50,103.2 2 1 github.com/echovault/echovault/internal/eviction/lru.go:100.50,103.2 2 1
github.com/echovault/echovault/internal/aof/engine.go:50.56,51.30 1 1
github.com/echovault/echovault/internal/aof/engine.go:51.30,53.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:56.57,57.30 1 1
github.com/echovault/echovault/internal/aof/engine.go:57.30,59.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:62.59,63.30 1 1
github.com/echovault/echovault/internal/aof/engine.go:63.30,65.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:68.58,69.30 1 1
github.com/echovault/echovault/internal/aof/engine.go:69.30,71.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:74.59,75.30 1 1
github.com/echovault/echovault/internal/aof/engine.go:75.30,77.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:80.82,81.30 1 1
github.com/echovault/echovault/internal/aof/engine.go:81.30,83.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:86.89,87.30 1 1
github.com/echovault/echovault/internal/aof/engine.go:87.30,89.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:92.73,93.30 1 1
github.com/echovault/echovault/internal/aof/engine.go:93.30,95.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:98.82,99.30 1 1
github.com/echovault/echovault/internal/aof/engine.go:99.30,101.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:104.78,105.30 1 1
github.com/echovault/echovault/internal/aof/engine.go:105.30,107.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:110.69,118.29 1 1
github.com/echovault/echovault/internal/aof/engine.go:118.30,118.31 0 0
github.com/echovault/echovault/internal/aof/engine.go:119.30,119.31 0 0
github.com/echovault/echovault/internal/aof/engine.go:120.57,120.71 1 0
github.com/echovault/echovault/internal/aof/engine.go:121.63,121.64 0 0
github.com/echovault/echovault/internal/aof/engine.go:122.44,122.45 0 0
github.com/echovault/echovault/internal/aof/engine.go:127.2,127.33 1 1
github.com/echovault/echovault/internal/aof/engine.go:127.33,129.3 1 1
github.com/echovault/echovault/internal/aof/engine.go:132.2,139.16 2 1
github.com/echovault/echovault/internal/aof/engine.go:139.16,141.3 1 0
github.com/echovault/echovault/internal/aof/engine.go:142.2,152.16 3 1
github.com/echovault/echovault/internal/aof/engine.go:152.16,154.3 1 0
github.com/echovault/echovault/internal/aof/engine.go:155.2,159.12 2 1
github.com/echovault/echovault/internal/aof/engine.go:159.12,160.7 1 1
github.com/echovault/echovault/internal/aof/engine.go:160.7,162.54 2 1
github.com/echovault/echovault/internal/aof/engine.go:162.54,164.5 1 0
github.com/echovault/echovault/internal/aof/engine.go:168.2,168.20 1 1
github.com/echovault/echovault/internal/aof/engine.go:171.52,173.2 1 1
github.com/echovault/echovault/internal/aof/engine.go:175.42,183.62 5 1
github.com/echovault/echovault/internal/aof/engine.go:183.62,185.3 1 0
github.com/echovault/echovault/internal/aof/engine.go:188.2,188.54 1 1
github.com/echovault/echovault/internal/aof/engine.go:188.54,190.3 1 0
github.com/echovault/echovault/internal/aof/engine.go:192.2,192.12 1 1
github.com/echovault/echovault/internal/aof/engine.go:195.39,196.55 1 1
github.com/echovault/echovault/internal/aof/engine.go:196.55,198.3 1 0
github.com/echovault/echovault/internal/aof/engine.go:199.2,199.53 1 1
github.com/echovault/echovault/internal/aof/engine.go:199.53,201.3 1 0
github.com/echovault/echovault/internal/aof/engine.go:202.2,202.12 1 1
github.com/echovault/echovault/internal/modules/acl/acl.go:52.40,57.24 3 1 github.com/echovault/echovault/internal/modules/acl/acl.go:52.40,57.24 3 1
github.com/echovault/echovault/internal/modules/acl/acl.go:57.24,65.3 2 1 github.com/echovault/echovault/internal/modules/acl/acl.go:57.24,65.3 2 1
github.com/echovault/echovault/internal/modules/acl/acl.go:68.2,68.28 1 1 github.com/echovault/echovault/internal/modules/acl/acl.go:68.2,68.28 1 1
@@ -1637,99 +1639,6 @@ github.com/echovault/echovault/internal/modules/acl/user.go:289.40,304.2 1 1
github.com/echovault/echovault/internal/modules/acl/user.go:306.46,307.24 1 1 github.com/echovault/echovault/internal/modules/acl/user.go:306.46,307.24 1 1
github.com/echovault/echovault/internal/modules/acl/user.go:307.24,309.3 1 1 github.com/echovault/echovault/internal/modules/acl/user.go:307.24,309.3 1 1
github.com/echovault/echovault/internal/modules/acl/user.go:310.2,310.26 1 1 github.com/echovault/echovault/internal/modules/acl/user.go:310.2,310.26 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:27.78,33.29 4 1
github.com/echovault/echovault/internal/modules/admin/commands.go:33.29,34.54 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:34.54,40.42 4 1
github.com/echovault/echovault/internal/modules/admin/commands.go:40.42,42.5 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:44.4,47.12 3 1
github.com/echovault/echovault/internal/modules/admin/commands.go:50.3,50.36 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:50.36,57.43 5 1
github.com/echovault/echovault/internal/modules/admin/commands.go:57.43,59.5 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:61.4,63.21 2 1
github.com/echovault/echovault/internal/modules/admin/commands.go:67.2,69.25 2 1
github.com/echovault/echovault/internal/modules/admin/commands.go:72.76,76.35 3 0
github.com/echovault/echovault/internal/modules/admin/commands.go:76.35,77.65 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:77.65,78.41 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:78.41,80.5 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:81.4,81.12 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:83.3,83.13 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:86.2,86.51 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:89.75,90.29 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:91.9,96.36 4 0
github.com/echovault/echovault/internal/modules/admin/commands.go:96.36,97.66 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:97.66,98.52 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:98.52,102.6 3 0
github.com/echovault/echovault/internal/modules/admin/commands.go:103.5,103.13 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:105.4,106.14 2 0
github.com/echovault/echovault/internal/modules/admin/commands.go:108.3,109.26 2 0
github.com/echovault/echovault/internal/modules/admin/commands.go:111.9,115.56 3 0
github.com/echovault/echovault/internal/modules/admin/commands.go:115.56,117.4 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:118.3,118.53 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:118.53,122.37 3 0
github.com/echovault/echovault/internal/modules/admin/commands.go:122.37,123.67 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:123.67,124.53 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:124.53,125.59 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:125.59,129.8 3 0
github.com/echovault/echovault/internal/modules/admin/commands.go:131.6,131.14 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:133.5,133.54 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:133.54,136.6 2 0
github.com/echovault/echovault/internal/modules/admin/commands.go:138.9,138.61 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:138.61,142.37 3 0
github.com/echovault/echovault/internal/modules/admin/commands.go:142.37,143.67 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:143.67,144.53 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:144.53,146.24 2 0
github.com/echovault/echovault/internal/modules/admin/commands.go:146.24,149.8 2 0
github.com/echovault/echovault/internal/modules/admin/commands.go:151.6,151.14 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:153.5,153.33 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:153.33,156.6 2 0
github.com/echovault/echovault/internal/modules/admin/commands.go:158.9,158.60 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:158.60,162.37 3 0
github.com/echovault/echovault/internal/modules/admin/commands.go:162.37,163.67 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:163.67,164.53 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:164.53,165.55 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:165.55,169.8 3 0
github.com/echovault/echovault/internal/modules/admin/commands.go:171.6,171.14 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:173.5,173.50 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:173.50,176.6 2 0
github.com/echovault/echovault/internal/modules/admin/commands.go:178.9,180.4 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:181.3,182.26 2 0
github.com/echovault/echovault/internal/modules/admin/commands.go:183.10,184.54 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:188.75,190.2 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:192.36,200.84 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:200.84,204.5 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:213.84,217.5 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:225.86,229.7 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:238.86,242.7 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:252.86,256.7 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:267.84,271.5 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:272.73,273.49 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:273.49,275.6 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:276.5,276.45 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:285.84,289.5 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:290.73,292.18 2 0
github.com/echovault/echovault/internal/modules/admin/commands.go:292.18,294.6 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:295.5,295.53 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:304.84,308.5 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:309.73,310.47 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:310.47,312.6 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:313.5,313.45 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:321.84,325.5 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:335.86,339.7 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:340.75,341.34 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:341.34,343.8 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:344.7,345.34 2 0
github.com/echovault/echovault/internal/modules/admin/commands.go:345.34,347.8 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:348.7,348.75 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:348.75,350.8 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:351.7,351.47 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:360.86,364.7 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:365.75,366.35 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:366.35,368.8 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:369.7,370.47 2 0
github.com/echovault/echovault/internal/modules/admin/commands.go:379.86,383.7 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:384.75,387.38 3 0
github.com/echovault/echovault/internal/modules/admin/commands.go:387.38,389.8 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:390.7,390.30 1 0
github.com/echovault/echovault/internal/modules/connection/commands.go:24.68,25.29 1 1 github.com/echovault/echovault/internal/modules/connection/commands.go:24.68,25.29 1 1
github.com/echovault/echovault/internal/modules/connection/commands.go:26.10,27.54 1 1 github.com/echovault/echovault/internal/modules/connection/commands.go:26.10,27.54 1 1
github.com/echovault/echovault/internal/modules/connection/commands.go:28.9,29.34 1 1 github.com/echovault/echovault/internal/modules/connection/commands.go:28.9,29.34 1 1
@@ -1986,6 +1895,157 @@ github.com/echovault/echovault/internal/modules/generic/utils.go:107.3,109.17 3
github.com/echovault/echovault/internal/modules/generic/utils.go:109.17,111.4 1 1 github.com/echovault/echovault/internal/modules/generic/utils.go:109.17,111.4 1 1
github.com/echovault/echovault/internal/modules/generic/utils.go:112.3,113.55 2 1 github.com/echovault/echovault/internal/modules/generic/utils.go:112.3,113.55 2 1
github.com/echovault/echovault/internal/modules/generic/utils.go:115.10,116.96 1 1 github.com/echovault/echovault/internal/modules/generic/utils.go:115.10,116.96 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:34.51,35.32 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:35.32,37.3 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:41.57,42.32 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:42.32,45.3 2 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:48.61,59.33 3 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:59.33,61.3 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:63.2,63.16 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:66.28,67.12 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:67.12,68.7 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:68.7,73.40 3 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:73.40,74.30 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:74.30,79.21 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:79.21,81.7 1 0
github.com/echovault/echovault/internal/modules/pubsub/channel.go:85.4,85.33 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:90.34,92.2 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:94.40,96.2 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:98.51,101.40 3 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:101.40,103.3 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:104.2,105.11 2 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:108.53,111.40 3 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:111.40,113.3 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:114.2,115.13 2 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:118.44,120.2 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:122.36,129.2 4 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:131.34,138.2 4 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:140.59,145.35 4 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:145.35,147.3 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:149.2,149.20 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:25.73,27.9 2 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:27.9,29.3 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:31.2,33.24 2 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:33.24,35.3 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:37.2,40.17 3 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:43.75,45.9 2 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:45.9,47.3 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:49.2,53.90 3 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:56.71,58.9 2 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:58.9,60.3 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:61.2,61.30 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:61.30,63.3 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:64.2,65.42 2 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:68.78,69.29 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:69.29,71.3 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:73.2,74.9 2 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:74.9,76.3 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:78.2,79.30 2 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:79.30,81.3 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:83.2,83.38 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:86.76,88.9 2 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:88.9,90.3 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:91.2,92.49 2 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:95.77,97.9 2 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:97.9,99.3 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:100.2,100.47 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:103.36,111.84 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:111.84,113.21 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:113.21,115.6 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:116.5,120.11 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:130.84,132.21 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:132.21,134.6 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:135.5,139.11 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:149.84,151.22 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:151.22,153.6 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:154.5,158.11 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:170.84,177.5 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:188.84,194.5 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:203.84,209.5 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:210.68,212.5 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:222.86,228.7 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:237.86,243.7 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:253.86,259.7 1 0
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:33.26,38.2 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:40.101,47.17 5 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:47.17,49.3 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:51.2,51.37 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:51.37,55.75 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:55.75,57.4 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:59.3,59.23 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:59.23,62.19 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:62.19,64.5 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:64.10,66.5 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:67.4,68.31 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:68.31,73.20 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:73.20,75.6 1 0
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:77.4,77.46 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:78.9,80.47 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:80.47,85.20 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:85.20,87.6 1 0
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:93.110,98.17 4 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:98.17,100.3 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:102.2,105.24 3 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:105.24,106.19 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:106.19,109.40 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:109.40,110.31 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:110.31,111.14 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:113.5,113.34 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:113.34,116.6 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:118.9,121.40 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:121.40,122.31 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:122.31,123.14 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:125.5,125.34 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:125.34,128.6 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:136.2,136.38 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:136.38,137.30 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:137.30,138.54 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:138.54,141.5 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:147.2,147.17 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:147.17,148.36 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:148.36,150.40 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:150.40,152.58 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:152.58,153.35 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:153.35,156.7 2 0
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:157.6,157.14 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:160.5,160.30 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:160.30,161.35 1 0
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:161.35,164.7 2 0
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:170.2,171.39 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:171.39,173.3 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:175.2,175.20 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:178.82,182.38 3 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:182.38,184.29 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:184.29,185.35 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:185.35,187.5 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:188.4,188.12 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:191.3,191.41 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:191.41,193.4 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:197.51,204.19 5 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:204.19,205.39 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:205.39,206.26 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:206.26,209.5 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:211.3,212.21 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:215.2,217.38 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:217.38,219.78 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:219.78,222.12 3 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:225.3,225.50 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:225.50,228.4 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:231.2,231.53 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:234.32,239.38 4 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:239.38,240.51 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:240.51,242.4 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:244.2,244.14 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:247.52,252.35 4 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:252.35,254.66 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:254.66,256.4 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:257.3,257.20 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:257.20,259.12 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:261.3,261.106 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:263.2,263.20 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:266.47,271.38 4 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:271.38,273.3 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:275.2,275.17 1 1
github.com/echovault/echovault/internal/modules/hash/commands.go:28.68,30.16 2 1 github.com/echovault/echovault/internal/modules/hash/commands.go:28.68,30.16 2 1
github.com/echovault/echovault/internal/modules/hash/commands.go:30.16,32.3 1 1 github.com/echovault/echovault/internal/modules/hash/commands.go:30.16,32.3 1 1
github.com/echovault/echovault/internal/modules/hash/commands.go:34.2,37.36 3 1 github.com/echovault/echovault/internal/modules/hash/commands.go:34.2,37.36 3 1
@@ -2107,10 +2167,10 @@ github.com/echovault/echovault/internal/modules/hash/commands.go:323.2,323.38 1
github.com/echovault/echovault/internal/modules/hash/commands.go:323.38,325.17 2 1 github.com/echovault/echovault/internal/modules/hash/commands.go:323.38,325.17 2 1
github.com/echovault/echovault/internal/modules/hash/commands.go:325.17,326.41 1 1 github.com/echovault/echovault/internal/modules/hash/commands.go:325.17,326.41 1 1
github.com/echovault/echovault/internal/modules/hash/commands.go:326.41,328.13 2 1 github.com/echovault/echovault/internal/modules/hash/commands.go:326.41,328.13 2 1
github.com/echovault/echovault/internal/modules/hash/commands.go:330.4,330.42 1 1 github.com/echovault/echovault/internal/modules/hash/commands.go:330.4,330.42 1 0
github.com/echovault/echovault/internal/modules/hash/commands.go:330.42,333.13 3 1 github.com/echovault/echovault/internal/modules/hash/commands.go:330.42,333.13 3 0
github.com/echovault/echovault/internal/modules/hash/commands.go:335.4,335.38 1 1 github.com/echovault/echovault/internal/modules/hash/commands.go:335.4,335.38 1 0
github.com/echovault/echovault/internal/modules/hash/commands.go:335.38,337.13 2 1 github.com/echovault/echovault/internal/modules/hash/commands.go:335.38,337.13 2 0
github.com/echovault/echovault/internal/modules/hash/commands.go:342.2,342.25 1 1 github.com/echovault/echovault/internal/modules/hash/commands.go:342.2,342.25 1 1
github.com/echovault/echovault/internal/modules/hash/commands.go:345.68,347.16 2 1 github.com/echovault/echovault/internal/modules/hash/commands.go:345.68,347.16 2 1
github.com/echovault/echovault/internal/modules/hash/commands.go:347.16,349.3 1 1 github.com/echovault/echovault/internal/modules/hash/commands.go:347.16,349.3 1 1
@@ -2469,157 +2529,6 @@ github.com/echovault/echovault/internal/modules/list/key_funcs.go:115.2,119.8 1
github.com/echovault/echovault/internal/modules/list/key_funcs.go:122.75,123.19 1 1 github.com/echovault/echovault/internal/modules/list/key_funcs.go:122.75,123.19 1 1
github.com/echovault/echovault/internal/modules/list/key_funcs.go:123.19,125.3 1 1 github.com/echovault/echovault/internal/modules/list/key_funcs.go:123.19,125.3 1 1
github.com/echovault/echovault/internal/modules/list/key_funcs.go:126.2,130.8 1 1 github.com/echovault/echovault/internal/modules/list/key_funcs.go:126.2,130.8 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:34.51,35.32 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:35.32,37.3 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:41.57,42.32 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:42.32,45.3 2 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:48.61,59.33 3 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:59.33,61.3 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:63.2,63.16 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:66.28,67.12 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:67.12,68.7 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:68.7,73.40 3 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:73.40,74.30 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:74.30,79.21 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:79.21,81.7 1 0
github.com/echovault/echovault/internal/modules/pubsub/channel.go:85.4,85.33 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:90.34,92.2 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:94.40,96.2 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:98.51,101.40 3 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:101.40,103.3 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:104.2,105.11 2 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:108.53,111.40 3 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:111.40,113.3 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:114.2,115.13 2 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:118.44,120.2 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:122.36,129.2 4 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:131.34,138.2 4 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:140.59,145.35 4 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:145.35,147.3 1 1
github.com/echovault/echovault/internal/modules/pubsub/channel.go:149.2,149.20 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:25.73,27.9 2 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:27.9,29.3 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:31.2,33.24 2 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:33.24,35.3 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:37.2,40.17 3 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:43.75,45.9 2 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:45.9,47.3 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:49.2,53.90 3 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:56.71,58.9 2 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:58.9,60.3 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:61.2,61.30 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:61.30,63.3 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:64.2,65.42 2 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:68.78,69.29 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:69.29,71.3 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:73.2,74.9 2 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:74.9,76.3 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:78.2,79.30 2 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:79.30,81.3 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:83.2,83.38 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:86.76,88.9 2 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:88.9,90.3 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:91.2,92.49 2 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:95.77,97.9 2 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:97.9,99.3 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:100.2,100.47 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:103.36,111.84 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:111.84,113.21 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:113.21,115.6 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:116.5,120.11 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:130.84,132.21 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:132.21,134.6 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:135.5,139.11 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:149.84,151.22 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:151.22,153.6 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:154.5,158.11 1 1
github.com/echovault/echovault/internal/modules/pubsub/commands.go:170.84,177.5 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:188.84,194.5 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:203.84,209.5 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:210.68,212.5 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:222.86,228.7 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:237.86,243.7 1 0
github.com/echovault/echovault/internal/modules/pubsub/commands.go:253.86,259.7 1 0
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:33.26,38.2 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:40.101,47.17 5 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:47.17,49.3 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:51.2,51.37 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:51.37,55.75 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:55.75,57.4 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:59.3,59.23 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:59.23,62.19 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:62.19,64.5 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:64.10,66.5 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:67.4,68.31 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:68.31,73.20 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:73.20,75.6 1 0
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:77.4,77.46 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:78.9,80.47 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:80.47,85.20 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:85.20,87.6 1 0
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:93.110,98.17 4 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:98.17,100.3 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:102.2,105.24 3 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:105.24,106.19 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:106.19,109.40 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:109.40,110.31 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:110.31,111.14 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:113.5,113.34 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:113.34,116.6 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:118.9,121.40 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:121.40,122.31 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:122.31,123.14 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:125.5,125.34 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:125.34,128.6 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:136.2,136.38 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:136.38,137.30 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:137.30,138.54 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:138.54,141.5 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:147.2,147.17 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:147.17,148.36 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:148.36,150.40 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:150.40,152.58 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:152.58,153.35 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:153.35,156.7 2 0
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:157.6,157.14 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:160.5,160.30 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:160.30,161.35 1 0
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:161.35,164.7 2 0
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:170.2,171.39 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:171.39,173.3 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:175.2,175.20 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:178.82,182.38 3 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:182.38,184.29 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:184.29,185.35 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:185.35,187.5 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:188.4,188.12 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:191.3,191.41 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:191.41,193.4 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:197.51,204.19 5 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:204.19,205.39 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:205.39,206.26 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:206.26,209.5 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:211.3,212.21 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:215.2,217.38 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:217.38,219.78 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:219.78,222.12 3 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:225.3,225.50 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:225.50,228.4 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:231.2,231.53 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:234.32,239.38 4 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:239.38,240.51 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:240.51,242.4 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:244.2,244.14 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:247.52,252.35 4 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:252.35,254.66 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:254.66,256.4 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:257.3,257.20 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:257.20,259.12 2 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:261.3,261.106 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:263.2,263.20 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:266.47,271.38 4 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:271.38,273.3 1 1
github.com/echovault/echovault/internal/modules/pubsub/pubsub.go:275.2,275.17 1 1
github.com/echovault/echovault/internal/modules/set/commands.go:26.68,28.16 2 1 github.com/echovault/echovault/internal/modules/set/commands.go:26.68,28.16 2 1
github.com/echovault/echovault/internal/modules/set/commands.go:28.16,30.3 1 1 github.com/echovault/echovault/internal/modules/set/commands.go:28.16,30.3 1 1
github.com/echovault/echovault/internal/modules/set/commands.go:32.2,36.44 3 1 github.com/echovault/echovault/internal/modules/set/commands.go:32.2,36.44 3 1
@@ -3030,6 +2939,99 @@ github.com/echovault/echovault/internal/modules/set/set.go:184.31,185.19 1 1
github.com/echovault/echovault/internal/modules/set/set.go:186.9,187.17 1 1 github.com/echovault/echovault/internal/modules/set/set.go:186.9,187.17 1 1
github.com/echovault/echovault/internal/modules/set/set.go:188.9,191.15 3 1 github.com/echovault/echovault/internal/modules/set/set.go:188.9,191.15 3 1
github.com/echovault/echovault/internal/modules/set/set.go:192.10,195.28 3 1 github.com/echovault/echovault/internal/modules/set/set.go:192.10,195.28 3 1
github.com/echovault/echovault/internal/modules/admin/commands.go:27.78,33.29 4 1
github.com/echovault/echovault/internal/modules/admin/commands.go:33.29,34.54 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:34.54,40.42 4 1
github.com/echovault/echovault/internal/modules/admin/commands.go:40.42,42.5 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:44.4,47.12 3 1
github.com/echovault/echovault/internal/modules/admin/commands.go:50.3,50.36 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:50.36,57.43 5 1
github.com/echovault/echovault/internal/modules/admin/commands.go:57.43,59.5 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:61.4,63.21 2 1
github.com/echovault/echovault/internal/modules/admin/commands.go:67.2,69.25 2 1
github.com/echovault/echovault/internal/modules/admin/commands.go:72.76,76.35 3 0
github.com/echovault/echovault/internal/modules/admin/commands.go:76.35,77.65 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:77.65,78.41 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:78.41,80.5 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:81.4,81.12 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:83.3,83.13 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:86.2,86.51 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:89.75,90.29 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:91.9,96.36 4 0
github.com/echovault/echovault/internal/modules/admin/commands.go:96.36,97.66 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:97.66,98.52 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:98.52,102.6 3 0
github.com/echovault/echovault/internal/modules/admin/commands.go:103.5,103.13 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:105.4,106.14 2 0
github.com/echovault/echovault/internal/modules/admin/commands.go:108.3,109.26 2 0
github.com/echovault/echovault/internal/modules/admin/commands.go:111.9,115.56 3 0
github.com/echovault/echovault/internal/modules/admin/commands.go:115.56,117.4 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:118.3,118.53 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:118.53,122.37 3 0
github.com/echovault/echovault/internal/modules/admin/commands.go:122.37,123.67 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:123.67,124.53 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:124.53,125.59 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:125.59,129.8 3 0
github.com/echovault/echovault/internal/modules/admin/commands.go:131.6,131.14 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:133.5,133.54 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:133.54,136.6 2 0
github.com/echovault/echovault/internal/modules/admin/commands.go:138.9,138.61 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:138.61,142.37 3 0
github.com/echovault/echovault/internal/modules/admin/commands.go:142.37,143.67 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:143.67,144.53 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:144.53,146.24 2 0
github.com/echovault/echovault/internal/modules/admin/commands.go:146.24,149.8 2 0
github.com/echovault/echovault/internal/modules/admin/commands.go:151.6,151.14 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:153.5,153.33 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:153.33,156.6 2 0
github.com/echovault/echovault/internal/modules/admin/commands.go:158.9,158.60 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:158.60,162.37 3 0
github.com/echovault/echovault/internal/modules/admin/commands.go:162.37,163.67 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:163.67,164.53 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:164.53,165.55 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:165.55,169.8 3 0
github.com/echovault/echovault/internal/modules/admin/commands.go:171.6,171.14 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:173.5,173.50 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:173.50,176.6 2 0
github.com/echovault/echovault/internal/modules/admin/commands.go:178.9,180.4 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:181.3,182.26 2 0
github.com/echovault/echovault/internal/modules/admin/commands.go:183.10,184.54 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:188.75,190.2 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:192.36,200.84 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:200.84,204.5 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:213.84,217.5 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:225.86,229.7 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:238.86,242.7 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:252.86,256.7 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:267.84,271.5 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:272.73,273.49 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:273.49,275.6 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:276.5,276.45 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:285.84,289.5 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:290.73,292.18 2 0
github.com/echovault/echovault/internal/modules/admin/commands.go:292.18,294.6 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:295.5,295.53 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:304.84,308.5 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:309.73,310.47 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:310.47,312.6 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:313.5,313.45 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:321.84,325.5 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:335.86,339.7 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:340.75,341.34 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:341.34,343.8 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:344.7,345.34 2 1
github.com/echovault/echovault/internal/modules/admin/commands.go:345.34,347.8 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:348.7,348.75 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:348.75,350.8 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:351.7,351.47 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:360.86,364.7 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:365.75,366.35 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:366.35,368.8 1 0
github.com/echovault/echovault/internal/modules/admin/commands.go:369.7,370.47 2 1
github.com/echovault/echovault/internal/modules/admin/commands.go:379.86,383.7 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:384.75,387.38 3 1
github.com/echovault/echovault/internal/modules/admin/commands.go:387.38,389.8 1 1
github.com/echovault/echovault/internal/modules/admin/commands.go:390.7,390.30 1 1
github.com/echovault/echovault/internal/modules/sorted_set/commands.go:29.68,31.16 2 1 github.com/echovault/echovault/internal/modules/sorted_set/commands.go:29.68,31.16 2 1
github.com/echovault/echovault/internal/modules/sorted_set/commands.go:31.16,33.3 1 1 github.com/echovault/echovault/internal/modules/sorted_set/commands.go:31.16,33.3 1 1
github.com/echovault/echovault/internal/modules/sorted_set/commands.go:35.2,44.43 7 1 github.com/echovault/echovault/internal/modules/sorted_set/commands.go:35.2,44.43 7 1

View File

@@ -357,15 +357,15 @@ func (server *EchoVault) startTCP() {
if !conf.TLS { if !conf.TLS {
// TCP // TCP
fmt.Printf("Starting TCP echovault at Address %s, Port %d...\n", conf.BindAddr, conf.Port) log.Printf("Starting TCP echovault at Address %s, Port %d...\n", conf.BindAddr, conf.Port)
} }
if conf.TLS || conf.MTLS { if conf.TLS || conf.MTLS {
// TLS // TLS
if conf.TLS { if conf.TLS {
fmt.Printf("Starting mTLS echovault at Address %s, Port %d...\n", conf.BindAddr, conf.Port) log.Printf("Starting mTLS echovault at Address %s, Port %d...\n", conf.BindAddr, conf.Port)
} else { } else {
fmt.Printf("Starting TLS echovault at Address %s, Port %d...\n", conf.BindAddr, conf.Port) log.Printf("Starting TLS echovault at Address %s, Port %d...\n", conf.BindAddr, conf.Port)
} }
var certificates []tls.Certificate var certificates []tls.Certificate
@@ -408,7 +408,7 @@ func (server *EchoVault) startTCP() {
for { for {
conn, err := listener.Accept() conn, err := listener.Accept()
if err != nil { if err != nil {
fmt.Println("Could not establish connection") log.Println("Could not establish connection")
continue continue
} }
// Read loop for connection // Read loop for connection

View File

@@ -33,6 +33,9 @@ import (
// `args` - ...string - A list of args that will be passed unmodified to the plugins command's // `args` - ...string - A list of args that will be passed unmodified to the plugins command's
// KeyExtractionFunc and HandlerFunc // KeyExtractionFunc and HandlerFunc
func (server *EchoVault) LoadModule(path string, args ...string) error { func (server *EchoVault) LoadModule(path string, args ...string) error {
server.commandsRWMut.Lock()
defer server.commandsRWMut.Unlock()
p, err := plugin.Open(path) p, err := plugin.Open(path)
if err != nil { if err != nil {
return fmt.Errorf("plugin open: %v", err) return fmt.Errorf("plugin open: %v", err)
@@ -104,9 +107,12 @@ func (server *EchoVault) LoadModule(path string, args ...string) error {
return errors.New("handler function has unexpected signature") return errors.New("handler function has unexpected signature")
} }
server.commandsRWMut.Lock() // Remove the currently loaded version of this module and replace it with the new one
defer server.commandsRWMut.Unlock() server.commands = slices.DeleteFunc(server.commands, func(command internal.Command) bool {
return strings.EqualFold(command.Module, path)
})
// Add the new command
server.commands = append(server.commands, internal.Command{ server.commands = append(server.commands, internal.Command{
Command: *command, Command: *command,
Module: path, Module: path,
@@ -144,6 +150,7 @@ func (server *EchoVault) LoadModule(path string, args ...string) error {
params.CreateKeyAndLock, params.CreateKeyAndLock,
params.GetValue, params.GetValue,
params.SetValue, params.SetValue,
args...,
) )
}, },
}) })

View File

@@ -17,28 +17,49 @@ package admin_test
import ( import (
"bytes" "bytes"
"context" "context"
"errors"
"fmt" "fmt"
"github.com/echovault/echovault/echovault" "github.com/echovault/echovault/echovault"
"github.com/echovault/echovault/internal" "github.com/echovault/echovault/internal"
"github.com/echovault/echovault/internal/config"
"github.com/echovault/echovault/internal/constants" "github.com/echovault/echovault/internal/constants"
"github.com/echovault/echovault/internal/modules/acl"
"github.com/echovault/echovault/internal/modules/admin"
"github.com/echovault/echovault/internal/modules/connection"
"github.com/echovault/echovault/internal/modules/generic"
"github.com/echovault/echovault/internal/modules/hash"
"github.com/echovault/echovault/internal/modules/list"
"github.com/echovault/echovault/internal/modules/pubsub"
"github.com/echovault/echovault/internal/modules/set"
"github.com/echovault/echovault/internal/modules/sorted_set"
str "github.com/echovault/echovault/internal/modules/string"
"github.com/tidwall/resp" "github.com/tidwall/resp"
"net" "net"
"os"
"reflect" "reflect"
"slices"
"strings" "strings"
"sync"
"testing" "testing"
"unsafe" "unsafe"
) )
var mockServer *echovault.EchoVault var mockServer *echovault.EchoVault
var port uint16
func init() { func init() {
mockServer, _ = echovault.NewEchoVault( p, _ := internal.GetFreePort()
echovault.WithConfig(config.Config{ port = uint16(p)
DataDir: "", setupServer(port)
EvictionPolicy: constants.NoEviction, }
}),
) func setupServer(port uint16) *echovault.EchoVault {
cfg := echovault.DefaultConfig()
cfg.DataDir = ""
cfg.BindAddr = "localhost"
cfg.Port = port
cfg.EvictionPolicy = constants.NoEviction
mockServer, _ = echovault.NewEchoVault(echovault.WithConfig(cfg))
return mockServer
} }
func getUnexportedField(field reflect.Value) interface{} { func getUnexportedField(field reflect.Value) interface{} {
@@ -50,7 +71,7 @@ func getHandler(commands ...string) internal.HandlerFunc {
return nil return nil
} }
getCommands := getCommands :=
getUnexportedField(reflect.ValueOf(mockServer).Elem().FieldByName("getCommands")).(func() []internal.Command) getUnexportedField(reflect.ValueOf(mockServer).Elem().FieldByName("getCommands")).(func() []internal.Command)
for _, c := range getCommands() { for _, c := range getCommands() {
if strings.EqualFold(commands[0], c.Command) && len(commands) == 1 { if strings.EqualFold(commands[0], c.Command) && len(commands) == 1 {
// Get command handler // Get command handler
@@ -70,7 +91,7 @@ func getHandler(commands ...string) internal.HandlerFunc {
func getHandlerFuncParams(ctx context.Context, cmd []string, conn *net.Conn) internal.HandlerFuncParams { func getHandlerFuncParams(ctx context.Context, cmd []string, conn *net.Conn) internal.HandlerFuncParams {
getCommands := getCommands :=
getUnexportedField(reflect.ValueOf(mockServer).Elem().FieldByName("getCommands")).(func() []internal.Command) getUnexportedField(reflect.ValueOf(mockServer).Elem().FieldByName("getCommands")).(func() []internal.Command)
return internal.HandlerFuncParams{ return internal.HandlerFuncParams{
Context: ctx, Context: ctx,
Command: cmd, Command: cmd,
@@ -79,19 +100,458 @@ func getHandlerFuncParams(ctx context.Context, cmd []string, conn *net.Conn) int
} }
} }
func Test_CommandsHandler(t *testing.T) { func Test_AdminCommand(t *testing.T) {
res, err := getHandler("COMMANDS")(getHandlerFuncParams(context.Background(), []string{"commands"}, nil)) t.Cleanup(func() {
if err != nil { _ = os.RemoveAll("./testdata")
t.Error(err) })
}
rd := resp.NewReader(bytes.NewReader(res)) t.Run("Test COMMAND command", func(t *testing.T) {
rv, _, err := rd.ReadValue() t.Parallel()
if err != nil { res, err := getHandler("COMMANDS")(getHandlerFuncParams(context.Background(), []string{"commands"}, nil))
t.Error(err) if err != nil {
} t.Error(err)
}
for _, element := range rv.Array() { rd := resp.NewReader(bytes.NewReader(res))
fmt.Println(element) rv, _, err := rd.ReadValue()
} if err != nil {
t.Error(err)
}
// Get all the commands from the existing modules.
var commands []internal.Command
commands = append(commands, acl.Commands()...)
commands = append(commands, admin.Commands()...)
commands = append(commands, generic.Commands()...)
commands = append(commands, hash.Commands()...)
commands = append(commands, list.Commands()...)
commands = append(commands, connection.Commands()...)
commands = append(commands, pubsub.Commands()...)
commands = append(commands, set.Commands()...)
commands = append(commands, sorted_set.Commands()...)
commands = append(commands, str.Commands()...)
// Flatten the commands and subcommands.
var allCommands []string
for _, c := range commands {
if c.SubCommands == nil || len(c.SubCommands) == 0 {
allCommands = append(allCommands, c.Command)
continue
}
for _, sc := range c.SubCommands {
allCommands = append(allCommands, fmt.Sprintf("%s|%s", c.Command, sc.Command))
}
}
if len(allCommands) != len(rv.Array()) {
t.Errorf("expected commands list to be of length %d, got %d", len(allCommands), len(rv.Array()))
}
})
t.Run("Test MODULE LOAD command", func(t *testing.T) {
t.Parallel()
tests := []struct {
name string
execCommand []resp.Value
wantExecRes string
wantExecErr error
testCommand []resp.Value
wantTestRes string
wantTestErr error
}{
{
name: "1. Successfully load module_set module and return a response from the module handler",
execCommand: []resp.Value{
resp.StringValue("MODULE"),
resp.StringValue("LOAD"),
resp.StringValue("./testdata/modules/module_set/module_set.so"),
},
wantExecRes: "OK",
wantExecErr: nil,
testCommand: []resp.Value{
resp.StringValue("MODULE.SET"),
resp.StringValue("key1"),
resp.StringValue("20"),
},
wantTestRes: "OK",
wantTestErr: nil,
},
{
name: "2. Successfully load module_get module and return a response from the module handler",
execCommand: []resp.Value{
resp.StringValue("MODULE"),
resp.StringValue("LOAD"),
resp.StringValue("./testdata/modules/module_get/module_get.so"),
resp.StringValue("10"), // With args
},
wantExecRes: "OK",
wantExecErr: nil,
testCommand: []resp.Value{
resp.StringValue("MODULE.GET"),
resp.StringValue("key1"),
},
wantTestRes: "200",
wantTestErr: nil,
},
{
name: "3. Return error from module_set command handler",
execCommand: make([]resp.Value, 0),
wantExecRes: "",
wantExecErr: nil,
testCommand: []resp.Value{resp.StringValue("MODULE.SET"), resp.StringValue("key2")},
wantTestRes: "",
wantTestErr: errors.New("wrong no of args for module.set command"),
},
{
name: "4. Return error from module_get command handler",
execCommand: []resp.Value{
resp.StringValue("SET"),
resp.StringValue("key2"),
resp.StringValue("value1"),
},
wantExecRes: "OK",
wantExecErr: nil,
testCommand: []resp.Value{
resp.StringValue("MODULE.GET"),
resp.StringValue("key2"),
},
wantTestRes: "",
wantTestErr: errors.New("value at key key2 is not an integer"),
},
{
name: "5. Return OK when reloading module that is already loaded",
execCommand: []resp.Value{
resp.StringValue("MODULE"),
resp.StringValue("LOAD"),
resp.StringValue("./testdata/modules/module_set/module_set.so"),
},
wantExecRes: "OK",
testCommand: []resp.Value{
resp.StringValue("MODULE.SET"),
resp.StringValue("key3"),
resp.StringValue("20"),
},
wantTestRes: "OK",
wantTestErr: nil,
},
}
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
wg.Done()
mockServer.Start()
}()
wg.Wait()
conn, err := net.Dial("tcp", fmt.Sprintf("localhost:%d", port))
if err != nil {
t.Error(err)
}
respConn := resp.NewConn(conn)
for i := 0; i < len(tests); i++ {
if len(tests[i].wantExecRes) > 0 {
// If the length of execCommand is > 0, write the command to the connection.
if err := respConn.WriteArray(tests[i].execCommand); err != nil {
t.Error(err)
}
// Read the response from the server.
r, _, err := respConn.ReadValue()
if err != nil {
t.Error(err)
}
// If we expect an error, check if the error matches the one we expect.
if tests[i].wantExecErr != nil {
fmt.Println("RES: ", r)
if !strings.Contains(strings.ToLower(r.Error().Error()), strings.ToLower(tests[i].wantExecErr.Error())) {
t.Errorf("expected error to contain \"%s\", got \"%s\"", tests[i].wantExecErr.Error(), r.Error().Error())
return
}
}
// If there's no expected error, check if the response is what's expected.
if tests[i].wantExecRes != "" {
if r.String() != tests[i].wantExecRes {
t.Errorf("expected exec response \"%s\", got \"%s\"", tests[i].wantExecRes, r.String())
return
}
}
}
if len(tests[i].testCommand) > 0 {
// If the length of test command is > 0, write teh command to the connections.
if err := respConn.WriteArray(tests[i].testCommand); err != nil {
t.Error(err)
}
// Read the response from the server.
r, _, err := respConn.ReadValue()
if err != nil {
t.Error(err)
}
// If we expect an error, check if the error is what's expected.
if tests[i].wantTestErr != nil {
if !strings.Contains(strings.ToLower(r.Error().Error()), strings.ToLower(tests[i].wantTestErr.Error())) {
t.Errorf("expected error to contain \"%s\", got \"%s\"", tests[i].wantTestErr.Error(), r.Error().Error())
return
}
}
// Check if the response is what's expected.
if tests[i].wantTestRes != "" {
if r.String() != tests[i].wantTestRes {
t.Errorf("expected test response \"%s\", got \"%s\"", tests[i].wantTestRes, r.String())
return
}
}
}
}
})
t.Run("Test MODULE UNLOAD command", func(t *testing.T) {
t.Parallel()
port, _ := internal.GetFreePort()
mockServer := setupServer(uint16(port))
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
wg.Done()
mockServer.Start()
}()
wg.Wait()
conn, err := net.Dial("tcp", fmt.Sprintf("localhost:%d", port))
if err != nil {
t.Error(err)
}
respConn := resp.NewConn(conn)
// Load module.set module
if err := respConn.WriteArray([]resp.Value{
resp.StringValue("MODULE"),
resp.StringValue("LOAD"),
resp.StringValue("./testdata/modules/module_set/module_set.so"),
}); err != nil {
t.Errorf("load module_set: %v", err)
return
}
// Expect OK response
r, _, err := respConn.ReadValue()
if err != nil {
t.Error(err)
return
}
if r.String() != "OK" {
t.Errorf("expected response OK, got \"%s\"", r.String())
return
}
// Load module.get module with arg
if err := respConn.WriteArray([]resp.Value{
resp.StringValue("MODULE"),
resp.StringValue("LOAD"),
resp.StringValue("./testdata/modules/module_get/module_get.so"),
resp.StringValue("10"),
}); err != nil {
t.Errorf("load module_get: %v", err)
return
}
// Expect OK response
r, _, err = respConn.ReadValue()
if err != nil {
t.Error(err)
return
}
if r.String() != "OK" {
t.Errorf("expected response OK, got \"%s\"", r.String())
return
}
// Execute module.set command, expect OK response
if err := respConn.WriteArray([]resp.Value{
resp.StringValue("module.set"),
resp.StringValue("key1"),
resp.StringValue("50"),
}); err != nil {
t.Errorf("exec module.set: %v", err)
return
}
// Expect OK response
r, _, err = respConn.ReadValue()
if err != nil {
t.Error(err)
return
}
if r.String() != "OK" {
t.Errorf("expected response OK, got \"%s\"", r.String())
return
}
// Execute module.get command, expect integer response
if err := respConn.WriteArray([]resp.Value{
resp.StringValue("module.get"),
resp.StringValue("key1"),
}); err != nil {
t.Errorf("exec module.get: %v", err)
return
}
// Expect integer response
r, _, err = respConn.ReadValue()
if err != nil {
t.Error(err)
return
}
if r.Integer() != 500 {
t.Errorf("expected response 500, got \"%d\"", r.Integer())
return
}
// Unload module.set module
if err := respConn.WriteArray([]resp.Value{
resp.StringValue("MODULE"),
resp.StringValue("UNLOAD"),
resp.StringValue("./testdata/modules/module_set/module_set.so"),
}); err != nil {
t.Errorf("unload module_set: %v", err)
return
}
// Expect OK response
r, _, err = respConn.ReadValue()
if err != nil {
t.Error(err)
return
}
if r.String() != "OK" {
t.Errorf("expected response OK, got \"%s\"", r.String())
return
}
// Unload module.get module
if err := respConn.WriteArray([]resp.Value{
resp.StringValue("MODULE"),
resp.StringValue("UNLOAD"),
resp.StringValue("./testdata/modules/module_get/module_get.so"),
}); err != nil {
t.Errorf("unload module_get: %v", err)
return
}
// Expect OK response
r, _, err = respConn.ReadValue()
if err != nil {
t.Error(err)
return
}
if r.String() != "OK" {
t.Errorf("expected response OK, got \"%s\"", r.String())
return
}
// Try to execute module.set command, should receive command not supported error
if err := respConn.WriteArray([]resp.Value{
resp.StringValue("module.set"),
resp.StringValue("key1"),
resp.StringValue("50"),
}); err != nil {
t.Errorf("retry module.set: %v", err)
return
}
// Expect command not supported response
r, _, err = respConn.ReadValue()
if err != nil {
t.Error(err)
return
}
if !strings.Contains(r.Error().Error(), "command module.set not supported") {
t.Errorf("expected error to contain \"command module.set not supported\", got \"%s\"", r.Error().Error())
return
}
// Try to execute module.get command, should receive command not supported error
if err := respConn.WriteArray([]resp.Value{
resp.StringValue("module.get"),
resp.StringValue("key1"),
}); err != nil {
t.Errorf("retry module.get: %v", err)
return
}
// Expect command not supported response
r, _, err = respConn.ReadValue()
if err != nil {
t.Error(err)
return
}
if !strings.Contains(r.Error().Error(), "command module.get not supported") {
t.Errorf("expected error to contain \"command module.get not supported\", got \"%s\"", r.Error().Error())
return
}
})
t.Run("Test MODULE LIST command", func(t *testing.T) {
t.Parallel()
port, _ := internal.GetFreePort()
mockServer := setupServer(uint16(port))
wg := sync.WaitGroup{}
wg.Add(1)
go func() {
wg.Done()
mockServer.Start()
}()
wg.Wait()
conn, err := net.Dial("tcp", fmt.Sprintf("localhost:%d", port))
if err != nil {
t.Error(err)
}
respConn := resp.NewConn(conn)
// Load module.get module with arg
if err := respConn.WriteArray([]resp.Value{
resp.StringValue("MODULE"),
resp.StringValue("LOAD"),
resp.StringValue("./testdata/modules/module_get/module_get.so"),
}); err != nil {
t.Errorf("load module_get: %v", err)
return
}
// Expect OK response
r, _, err := respConn.ReadValue()
if err != nil {
t.Error(err)
return
}
if r.String() != "OK" {
t.Errorf("expected response OK, got \"%s\"", r.String())
return
}
if err := respConn.WriteArray([]resp.Value{
resp.StringValue("MODULE"),
resp.StringValue("LIST"),
}); err != nil {
t.Errorf("list module: %v", err)
}
r, _, err = respConn.ReadValue()
if err != nil {
t.Error(err)
return
}
serverModules := mockServer.ListModules()
if len(r.Array()) != len(serverModules) {
t.Errorf("expected response of length %d, got %d", len(serverModules), len(r.Array()))
return
}
for _, resModule := range r.Array() {
if !slices.ContainsFunc(serverModules, func(serverModule string) bool {
return resModule.String() == serverModule
}) {
t.Errorf("could not file module \"%s\" in the loaded server modules \"%s\"", resModule, serverModules)
}
}
})
} }

View File

@@ -16,7 +16,9 @@ package main
import ( import (
"context" "context"
"errors"
"fmt" "fmt"
"strconv"
) )
var Command string = "Module.Get" var Command string = "Module.Get"
@@ -69,5 +71,13 @@ func HandlerFunc(
return nil, fmt.Errorf("value at key %s is not an integer", key) return nil, fmt.Errorf("value at key %s is not an integer", key)
} }
return []byte(fmt.Sprintf(":%d\r\n", val*val)), nil factor := val
if len(args) >= 1 {
factor, err = strconv.ParseInt(args[0], 10, 64)
if err != nil {
return nil, errors.New("first value of args must be an integer")
}
}
return []byte(fmt.Sprintf(":%d\r\n", val*factor)), nil
} }

View File

@@ -18,6 +18,7 @@ import (
"context" "context"
"fmt" "fmt"
"strconv" "strconv"
"strings"
) )
var Command string = "Module.Set" var Command string = "Module.Set"
@@ -31,7 +32,7 @@ var Sync bool = true
func KeyExtractionFunc(cmd []string, args ...string) ([]string, []string, error) { func KeyExtractionFunc(cmd []string, args ...string) ([]string, []string, error) {
if len(cmd) != 3 { if len(cmd) != 3 {
return nil, nil, fmt.Errorf("wrong no of args for %s command", Command) return nil, nil, fmt.Errorf("wrong no of args for %s command", strings.ToLower(Command))
} }
return []string{}, cmd[1:2], nil return []string{}, cmd[1:2], nil
} }