@nebutra/collab 0.2.1 → 0.2.2

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.
@@ -0,0 +1,161 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src</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> src</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">93.51% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>101/108</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">77.77% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>35/45</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">91.66% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>22/24</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">95.09% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>97/102</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
+ <div class="pad1">
66
+ <table class="coverage-summary">
67
+ <thead>
68
+ <tr>
69
+ <th data-col="file" data-fmt="html" data-html="true" class="file">File</th>
70
+ <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th>
71
+ <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th>
72
+ <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th>
73
+ <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th>
74
+ <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th>
75
+ <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th>
76
+ <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th>
77
+ <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th>
78
+ <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th>
79
+ </tr>
80
+ </thead>
81
+ <tbody><tr>
82
+ <td class="file high" data-value="errors.ts"><a href="errors.ts.html">errors.ts</a></td>
83
+ <td data-value="85.71" class="pic high">
84
+ <div class="chart"><div class="cover-fill" style="width: 85%"></div><div class="cover-empty" style="width: 15%"></div></div>
85
+ </td>
86
+ <td data-value="85.71" class="pct high">85.71%</td>
87
+ <td data-value="7" class="abs high">6/7</td>
88
+ <td data-value="83.33" class="pct high">83.33%</td>
89
+ <td data-value="6" class="abs high">5/6</td>
90
+ <td data-value="100" class="pct high">100%</td>
91
+ <td data-value="1" class="abs high">1/1</td>
92
+ <td data-value="85.71" class="pct high">85.71%</td>
93
+ <td data-value="7" class="abs high">6/7</td>
94
+ </tr>
95
+
96
+ <tr>
97
+ <td class="file high" data-value="hub.ts"><a href="hub.ts.html">hub.ts</a></td>
98
+ <td data-value="92.98" class="pic high">
99
+ <div class="chart"><div class="cover-fill" style="width: 92%"></div><div class="cover-empty" style="width: 8%"></div></div>
100
+ </td>
101
+ <td data-value="92.98" class="pct high">92.98%</td>
102
+ <td data-value="57" class="abs high">53/57</td>
103
+ <td data-value="79.31" class="pct medium">79.31%</td>
104
+ <td data-value="29" class="abs medium">23/29</td>
105
+ <td data-value="90" class="pct high">90%</td>
106
+ <td data-value="10" class="abs high">9/10</td>
107
+ <td data-value="92.72" class="pct high">92.72%</td>
108
+ <td data-value="55" class="abs high">51/55</td>
109
+ </tr>
110
+
111
+ <tr>
112
+ <td class="file empty" data-value="index.ts"><a href="index.ts.html">index.ts</a></td>
113
+ <td data-value="0" class="pic empty">
114
+ <div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
115
+ </td>
116
+ <td data-value="0" class="pct empty">0%</td>
117
+ <td data-value="0" class="abs empty">0/0</td>
118
+ <td data-value="0" class="pct empty">0%</td>
119
+ <td data-value="0" class="abs empty">0/0</td>
120
+ <td data-value="0" class="pct empty">0%</td>
121
+ <td data-value="0" class="abs empty">0/0</td>
122
+ <td data-value="0" class="pct empty">0%</td>
123
+ <td data-value="0" class="abs empty">0/0</td>
124
+ </tr>
125
+
126
+ <tr>
127
+ <td class="file high" data-value="room.ts"><a href="room.ts.html">room.ts</a></td>
128
+ <td data-value="95.45" class="pic high">
129
+ <div class="chart"><div class="cover-fill" style="width: 95%"></div><div class="cover-empty" style="width: 5%"></div></div>
130
+ </td>
131
+ <td data-value="95.45" class="pct high">95.45%</td>
132
+ <td data-value="44" class="abs high">42/44</td>
133
+ <td data-value="70" class="pct medium">70%</td>
134
+ <td data-value="10" class="abs medium">7/10</td>
135
+ <td data-value="92.3" class="pct high">92.3%</td>
136
+ <td data-value="13" class="abs high">12/13</td>
137
+ <td data-value="100" class="pct high">100%</td>
138
+ <td data-value="40" class="abs high">40/40</td>
139
+ </tr>
140
+
141
+ </tbody>
142
+ </table>
143
+ </div>
144
+ <div class='push'></div><!-- for sticky footer -->
145
+ </div><!-- /wrapper -->
146
+ <div class='footer quiet pad2 space-top1 center small'>
147
+ Code coverage generated by
148
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
149
+ at 2026-05-17T09:08:52.337Z
150
+ </div>
151
+ <script src="../prettify.js"></script>
152
+ <script>
153
+ window.onload = function () {
154
+ prettyPrint();
155
+ };
156
+ </script>
157
+ <script src="../sorter.js"></script>
158
+ <script src="../block-navigation.js"></script>
159
+ </body>
160
+ </html>
161
+
@@ -0,0 +1,211 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for src/index.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</a> index.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">0% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>0/0</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">0% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/0</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">0% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>0/0</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">0% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>0/0</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 low'></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></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
109
+ <span class="cline-any cline-neutral">&nbsp;</span>
110
+ <span class="cline-any cline-neutral">&nbsp;</span>
111
+ <span class="cline-any cline-neutral">&nbsp;</span>
112
+ <span class="cline-any cline-neutral">&nbsp;</span>
113
+ <span class="cline-any cline-neutral">&nbsp;</span>
114
+ <span class="cline-any cline-neutral">&nbsp;</span>
115
+ <span class="cline-any cline-neutral">&nbsp;</span>
116
+ <span class="cline-any cline-neutral">&nbsp;</span>
117
+ <span class="cline-any cline-neutral">&nbsp;</span>
118
+ <span class="cline-any cline-neutral">&nbsp;</span>
119
+ <span class="cline-any cline-neutral">&nbsp;</span>
120
+ <span class="cline-any cline-neutral">&nbsp;</span>
121
+ <span class="cline-any cline-neutral">&nbsp;</span>
122
+ <span class="cline-any cline-neutral">&nbsp;</span>
123
+ <span class="cline-any cline-neutral">&nbsp;</span>
124
+ <span class="cline-any cline-neutral">&nbsp;</span>
125
+ <span class="cline-any cline-neutral">&nbsp;</span>
126
+ <span class="cline-any cline-neutral">&nbsp;</span>
127
+ <span class="cline-any cline-neutral">&nbsp;</span>
128
+ <span class="cline-any cline-neutral">&nbsp;</span>
129
+ <span class="cline-any cline-neutral">&nbsp;</span>
130
+ <span class="cline-any cline-neutral">&nbsp;</span>
131
+ <span class="cline-any cline-neutral">&nbsp;</span>
132
+ <span class="cline-any cline-neutral">&nbsp;</span>
133
+ <span class="cline-any cline-neutral">&nbsp;</span>
134
+ <span class="cline-any cline-neutral">&nbsp;</span>
135
+ <span class="cline-any cline-neutral">&nbsp;</span>
136
+ <span class="cline-any cline-neutral">&nbsp;</span>
137
+ <span class="cline-any cline-neutral">&nbsp;</span>
138
+ <span class="cline-any cline-neutral">&nbsp;</span>
139
+ <span class="cline-any cline-neutral">&nbsp;</span>
140
+ <span class="cline-any cline-neutral">&nbsp;</span>
141
+ <span class="cline-any cline-neutral">&nbsp;</span>
142
+ <span class="cline-any cline-neutral">&nbsp;</span>
143
+ <span class="cline-any cline-neutral">&nbsp;</span>
144
+ <span class="cline-any cline-neutral">&nbsp;</span>
145
+ <span class="cline-any cline-neutral">&nbsp;</span>
146
+ <span class="cline-any cline-neutral">&nbsp;</span>
147
+ <span class="cline-any cline-neutral">&nbsp;</span>
148
+ <span class="cline-any cline-neutral">&nbsp;</span>
149
+ <span class="cline-any cline-neutral">&nbsp;</span>
150
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
151
+ * @nebutra/collab — multi-tenant, transport-agnostic real-time collaborative
152
+ * sync layer.
153
+ *
154
+ * Sailor already had Pusher pub/sub (fire-and-forget broadcast) but no
155
+ * conflict-free concurrent editing. This package fills that gap with
156
+ * tenant-partitioned CRDT rooms built on Yjs (MIT). It is generic: a
157
+ * node-graph canvas, a rich-text document, or any shared structure binds to
158
+ * a `CollabRoom` and gets convergence for free.
159
+ *
160
+ * Multi-tenancy is NON-NEGOTIABLE. Rooms are hard-partitioned by `tenantId`:
161
+ * a room handle is only ever produced by passing an explicit tenant, the
162
+ * snapshot store and transport are addressed by (tenantId, roomId), and the
163
+ * composite key uses a NUL separator so partitions cannot collide. See
164
+ * `hub.ts` for the structural argument and `__tests__` for the proof.
165
+ *
166
+ * Zero-config: `getCollab()` with no args yields REAL (non-mock) CRDT
167
+ * behaviour via an in-memory snapshot store (composed from
168
+ * `@nebutra/tenant-store`) and an in-process loopback transport. Production
169
+ * swaps a Prisma/Redis `SnapshotStore` and a Pusher/WebSocket
170
+ * `CollabTransport` through the same interfaces (see README).
171
+ *
172
+ * This package keeps itself in the `active` tier of the three-tier module
173
+ * lifecycle by shipping a real in-package caller of the exported factory —
174
+ * see `examples/zero-config-convergence.ts`.
175
+ */
176
+ &nbsp;
177
+ export { CollabError } from "./errors";
178
+ export type { CollabErrorCode, CollabErrorInit } from "./errors";
179
+ export { createCollab, getCollab } from "./hub";
180
+ export type {
181
+ CollabConfig,
182
+ CollabHub,
183
+ CollabRoom,
184
+ CollabTransport,
185
+ DoctorCheck,
186
+ DoctorReport,
187
+ SnapshotStore,
188
+ UpdateListener,
189
+ } from "./types";
190
+ export { InMemorySnapshotStore } from "./store/memory";
191
+ export { LoopbackTransport } from "./transport/loopback";
192
+ &nbsp;</pre></td></tr></table></pre>
193
+
194
+ <div class='push'></div><!-- for sticky footer -->
195
+ </div><!-- /wrapper -->
196
+ <div class='footer quiet pad2 space-top1 center small'>
197
+ Code coverage generated by
198
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
199
+ at 2026-05-17T09:08:52.337Z
200
+ </div>
201
+ <script src="../prettify.js"></script>
202
+ <script>
203
+ window.onload = function () {
204
+ prettyPrint();
205
+ };
206
+ </script>
207
+ <script src="../sorter.js"></script>
208
+ <script src="../block-navigation.js"></script>
209
+ </body>
210
+ </html>
211
+