@soulbatical/tetra-core 0.1.37 → 0.1.38
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.
|
@@ -4,9 +4,6 @@
|
|
|
4
4
|
* Wraps a SupabaseClient so that every insert/update/upsert/delete on .from()
|
|
5
5
|
* also fires a fire-and-forget RPC to the Stella daemon's RuVectorStore.
|
|
6
6
|
*
|
|
7
|
-
* The proxy is transparent: it returns the same SupabaseClient interface,
|
|
8
|
-
* same return types, same behavior. RuVector sync failures are silently logged.
|
|
9
|
-
*
|
|
10
7
|
* Activation: set DUAL_WRITE=1 or STELLA_STORES=supabase,ruvector
|
|
11
8
|
*/
|
|
12
9
|
import type { SupabaseClient } from '@supabase/supabase-js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dualWriteProxy.d.ts","sourceRoot":"","sources":["../../src/core/dualWriteProxy.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dualWriteProxy.d.ts","sourceRoot":"","sources":["../../src/core/dualWriteProxy.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AA+R3D,wBAAgB,kBAAkB,IAAI,OAAO,CAI5C;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE,cAAc,GAAG,cAAc,CASpE"}
|
|
@@ -4,9 +4,6 @@
|
|
|
4
4
|
* Wraps a SupabaseClient so that every insert/update/upsert/delete on .from()
|
|
5
5
|
* also fires a fire-and-forget RPC to the Stella daemon's RuVectorStore.
|
|
6
6
|
*
|
|
7
|
-
* The proxy is transparent: it returns the same SupabaseClient interface,
|
|
8
|
-
* same return types, same behavior. RuVector sync failures are silently logged.
|
|
9
|
-
*
|
|
10
7
|
* Activation: set DUAL_WRITE=1 or STELLA_STORES=supabase,ruvector
|
|
11
8
|
*/
|
|
12
9
|
import { connect } from 'node:net';
|
|
@@ -49,7 +46,6 @@ function connectDaemon() {
|
|
|
49
46
|
});
|
|
50
47
|
});
|
|
51
48
|
}
|
|
52
|
-
/** Fire-and-forget RPC to daemon. Never throws, never blocks. */
|
|
53
49
|
function daemonRpc(method, params) {
|
|
54
50
|
connectDaemon().then(() => {
|
|
55
51
|
if (!daemonSocket || !daemonConnected)
|
|
@@ -64,129 +60,197 @@ function daemonRpc(method, params) {
|
|
|
64
60
|
}
|
|
65
61
|
}).catch(() => { });
|
|
66
62
|
}
|
|
67
|
-
// ───
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
function
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
if (prop === 'insert' && typeof value === 'function') {
|
|
81
|
-
return function (data, options) {
|
|
82
|
-
const builder = value.call(target, data, options);
|
|
83
|
-
// Attach side-effect: after this entire chain resolves, mirror to daemon
|
|
84
|
-
attachMirror(builder, () => {
|
|
85
|
-
if (Array.isArray(data)) {
|
|
86
|
-
daemonRpc('store.seed', { table, records: data });
|
|
87
|
-
}
|
|
88
|
-
else if (data) {
|
|
89
|
-
daemonRpc('store.insert', { table, record: data });
|
|
90
|
-
}
|
|
91
|
-
});
|
|
92
|
-
return builder;
|
|
93
|
-
};
|
|
94
|
-
}
|
|
95
|
-
if (prop === 'upsert' && typeof value === 'function') {
|
|
96
|
-
return function (data, options) {
|
|
97
|
-
const builder = value.call(target, data, options);
|
|
98
|
-
attachMirror(builder, () => {
|
|
99
|
-
const onConflict = options?.onConflict || 'id';
|
|
100
|
-
if (Array.isArray(data)) {
|
|
101
|
-
for (const record of data) {
|
|
102
|
-
daemonRpc('store.upsert', { table, record, onConflict });
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
else if (data) {
|
|
106
|
-
daemonRpc('store.upsert', { table, record: data, onConflict });
|
|
107
|
-
}
|
|
108
|
-
});
|
|
109
|
-
return builder;
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
if (prop === 'update' && typeof value === 'function') {
|
|
113
|
-
return function (data, options) {
|
|
114
|
-
const builder = value.call(target, data, options);
|
|
115
|
-
// For update we need the filter chain — we'll capture it from the URL later
|
|
116
|
-
attachMirrorWithFilters(builder, table, 'update', data);
|
|
117
|
-
return builder;
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
if (prop === 'delete' && typeof value === 'function') {
|
|
121
|
-
return function (options) {
|
|
122
|
-
const builder = value.call(target, options);
|
|
123
|
-
attachMirrorWithFilters(builder, table, 'delete', null);
|
|
124
|
-
return builder;
|
|
125
|
-
};
|
|
126
|
-
}
|
|
127
|
-
if (typeof value === 'function')
|
|
128
|
-
return value.bind(target);
|
|
129
|
-
return value;
|
|
63
|
+
// ─── Mirror logic ───────────────────────────────────────────
|
|
64
|
+
function mirrorInsert(table, data) {
|
|
65
|
+
if (Array.isArray(data)) {
|
|
66
|
+
daemonRpc('store.seed', { table, records: data });
|
|
67
|
+
}
|
|
68
|
+
else if (data) {
|
|
69
|
+
daemonRpc('store.insert', { table, record: data });
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function mirrorUpsert(table, data, onConflict) {
|
|
73
|
+
if (Array.isArray(data)) {
|
|
74
|
+
for (const record of data) {
|
|
75
|
+
daemonRpc('store.upsert', { table, record, onConflict });
|
|
130
76
|
}
|
|
131
|
-
}
|
|
77
|
+
}
|
|
78
|
+
else if (data) {
|
|
79
|
+
daemonRpc('store.upsert', { table, record: data, onConflict });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function mirrorUpdate(table, changes, filters) {
|
|
83
|
+
if (filters.length && changes) {
|
|
84
|
+
daemonRpc('store.update', { table, filters, changes });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
function mirrorDelete(table, filters) {
|
|
88
|
+
if (filters.length) {
|
|
89
|
+
daemonRpc('store.delete', { table, filters });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
class DualWriteQueryBuilder {
|
|
93
|
+
original;
|
|
94
|
+
table;
|
|
95
|
+
constructor(original, table) {
|
|
96
|
+
this.original = original;
|
|
97
|
+
this.table = table;
|
|
98
|
+
}
|
|
99
|
+
// ─── Write methods with dual-write ───
|
|
100
|
+
insert(data, options) {
|
|
101
|
+
const result = this.original.insert(data, options);
|
|
102
|
+
return this.wrapResult(result, () => mirrorInsert(this.table, data));
|
|
103
|
+
}
|
|
104
|
+
upsert(data, options) {
|
|
105
|
+
const result = this.original.upsert(data, options);
|
|
106
|
+
const onConflict = options?.onConflict || 'id';
|
|
107
|
+
return this.wrapResult(result, () => mirrorUpsert(this.table, data, onConflict));
|
|
108
|
+
}
|
|
109
|
+
update(changes, options) {
|
|
110
|
+
const result = this.original.update(changes, options);
|
|
111
|
+
return this.wrapFilteredResult(result, (filters) => mirrorUpdate(this.table, changes, filters));
|
|
112
|
+
}
|
|
113
|
+
delete(options) {
|
|
114
|
+
const result = this.original.delete(options);
|
|
115
|
+
return this.wrapFilteredResult(result, (filters) => mirrorDelete(this.table, filters));
|
|
116
|
+
}
|
|
117
|
+
// ─── Read methods (pass-through) ───
|
|
118
|
+
select(...args) { return this.original.select(...args); }
|
|
119
|
+
// ─── Wrap a write result to trigger mirror on success ───
|
|
120
|
+
wrapResult(builder, onSuccess) {
|
|
121
|
+
return new DualWriteResultBuilder(builder, onSuccess);
|
|
122
|
+
}
|
|
123
|
+
wrapFilteredResult(builder, onSuccess) {
|
|
124
|
+
return new DualWriteFilterBuilder(builder, onSuccess);
|
|
125
|
+
}
|
|
132
126
|
}
|
|
133
127
|
/**
|
|
134
|
-
*
|
|
135
|
-
*
|
|
128
|
+
* Wraps a PostgREST result builder (after insert/upsert).
|
|
129
|
+
* Intercepts await/.then() to trigger the daemon mirror on success.
|
|
136
130
|
*/
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
//
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
return
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
131
|
+
class DualWriteResultBuilder {
|
|
132
|
+
builder;
|
|
133
|
+
onSuccess;
|
|
134
|
+
constructor(builder, onSuccess) {
|
|
135
|
+
this.builder = builder;
|
|
136
|
+
this.onSuccess = onSuccess;
|
|
137
|
+
}
|
|
138
|
+
// Chain methods — delegate to original, keep wrapping
|
|
139
|
+
select(...args) {
|
|
140
|
+
this.builder = this.builder.select(...args);
|
|
141
|
+
return this;
|
|
142
|
+
}
|
|
143
|
+
single() {
|
|
144
|
+
this.builder = this.builder.single();
|
|
145
|
+
return this;
|
|
146
|
+
}
|
|
147
|
+
maybeSingle() {
|
|
148
|
+
this.builder = this.builder.maybeSingle();
|
|
149
|
+
return this;
|
|
150
|
+
}
|
|
151
|
+
order(...args) {
|
|
152
|
+
this.builder = this.builder.order(...args);
|
|
153
|
+
return this;
|
|
154
|
+
}
|
|
155
|
+
limit(...args) {
|
|
156
|
+
this.builder = this.builder.limit(...args);
|
|
157
|
+
return this;
|
|
158
|
+
}
|
|
159
|
+
eq(...args) {
|
|
160
|
+
this.builder = this.builder.eq(...args);
|
|
161
|
+
return this;
|
|
162
|
+
}
|
|
163
|
+
// Thenable — this is what await calls
|
|
164
|
+
then(onFulfilled, onRejected) {
|
|
165
|
+
return this.builder.then((result) => {
|
|
153
166
|
if (!result?.error) {
|
|
154
167
|
try {
|
|
155
|
-
onSuccess();
|
|
168
|
+
this.onSuccess();
|
|
156
169
|
}
|
|
157
170
|
catch { /* never fail */ }
|
|
158
171
|
}
|
|
159
172
|
return onFulfilled ? onFulfilled(result) : result;
|
|
160
173
|
}, onRejected);
|
|
161
|
-
}
|
|
162
|
-
// Override .then on the instance
|
|
163
|
-
builder.then = patchedThen;
|
|
174
|
+
}
|
|
164
175
|
}
|
|
165
176
|
/**
|
|
166
|
-
*
|
|
177
|
+
* Wraps update/delete result builders. Captures .eq() filter calls
|
|
178
|
+
* to pass to the daemon mirror.
|
|
167
179
|
*/
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
}
|
|
180
|
+
class DualWriteFilterBuilder {
|
|
181
|
+
builder;
|
|
182
|
+
onSuccess;
|
|
183
|
+
filters = [];
|
|
184
|
+
constructor(builder, onSuccess) {
|
|
185
|
+
this.builder = builder;
|
|
186
|
+
this.onSuccess = onSuccess;
|
|
187
|
+
}
|
|
188
|
+
// Filter methods — capture and delegate
|
|
189
|
+
eq(column, value) {
|
|
190
|
+
this.filters.push({ column, op: 'eq', value });
|
|
191
|
+
this.builder = this.builder.eq(column, value);
|
|
192
|
+
return this;
|
|
193
|
+
}
|
|
194
|
+
neq(column, value) {
|
|
195
|
+
this.filters.push({ column, op: 'neq', value });
|
|
196
|
+
this.builder = this.builder.neq(column, value);
|
|
197
|
+
return this;
|
|
198
|
+
}
|
|
199
|
+
gt(column, value) {
|
|
200
|
+
this.filters.push({ column, op: 'gt', value });
|
|
201
|
+
this.builder = this.builder.gt(column, value);
|
|
202
|
+
return this;
|
|
203
|
+
}
|
|
204
|
+
gte(column, value) {
|
|
205
|
+
this.filters.push({ column, op: 'gte', value });
|
|
206
|
+
this.builder = this.builder.gte(column, value);
|
|
207
|
+
return this;
|
|
208
|
+
}
|
|
209
|
+
lt(column, value) {
|
|
210
|
+
this.filters.push({ column, op: 'lt', value });
|
|
211
|
+
this.builder = this.builder.lt(column, value);
|
|
212
|
+
return this;
|
|
213
|
+
}
|
|
214
|
+
lte(column, value) {
|
|
215
|
+
this.filters.push({ column, op: 'lte', value });
|
|
216
|
+
this.builder = this.builder.lte(column, value);
|
|
217
|
+
return this;
|
|
218
|
+
}
|
|
219
|
+
in(column, values) {
|
|
220
|
+
this.filters.push({ column, op: 'in', value: values });
|
|
221
|
+
this.builder = this.builder.in(column, values);
|
|
222
|
+
return this;
|
|
223
|
+
}
|
|
224
|
+
is(column, value) {
|
|
225
|
+
this.filters.push({ column, op: 'is', value });
|
|
226
|
+
this.builder = this.builder.is(column, value);
|
|
227
|
+
return this;
|
|
228
|
+
}
|
|
229
|
+
// Chain methods
|
|
230
|
+
select(...args) {
|
|
231
|
+
this.builder = this.builder.select(...args);
|
|
232
|
+
return this;
|
|
233
|
+
}
|
|
234
|
+
single() {
|
|
235
|
+
this.builder = this.builder.single();
|
|
236
|
+
return this;
|
|
237
|
+
}
|
|
238
|
+
maybeSingle() {
|
|
239
|
+
this.builder = this.builder.maybeSingle();
|
|
240
|
+
return this;
|
|
241
|
+
}
|
|
242
|
+
// Thenable
|
|
243
|
+
then(onFulfilled, onRejected) {
|
|
244
|
+
return this.builder.then((result) => {
|
|
245
|
+
if (!result?.error) {
|
|
246
|
+
try {
|
|
247
|
+
this.onSuccess(this.filters);
|
|
248
|
+
}
|
|
249
|
+
catch { /* never fail */ }
|
|
250
|
+
}
|
|
251
|
+
return onFulfilled ? onFulfilled(result) : result;
|
|
252
|
+
}, onRejected);
|
|
179
253
|
}
|
|
180
|
-
attachMirror(builder, () => {
|
|
181
|
-
if (filters.length === 0)
|
|
182
|
-
return; // No filters = unsafe, skip
|
|
183
|
-
if (op === 'update' && changes) {
|
|
184
|
-
daemonRpc('store.update', { table, filters, changes });
|
|
185
|
-
}
|
|
186
|
-
else if (op === 'delete') {
|
|
187
|
-
daemonRpc('store.delete', { table, filters });
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
254
|
}
|
|
191
255
|
// ─── Public API ─────────────────────────────────────────────
|
|
192
256
|
export function isDualWriteEnabled() {
|
|
@@ -199,7 +263,7 @@ export function withDualWrite(client) {
|
|
|
199
263
|
const originalFrom = client.from.bind(client);
|
|
200
264
|
client.from = function proxiedFrom(table) {
|
|
201
265
|
const queryBuilder = originalFrom(table);
|
|
202
|
-
return
|
|
266
|
+
return new DualWriteQueryBuilder(queryBuilder, table);
|
|
203
267
|
};
|
|
204
268
|
return client;
|
|
205
269
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dualWriteProxy.js","sourceRoot":"","sources":["../../src/core/dualWriteProxy.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"dualWriteProxy.js","sourceRoot":"","sources":["../../src/core/dualWriteProxy.ts"],"names":[],"mappings":"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"}
|