@reprova/sdk 0.5.0 → 0.6.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 +75 -0
- package/dist/cjs/context.js +28 -0
- package/dist/cjs/distributionBaselinePoller.js +87 -0
- package/dist/cjs/distributionDrift.js +170 -0
- package/dist/cjs/drizzle.js +204 -0
- package/dist/cjs/frameworkAdapter.js +2 -0
- package/dist/cjs/httpFetch.js +59 -0
- package/dist/cjs/idempotency.js +132 -0
- package/dist/cjs/idempotencySettingsPoller.js +71 -0
- package/dist/cjs/index.js +96 -0
- package/dist/cjs/invariantInference.js +90 -0
- package/dist/cjs/invariantRules.js +142 -0
- package/dist/cjs/knex.js +86 -0
- package/dist/cjs/kysely.js +175 -0
- package/dist/cjs/legacyPrisma.js +130 -0
- package/dist/cjs/mikroorm.js +74 -0
- package/dist/cjs/mongoSchemaReporter.js +85 -0
- package/dist/cjs/mongoose.js +335 -0
- package/dist/cjs/nPlusOne.js +0 -0
- package/dist/cjs/nest.js +136 -0
- package/dist/cjs/nextjs.js +180 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/prisma.js +363 -0
- package/dist/cjs/proto.gen.js +4 -0
- package/dist/cjs/registry.js +100 -0
- package/dist/cjs/retryStorm.js +70 -0
- package/dist/cjs/rulesPoller.js +77 -0
- package/dist/cjs/sdk.js +1231 -0
- package/dist/cjs/sequelize.js +108 -0
- package/dist/cjs/shape.js +45 -0
- package/dist/cjs/stack.js +51 -0
- package/dist/cjs/transport.js +71 -0
- package/dist/cjs/typeorm.js +200 -0
- package/dist/context.d.ts +18 -0
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js.map +1 -1
- package/dist/distributionBaselinePoller.d.ts +36 -0
- package/dist/distributionBaselinePoller.d.ts.map +1 -0
- package/dist/distributionBaselinePoller.js +84 -0
- package/dist/distributionBaselinePoller.js.map +1 -0
- package/dist/distributionDrift.d.ts +41 -0
- package/dist/distributionDrift.d.ts.map +1 -0
- package/dist/distributionDrift.js +161 -0
- package/dist/distributionDrift.js.map +1 -0
- package/dist/drizzle.d.ts.map +1 -1
- package/dist/drizzle.js +10 -4
- package/dist/drizzle.js.map +1 -1
- package/dist/frameworkAdapter.d.ts +5 -0
- package/dist/frameworkAdapter.d.ts.map +1 -0
- package/dist/frameworkAdapter.js +2 -0
- package/dist/frameworkAdapter.js.map +1 -0
- package/dist/httpFetch.d.ts +13 -0
- package/dist/httpFetch.d.ts.map +1 -0
- package/dist/httpFetch.js +54 -0
- package/dist/httpFetch.js.map +1 -0
- package/dist/idempotency.d.ts +26 -0
- package/dist/idempotency.d.ts.map +1 -0
- package/dist/idempotency.js +124 -0
- package/dist/idempotency.js.map +1 -0
- package/dist/idempotencySettingsPoller.d.ts +23 -0
- package/dist/idempotencySettingsPoller.d.ts.map +1 -0
- package/dist/idempotencySettingsPoller.js +68 -0
- package/dist/idempotencySettingsPoller.js.map +1 -0
- package/dist/index.d.ts +30 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -3
- package/dist/index.js.map +1 -1
- package/dist/invariantInference.d.ts +28 -0
- package/dist/invariantInference.d.ts.map +1 -0
- package/dist/invariantInference.js +87 -0
- package/dist/invariantInference.js.map +1 -0
- package/dist/invariantRules.d.ts +16 -0
- package/dist/invariantRules.d.ts.map +1 -0
- package/dist/invariantRules.js +104 -0
- package/dist/invariantRules.js.map +1 -0
- package/dist/knex.d.ts.map +1 -1
- package/dist/knex.js +1 -0
- package/dist/knex.js.map +1 -1
- package/dist/kysely.d.ts.map +1 -1
- package/dist/kysely.js +2 -1
- package/dist/kysely.js.map +1 -1
- package/dist/legacyPrisma.d.ts +6 -0
- package/dist/legacyPrisma.d.ts.map +1 -0
- package/dist/legacyPrisma.js +128 -0
- package/dist/legacyPrisma.js.map +1 -0
- package/dist/mikroorm.d.ts +2 -0
- package/dist/mikroorm.d.ts.map +1 -0
- package/dist/mikroorm.js +72 -0
- package/dist/mikroorm.js.map +1 -0
- package/dist/mongoSchemaReporter.d.ts +23 -0
- package/dist/mongoSchemaReporter.d.ts.map +1 -0
- package/dist/mongoSchemaReporter.js +82 -0
- package/dist/mongoSchemaReporter.js.map +1 -0
- package/dist/mongoose.d.ts +48 -0
- package/dist/mongoose.d.ts.map +1 -0
- package/dist/mongoose.js +331 -0
- package/dist/mongoose.js.map +1 -0
- package/dist/nPlusOne.d.ts +52 -0
- package/dist/nPlusOne.d.ts.map +1 -0
- package/dist/nPlusOne.js +0 -0
- package/dist/nPlusOne.js.map +1 -0
- package/dist/nest.d.ts +13 -0
- package/dist/nest.d.ts.map +1 -1
- package/dist/nest.js +39 -0
- package/dist/nest.js.map +1 -1
- package/dist/nextjs.d.ts +27 -0
- package/dist/nextjs.d.ts.map +1 -0
- package/dist/nextjs.js +178 -0
- package/dist/nextjs.js.map +1 -0
- package/dist/prisma.d.ts +21 -5
- package/dist/prisma.d.ts.map +1 -1
- package/dist/prisma.js +247 -22
- package/dist/prisma.js.map +1 -1
- package/dist/proto.gen.d.ts +10 -2
- package/dist/proto.gen.d.ts.map +1 -1
- package/dist/registry.d.ts +1 -0
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +24 -0
- package/dist/registry.js.map +1 -1
- package/dist/retryStorm.d.ts +42 -0
- package/dist/retryStorm.d.ts.map +1 -0
- package/dist/retryStorm.js +65 -0
- package/dist/retryStorm.js.map +1 -0
- package/dist/rulesPoller.d.ts +26 -0
- package/dist/rulesPoller.d.ts.map +1 -0
- package/dist/rulesPoller.js +74 -0
- package/dist/rulesPoller.js.map +1 -0
- package/dist/sdk.d.ts +48 -7
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +619 -47
- package/dist/sdk.js.map +1 -1
- package/dist/sequelize.d.ts.map +1 -1
- package/dist/sequelize.js +4 -3
- package/dist/sequelize.js.map +1 -1
- package/dist/stack.d.ts.map +1 -1
- package/dist/stack.js +6 -3
- package/dist/stack.js.map +1 -1
- package/dist/transport.d.ts.map +1 -1
- package/dist/transport.js +2 -1
- package/dist/transport.js.map +1 -1
- package/dist/typeorm.d.ts +1 -0
- package/dist/typeorm.d.ts.map +1 -1
- package/dist/typeorm.js +133 -1
- package/dist/typeorm.js.map +1 -1
- package/package.json +14 -5
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { contextStorage } from './context.js';
|
|
2
|
+
import { recordFailedWrite, recordPrismaOperation } from './prisma.js';
|
|
3
|
+
// Older Prisma clients have no query-lifecycle hook at all — confirmed live
|
|
4
|
+
// against a real @prisma/client@2.0.0-beta.4 (2020): $extends (introduced
|
|
5
|
+
// 4.16, 2023), $use (Prisma's earlier middleware API, introduced ~2.something
|
|
6
|
+
// and itself later deprecated in favor of $extends), and even $queryRaw are
|
|
7
|
+
// all `undefined` on that client. createPrismaExtension's $allOperations has
|
|
8
|
+
// nothing to attach to on a client like this.
|
|
9
|
+
//
|
|
10
|
+
// What IS there, on every Prisma client generator back to the very first
|
|
11
|
+
// one: a plain per-model delegate object (client.article, client.user, ...)
|
|
12
|
+
// whose CRUD methods (findMany, create, update, ...) are ordinary
|
|
13
|
+
// own-property functions — directly reassignable, the same monkey-patch
|
|
14
|
+
// shape this SDK already uses for TypeORM's QueryRunner.prototype.query and
|
|
15
|
+
// Mongoose's already-compiled models (instrumentAlreadyCompiledModels). This
|
|
16
|
+
// wraps each one directly instead of relying on any official extension
|
|
17
|
+
// point, so footprint capture and every detector built on recordPrismaOperation
|
|
18
|
+
// work identically regardless of how old the installed client is.
|
|
19
|
+
//
|
|
20
|
+
// Also captures DB-rejected writes the same way typeorm.ts does for a
|
|
21
|
+
// TypeORM app: create/update/upsert/delete/updateMany/deleteMany record an
|
|
22
|
+
// `<op>_failed` footprint entry on rejection — column NAMES only (from the
|
|
23
|
+
// call's own `data`/`where` argument keys), never the bound values, per the
|
|
24
|
+
// metadata-only rule. A read failing has no "what would have been written"
|
|
25
|
+
// story, so only write ops get this treatment, matching typeorm.ts's scope.
|
|
26
|
+
const READ_OPS = new Set(['findOne', 'findUnique', 'findUniqueOrThrow', 'findFirst', 'findFirstOrThrow', 'findMany', 'count', 'aggregate', 'groupBy']);
|
|
27
|
+
const WRITE_OPS = new Set(['create', 'createMany', 'update', 'updateMany', 'upsert', 'delete', 'deleteMany']);
|
|
28
|
+
// `findOne` is Prisma's own deprecated alias for `findUnique` (renamed
|
|
29
|
+
// well before $extends existed, still present on clients this old) —
|
|
30
|
+
// normalized before recording so the footprint's `op` field and
|
|
31
|
+
// operationMatchesHook's after_read gating (invariantRules.ts's READ_OPS,
|
|
32
|
+
// which only lists modern names) both see the same vocabulary regardless
|
|
33
|
+
// of which Prisma version actually captured it.
|
|
34
|
+
function normalizeOperation(method) {
|
|
35
|
+
return method === 'findOne' ? 'findUnique' : method;
|
|
36
|
+
}
|
|
37
|
+
// Reassigns each detected model delegate's own CRUD methods exactly once —
|
|
38
|
+
// re-instrumenting an already-patched delegate (e.g. instrumentPrisma called
|
|
39
|
+
// twice) would double-record every footprint entry.
|
|
40
|
+
const patchedDelegates = new WeakSet();
|
|
41
|
+
export function instrumentLegacyPrismaClient(client, opts = {}) {
|
|
42
|
+
try {
|
|
43
|
+
const dmmf = opts.dmmf ?? client.dmmf;
|
|
44
|
+
const hooks = {
|
|
45
|
+
dmmf,
|
|
46
|
+
getRules: opts.getRules,
|
|
47
|
+
inferenceReporter: opts.inferenceReporter,
|
|
48
|
+
writeCountDriftReporter: opts.writeCountDriftReporter,
|
|
49
|
+
writeCountBaselinePoller: opts.writeCountBaselinePoller,
|
|
50
|
+
};
|
|
51
|
+
const modelNameFor = buildModelNameResolver(dmmf);
|
|
52
|
+
for (const [key, delegate] of Object.entries(client)) {
|
|
53
|
+
if (!isModelDelegate(delegate))
|
|
54
|
+
continue;
|
|
55
|
+
if (patchedDelegates.has(delegate))
|
|
56
|
+
continue;
|
|
57
|
+
patchedDelegates.add(delegate);
|
|
58
|
+
const modelName = modelNameFor(key);
|
|
59
|
+
for (const method of Object.keys(delegate)) {
|
|
60
|
+
if (READ_OPS.has(method)) {
|
|
61
|
+
patchReadMethod(delegate, method, modelName, hooks);
|
|
62
|
+
}
|
|
63
|
+
else if (WRITE_OPS.has(method)) {
|
|
64
|
+
patchWriteMethod(delegate, method, modelName, hooks);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
/* never throw from install */
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function isModelDelegate(value) {
|
|
74
|
+
if (!value || typeof value !== 'object')
|
|
75
|
+
return false;
|
|
76
|
+
const d = value;
|
|
77
|
+
return typeof d.findMany === 'function' || typeof d.create === 'function';
|
|
78
|
+
}
|
|
79
|
+
// Prisma's own convention: a model named `Article` gets a delegate property
|
|
80
|
+
// named `article` (first letter lowercased) — true on every version this
|
|
81
|
+
// adapter targets. Falls back to that convention when dmmf isn't available
|
|
82
|
+
// at all; uses the real dmmf model list when it is, so an unconventional
|
|
83
|
+
// name still resolves correctly.
|
|
84
|
+
function buildModelNameResolver(dmmf) {
|
|
85
|
+
if (!dmmf) {
|
|
86
|
+
return (key) => key.charAt(0).toUpperCase() + key.slice(1);
|
|
87
|
+
}
|
|
88
|
+
const byLowerFirst = new Map();
|
|
89
|
+
for (const model of dmmf.datamodel.models) {
|
|
90
|
+
byLowerFirst.set(model.name.charAt(0).toLowerCase() + model.name.slice(1), model.name);
|
|
91
|
+
}
|
|
92
|
+
return (key) => byLowerFirst.get(key) ?? key.charAt(0).toUpperCase() + key.slice(1);
|
|
93
|
+
}
|
|
94
|
+
function patchReadMethod(delegate, method, modelName, hooks) {
|
|
95
|
+
const original = delegate[method];
|
|
96
|
+
const operation = normalizeOperation(method);
|
|
97
|
+
delegate[method] = async function (...args) {
|
|
98
|
+
const result = await original.apply(this, args);
|
|
99
|
+
const ctx = contextStorage.getStore();
|
|
100
|
+
if (ctx) {
|
|
101
|
+
const callArgs = args[0] ?? {};
|
|
102
|
+
await recordPrismaOperation(ctx, modelName, operation, callArgs, result, hooks);
|
|
103
|
+
}
|
|
104
|
+
return result;
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function patchWriteMethod(delegate, method, modelName, hooks) {
|
|
108
|
+
const original = delegate[method];
|
|
109
|
+
delegate[method] = async function (...args) {
|
|
110
|
+
const callArgs = args[0] ?? {};
|
|
111
|
+
let result;
|
|
112
|
+
try {
|
|
113
|
+
result = await original.apply(this, args);
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
const ctx = contextStorage.getStore();
|
|
117
|
+
if (ctx)
|
|
118
|
+
recordFailedWrite(ctx, modelName, method, callArgs);
|
|
119
|
+
throw err;
|
|
120
|
+
}
|
|
121
|
+
const ctx = contextStorage.getStore();
|
|
122
|
+
if (ctx) {
|
|
123
|
+
await recordPrismaOperation(ctx, modelName, method, callArgs, result, hooks);
|
|
124
|
+
}
|
|
125
|
+
return result;
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
//# sourceMappingURL=legacyPrisma.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"legacyPrisma.js","sourceRoot":"","sources":["../src/legacyPrisma.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mikroorm.d.ts","sourceRoot":"","sources":["../src/mikroorm.ts"],"names":[],"mappings":"AAqEA,wBAAgB,yBAAyB,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAmB5D"}
|
package/dist/mikroorm.js
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { contextStorage } from './context.js';
|
|
2
|
+
function pkOf(entity, meta) {
|
|
3
|
+
const keys = meta?.primaryKeys ?? [];
|
|
4
|
+
if (!entity || keys.length === 0)
|
|
5
|
+
return null;
|
|
6
|
+
const vals = keys.map((k) => entity[k]);
|
|
7
|
+
if (vals.some((v) => v === undefined || v === null))
|
|
8
|
+
return null;
|
|
9
|
+
return vals.map((v) => String(v)).join(':');
|
|
10
|
+
}
|
|
11
|
+
// Find-or-create the (table, op) entry for this request and fold in the PK.
|
|
12
|
+
function recordPk(table, op, pk) {
|
|
13
|
+
const ctx = contextStorage.getStore();
|
|
14
|
+
if (!ctx || !table)
|
|
15
|
+
return;
|
|
16
|
+
let entry = ctx.footprint.find((f) => f.model === table && f.op === op);
|
|
17
|
+
if (!entry) {
|
|
18
|
+
entry = { model: table, op, pks: [], count: 0 };
|
|
19
|
+
ctx.footprint.push(entry);
|
|
20
|
+
}
|
|
21
|
+
if (pk !== null && !entry.pks.includes(pk))
|
|
22
|
+
entry.pks.push(pk);
|
|
23
|
+
entry.count = entry.pks.length;
|
|
24
|
+
}
|
|
25
|
+
// Accepts either a MikroORM instance (orm.em.getEventManager()) or an
|
|
26
|
+
// EntityManager directly (em.getEventManager()) — Reprova has no way to
|
|
27
|
+
// know which one a given host app kept a reference to.
|
|
28
|
+
function getEventManager(orm) {
|
|
29
|
+
const o = orm;
|
|
30
|
+
if (typeof o.getEventManager === 'function')
|
|
31
|
+
return o.getEventManager();
|
|
32
|
+
if (o.em && typeof o.em.getEventManager === 'function')
|
|
33
|
+
return o.em.getEventManager();
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
// Installs a footprint subscriber on an initialized MikroORM instance (or
|
|
37
|
+
// EntityManager). Call AFTER MikroORM.init() — the EventManager only
|
|
38
|
+
// exists once the ORM is initialized. Registers a plain object, so the
|
|
39
|
+
// host needs no @Subscriber()-decorated class.
|
|
40
|
+
export function installMikroOrmSubscriber(orm) {
|
|
41
|
+
const subscriber = {
|
|
42
|
+
onLoad(args) {
|
|
43
|
+
try {
|
|
44
|
+
recordPk(args?.meta?.className, 'select', pkOf(args?.entity, args?.meta));
|
|
45
|
+
}
|
|
46
|
+
catch { /* never break */ }
|
|
47
|
+
},
|
|
48
|
+
afterCreate(args) {
|
|
49
|
+
try {
|
|
50
|
+
recordPk(args?.meta?.className, 'insert', pkOf(args?.entity, args?.meta));
|
|
51
|
+
}
|
|
52
|
+
catch { /* ignore */ }
|
|
53
|
+
},
|
|
54
|
+
afterUpdate(args) {
|
|
55
|
+
try {
|
|
56
|
+
recordPk(args?.meta?.className, 'update', pkOf(args?.entity, args?.meta));
|
|
57
|
+
}
|
|
58
|
+
catch { /* ignore */ }
|
|
59
|
+
},
|
|
60
|
+
afterDelete(args) {
|
|
61
|
+
try {
|
|
62
|
+
recordPk(args?.meta?.className, 'delete', pkOf(args?.entity, args?.meta));
|
|
63
|
+
}
|
|
64
|
+
catch { /* ignore */ }
|
|
65
|
+
},
|
|
66
|
+
};
|
|
67
|
+
try {
|
|
68
|
+
getEventManager(orm)?.registerSubscriber(subscriber);
|
|
69
|
+
}
|
|
70
|
+
catch { /* never throw from install */ }
|
|
71
|
+
}
|
|
72
|
+
//# sourceMappingURL=mikroorm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mikroorm.js","sourceRoot":"","sources":["../src/mikroorm.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { MongooseInstanceLike } from './mongoose.js';
|
|
2
|
+
interface MongoSchemaReporterOptions {
|
|
3
|
+
endpoint: string;
|
|
4
|
+
apiKey: string;
|
|
5
|
+
mongooseInstance: MongooseInstanceLike;
|
|
6
|
+
intervalMs?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare class MongoSchemaReporter {
|
|
9
|
+
private timer;
|
|
10
|
+
private lastSentJSON;
|
|
11
|
+
private lastWarnAt;
|
|
12
|
+
private readonly endpoint;
|
|
13
|
+
private readonly apiKey;
|
|
14
|
+
private readonly intervalMs;
|
|
15
|
+
private readonly mongooseInstance;
|
|
16
|
+
constructor(opts: MongoSchemaReporterOptions);
|
|
17
|
+
start(): void;
|
|
18
|
+
stop(): void;
|
|
19
|
+
tick(): Promise<void>;
|
|
20
|
+
private warnOnce;
|
|
21
|
+
}
|
|
22
|
+
export {};
|
|
23
|
+
//# sourceMappingURL=mongoSchemaReporter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongoSchemaReporter.d.ts","sourceRoot":"","sources":["../src/mongoSchemaReporter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,oBAAoB,EAA6C,MAAM,eAAe,CAAC;AAkBrG,UAAU,0BAA0B;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,oBAAoB,CAAC;IACvC,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAuB;gBAE5C,IAAI,EAAE,0BAA0B;IAO5C,KAAK,IAAI,IAAI;IAMb,IAAI,IAAI,IAAI;IASN,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA4B3B,OAAO,CAAC,QAAQ;CAOjB"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { discoverMongooseSchema } from './mongoose.js';
|
|
2
|
+
import { httpFetch } from './httpFetch.js';
|
|
3
|
+
// Periodically re-scans a live Mongoose instance's model registry and
|
|
4
|
+
// reports the discovered model->collection map plus every ref: edge found,
|
|
5
|
+
// so the control plane can hand the agent a reference-edge map at
|
|
6
|
+
// plan-build time (MongoDB has no FK catalog for the agent to introspect
|
|
7
|
+
// itself — see mongo_schema.go's handler doc comment). Unlike
|
|
8
|
+
// DistributionDriftReporter (accumulates external .record() deltas since
|
|
9
|
+
// its last flush), this reporter is self-driven: it re-derives the current
|
|
10
|
+
// schema shape itself on each tick and only POSTs when that shape actually
|
|
11
|
+
// changed, since schema shape is near-static and re-sending an unchanged
|
|
12
|
+
// report every tick for the life of a long-running process would be pure
|
|
13
|
+
// waste.
|
|
14
|
+
const WARN_INTERVAL_MS = 60_000;
|
|
15
|
+
const DEFAULT_INTERVAL_MS = 60_000;
|
|
16
|
+
export class MongoSchemaReporter {
|
|
17
|
+
timer = null;
|
|
18
|
+
lastSentJSON = null;
|
|
19
|
+
lastWarnAt = 0;
|
|
20
|
+
endpoint;
|
|
21
|
+
apiKey;
|
|
22
|
+
intervalMs;
|
|
23
|
+
mongooseInstance;
|
|
24
|
+
constructor(opts) {
|
|
25
|
+
this.endpoint = opts.endpoint;
|
|
26
|
+
this.apiKey = opts.apiKey;
|
|
27
|
+
this.intervalMs = opts.intervalMs ?? DEFAULT_INTERVAL_MS;
|
|
28
|
+
this.mongooseInstance = opts.mongooseInstance;
|
|
29
|
+
}
|
|
30
|
+
start() {
|
|
31
|
+
void this.tick(); // report the current shape immediately, don't wait a full interval for the first report
|
|
32
|
+
this.timer = setInterval(() => void this.tick(), this.intervalMs);
|
|
33
|
+
if (this.timer.unref)
|
|
34
|
+
this.timer.unref();
|
|
35
|
+
}
|
|
36
|
+
stop() {
|
|
37
|
+
if (this.timer) {
|
|
38
|
+
clearInterval(this.timer);
|
|
39
|
+
this.timer = null;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// Exposed for tests and for an explicit "report now" call after a
|
|
43
|
+
// dynamic model registration; start()/the timer call this on their own.
|
|
44
|
+
async tick() {
|
|
45
|
+
let discovered;
|
|
46
|
+
try {
|
|
47
|
+
discovered = discoverMongooseSchema(this.mongooseInstance);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return; // never let introspection failure break the host app
|
|
51
|
+
}
|
|
52
|
+
if (discovered.models.length === 0 && discovered.edges.length === 0)
|
|
53
|
+
return;
|
|
54
|
+
const json = JSON.stringify(discovered);
|
|
55
|
+
if (json === this.lastSentJSON)
|
|
56
|
+
return; // schema shape unchanged since last report
|
|
57
|
+
try {
|
|
58
|
+
const res = await httpFetch(this.endpoint, {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
headers: { 'Content-Type': 'application/json', 'X-Reprova-Key': this.apiKey },
|
|
61
|
+
body: JSON.stringify({ models: discovered.models, edges: discovered.edges }),
|
|
62
|
+
});
|
|
63
|
+
if (res.ok) {
|
|
64
|
+
this.lastSentJSON = json;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
this.warnOnce(`reprova: mongo schema report returned ${res.status}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
catch (err) {
|
|
71
|
+
this.warnOnce(`reprova: mongo schema report error: ${err.message}`);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
warnOnce(msg) {
|
|
75
|
+
const now = Date.now();
|
|
76
|
+
if (now - this.lastWarnAt > WARN_INTERVAL_MS) {
|
|
77
|
+
this.lastWarnAt = now;
|
|
78
|
+
console.warn(msg);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=mongoSchemaReporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongoSchemaReporter.js","sourceRoot":"","sources":["../src/mongoSchemaReporter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export interface MongooseSchemaLike {
|
|
2
|
+
post(name: string, fn: (result: unknown) => void): void;
|
|
3
|
+
pre(name: string, fn: (arg?: unknown) => void): void;
|
|
4
|
+
}
|
|
5
|
+
export declare function reprovaMongoosePlugin(schema: MongooseSchemaLike): void;
|
|
6
|
+
export declare function instrumentAlreadyCompiledModels(mongooseInstance: {
|
|
7
|
+
modelNames(): string[];
|
|
8
|
+
model(name: string): unknown;
|
|
9
|
+
}): void;
|
|
10
|
+
export interface DiscoveredMongoModel {
|
|
11
|
+
model: string;
|
|
12
|
+
collection: string;
|
|
13
|
+
}
|
|
14
|
+
export interface DiscoveredMongoEdge {
|
|
15
|
+
from_collection: string;
|
|
16
|
+
from_field: string;
|
|
17
|
+
to_model: string;
|
|
18
|
+
array: boolean;
|
|
19
|
+
}
|
|
20
|
+
interface MongooseSchemaTypeLike {
|
|
21
|
+
options?: {
|
|
22
|
+
ref?: string;
|
|
23
|
+
};
|
|
24
|
+
caster?: {
|
|
25
|
+
options?: {
|
|
26
|
+
ref?: string;
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
interface MongooseCompiledSchemaLike {
|
|
31
|
+
eachPath(fn: (pathName: string, schemaType: MongooseSchemaTypeLike) => void): void;
|
|
32
|
+
}
|
|
33
|
+
interface MongooseModelWithSchemaLike {
|
|
34
|
+
collection?: {
|
|
35
|
+
collectionName?: string;
|
|
36
|
+
};
|
|
37
|
+
schema: MongooseCompiledSchemaLike;
|
|
38
|
+
}
|
|
39
|
+
export interface MongooseInstanceLike {
|
|
40
|
+
modelNames(): string[];
|
|
41
|
+
model(name: string): MongooseModelWithSchemaLike;
|
|
42
|
+
}
|
|
43
|
+
export declare function discoverMongooseSchema(mongooseInstance: MongooseInstanceLike): {
|
|
44
|
+
models: DiscoveredMongoModel[];
|
|
45
|
+
edges: DiscoveredMongoEdge[];
|
|
46
|
+
};
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=mongoose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mongoose.d.ts","sourceRoot":"","sources":["../src/mongoose.ts"],"names":[],"mappings":"AAyCA,MAAM,WAAW,kBAAkB;IACjC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;IACxD,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,KAAK,IAAI,GAAG,IAAI,CAAC;CACtD;AA+FD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,kBAAkB,GAAG,IAAI,CAuEtE;AAgHD,wBAAgB,+BAA+B,CAAC,gBAAgB,EAAE;IAAE,UAAU,IAAI,MAAM,EAAE,CAAC;IAAC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAA;CAAE,GAAG,IAAI,CAchI;AAWD,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,UAAU,sBAAsB;IAC9B,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3B,MAAM,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE;YAAE,GAAG,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC;CACzC;AACD,UAAU,0BAA0B;IAClC,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,sBAAsB,KAAK,IAAI,GAAG,IAAI,CAAC;CACpF;AACD,UAAU,2BAA2B;IACnC,UAAU,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,MAAM,EAAE,0BAA0B,CAAC;CACpC;AACD,MAAM,WAAW,oBAAoB;IACnC,UAAU,IAAI,MAAM,EAAE,CAAC;IACvB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,2BAA2B,CAAC;CAClD;AAED,wBAAgB,sBAAsB,CAAC,gBAAgB,EAAE,oBAAoB,GAAG;IAAE,MAAM,EAAE,oBAAoB,EAAE,CAAC;IAAC,KAAK,EAAE,mBAAmB,EAAE,CAAA;CAAE,CAuC/I"}
|