atagen

macltok

public
Star0
Watch0
a33777af1c268b8a169a26f4c8fd759ef1a9c3d0
3
ssh://brewery@pls.lobotomise.me:33/atagen/macltok.git
harness/web/run.nu102 lines3.8 KB
1
# drives macltok in a headless firefox worker against a throwaway continuwuity
2
# run from the web devshell, `nix develop .#web -c nu harness/web/run.nu`
3
4
const crate = path self .
5
const root = path self ../..
6
const username = "harness"
7
const password = "harness-password"
8
9
# the shared build wrapper sets CARGO_TARGET_DIR, the nix sandbox does not
10
def target [] { $env.CARGO_TARGET_DIR? | default ($root | path join target) }
11
12
def scratch [] { target | path join harness }
13
14
def start-homeserver [] {
15
    let dir = scratch
16
    rm -rf $dir
17
    mkdir $dir
18
    let port = 6167
19
    let config = $dir | path join homeserver.toml
20
    let log = $dir | path join homeserver.log
21
    {
22
        global: {
23
            server_name: "localhost"
24
            database_path: ($dir | path join db)
25
            address: ["127.0.0.1"]
26
            port: $port
27
            allow_federation: false
28
            new_user_displayname_suffix: ""
29
        }
30
    } | to toml | save $config
31
    # the first account otherwise needs a one-time token that is only ever printed to the log
32
    let create = $"users create-user ($username) ($password)"
33
    let pid = ^bash -c 'conduwuit -c "$1" --execute "$2" > "$3" 2>&1 & echo $!' _ $config $create $log | str trim
34
    let url = $'http://127.0.0.1:($port)'
35
    for _ in 1..100 {
36
        if (try { login $url | ignore; true } catch { false }) {
37
            return { pid: $pid, url: $url }
38
        }
39
        sleep 100ms
40
    }
41
    try { stop $pid }
42
    print (open --raw $log | lines | last 20 | str join "\n")
43
    error make { msg: "homeserver did not come up" }
44
}
45
46
def login [url: string] {
47
    let body = { type: "m.login.password", identifier: { type: "m.id.user", user: $username }, password: $password }
48
    http post --content-type application/json $'($url)/_matrix/client/v3/login' $body
49
}
50
51
def seed [url: string] {
52
    let auth = [Authorization $'Bearer ((login $url).access_token)']
53
    http post --headers $auth --content-type application/json $'($url)/_matrix/client/v3/createRoom' { name: "harness" } | ignore
54
}
55
56
def stop [pid: string] {
57
    ^kill -9 $pid
58
}
59
60
def main [] {
61
    let server = start-homeserver
62
    let result = try {
63
        let versions = http get $'($server.url)/_matrix/client/versions'
64
        if not ($versions.unstable_features | get -o 'org.matrix.simplified_msc3575' | default false) {
65
            error make { msg: "homeserver does not advertise simplified sliding sync" }
66
        }
67
        seed $server.url
68
        cd $crate
69
        with-env {
70
            MACLTOK_HOMESERVER: $server.url
71
            MACLTOK_USERNAME: $username
72
            MACLTOK_PASSWORD: $password
73
            GECKODRIVER: (which geckodriver | get 0.path)
74
            WASM_BINDGEN_TEST_TIMEOUT: "180"
75
        } {
76
            ^cargo test --target wasm32-unknown-unknown --test worker
77
        }
78
        null
79
    } catch {|error| $error }
80
    stop $server.pid
81
    if $result != null {
82
        print $'homeserver log at (scratch)/homeserver.log'
83
        error make { msg: $result.msg }
84
    }
85
}
86
87
# release build of the same slice, sized raw, after wasm-opt, and compressed
88
def "main size" [] {
89
    let target = target
90
    let out = scratch | path join size
91
    rm -rf $out
92
    mkdir $out
93
    cd $crate
94
    ^cargo build --release --lib --target wasm32-unknown-unknown
95
    ^wasm-bindgen --target web --out-dir $out ($target | path join wasm32-unknown-unknown release macltok_web.wasm)
96
    let raw = $out | path join macltok_web_bg.wasm
97
    let opt = $out | path join macltok_web_opt.wasm
98
    ^wasm-opt -Oz --enable-bulk-memory --enable-nontrapping-float-to-int --enable-sign-ext --enable-mutable-globals --enable-reference-types --enable-multivalue -o $opt $raw
99
    ^gzip -9 -k $opt
100
    ^brotli -q 11 -k $opt
101
    [$raw $opt $'($opt).gz' $'($opt).br'] | each {|file| { file: ($file | path basename), size: (ls $file | get 0.size) } }
102
}