@spooky-sync/core 0.0.1-canary.239 → 0.0.1-canary.240
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/coverage/lcov-report/base.css +224 -0
- package/coverage/lcov-report/block-navigation.js +87 -0
- package/coverage/lcov-report/favicon.png +0 -0
- package/coverage/lcov-report/index.html +476 -0
- package/coverage/lcov-report/prettify.css +1 -0
- package/coverage/lcov-report/prettify.js +2 -0
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +210 -0
- package/coverage/lcov-report/src/boot/auth-flip.saga.ts.html +271 -0
- package/coverage/lcov-report/src/boot/boot.saga.ts.html +469 -0
- package/coverage/lcov-report/src/boot/bucket-switch.saga.ts.html +430 -0
- package/coverage/lcov-report/src/boot/index.html +161 -0
- package/coverage/lcov-report/src/boot/preload.saga.ts.html +178 -0
- package/coverage/lcov-report/src/client/bucket-handle.ts.html +766 -0
- package/coverage/lcov-report/src/client/index.html +161 -0
- package/coverage/lcov-report/src/client/router.ts.html +367 -0
- package/coverage/lcov-report/src/client/runtime.ts.html +940 -0
- package/coverage/lcov-report/src/client/sp00ky-client.ts.html +1531 -0
- package/coverage/lcov-report/src/events/index.html +116 -0
- package/coverage/lcov-report/src/events/index.ts.html +877 -0
- package/coverage/lcov-report/src/index.html +146 -0
- package/coverage/lcov-report/src/index.ts.html +202 -0
- package/coverage/lcov-report/src/kernel/constants.ts.html +247 -0
- package/coverage/lcov-report/src/kernel/effects.ts.html +562 -0
- package/coverage/lcov-report/src/kernel/events.ts.html +250 -0
- package/coverage/lcov-report/src/kernel/index.html +176 -0
- package/coverage/lcov-report/src/kernel/interpreter.ts.html +514 -0
- package/coverage/lcov-report/src/kernel/saga.ts.html +304 -0
- package/coverage/lcov-report/src/modules/app-release/index.html +116 -0
- package/coverage/lcov-report/src/modules/app-release/index.ts.html +712 -0
- package/coverage/lcov-report/src/modules/auth/events/index.html +116 -0
- package/coverage/lcov-report/src/modules/auth/events/index.ts.html +142 -0
- package/coverage/lcov-report/src/modules/auth/index.html +116 -0
- package/coverage/lcov-report/src/modules/auth/index.ts.html +1225 -0
- package/coverage/lcov-report/src/modules/crdt/crdt-field.ts.html +967 -0
- package/coverage/lcov-report/src/modules/crdt/index.html +146 -0
- package/coverage/lcov-report/src/modules/crdt/index.ts.html +1474 -0
- package/coverage/lcov-report/src/modules/crdt/loro-loader.ts.html +160 -0
- package/coverage/lcov-report/src/modules/devtools/flags.ts.html +1132 -0
- package/coverage/lcov-report/src/modules/devtools/index.html +161 -0
- package/coverage/lcov-report/src/modules/devtools/index.ts.html +2413 -0
- package/coverage/lcov-report/src/modules/devtools/storage-info.ts.html +589 -0
- package/coverage/lcov-report/src/modules/devtools/versions.ts.html +415 -0
- package/coverage/lcov-report/src/modules/feature-flag/index.html +116 -0
- package/coverage/lcov-report/src/modules/feature-flag/index.ts.html +1033 -0
- package/coverage/lcov-report/src/modules/index.html +116 -0
- package/coverage/lcov-report/src/modules/ref-tables.ts.html +349 -0
- package/coverage/lcov-report/src/mutation/index.html +191 -0
- package/coverage/lcov-report/src/mutation/jobs.ts.html +208 -0
- package/coverage/lcov-report/src/mutation/mutation-id.ts.html +190 -0
- package/coverage/lcov-report/src/mutation/push.saga.ts.html +730 -0
- package/coverage/lcov-report/src/mutation/rows.ts.html +1216 -0
- package/coverage/lcov-report/src/mutation/tray.saga.ts.html +229 -0
- package/coverage/lcov-report/src/mutation/write.saga.ts.html +583 -0
- package/coverage/lcov-report/src/otel/index.html +116 -0
- package/coverage/lcov-report/src/otel/index.ts.html +466 -0
- package/coverage/lcov-report/src/query/env.ts.html +253 -0
- package/coverage/lcov-report/src/query/fetch.saga.ts.html +412 -0
- package/coverage/lcov-report/src/query/hash.ts.html +139 -0
- package/coverage/lcov-report/src/query/index.html +281 -0
- package/coverage/lcov-report/src/query/lifecycle.saga.ts.html +388 -0
- package/coverage/lcov-report/src/query/materialize.saga.ts.html +310 -0
- package/coverage/lcov-report/src/query/materialize.ts.html +217 -0
- package/coverage/lcov-report/src/query/membership.saga.ts.html +709 -0
- package/coverage/lcov-report/src/query/membership.ts.html +559 -0
- package/coverage/lcov-report/src/query/register.saga.ts.html +655 -0
- package/coverage/lcov-report/src/query/render-set.ts.html +265 -0
- package/coverage/lcov-report/src/query/sql.ts.html +322 -0
- package/coverage/lcov-report/src/query/window-query.ts.html +670 -0
- package/coverage/lcov-report/src/services/blobs/blob-cache.ts.html +1894 -0
- package/coverage/lcov-report/src/services/blobs/blob-manifest.ts.html +766 -0
- package/coverage/lcov-report/src/services/blobs/blob-store.ts.html +1162 -0
- package/coverage/lcov-report/src/services/blobs/index.html +161 -0
- package/coverage/lcov-report/src/services/blobs/index.ts.html +295 -0
- package/coverage/lcov-report/src/services/database/cache-engine.ts.html +664 -0
- package/coverage/lcov-report/src/services/database/connection-supervisor.ts.html +1330 -0
- package/coverage/lcov-report/src/services/database/database.ts.html +658 -0
- package/coverage/lcov-report/src/services/database/engine-factory.ts.html +184 -0
- package/coverage/lcov-report/src/services/database/errors.ts.html +187 -0
- package/coverage/lcov-report/src/services/database/events/index.html +116 -0
- package/coverage/lcov-report/src/services/database/events/index.ts.html +184 -0
- package/coverage/lcov-report/src/services/database/index.html +386 -0
- package/coverage/lcov-report/src/services/database/index.ts.html +121 -0
- package/coverage/lcov-report/src/services/database/local-migrator.ts.html +703 -0
- package/coverage/lcov-report/src/services/database/local.ts.html +1633 -0
- package/coverage/lcov-report/src/services/database/plan-render.ts.html +409 -0
- package/coverage/lcov-report/src/services/database/relation-resolver.ts.html +682 -0
- package/coverage/lcov-report/src/services/database/remote.ts.html +1036 -0
- package/coverage/lcov-report/src/services/database/sqlite-cache-engine.ts.html +4132 -0
- package/coverage/lcov-report/src/services/database/sqlite-lock-verify.ts.html +220 -0
- package/coverage/lcov-report/src/services/database/sqlite-open.ts.html +577 -0
- package/coverage/lcov-report/src/services/database/sqlite-plan-sql.ts.html +499 -0
- package/coverage/lcov-report/src/services/database/sqlite-select.ts.html +478 -0
- package/coverage/lcov-report/src/services/database/sqlite-transport.ts.html +757 -0
- package/coverage/lcov-report/src/services/database/surql-translate.ts.html +1333 -0
- package/coverage/lcov-report/src/services/database/surreal-cache-engine.ts.html +568 -0
- package/coverage/lcov-report/src/services/logger/index.html +116 -0
- package/coverage/lcov-report/src/services/logger/index.ts.html +154 -0
- package/coverage/lcov-report/src/services/persistence/index.html +146 -0
- package/coverage/lcov-report/src/services/persistence/localstorage.ts.html +163 -0
- package/coverage/lcov-report/src/services/persistence/resilient.ts.html +208 -0
- package/coverage/lcov-report/src/services/persistence/surrealdb.ts.html +271 -0
- package/coverage/lcov-report/src/services/stream-processor/index.html +146 -0
- package/coverage/lcov-report/src/services/stream-processor/index.ts.html +3313 -0
- package/coverage/lcov-report/src/services/stream-processor/permissions.ts.html +244 -0
- package/coverage/lcov-report/src/services/stream-processor/wasm-types.ts.html +346 -0
- package/coverage/lcov-report/src/services/tabs/broker-client.ts.html +934 -0
- package/coverage/lcov-report/src/services/tabs/coordinator.ts.html +1984 -0
- package/coverage/lcov-report/src/services/tabs/index.html +191 -0
- package/coverage/lcov-report/src/services/tabs/leader-locks.ts.html +310 -0
- package/coverage/lcov-report/src/services/tabs/protocol.ts.html +871 -0
- package/coverage/lcov-report/src/services/tabs/support.ts.html +193 -0
- package/coverage/lcov-report/src/services/tabs/tabs-broker-worker.ts.html +2005 -0
- package/coverage/lcov-report/src/sp00ky.ts.html +100 -0
- package/coverage/lcov-report/src/state/client-state.ts.html +637 -0
- package/coverage/lcov-report/src/state/index.html +161 -0
- package/coverage/lcov-report/src/state/lifecycle.ts.html +343 -0
- package/coverage/lcov-report/src/state/reducers.ts.html +1471 -0
- package/coverage/lcov-report/src/state/selectors.ts.html +637 -0
- package/coverage/lcov-report/src/sync/connection.saga.ts.html +343 -0
- package/coverage/lcov-report/src/sync/index.html +176 -0
- package/coverage/lcov-report/src/sync/live.saga.ts.html +232 -0
- package/coverage/lcov-report/src/sync/policy.ts.html +1606 -0
- package/coverage/lcov-report/src/sync/poll.saga.ts.html +193 -0
- package/coverage/lcov-report/src/sync/tabs.saga.ts.html +361 -0
- package/coverage/lcov-report/src/types.ts.html +2419 -0
- package/coverage/lcov-report/src/utils/blurhash.ts.html +355 -0
- package/coverage/lcov-report/src/utils/error-classification.ts.html +244 -0
- package/coverage/lcov-report/src/utils/index.html +191 -0
- package/coverage/lcov-report/src/utils/index.ts.html +820 -0
- package/coverage/lcov-report/src/utils/parser.ts.html +313 -0
- package/coverage/lcov-report/src/utils/semver.ts.html +175 -0
- package/coverage/lcov-report/src/utils/surql.ts.html +667 -0
- package/coverage/lcov.info +19079 -0
- package/dist/index.js +3 -3
- package/dist/sqlite-open.js +20 -1
- package/package.json +3 -3
- package/src/services/database/relation-resolver.test.ts +55 -1
- package/src/services/database/relation-resolver.ts +0 -0
|
@@ -0,0 +1,637 @@
|
|
|
1
|
+
|
|
2
|
+
<!doctype html>
|
|
3
|
+
<html lang="en">
|
|
4
|
+
|
|
5
|
+
<head>
|
|
6
|
+
<title>Code coverage report for src/state/selectors.ts</title>
|
|
7
|
+
<meta charset="utf-8" />
|
|
8
|
+
<link rel="stylesheet" href="../../prettify.css" />
|
|
9
|
+
<link rel="stylesheet" href="../../base.css" />
|
|
10
|
+
<link rel="shortcut icon" type="image/x-icon" href="../../favicon.png" />
|
|
11
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
12
|
+
<style type='text/css'>
|
|
13
|
+
.coverage-summary .sorter {
|
|
14
|
+
background-image: url(../../sort-arrow-sprite.png);
|
|
15
|
+
}
|
|
16
|
+
</style>
|
|
17
|
+
</head>
|
|
18
|
+
|
|
19
|
+
<body>
|
|
20
|
+
<div class='wrapper'>
|
|
21
|
+
<div class='pad1'>
|
|
22
|
+
<h1><a href="../../index.html">All files</a> / <a href="index.html">src/state</a> selectors.ts</h1>
|
|
23
|
+
<div class='clearfix'>
|
|
24
|
+
|
|
25
|
+
<div class='fl pad1y space-right2'>
|
|
26
|
+
<span class="strong">100% </span>
|
|
27
|
+
<span class="quiet">Statements</span>
|
|
28
|
+
<span class='fraction'>133/133</span>
|
|
29
|
+
</div>
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
<div class='fl pad1y space-right2'>
|
|
33
|
+
<span class="strong">100% </span>
|
|
34
|
+
<span class="quiet">Branches</span>
|
|
35
|
+
<span class='fraction'>76/76</span>
|
|
36
|
+
</div>
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
<div class='fl pad1y space-right2'>
|
|
40
|
+
<span class="strong">100% </span>
|
|
41
|
+
<span class="quiet">Functions</span>
|
|
42
|
+
<span class='fraction'>23/23</span>
|
|
43
|
+
</div>
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
<div class='fl pad1y space-right2'>
|
|
47
|
+
<span class="strong">100% </span>
|
|
48
|
+
<span class="quiet">Lines</span>
|
|
49
|
+
<span class='fraction'>133/133</span>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
</div>
|
|
54
|
+
<p class="quiet">
|
|
55
|
+
Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
|
|
56
|
+
</p>
|
|
57
|
+
<template id="filterTemplate">
|
|
58
|
+
<div class="quiet">
|
|
59
|
+
Filter:
|
|
60
|
+
<input type="search" id="fileSearch">
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
</div>
|
|
64
|
+
<div class='status-line high'></div>
|
|
65
|
+
<pre><table class="coverage">
|
|
66
|
+
<tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
|
|
67
|
+
<a name='L2'></a><a href='#L2'>2</a>
|
|
68
|
+
<a name='L3'></a><a href='#L3'>3</a>
|
|
69
|
+
<a name='L4'></a><a href='#L4'>4</a>
|
|
70
|
+
<a name='L5'></a><a href='#L5'>5</a>
|
|
71
|
+
<a name='L6'></a><a href='#L6'>6</a>
|
|
72
|
+
<a name='L7'></a><a href='#L7'>7</a>
|
|
73
|
+
<a name='L8'></a><a href='#L8'>8</a>
|
|
74
|
+
<a name='L9'></a><a href='#L9'>9</a>
|
|
75
|
+
<a name='L10'></a><a href='#L10'>10</a>
|
|
76
|
+
<a name='L11'></a><a href='#L11'>11</a>
|
|
77
|
+
<a name='L12'></a><a href='#L12'>12</a>
|
|
78
|
+
<a name='L13'></a><a href='#L13'>13</a>
|
|
79
|
+
<a name='L14'></a><a href='#L14'>14</a>
|
|
80
|
+
<a name='L15'></a><a href='#L15'>15</a>
|
|
81
|
+
<a name='L16'></a><a href='#L16'>16</a>
|
|
82
|
+
<a name='L17'></a><a href='#L17'>17</a>
|
|
83
|
+
<a name='L18'></a><a href='#L18'>18</a>
|
|
84
|
+
<a name='L19'></a><a href='#L19'>19</a>
|
|
85
|
+
<a name='L20'></a><a href='#L20'>20</a>
|
|
86
|
+
<a name='L21'></a><a href='#L21'>21</a>
|
|
87
|
+
<a name='L22'></a><a href='#L22'>22</a>
|
|
88
|
+
<a name='L23'></a><a href='#L23'>23</a>
|
|
89
|
+
<a name='L24'></a><a href='#L24'>24</a>
|
|
90
|
+
<a name='L25'></a><a href='#L25'>25</a>
|
|
91
|
+
<a name='L26'></a><a href='#L26'>26</a>
|
|
92
|
+
<a name='L27'></a><a href='#L27'>27</a>
|
|
93
|
+
<a name='L28'></a><a href='#L28'>28</a>
|
|
94
|
+
<a name='L29'></a><a href='#L29'>29</a>
|
|
95
|
+
<a name='L30'></a><a href='#L30'>30</a>
|
|
96
|
+
<a name='L31'></a><a href='#L31'>31</a>
|
|
97
|
+
<a name='L32'></a><a href='#L32'>32</a>
|
|
98
|
+
<a name='L33'></a><a href='#L33'>33</a>
|
|
99
|
+
<a name='L34'></a><a href='#L34'>34</a>
|
|
100
|
+
<a name='L35'></a><a href='#L35'>35</a>
|
|
101
|
+
<a name='L36'></a><a href='#L36'>36</a>
|
|
102
|
+
<a name='L37'></a><a href='#L37'>37</a>
|
|
103
|
+
<a name='L38'></a><a href='#L38'>38</a>
|
|
104
|
+
<a name='L39'></a><a href='#L39'>39</a>
|
|
105
|
+
<a name='L40'></a><a href='#L40'>40</a>
|
|
106
|
+
<a name='L41'></a><a href='#L41'>41</a>
|
|
107
|
+
<a name='L42'></a><a href='#L42'>42</a>
|
|
108
|
+
<a name='L43'></a><a href='#L43'>43</a>
|
|
109
|
+
<a name='L44'></a><a href='#L44'>44</a>
|
|
110
|
+
<a name='L45'></a><a href='#L45'>45</a>
|
|
111
|
+
<a name='L46'></a><a href='#L46'>46</a>
|
|
112
|
+
<a name='L47'></a><a href='#L47'>47</a>
|
|
113
|
+
<a name='L48'></a><a href='#L48'>48</a>
|
|
114
|
+
<a name='L49'></a><a href='#L49'>49</a>
|
|
115
|
+
<a name='L50'></a><a href='#L50'>50</a>
|
|
116
|
+
<a name='L51'></a><a href='#L51'>51</a>
|
|
117
|
+
<a name='L52'></a><a href='#L52'>52</a>
|
|
118
|
+
<a name='L53'></a><a href='#L53'>53</a>
|
|
119
|
+
<a name='L54'></a><a href='#L54'>54</a>
|
|
120
|
+
<a name='L55'></a><a href='#L55'>55</a>
|
|
121
|
+
<a name='L56'></a><a href='#L56'>56</a>
|
|
122
|
+
<a name='L57'></a><a href='#L57'>57</a>
|
|
123
|
+
<a name='L58'></a><a href='#L58'>58</a>
|
|
124
|
+
<a name='L59'></a><a href='#L59'>59</a>
|
|
125
|
+
<a name='L60'></a><a href='#L60'>60</a>
|
|
126
|
+
<a name='L61'></a><a href='#L61'>61</a>
|
|
127
|
+
<a name='L62'></a><a href='#L62'>62</a>
|
|
128
|
+
<a name='L63'></a><a href='#L63'>63</a>
|
|
129
|
+
<a name='L64'></a><a href='#L64'>64</a>
|
|
130
|
+
<a name='L65'></a><a href='#L65'>65</a>
|
|
131
|
+
<a name='L66'></a><a href='#L66'>66</a>
|
|
132
|
+
<a name='L67'></a><a href='#L67'>67</a>
|
|
133
|
+
<a name='L68'></a><a href='#L68'>68</a>
|
|
134
|
+
<a name='L69'></a><a href='#L69'>69</a>
|
|
135
|
+
<a name='L70'></a><a href='#L70'>70</a>
|
|
136
|
+
<a name='L71'></a><a href='#L71'>71</a>
|
|
137
|
+
<a name='L72'></a><a href='#L72'>72</a>
|
|
138
|
+
<a name='L73'></a><a href='#L73'>73</a>
|
|
139
|
+
<a name='L74'></a><a href='#L74'>74</a>
|
|
140
|
+
<a name='L75'></a><a href='#L75'>75</a>
|
|
141
|
+
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
|
+
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
|
+
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
+
<a name='L79'></a><a href='#L79'>79</a>
|
|
145
|
+
<a name='L80'></a><a href='#L80'>80</a>
|
|
146
|
+
<a name='L81'></a><a href='#L81'>81</a>
|
|
147
|
+
<a name='L82'></a><a href='#L82'>82</a>
|
|
148
|
+
<a name='L83'></a><a href='#L83'>83</a>
|
|
149
|
+
<a name='L84'></a><a href='#L84'>84</a>
|
|
150
|
+
<a name='L85'></a><a href='#L85'>85</a>
|
|
151
|
+
<a name='L86'></a><a href='#L86'>86</a>
|
|
152
|
+
<a name='L87'></a><a href='#L87'>87</a>
|
|
153
|
+
<a name='L88'></a><a href='#L88'>88</a>
|
|
154
|
+
<a name='L89'></a><a href='#L89'>89</a>
|
|
155
|
+
<a name='L90'></a><a href='#L90'>90</a>
|
|
156
|
+
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
|
+
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
|
+
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
167
|
+
<a name='L102'></a><a href='#L102'>102</a>
|
|
168
|
+
<a name='L103'></a><a href='#L103'>103</a>
|
|
169
|
+
<a name='L104'></a><a href='#L104'>104</a>
|
|
170
|
+
<a name='L105'></a><a href='#L105'>105</a>
|
|
171
|
+
<a name='L106'></a><a href='#L106'>106</a>
|
|
172
|
+
<a name='L107'></a><a href='#L107'>107</a>
|
|
173
|
+
<a name='L108'></a><a href='#L108'>108</a>
|
|
174
|
+
<a name='L109'></a><a href='#L109'>109</a>
|
|
175
|
+
<a name='L110'></a><a href='#L110'>110</a>
|
|
176
|
+
<a name='L111'></a><a href='#L111'>111</a>
|
|
177
|
+
<a name='L112'></a><a href='#L112'>112</a>
|
|
178
|
+
<a name='L113'></a><a href='#L113'>113</a>
|
|
179
|
+
<a name='L114'></a><a href='#L114'>114</a>
|
|
180
|
+
<a name='L115'></a><a href='#L115'>115</a>
|
|
181
|
+
<a name='L116'></a><a href='#L116'>116</a>
|
|
182
|
+
<a name='L117'></a><a href='#L117'>117</a>
|
|
183
|
+
<a name='L118'></a><a href='#L118'>118</a>
|
|
184
|
+
<a name='L119'></a><a href='#L119'>119</a>
|
|
185
|
+
<a name='L120'></a><a href='#L120'>120</a>
|
|
186
|
+
<a name='L121'></a><a href='#L121'>121</a>
|
|
187
|
+
<a name='L122'></a><a href='#L122'>122</a>
|
|
188
|
+
<a name='L123'></a><a href='#L123'>123</a>
|
|
189
|
+
<a name='L124'></a><a href='#L124'>124</a>
|
|
190
|
+
<a name='L125'></a><a href='#L125'>125</a>
|
|
191
|
+
<a name='L126'></a><a href='#L126'>126</a>
|
|
192
|
+
<a name='L127'></a><a href='#L127'>127</a>
|
|
193
|
+
<a name='L128'></a><a href='#L128'>128</a>
|
|
194
|
+
<a name='L129'></a><a href='#L129'>129</a>
|
|
195
|
+
<a name='L130'></a><a href='#L130'>130</a>
|
|
196
|
+
<a name='L131'></a><a href='#L131'>131</a>
|
|
197
|
+
<a name='L132'></a><a href='#L132'>132</a>
|
|
198
|
+
<a name='L133'></a><a href='#L133'>133</a>
|
|
199
|
+
<a name='L134'></a><a href='#L134'>134</a>
|
|
200
|
+
<a name='L135'></a><a href='#L135'>135</a>
|
|
201
|
+
<a name='L136'></a><a href='#L136'>136</a>
|
|
202
|
+
<a name='L137'></a><a href='#L137'>137</a>
|
|
203
|
+
<a name='L138'></a><a href='#L138'>138</a>
|
|
204
|
+
<a name='L139'></a><a href='#L139'>139</a>
|
|
205
|
+
<a name='L140'></a><a href='#L140'>140</a>
|
|
206
|
+
<a name='L141'></a><a href='#L141'>141</a>
|
|
207
|
+
<a name='L142'></a><a href='#L142'>142</a>
|
|
208
|
+
<a name='L143'></a><a href='#L143'>143</a>
|
|
209
|
+
<a name='L144'></a><a href='#L144'>144</a>
|
|
210
|
+
<a name='L145'></a><a href='#L145'>145</a>
|
|
211
|
+
<a name='L146'></a><a href='#L146'>146</a>
|
|
212
|
+
<a name='L147'></a><a href='#L147'>147</a>
|
|
213
|
+
<a name='L148'></a><a href='#L148'>148</a>
|
|
214
|
+
<a name='L149'></a><a href='#L149'>149</a>
|
|
215
|
+
<a name='L150'></a><a href='#L150'>150</a>
|
|
216
|
+
<a name='L151'></a><a href='#L151'>151</a>
|
|
217
|
+
<a name='L152'></a><a href='#L152'>152</a>
|
|
218
|
+
<a name='L153'></a><a href='#L153'>153</a>
|
|
219
|
+
<a name='L154'></a><a href='#L154'>154</a>
|
|
220
|
+
<a name='L155'></a><a href='#L155'>155</a>
|
|
221
|
+
<a name='L156'></a><a href='#L156'>156</a>
|
|
222
|
+
<a name='L157'></a><a href='#L157'>157</a>
|
|
223
|
+
<a name='L158'></a><a href='#L158'>158</a>
|
|
224
|
+
<a name='L159'></a><a href='#L159'>159</a>
|
|
225
|
+
<a name='L160'></a><a href='#L160'>160</a>
|
|
226
|
+
<a name='L161'></a><a href='#L161'>161</a>
|
|
227
|
+
<a name='L162'></a><a href='#L162'>162</a>
|
|
228
|
+
<a name='L163'></a><a href='#L163'>163</a>
|
|
229
|
+
<a name='L164'></a><a href='#L164'>164</a>
|
|
230
|
+
<a name='L165'></a><a href='#L165'>165</a>
|
|
231
|
+
<a name='L166'></a><a href='#L166'>166</a>
|
|
232
|
+
<a name='L167'></a><a href='#L167'>167</a>
|
|
233
|
+
<a name='L168'></a><a href='#L168'>168</a>
|
|
234
|
+
<a name='L169'></a><a href='#L169'>169</a>
|
|
235
|
+
<a name='L170'></a><a href='#L170'>170</a>
|
|
236
|
+
<a name='L171'></a><a href='#L171'>171</a>
|
|
237
|
+
<a name='L172'></a><a href='#L172'>172</a>
|
|
238
|
+
<a name='L173'></a><a href='#L173'>173</a>
|
|
239
|
+
<a name='L174'></a><a href='#L174'>174</a>
|
|
240
|
+
<a name='L175'></a><a href='#L175'>175</a>
|
|
241
|
+
<a name='L176'></a><a href='#L176'>176</a>
|
|
242
|
+
<a name='L177'></a><a href='#L177'>177</a>
|
|
243
|
+
<a name='L178'></a><a href='#L178'>178</a>
|
|
244
|
+
<a name='L179'></a><a href='#L179'>179</a>
|
|
245
|
+
<a name='L180'></a><a href='#L180'>180</a>
|
|
246
|
+
<a name='L181'></a><a href='#L181'>181</a>
|
|
247
|
+
<a name='L182'></a><a href='#L182'>182</a>
|
|
248
|
+
<a name='L183'></a><a href='#L183'>183</a>
|
|
249
|
+
<a name='L184'></a><a href='#L184'>184</a>
|
|
250
|
+
<a name='L185'></a><a href='#L185'>185</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
|
|
251
|
+
<span class="cline-any cline-neutral"> </span>
|
|
252
|
+
<span class="cline-any cline-neutral"> </span>
|
|
253
|
+
<span class="cline-any cline-neutral"> </span>
|
|
254
|
+
<span class="cline-any cline-neutral"> </span>
|
|
255
|
+
<span class="cline-any cline-neutral"> </span>
|
|
256
|
+
<span class="cline-any cline-neutral"> </span>
|
|
257
|
+
<span class="cline-any cline-yes">1x</span>
|
|
258
|
+
<span class="cline-any cline-neutral"> </span>
|
|
259
|
+
<span class="cline-any cline-yes">1x</span>
|
|
260
|
+
<span class="cline-any cline-neutral"> </span>
|
|
261
|
+
<span class="cline-any cline-yes">1x</span>
|
|
262
|
+
<span class="cline-any cline-yes">1x</span>
|
|
263
|
+
<span class="cline-any cline-neutral"> </span>
|
|
264
|
+
<span class="cline-any cline-yes">1x</span>
|
|
265
|
+
<span class="cline-any cline-yes">2x</span>
|
|
266
|
+
<span class="cline-any cline-yes">2x</span>
|
|
267
|
+
<span class="cline-any cline-yes">2x</span>
|
|
268
|
+
<span class="cline-any cline-neutral"> </span>
|
|
269
|
+
<span class="cline-any cline-neutral"> </span>
|
|
270
|
+
<span class="cline-any cline-neutral"> </span>
|
|
271
|
+
<span class="cline-any cline-neutral"> </span>
|
|
272
|
+
<span class="cline-any cline-neutral"> </span>
|
|
273
|
+
<span class="cline-any cline-neutral"> </span>
|
|
274
|
+
<span class="cline-any cline-neutral"> </span>
|
|
275
|
+
<span class="cline-any cline-neutral"> </span>
|
|
276
|
+
<span class="cline-any cline-neutral"> </span>
|
|
277
|
+
<span class="cline-any cline-yes">1x</span>
|
|
278
|
+
<span class="cline-any cline-yes">13x</span>
|
|
279
|
+
<span class="cline-any cline-yes">13x</span>
|
|
280
|
+
<span class="cline-any cline-yes">13x</span>
|
|
281
|
+
<span class="cline-any cline-yes">5x</span>
|
|
282
|
+
<span class="cline-any cline-yes">3x</span>
|
|
283
|
+
<span class="cline-any cline-yes">5x</span>
|
|
284
|
+
<span class="cline-any cline-yes">13x</span>
|
|
285
|
+
<span class="cline-any cline-yes">13x</span>
|
|
286
|
+
<span class="cline-any cline-neutral"> </span>
|
|
287
|
+
<span class="cline-any cline-yes">1x</span>
|
|
288
|
+
<span class="cline-any cline-yes">45x</span>
|
|
289
|
+
<span class="cline-any cline-neutral"> </span>
|
|
290
|
+
<span class="cline-any cline-yes">1x</span>
|
|
291
|
+
<span class="cline-any cline-neutral"> </span>
|
|
292
|
+
<span class="cline-any cline-yes">1x</span>
|
|
293
|
+
<span class="cline-any cline-yes">129x</span>
|
|
294
|
+
<span class="cline-any cline-neutral"> </span>
|
|
295
|
+
<span class="cline-any cline-yes">1x</span>
|
|
296
|
+
<span class="cline-any cline-yes">123x</span>
|
|
297
|
+
<span class="cline-any cline-neutral"> </span>
|
|
298
|
+
<span class="cline-any cline-neutral"> </span>
|
|
299
|
+
<span class="cline-any cline-yes">1x</span>
|
|
300
|
+
<span class="cline-any cline-yes">47x</span>
|
|
301
|
+
<span class="cline-any cline-yes">47x</span>
|
|
302
|
+
<span class="cline-any cline-yes">44x</span>
|
|
303
|
+
<span class="cline-any cline-yes">44x</span>
|
|
304
|
+
<span class="cline-any cline-yes">44x</span>
|
|
305
|
+
<span class="cline-any cline-neutral"> </span>
|
|
306
|
+
<span class="cline-any cline-neutral"> </span>
|
|
307
|
+
<span class="cline-any cline-yes">1x</span>
|
|
308
|
+
<span class="cline-any cline-yes">29x</span>
|
|
309
|
+
<span class="cline-any cline-yes">29x</span>
|
|
310
|
+
<span class="cline-any cline-yes">3x</span>
|
|
311
|
+
<span class="cline-any cline-yes">3x</span>
|
|
312
|
+
<span class="cline-any cline-neutral"> </span>
|
|
313
|
+
<span class="cline-any cline-neutral"> </span>
|
|
314
|
+
<span class="cline-any cline-neutral"> </span>
|
|
315
|
+
<span class="cline-any cline-neutral"> </span>
|
|
316
|
+
<span class="cline-any cline-neutral"> </span>
|
|
317
|
+
<span class="cline-any cline-neutral"> </span>
|
|
318
|
+
<span class="cline-any cline-neutral"> </span>
|
|
319
|
+
<span class="cline-any cline-neutral"> </span>
|
|
320
|
+
<span class="cline-any cline-neutral"> </span>
|
|
321
|
+
<span class="cline-any cline-neutral"> </span>
|
|
322
|
+
<span class="cline-any cline-yes">1x</span>
|
|
323
|
+
<span class="cline-any cline-yes">23x</span>
|
|
324
|
+
<span class="cline-any cline-yes">23x</span>
|
|
325
|
+
<span class="cline-any cline-yes">23x</span>
|
|
326
|
+
<span class="cline-any cline-yes">54x</span>
|
|
327
|
+
<span class="cline-any cline-yes">54x</span>
|
|
328
|
+
<span class="cline-any cline-yes">23x</span>
|
|
329
|
+
<span class="cline-any cline-yes">27x</span>
|
|
330
|
+
<span class="cline-any cline-yes">27x</span>
|
|
331
|
+
<span class="cline-any cline-yes">27x</span>
|
|
332
|
+
<span class="cline-any cline-yes">27x</span>
|
|
333
|
+
<span class="cline-any cline-yes">27x</span>
|
|
334
|
+
<span class="cline-any cline-yes">23x</span>
|
|
335
|
+
<span class="cline-any cline-yes">23x</span>
|
|
336
|
+
<span class="cline-any cline-yes">23x</span>
|
|
337
|
+
<span class="cline-any cline-yes">23x</span>
|
|
338
|
+
<span class="cline-any cline-yes">23x</span>
|
|
339
|
+
<span class="cline-any cline-neutral"> </span>
|
|
340
|
+
<span class="cline-any cline-neutral"> </span>
|
|
341
|
+
<span class="cline-any cline-neutral"> </span>
|
|
342
|
+
<span class="cline-any cline-neutral"> </span>
|
|
343
|
+
<span class="cline-any cline-neutral"> </span>
|
|
344
|
+
<span class="cline-any cline-neutral"> </span>
|
|
345
|
+
<span class="cline-any cline-yes">1x</span>
|
|
346
|
+
<span class="cline-any cline-yes">23x</span>
|
|
347
|
+
<span class="cline-any cline-yes">23x</span>
|
|
348
|
+
<span class="cline-any cline-yes">23x</span>
|
|
349
|
+
<span class="cline-any cline-yes">23x</span>
|
|
350
|
+
<span class="cline-any cline-neutral"> </span>
|
|
351
|
+
<span class="cline-any cline-yes">1x</span>
|
|
352
|
+
<span class="cline-any cline-yes">23x</span>
|
|
353
|
+
<span class="cline-any cline-yes">23x</span>
|
|
354
|
+
<span class="cline-any cline-yes">23x</span>
|
|
355
|
+
<span class="cline-any cline-neutral"> </span>
|
|
356
|
+
<span class="cline-any cline-yes">1x</span>
|
|
357
|
+
<span class="cline-any cline-yes">16x</span>
|
|
358
|
+
<span class="cline-any cline-neutral"> </span>
|
|
359
|
+
<span class="cline-any cline-yes">1x</span>
|
|
360
|
+
<span class="cline-any cline-yes">12x</span>
|
|
361
|
+
<span class="cline-any cline-yes">12x</span>
|
|
362
|
+
<span class="cline-any cline-yes">12x</span>
|
|
363
|
+
<span class="cline-any cline-yes">12x</span>
|
|
364
|
+
<span class="cline-any cline-yes">12x</span>
|
|
365
|
+
<span class="cline-any cline-neutral"> </span>
|
|
366
|
+
<span class="cline-any cline-yes">1x</span>
|
|
367
|
+
<span class="cline-any cline-yes">13x</span>
|
|
368
|
+
<span class="cline-any cline-yes">13x</span>
|
|
369
|
+
<span class="cline-any cline-yes">13x</span>
|
|
370
|
+
<span class="cline-any cline-yes">13x</span>
|
|
371
|
+
<span class="cline-any cline-neutral"> </span>
|
|
372
|
+
<span class="cline-any cline-neutral"> </span>
|
|
373
|
+
<span class="cline-any cline-yes">1x</span>
|
|
374
|
+
<span class="cline-any cline-yes">5x</span>
|
|
375
|
+
<span class="cline-any cline-yes">5x</span>
|
|
376
|
+
<span class="cline-any cline-yes">5x</span>
|
|
377
|
+
<span class="cline-any cline-yes">5x</span>
|
|
378
|
+
<span class="cline-any cline-yes">5x</span>
|
|
379
|
+
<span class="cline-any cline-yes">5x</span>
|
|
380
|
+
<span class="cline-any cline-yes">5x</span>
|
|
381
|
+
<span class="cline-any cline-yes">5x</span>
|
|
382
|
+
<span class="cline-any cline-yes">5x</span>
|
|
383
|
+
<span class="cline-any cline-yes">5x</span>
|
|
384
|
+
<span class="cline-any cline-yes">5x</span>
|
|
385
|
+
<span class="cline-any cline-yes">5x</span>
|
|
386
|
+
<span class="cline-any cline-yes">5x</span>
|
|
387
|
+
<span class="cline-any cline-yes">5x</span>
|
|
388
|
+
<span class="cline-any cline-yes">5x</span>
|
|
389
|
+
<span class="cline-any cline-yes">5x</span>
|
|
390
|
+
<span class="cline-any cline-yes">5x</span>
|
|
391
|
+
<span class="cline-any cline-yes">5x</span>
|
|
392
|
+
<span class="cline-any cline-yes">5x</span>
|
|
393
|
+
<span class="cline-any cline-yes">5x</span>
|
|
394
|
+
<span class="cline-any cline-yes">5x</span>
|
|
395
|
+
<span class="cline-any cline-yes">5x</span>
|
|
396
|
+
<span class="cline-any cline-yes">5x</span>
|
|
397
|
+
<span class="cline-any cline-yes">5x</span>
|
|
398
|
+
<span class="cline-any cline-yes">5x</span>
|
|
399
|
+
<span class="cline-any cline-yes">5x</span>
|
|
400
|
+
<span class="cline-any cline-yes">5x</span>
|
|
401
|
+
<span class="cline-any cline-yes">5x</span>
|
|
402
|
+
<span class="cline-any cline-yes">5x</span>
|
|
403
|
+
<span class="cline-any cline-yes">5x</span>
|
|
404
|
+
<span class="cline-any cline-yes">5x</span>
|
|
405
|
+
<span class="cline-any cline-yes">5x</span>
|
|
406
|
+
<span class="cline-any cline-yes">5x</span>
|
|
407
|
+
<span class="cline-any cline-yes">5x</span>
|
|
408
|
+
<span class="cline-any cline-yes">5x</span>
|
|
409
|
+
<span class="cline-any cline-neutral"> </span>
|
|
410
|
+
<span class="cline-any cline-yes">21x</span>
|
|
411
|
+
<span class="cline-any cline-yes">21x</span>
|
|
412
|
+
<span class="cline-any cline-yes">2x</span>
|
|
413
|
+
<span class="cline-any cline-yes">2x</span>
|
|
414
|
+
<span class="cline-any cline-yes">2x</span>
|
|
415
|
+
<span class="cline-any cline-yes">2x</span>
|
|
416
|
+
<span class="cline-any cline-neutral"> </span>
|
|
417
|
+
<span class="cline-any cline-neutral"> </span>
|
|
418
|
+
<span class="cline-any cline-yes">1x</span>
|
|
419
|
+
<span class="cline-any cline-yes">3x</span>
|
|
420
|
+
<span class="cline-any cline-yes">3x</span>
|
|
421
|
+
<span class="cline-any cline-yes">3x</span>
|
|
422
|
+
<span class="cline-any cline-yes">3x</span>
|
|
423
|
+
<span class="cline-any cline-yes">3x</span>
|
|
424
|
+
<span class="cline-any cline-yes">3x</span>
|
|
425
|
+
<span class="cline-any cline-yes">3x</span>
|
|
426
|
+
<span class="cline-any cline-yes">3x</span>
|
|
427
|
+
<span class="cline-any cline-yes">3x</span>
|
|
428
|
+
<span class="cline-any cline-yes">3x</span>
|
|
429
|
+
<span class="cline-any cline-yes">3x</span>
|
|
430
|
+
<span class="cline-any cline-yes">3x</span>
|
|
431
|
+
<span class="cline-any cline-yes">3x</span>
|
|
432
|
+
<span class="cline-any cline-yes">3x</span>
|
|
433
|
+
<span class="cline-any cline-yes">3x</span>
|
|
434
|
+
<span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import type { PhaseStat, QueryHash, QueryState, QueryStatus, QueryTimings, RecordVersionArray } from '../types';
|
|
435
|
+
import type { ClientState, QueryEntry } from './client-state';
|
|
436
|
+
import { deriveStatus, hasServerMembership, isAuthoritative } from './lifecycle';
|
|
437
|
+
import { FETCH_CHUNK } from '../kernel/constants';
|
|
438
|
+
|
|
439
|
+
/** Pure reads over `ClientState`. Sagas use them through `state.read`. */
|
|
440
|
+
|
|
441
|
+
export const queryByHash = (s: ClientState, hash: QueryHash): QueryEntry | undefined => s.queries.get(hash);
|
|
442
|
+
|
|
443
|
+
export const activeHashes = (s: ClientState): QueryHash[] => [...s.queries.keys()];
|
|
444
|
+
|
|
445
|
+
export const hashesForTable = (s: ClientState, table: string): QueryHash[] =>
|
|
446
|
+
[...s.queries].filter(([, e]) => e.def.tableName === table).map(([h]) => h);
|
|
447
|
+
|
|
448
|
+
export const queryStatus = (s: ClientState, hash: QueryHash): QueryStatus | undefined => {
|
|
449
|
+
const e = s.queries.get(hash);
|
|
450
|
+
return e ? deriveStatus(e.lifecycle) : undefined;
|
|
451
|
+
};
|
|
452
|
+
|
|
453
|
+
export interface Overlay {
|
|
454
|
+
/** Ids with an unsynced or just-acked create/update. */
|
|
455
|
+
readonly writes: ReadonlySet<string>;
|
|
456
|
+
/** Ids with an unsynced or just-acked delete. */
|
|
457
|
+
readonly deletes: ReadonlySet<string>;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/** The optimistic overlay, derived from the outbox (pending AND acked items). */
|
|
461
|
+
export function overlay(s: ClientState): Overlay {
|
|
462
|
+
const writes = new Set<string>();
|
|
463
|
+
const deletes = new Set<string>();
|
|
464
|
+
for (const item of s.outbox) {
|
|
465
|
+
if (item.type === 'delete') deletes.add(item.recordId);
|
|
466
|
+
else writes.add(item.recordId);
|
|
467
|
+
}
|
|
468
|
+
return { writes, deletes };
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
export const pendingDeleteIds = (s: ClientState): ReadonlySet<string> =>
|
|
472
|
+
new Set(s.outbox.filter((i) => i.type === 'delete').map((i) => i.recordId));
|
|
473
|
+
|
|
474
|
+
export const hasAckedWrites = (s: ClientState): boolean => s.outbox.some((i) => i.status === 'acked');
|
|
475
|
+
|
|
476
|
+
export const pendingMutationCount = (s: ClientState): number =>
|
|
477
|
+
s.outbox.filter((i) => i.status === 'pending').length;
|
|
478
|
+
|
|
479
|
+
export const fetchingQueryCount = (s: ClientState): number =>
|
|
480
|
+
[...s.queries.values()].filter((e) => e.lifecycle.fetchDepth > 0).length;
|
|
481
|
+
|
|
482
|
+
/** Membership entries whose body is missing or older locally. */
|
|
483
|
+
export function needed(s: ClientState, hash: QueryHash): RecordVersionArray {
|
|
484
|
+
const e = s.queries.get(hash);
|
|
485
|
+
if (!e || !hasServerMembership(e.lifecycle)) return [];
|
|
486
|
+
const deletes = pendingDeleteIds(s);
|
|
487
|
+
return e.remoteArray.filter(([id, v]) => !deletes.has(id) && (s.versions.get(id) ?? -1) < v);
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
/** Subquery child bodies missing or stale locally (never part of `settled`). */
|
|
491
|
+
export function neededChildren(s: ClientState, hash: QueryHash): RecordVersionArray {
|
|
492
|
+
const e = s.queries.get(hash);
|
|
493
|
+
if (!e || e.subqueryRemoteArray.length === 0) return [];
|
|
494
|
+
return e.subqueryRemoteArray.filter(([id, v]) => (s.versions.get(id) ?? -1) < v);
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
export interface FetchPlan {
|
|
498
|
+
/** Queries whose primary membership needs bodies (they flip to `fetching`). */
|
|
499
|
+
readonly hashes: QueryHash[];
|
|
500
|
+
readonly chunks: string[][];
|
|
501
|
+
/** Highest requested version per id, across every query naming it. */
|
|
502
|
+
readonly versions: ReadonlyMap<string, number>;
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
/** Cross-query, deduped, chunked list of ids to pull from the server. */
|
|
506
|
+
export function planFetch(s: ClientState, chunkSize = FETCH_CHUNK): FetchPlan {
|
|
507
|
+
const versions = new Map<string, number>();
|
|
508
|
+
const hashes: QueryHash[] = [];
|
|
509
|
+
const add = (pairs: RecordVersionArray) => {
|
|
510
|
+
for (const [id, v] of pairs) versions.set(id, Math.max(v, versions.get(id) ?? -1));
|
|
511
|
+
};
|
|
512
|
+
for (const hash of s.queries.keys()) {
|
|
513
|
+
const missing = needed(s, hash);
|
|
514
|
+
if (missing.length > 0) hashes.push(hash);
|
|
515
|
+
add(missing);
|
|
516
|
+
add(neededChildren(s, hash));
|
|
517
|
+
}
|
|
518
|
+
const all = [...versions.keys()];
|
|
519
|
+
const chunks: string[][] = [];
|
|
520
|
+
for (let i = 0; i < all.length; i += chunkSize) chunks.push(all.slice(i, i + chunkSize));
|
|
521
|
+
return { hashes, chunks, versions };
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
/**
|
|
525
|
+
* "This query's rows are authoritative and complete": server membership
|
|
526
|
+
* accepted, every body present at its version, nothing waiting to be
|
|
527
|
+
* re-rendered, subscribers told at least once.
|
|
528
|
+
*/
|
|
529
|
+
export function settled(s: ClientState, hash: QueryHash): boolean {
|
|
530
|
+
const e = s.queries.get(hash);
|
|
531
|
+
if (!e || e.lifecycle.phase !== 'live') return false;
|
|
532
|
+
return needed(s, hash).length === 0 && !s.dirty.has(hash) && e.lifecycle.notified;
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
export const settleFailed = (s: ClientState, hash: QueryHash): boolean => {
|
|
536
|
+
const e = s.queries.get(hash);
|
|
537
|
+
return !e || e.lifecycle.remote === 'failed';
|
|
538
|
+
};
|
|
539
|
+
|
|
540
|
+
export const desiredRegistrations = (s: ClientState): QueryHash[] =>
|
|
541
|
+
[...s.queries].filter(([, e]) => e.lifecycle.remote === 'unregistered').map(([h]) => h);
|
|
542
|
+
|
|
543
|
+
export const evictable = (s: ClientState, now: number): QueryHash[] =>
|
|
544
|
+
[...s.queries]
|
|
545
|
+
.filter(
|
|
546
|
+
([, e]) => e.subscribers === 0 && e.lastSubscriberLeftAt !== null && now - e.lastSubscriberLeftAt >= e.def.ttlMs
|
|
547
|
+
)
|
|
548
|
+
.map(([h]) => h);
|
|
549
|
+
|
|
550
|
+
export const shortestTtlMs = (s: ClientState): number | null => {
|
|
551
|
+
let min: number | null = null;
|
|
552
|
+
for (const e of s.queries.values()) min = min === null ? e.def.ttlMs : Math.min(min, e.def.ttlMs);
|
|
553
|
+
return min;
|
|
554
|
+
};
|
|
555
|
+
|
|
556
|
+
/** Legacy `QueryState` shape for DevTools and the public type surface. */
|
|
557
|
+
export function toQueryState(e: QueryEntry): QueryState {
|
|
558
|
+
const l = e.lifecycle;
|
|
559
|
+
return {
|
|
560
|
+
config: {
|
|
561
|
+
id: e.def.id,
|
|
562
|
+
surql: e.def.surql,
|
|
563
|
+
plan: e.def.plan,
|
|
564
|
+
params: { ...e.def.params },
|
|
565
|
+
localArray: [...e.localArray],
|
|
566
|
+
remoteArray: [...e.remoteArray],
|
|
567
|
+
subqueryRemoteArray: e.subqueryRemoteArray.length ? [...e.subqueryRemoteArray] : undefined,
|
|
568
|
+
membershipKnown: isAuthoritative(l),
|
|
569
|
+
membershipKey: e.def.viewKey,
|
|
570
|
+
ttl: e.def.ttl,
|
|
571
|
+
lastActiveAt: new Date(e.lastHeartbeatAt ?? e.def.createdAt),
|
|
572
|
+
tableName: e.def.tableName,
|
|
573
|
+
},
|
|
574
|
+
records: [...e.records] as Record<string, any>[],
|
|
575
|
+
serverMembership: hasServerMembership(l),
|
|
576
|
+
viewLost: l.phase === 'view-lost',
|
|
577
|
+
serverState: e.serverState,
|
|
578
|
+
syncNotified: l.notified,
|
|
579
|
+
ttlTimer: null,
|
|
580
|
+
ttlDurationMs: e.def.ttlMs,
|
|
581
|
+
lastHeartbeatAt: e.lastHeartbeatAt ?? undefined,
|
|
582
|
+
updateCount: e.telemetry.updateCount,
|
|
583
|
+
lastUpdatedAt: e.telemetry.lastUpdatedAt,
|
|
584
|
+
materializationSamples: [...e.telemetry.materializationSamples],
|
|
585
|
+
lastIngestLatencyMs: e.telemetry.lastIngestLatencyMs,
|
|
586
|
+
errorCount: e.telemetry.errorCount,
|
|
587
|
+
status: deriveStatus(l),
|
|
588
|
+
phaseSamples: Object.fromEntries(Object.entries(e.telemetry.phaseSamples).map(([k, v]) => [k, [...v]])),
|
|
589
|
+
phaseLast: { ...e.telemetry.phaseLast },
|
|
590
|
+
registrationTimings: e.telemetry.registrationTimings,
|
|
591
|
+
};
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
function phaseStatOf(samples: ReadonlyArray<number>, lastMs: number | null): PhaseStat {
|
|
595
|
+
if (samples.length === 0) return { lastMs, p50: null, p90: null, p99: null, count: 0 };
|
|
596
|
+
const sorted = [...samples].sort((a, b) => a - b);
|
|
597
|
+
const pick = (q: number) => sorted[Math.min(sorted.length - 1, Math.floor(q * sorted.length))]!;
|
|
598
|
+
return { lastMs, p50: pick(0.5), p90: pick(0.9), p99: pick(0.99), count: samples.length };
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
/** Per-query processing-time breakdown for DevTools and the MCP. */
|
|
602
|
+
export function phaseTimings(e: QueryEntry): QueryTimings {
|
|
603
|
+
const t = e.telemetry;
|
|
604
|
+
const stat = (phase: string) => phaseStatOf(t.phaseSamples[phase] ?? [], t.phaseLast[phase] ?? null);
|
|
605
|
+
return {
|
|
606
|
+
ssp: phaseStatOf(t.materializationSamples, t.lastIngestLatencyMs),
|
|
607
|
+
sspStoreApply: stat('sspStoreApply'),
|
|
608
|
+
sspCircuitStep: stat('sspCircuitStep'),
|
|
609
|
+
sspTransform: stat('sspTransform'),
|
|
610
|
+
localFetch: stat('localFetch'),
|
|
611
|
+
remoteFetch: stat('remoteFetch'),
|
|
612
|
+
frontend: stat('frontend'),
|
|
613
|
+
registration: t.registrationTimings,
|
|
614
|
+
updateCount: t.updateCount,
|
|
615
|
+
errorCount: t.errorCount,
|
|
616
|
+
};
|
|
617
|
+
}
|
|
618
|
+
</pre></td></tr></table></pre>
|
|
619
|
+
|
|
620
|
+
<div class='push'></div><!-- for sticky footer -->
|
|
621
|
+
</div><!-- /wrapper -->
|
|
622
|
+
<div class='footer quiet pad2 space-top1 center small'>
|
|
623
|
+
Code coverage generated by
|
|
624
|
+
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
625
|
+
at 2026-09-09T09:49:51.780Z
|
|
626
|
+
</div>
|
|
627
|
+
<script src="../../prettify.js"></script>
|
|
628
|
+
<script>
|
|
629
|
+
window.onload = function () {
|
|
630
|
+
prettyPrint();
|
|
631
|
+
};
|
|
632
|
+
</script>
|
|
633
|
+
<script src="../../sorter.js"></script>
|
|
634
|
+
<script src="../../block-navigation.js"></script>
|
|
635
|
+
</body>
|
|
636
|
+
</html>
|
|
637
|
+
|