@mybuildex/pkg 0.10.2 → 0.11.0
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/README.md +28 -0
- package/dist/acl/map.generated.js +25 -0
- package/dist/acl/map.generated.js.map +1 -1
- package/dist/index.d.ts +6 -0
- package/dist/index.js +33 -1
- package/dist/index.js.map +1 -1
- package/dist/network/context.d.ts +68 -0
- package/dist/network/context.js +189 -0
- package/dist/network/context.js.map +1 -0
- package/dist/network/plugin.d.ts +21 -0
- package/dist/network/plugin.js +179 -0
- package/dist/network/plugin.js.map +1 -0
- package/dist/network/replication.d.ts +86 -0
- package/dist/network/replication.js +328 -0
- package/dist/network/replication.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,328 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Replicação matriz -> filiais (governança de rede; ver context.ts).
|
|
3
|
+
//
|
|
4
|
+
// Tudo o que a MATRIZ grava numa tabela do catálogo de módulos da rede é
|
|
5
|
+
// espelhado nas filiais — os bancos das escolas têm as mesmas tabelas. Em vez
|
|
6
|
+
// de repetir cada operação do Prisma em cada filial (ids divergiriam, e
|
|
7
|
+
// update/delete por id acertariam a linha errada), a réplica copia o ESTADO
|
|
8
|
+
// final das linhas tocadas, pela chave primária:
|
|
9
|
+
//
|
|
10
|
+
// 1. durante a request, o client da matriz (proxy de trackWrites) anota a
|
|
11
|
+
// chave de cada linha escrita: pelo resultado (create/update/upsert/
|
|
12
|
+
// delete), por uma leitura antes da escrita (where de update/delete e
|
|
13
|
+
// das variantes *Many) ou, no createMany (o MySQL não devolve os ids),
|
|
14
|
+
// por uma busca depois com os mesmos valores gravados;
|
|
15
|
+
// 2. no fim da request (onSend, ANTES da resposta sair), syncWrites roda numa
|
|
16
|
+
// ÚNICA transação, para cada filial:
|
|
17
|
+
// DELETE das linhas que não existem mais na matriz
|
|
18
|
+
// INSERT ... SELECT da matriz ... ON DUPLICATE KEY UPDATE
|
|
19
|
+
// com o mesmo id da matriz. Falha em qualquer filial desfaz a réplica em
|
|
20
|
+
// todas (a escrita na matriz já foi gravada).
|
|
21
|
+
//
|
|
22
|
+
// Por copiar o estado (e não a operação), a réplica é idempotente e também
|
|
23
|
+
// cobre escrita dentro de $transaction (o estado lido já é o confirmado).
|
|
24
|
+
//
|
|
25
|
+
// Limitações: SQL cru ($executeRaw) na matriz não é capturado; escrita
|
|
26
|
+
// aninhada em relação (data: {filhos: {create}}) só replica a tabela do model
|
|
27
|
+
// chamado.
|
|
28
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
29
|
+
exports.NetworkWrites = exports.MAX_TRACKED_ROWS = exports.PROTECTED_ROWS = exports.NEVER_REPLICATED = exports.NETWORK_WRITE_OPERATIONS = void 0;
|
|
30
|
+
exports.createTableMetaCache = createTableMetaCache;
|
|
31
|
+
exports.flattenWhere = flattenWhere;
|
|
32
|
+
exports.trackWrites = trackWrites;
|
|
33
|
+
exports.buildSyncStatements = buildSyncStatements;
|
|
34
|
+
exports.syncWrites = syncWrites;
|
|
35
|
+
/** Escritas do Prisma que a réplica acompanha (as mesmas da auditoria). */
|
|
36
|
+
exports.NETWORK_WRITE_OPERATIONS = new Set([
|
|
37
|
+
"create", "createMany", "createManyAndReturn",
|
|
38
|
+
"update", "updateMany", "updateManyAndReturn",
|
|
39
|
+
"upsert", "delete", "deleteMany",
|
|
40
|
+
]);
|
|
41
|
+
/** Leitura da chave antes de escrever (where de update/delete/upsert/*Many). */
|
|
42
|
+
const READ_KEYS_BEFORE = new Set(["update", "updateMany", "updateManyAndReturn", "upsert", "delete", "deleteMany"]);
|
|
43
|
+
/** Tabelas nunca replicadas, mesmo no catálogo. */
|
|
44
|
+
exports.NEVER_REPLICATED = new Set(["audit_logs", "migrations"]);
|
|
45
|
+
/**
|
|
46
|
+
* Linhas que pertencem a cada escola e nunca são copiadas nem apagadas pela
|
|
47
|
+
* réplica: a flag REDE é gravada pelo core em cada membro.
|
|
48
|
+
*/
|
|
49
|
+
exports.PROTECTED_ROWS = {
|
|
50
|
+
configs: { column: "key", value: "REDE" },
|
|
51
|
+
};
|
|
52
|
+
/** Teto de linhas por escrita *Many acompanhada. */
|
|
53
|
+
exports.MAX_TRACKED_ROWS = 5000;
|
|
54
|
+
const CHUNK = 500;
|
|
55
|
+
const IDENT_RE = /^[A-Za-z0-9_]+$/;
|
|
56
|
+
function q(ident) {
|
|
57
|
+
if (!IDENT_RE.test(ident))
|
|
58
|
+
throw new Error(`identificador inválido: ${ident}`);
|
|
59
|
+
return `\`${ident}\``;
|
|
60
|
+
}
|
|
61
|
+
function isPlainObject(v) {
|
|
62
|
+
return !!v && typeof v === "object" && !Array.isArray(v) && !(v instanceof Date) && Object.getPrototypeOf(v) === Object.prototype;
|
|
63
|
+
}
|
|
64
|
+
function isPrimitive(v) {
|
|
65
|
+
return v === null || ["string", "number", "bigint", "boolean"].includes(typeof v);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Colunas e chave primária da tabela (information_schema). As tabelas são as
|
|
69
|
+
* mesmas em todas as escolas: cache por tabela, para a vida da instância.
|
|
70
|
+
*/
|
|
71
|
+
function createTableMetaCache() {
|
|
72
|
+
const cache = new Map();
|
|
73
|
+
return function tableMeta(db, schema, table) {
|
|
74
|
+
let hit = cache.get(table);
|
|
75
|
+
if (!hit) {
|
|
76
|
+
hit = (async () => {
|
|
77
|
+
const rows = await db.$queryRawUnsafe("SELECT COLUMN_NAME AS name, COLUMN_KEY AS col_key, EXTRA AS extra FROM information_schema.COLUMNS" +
|
|
78
|
+
" WHERE TABLE_SCHEMA = ? AND TABLE_NAME = ? ORDER BY ORDINAL_POSITION", schema, table);
|
|
79
|
+
const columns = rows.filter(r => !/GENERATED/i.test(String(r.extra ?? ""))).map(r => String(r.name));
|
|
80
|
+
const pk = rows.filter(r => String(r.col_key) === "PRI").map(r => String(r.name));
|
|
81
|
+
if (!columns.length)
|
|
82
|
+
throw new Error(`tabela ${schema}.${table} não encontrada`);
|
|
83
|
+
if (!pk.length)
|
|
84
|
+
throw new Error(`tabela ${table} sem chave primária: não dá para replicar`);
|
|
85
|
+
return { columns, pk };
|
|
86
|
+
})();
|
|
87
|
+
cache.set(table, hit);
|
|
88
|
+
hit.catch(() => cache.delete(table));
|
|
89
|
+
}
|
|
90
|
+
return hit;
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function keyOf(row, pk) {
|
|
94
|
+
if (!row || typeof row !== "object")
|
|
95
|
+
return null;
|
|
96
|
+
const key = {};
|
|
97
|
+
for (const c of pk) {
|
|
98
|
+
const v = row[c];
|
|
99
|
+
if (v === undefined || v === null || typeof v === "object")
|
|
100
|
+
return null;
|
|
101
|
+
key[c] = v;
|
|
102
|
+
}
|
|
103
|
+
return key;
|
|
104
|
+
}
|
|
105
|
+
function keyString(key, pk) {
|
|
106
|
+
return pk.map(c => String(key[c])).join("\u0000");
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* where do Prisma -> where de findMany: chave única composta
|
|
110
|
+
* (`{a_b: {a, b}}`) vira `{a, b}`; o resto passa igual.
|
|
111
|
+
*/
|
|
112
|
+
function flattenWhere(where, meta) {
|
|
113
|
+
const out = {};
|
|
114
|
+
for (const [k, v] of Object.entries(where ?? {})) {
|
|
115
|
+
if (!meta.columns.includes(k) && isPlainObject(v) && Object.keys(v).length > 0 && Object.keys(v).every(c => meta.columns.includes(c))) {
|
|
116
|
+
Object.assign(out, v);
|
|
117
|
+
}
|
|
118
|
+
else {
|
|
119
|
+
out[k] = v;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return out;
|
|
123
|
+
}
|
|
124
|
+
/** Valores simples gravados numa linha (para reencontrá-la depois do createMany). */
|
|
125
|
+
function lookupWhere(data, meta) {
|
|
126
|
+
const where = {};
|
|
127
|
+
for (const [k, v] of Object.entries(data ?? {})) {
|
|
128
|
+
if (meta.columns.includes(k) && isPrimitive(v))
|
|
129
|
+
where[k] = v;
|
|
130
|
+
}
|
|
131
|
+
return Object.keys(where).length ? where : null;
|
|
132
|
+
}
|
|
133
|
+
/** Linhas tocadas pela request na matriz, por tabela, na ordem da primeira escrita. */
|
|
134
|
+
class NetworkWrites {
|
|
135
|
+
tables = [];
|
|
136
|
+
keys = new Map();
|
|
137
|
+
lookups = new Map();
|
|
138
|
+
touch(table) {
|
|
139
|
+
if (!this.keys.has(table)) {
|
|
140
|
+
this.tables.push(table);
|
|
141
|
+
this.keys.set(table, new Map());
|
|
142
|
+
this.lookups.set(table, []);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
addKey(table, key, pk) {
|
|
146
|
+
this.touch(table);
|
|
147
|
+
this.keys.get(table).set(keyString(key, pk), key);
|
|
148
|
+
}
|
|
149
|
+
addLookup(table, where) {
|
|
150
|
+
this.touch(table);
|
|
151
|
+
this.lookups.get(table).push(where);
|
|
152
|
+
}
|
|
153
|
+
get empty() {
|
|
154
|
+
return this.tables.length === 0;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
exports.NetworkWrites = NetworkWrites;
|
|
158
|
+
async function trackOperation(table, op, args, run, opts) {
|
|
159
|
+
const meta = await opts.meta(table);
|
|
160
|
+
const { writes, base } = opts;
|
|
161
|
+
if (READ_KEYS_BEFORE.has(op)) {
|
|
162
|
+
const where = flattenWhere(args?.where, meta);
|
|
163
|
+
const select = Object.fromEntries(meta.pk.map(c => [c, true]));
|
|
164
|
+
const before = await base[table].findMany({ where, select, take: exports.MAX_TRACKED_ROWS });
|
|
165
|
+
for (const row of before) {
|
|
166
|
+
const key = keyOf(row, meta.pk);
|
|
167
|
+
if (key)
|
|
168
|
+
writes.addKey(table, key, meta.pk);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
const result = await run(args);
|
|
172
|
+
// *Many devolve {count}: sem a chave, keyOf descarta
|
|
173
|
+
const rows = Array.isArray(result) ? result : result && typeof result === "object" ? [result] : [];
|
|
174
|
+
let found = false;
|
|
175
|
+
for (const row of rows) {
|
|
176
|
+
const key = keyOf(row, meta.pk);
|
|
177
|
+
if (key) {
|
|
178
|
+
writes.addKey(table, key, meta.pk);
|
|
179
|
+
found = true;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (!found && (op === "create" || op === "createMany")) {
|
|
183
|
+
// createMany não devolve linhas; create com select sem a chave também não
|
|
184
|
+
const list = op === "create" ? [args?.data] : Array.isArray(args?.data) ? args.data : [args?.data];
|
|
185
|
+
for (const data of list) {
|
|
186
|
+
const key = keyOf(data, meta.pk);
|
|
187
|
+
if (key) {
|
|
188
|
+
writes.addKey(table, key, meta.pk);
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
191
|
+
const where = lookupWhere(data, meta);
|
|
192
|
+
if (where)
|
|
193
|
+
writes.addLookup(table, where);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
return result;
|
|
197
|
+
}
|
|
198
|
+
function bindValue(target, prop) {
|
|
199
|
+
const v = Reflect.get(target, prop);
|
|
200
|
+
return typeof v === "function" ? v.bind(target) : v;
|
|
201
|
+
}
|
|
202
|
+
function trackDelegate(delegate, table, opts) {
|
|
203
|
+
return new Proxy(delegate, {
|
|
204
|
+
get(target, prop) {
|
|
205
|
+
const fn = bindValue(target, prop);
|
|
206
|
+
if (typeof prop !== "string" || typeof fn !== "function" || !exports.NETWORK_WRITE_OPERATIONS.has(prop))
|
|
207
|
+
return fn;
|
|
208
|
+
return (args) => trackOperation(table, prop, args, fn, opts);
|
|
209
|
+
},
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Client da matriz que anota as escritas nas tabelas replicadas. Leitura, SQL
|
|
214
|
+
* cru e tabelas fora do catálogo passam direto. $transaction interativa
|
|
215
|
+
* recebe um tx também acompanhado.
|
|
216
|
+
*/
|
|
217
|
+
function trackWrites(client, opts) {
|
|
218
|
+
return new Proxy(client, {
|
|
219
|
+
get(target, prop) {
|
|
220
|
+
if (prop === "$transaction") {
|
|
221
|
+
const tx = bindValue(target, prop);
|
|
222
|
+
return (arg, txOptions) => typeof arg === "function"
|
|
223
|
+
? tx((inner) => arg(trackWrites(inner, opts)), txOptions)
|
|
224
|
+
: tx(arg, txOptions);
|
|
225
|
+
}
|
|
226
|
+
if (typeof prop === "string" && opts.tables.has(prop) && !exports.NEVER_REPLICATED.has(prop)) {
|
|
227
|
+
return trackDelegate(Reflect.get(target, prop), prop, opts);
|
|
228
|
+
}
|
|
229
|
+
return bindValue(target, prop);
|
|
230
|
+
},
|
|
231
|
+
});
|
|
232
|
+
}
|
|
233
|
+
function keyCondition(alias, pk, keys) {
|
|
234
|
+
if (pk.length === 1) {
|
|
235
|
+
return { sql: `${alias}.${q(pk[0])} IN (${keys.map(() => "?").join(", ")})`, params: keys.map(k => k[pk[0]]) };
|
|
236
|
+
}
|
|
237
|
+
const tuple = `(${pk.map(() => "?").join(", ")})`;
|
|
238
|
+
return {
|
|
239
|
+
sql: `(${pk.map(c => `${alias}.${q(c)}`).join(", ")}) IN (${keys.map(() => tuple).join(", ")})`,
|
|
240
|
+
params: keys.flatMap(k => pk.map(c => k[c])),
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
function samePk(a, b, pk) {
|
|
244
|
+
return pk.map(c => `${a}.${q(c)} = ${b}.${q(c)}`).join(" AND ");
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* SQL que deixa as linhas `keys` de `table` na filial iguais às da matriz:
|
|
248
|
+
* apaga as que sumiram da matriz e insere/atualiza as demais com o mesmo id.
|
|
249
|
+
*/
|
|
250
|
+
function buildSyncStatements(source, target, table, meta, keys) {
|
|
251
|
+
const src = `${q(source)}.${q(table)}`;
|
|
252
|
+
const dst = `${q(target)}.${q(table)}`;
|
|
253
|
+
const cols = meta.columns.map(q);
|
|
254
|
+
const update = meta.columns.filter(c => !meta.pk.includes(c)).map(c => `${q(c)} = VALUES(${q(c)})`);
|
|
255
|
+
const guard = exports.PROTECTED_ROWS[table];
|
|
256
|
+
const deletes = [];
|
|
257
|
+
const upserts = [];
|
|
258
|
+
for (let i = 0; i < keys.length; i += CHUNK) {
|
|
259
|
+
const chunk = keys.slice(i, i + CHUNK);
|
|
260
|
+
const dk = keyCondition("dst", meta.pk, chunk);
|
|
261
|
+
// DELETE de tabela única com alias (MySQL 8.0.16+): o multi-tabela
|
|
262
|
+
// (`DELETE dst FROM ... AS dst`) exige database default, e o pool não tem
|
|
263
|
+
const del = {
|
|
264
|
+
sql: `DELETE FROM ${dst} AS dst WHERE ${dk.sql}` +
|
|
265
|
+
(guard ? ` AND NOT (dst.${q(guard.column)} <=> ?)` : "") +
|
|
266
|
+
` AND NOT EXISTS (SELECT 1 FROM ${src} AS src WHERE ${samePk("src", "dst", meta.pk)})`,
|
|
267
|
+
params: [...dk.params, ...(guard ? [guard.value] : [])],
|
|
268
|
+
};
|
|
269
|
+
deletes.push(del);
|
|
270
|
+
const sk = keyCondition("src", meta.pk, chunk);
|
|
271
|
+
const head = update.length ? `INSERT INTO ${dst}` : `INSERT IGNORE INTO ${dst}`;
|
|
272
|
+
upserts.push({
|
|
273
|
+
sql: `${head} (${cols.join(", ")}) SELECT ${cols.map(c => `src.${c}`).join(", ")} FROM ${src} AS src WHERE ${sk.sql}` +
|
|
274
|
+
(guard
|
|
275
|
+
? ` AND NOT (src.${q(guard.column)} <=> ?)` +
|
|
276
|
+
` AND NOT EXISTS (SELECT 1 FROM ${dst} AS cur WHERE ${samePk("cur", "src", meta.pk)} AND cur.${q(guard.column)} <=> ?)`
|
|
277
|
+
: "") +
|
|
278
|
+
(update.length ? ` ON DUPLICATE KEY UPDATE ${update.join(", ")}` : ""),
|
|
279
|
+
params: [...sk.params, ...(guard ? [guard.value, guard.value] : [])],
|
|
280
|
+
});
|
|
281
|
+
}
|
|
282
|
+
return { deletes, upserts };
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Copia para cada filial as linhas anotadas em `writes`, numa transação só.
|
|
286
|
+
* `db` executa o SQL (qualquer client do pool serve: todo nome é qualificado)
|
|
287
|
+
* e `base` reencontra as linhas do createMany na matriz.
|
|
288
|
+
*/
|
|
289
|
+
async function syncWrites(input) {
|
|
290
|
+
const { db, base, source, targets, writes, meta } = input;
|
|
291
|
+
const result = { tables: {}, filiais: targets, statements: 0 };
|
|
292
|
+
const perTable = [];
|
|
293
|
+
for (const table of writes.tables) {
|
|
294
|
+
const m = await meta(table);
|
|
295
|
+
const lookups = writes.lookups.get(table) ?? [];
|
|
296
|
+
for (let i = 0; i < lookups.length; i += CHUNK) {
|
|
297
|
+
const select = Object.fromEntries(m.pk.map(c => [c, true]));
|
|
298
|
+
const found = await base[table].findMany({ where: { OR: lookups.slice(i, i + CHUNK) }, select, take: exports.MAX_TRACKED_ROWS });
|
|
299
|
+
for (const row of found) {
|
|
300
|
+
const key = keyOf(row, m.pk);
|
|
301
|
+
if (key)
|
|
302
|
+
writes.addKey(table, key, m.pk);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
const keys = [...(writes.keys.get(table)?.values() ?? [])];
|
|
306
|
+
if (keys.length)
|
|
307
|
+
perTable.push({ table, meta: m, keys });
|
|
308
|
+
result.tables[table] = keys.length;
|
|
309
|
+
}
|
|
310
|
+
if (!perTable.length || !targets.length)
|
|
311
|
+
return result;
|
|
312
|
+
const statements = [];
|
|
313
|
+
for (const target of targets) {
|
|
314
|
+
const built = perTable.map(t => buildSyncStatements(source, target, t.table, t.meta, t.keys));
|
|
315
|
+
// filhos antes dos pais ao apagar; pais antes dos filhos ao inserir (FKs)
|
|
316
|
+
for (const b of [...built].reverse())
|
|
317
|
+
statements.push(...b.deletes);
|
|
318
|
+
for (const b of built)
|
|
319
|
+
statements.push(...b.upserts);
|
|
320
|
+
}
|
|
321
|
+
await db.$transaction(async (tx) => {
|
|
322
|
+
for (const s of statements)
|
|
323
|
+
await tx.$executeRawUnsafe(s.sql, ...s.params);
|
|
324
|
+
});
|
|
325
|
+
result.statements = statements.length;
|
|
326
|
+
return result;
|
|
327
|
+
}
|
|
328
|
+
//# sourceMappingURL=replication.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replication.js","sourceRoot":"","sources":["../../src/network/replication.ts"],"names":[],"mappings":"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"}
|