@selvajs/supabase-provider 0.13.5 → 0.14.1
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/dist/data/SupabaseDataProvider.d.ts +7 -0
- package/dist/data/SupabaseDataProvider.d.ts.map +1 -1
- package/dist/data/SupabaseDataProvider.js +8 -0
- package/dist/data/SupabaseDataProvider.js.map +1 -1
- package/dist/data/SupabaseSolveMetricSink.d.ts +17 -0
- package/dist/data/SupabaseSolveMetricSink.d.ts.map +1 -0
- package/dist/data/SupabaseSolveMetricSink.js +39 -0
- package/dist/data/SupabaseSolveMetricSink.js.map +1 -0
- package/dist/data/__tests__/solve-metric-sink-conformance.test.d.ts +2 -0
- package/dist/data/__tests__/solve-metric-sink-conformance.test.d.ts.map +1 -0
- package/dist/data/__tests__/solve-metric-sink-conformance.test.js +52 -0
- package/dist/data/__tests__/solve-metric-sink-conformance.test.js.map +1 -0
- package/dist/data/__tests__/test-helpers.d.ts.map +1 -1
- package/dist/data/__tests__/test-helpers.js +1 -0
- package/dist/data/__tests__/test-helpers.js.map +1 -1
- package/dist/data/index.d.ts +1 -0
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +1 -0
- package/dist/data/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/src/data/SupabaseDataProvider.ts +8 -0
- package/src/data/SupabaseSolveMetricSink.ts +38 -0
- package/src/data/__tests__/solve-metric-sink-conformance.test.ts +59 -0
- package/src/data/__tests__/test-helpers.ts +1 -0
- package/src/data/index.ts +1 -0
- package/src/index.ts +1 -0
- package/supabase/migrations/20260615120000_selva_solve_metrics.sql +56 -0
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { IDataProvider, IEventSink, IPlatformProjectGrantStore } from '@selvajs/platform';
|
|
2
2
|
import type { ClientBundle, BuildClientOptions } from './client.js';
|
|
3
|
+
import { SupabaseSolveMetricSink } from './SupabaseSolveMetricSink.js';
|
|
3
4
|
import { SupabaseAuditQuery } from './SupabaseAuditQuery.js';
|
|
4
5
|
import { SupabaseOrgStore } from './SupabaseOrgStore.js';
|
|
5
6
|
import { SupabaseProjectStore } from './SupabaseProjectStore.js';
|
|
@@ -26,6 +27,12 @@ export declare class SupabaseDataProvider implements IDataProvider {
|
|
|
26
27
|
readonly permissions: SupabasePlatformPermissionStore;
|
|
27
28
|
readonly platformProjectGrants: IPlatformProjectGrantStore;
|
|
28
29
|
readonly auditQuery: SupabaseAuditQuery;
|
|
30
|
+
/**
|
|
31
|
+
* Per-solve timing sink, built from the same client bundle. Exposed so the
|
|
32
|
+
* app's provider wiring can hand it to `SelvaConfig.solveMetrics` without
|
|
33
|
+
* constructing a second Supabase client.
|
|
34
|
+
*/
|
|
35
|
+
readonly solveMetrics: SupabaseSolveMetricSink;
|
|
29
36
|
private constructor();
|
|
30
37
|
static fromEnv(env: Record<string, string | undefined>, events?: IEventSink): SupabaseDataProvider;
|
|
31
38
|
static create(opts: BuildClientOptions, events?: IEventSink): SupabaseDataProvider;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SupabaseDataProvider.d.ts","sourceRoot":"","sources":["../../src/data/SupabaseDataProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAE/F,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AAC5F,OAAO,EAAE,+BAA+B,EAAE,MAAM,mDAAmD,CAAC;AA0BpG;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,aAAa;
|
|
1
|
+
{"version":3,"file":"SupabaseDataProvider.d.ts","sourceRoot":"","sources":["../../src/data/SupabaseDataProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AAE/F,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAGpE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AAC5F,OAAO,EAAE,+BAA+B,EAAE,MAAM,mDAAmD,CAAC;AA0BpG;;;;GAIG;AACH,qBAAa,oBAAqB,YAAW,aAAa;IAmBxD,OAAO,CAAC,QAAQ,CAAC,OAAO;IAlBzB,QAAQ,CAAC,IAAI,EAAE,gBAAgB,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,WAAW,EAAE,uBAAuB,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,mBAAmB,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,0BAA0B,CAAC;IACnD,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAC5C,QAAQ,CAAC,WAAW,EAAE,2BAA2B,CAAC;IAClD,QAAQ,CAAC,WAAW,EAAE,+BAA+B,CAAC;IACtD,QAAQ,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;IAC3D,QAAQ,CAAC,UAAU,EAAE,kBAAkB,CAAC;IACxC;;;;OAIG;IACH,QAAQ,CAAC,YAAY,EAAE,uBAAuB,CAAC;IAE/C,OAAO;IAiBP,MAAM,CAAC,OAAO,CACb,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,EACvC,MAAM,CAAC,EAAE,UAAU,GACjB,oBAAoB;IAWvB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,oBAAoB;IAKlF;;;OAGG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,EAAE,UAAU,GAAG,oBAAoB;IAIlF;;;OAGG;IACH,eAAe,IAAI,YAAY;IAI/B;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAIjC;;;;OAIG;IACG,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;CAGpC"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ProviderError } from '@selvajs/platform';
|
|
2
2
|
import { buildClientBundle } from './client.js';
|
|
3
3
|
import { SupabaseEventSink } from './SupabaseEventSink.js';
|
|
4
|
+
import { SupabaseSolveMetricSink } from './SupabaseSolveMetricSink.js';
|
|
4
5
|
import { SupabaseAuditQuery } from './SupabaseAuditQuery.js';
|
|
5
6
|
import { SupabaseOrgStore } from './SupabaseOrgStore.js';
|
|
6
7
|
import { SupabaseProjectStore } from './SupabaseProjectStore.js';
|
|
@@ -50,8 +51,15 @@ export class SupabaseDataProvider {
|
|
|
50
51
|
permissions;
|
|
51
52
|
platformProjectGrants;
|
|
52
53
|
auditQuery;
|
|
54
|
+
/**
|
|
55
|
+
* Per-solve timing sink, built from the same client bundle. Exposed so the
|
|
56
|
+
* app's provider wiring can hand it to `SelvaConfig.solveMetrics` without
|
|
57
|
+
* constructing a second Supabase client.
|
|
58
|
+
*/
|
|
59
|
+
solveMetrics;
|
|
53
60
|
constructor(clients, events) {
|
|
54
61
|
this.clients = clients;
|
|
62
|
+
this.solveMetrics = new SupabaseSolveMetricSink(clients);
|
|
55
63
|
this.orgs = new SupabaseOrgStore(clients, events);
|
|
56
64
|
this.projects = new SupabaseProjectStore(clients, events);
|
|
57
65
|
this.definitions = new SupabaseDefinitionStore(clients, events);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SupabaseDataProvider.js","sourceRoot":"","sources":["../../src/data/SupabaseDataProvider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,+CAA+C,CAAC;AAC5F,OAAO,EAAE,+BAA+B,EAAE,MAAM,mDAAmD,CAAC;AAEpG;;;;GAIG;AACH,MAAM,mBAAmB,GAAG,6DAA6D,CAAC;AAC1F,MAAM,wBAAwB,GAA+B;IAC5D,aAAa,EAAE,KAAK,IAAI,EAAE;QACzB,MAAM,IAAI,aAAa,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,EAAE,KAAK,IAAI,EAAE;QAClB,MAAM,IAAI,aAAa,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC;IACD,MAAM,EAAE,KAAK,IAAI,EAAE;QAClB,MAAM,IAAI,aAAa,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IACnD,CAAC;IACD,eAAe,EAAE,KAAK,IAAI,EAAE;QAC3B,yEAAyE;IAC1E,CAAC;IACD,kBAAkB,EAAE,KAAK,IAAI,EAAE;QAC9B,yBAAyB;IAC1B,CAAC;CACD,CAAC;AAEF;;;;GAIG;AACH,MAAM,OAAO,oBAAoB;
|
|
1
|
+
{"version":3,"file":"SupabaseDataProvider.js","sourceRoot":"","sources":["../../src/data/SupabaseDataProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ISolveMetricSink, RequestContext, SolveMetric } from '@selvajs/platform';
|
|
2
|
+
import type { ClientBundle } from './client.js';
|
|
3
|
+
/**
|
|
4
|
+
* Persists every solve's timing to `selva.solve_metrics`. Writes use the
|
|
5
|
+
* service-role client so RLS does not gate the telemetry — the sink runs as a
|
|
6
|
+
* system process attached to the compute route, not the requesting user.
|
|
7
|
+
*
|
|
8
|
+
* Per the `ISolveMetricSink` contract, `record` MUST NOT throw. It sits on the
|
|
9
|
+
* hot path of every solve and the response has already been produced by the
|
|
10
|
+
* time we're here, so a failed insert is logged and swallowed.
|
|
11
|
+
*/
|
|
12
|
+
export declare class SupabaseSolveMetricSink implements ISolveMetricSink {
|
|
13
|
+
private readonly clients;
|
|
14
|
+
constructor(clients: ClientBundle);
|
|
15
|
+
record(_ctx: RequestContext, metric: SolveMetric): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=SupabaseSolveMetricSink.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SupabaseSolveMetricSink.d.ts","sourceRoot":"","sources":["../../src/data/SupabaseSolveMetricSink.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACvF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEhD;;;;;;;;GAQG;AACH,qBAAa,uBAAwB,YAAW,gBAAgB;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,YAAY;IAE5C,MAAM,CAAC,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAsBtE"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Persists every solve's timing to `selva.solve_metrics`. Writes use the
|
|
3
|
+
* service-role client so RLS does not gate the telemetry — the sink runs as a
|
|
4
|
+
* system process attached to the compute route, not the requesting user.
|
|
5
|
+
*
|
|
6
|
+
* Per the `ISolveMetricSink` contract, `record` MUST NOT throw. It sits on the
|
|
7
|
+
* hot path of every solve and the response has already been produced by the
|
|
8
|
+
* time we're here, so a failed insert is logged and swallowed.
|
|
9
|
+
*/
|
|
10
|
+
export class SupabaseSolveMetricSink {
|
|
11
|
+
clients;
|
|
12
|
+
constructor(clients) {
|
|
13
|
+
this.clients = clients;
|
|
14
|
+
}
|
|
15
|
+
async record(_ctx, metric) {
|
|
16
|
+
try {
|
|
17
|
+
const { error } = await this.clients.serviceClient.from('solve_metrics').insert({
|
|
18
|
+
actor_id: _ctx.userId || 'system',
|
|
19
|
+
definition_url: metric.definitionUrl,
|
|
20
|
+
definition_id: metric.definitionId,
|
|
21
|
+
version_id: metric.versionId,
|
|
22
|
+
channel: metric.channel,
|
|
23
|
+
org_id: metric.orgId,
|
|
24
|
+
duration_ms: metric.durationMs,
|
|
25
|
+
ok: metric.ok,
|
|
26
|
+
failure_kind: metric.failureKind,
|
|
27
|
+
error_count: metric.errorCount,
|
|
28
|
+
warning_count: metric.warningCount
|
|
29
|
+
});
|
|
30
|
+
if (error) {
|
|
31
|
+
console.error('[SupabaseSolveMetricSink] insert failed:', error.message, { metric });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
catch (err) {
|
|
35
|
+
console.error('[SupabaseSolveMetricSink] unexpected error:', err, { metric });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=SupabaseSolveMetricSink.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SupabaseSolveMetricSink.js","sourceRoot":"","sources":["../../src/data/SupabaseSolveMetricSink.ts"],"names":[],"mappings":"AAGA;;;;;;;;GAQG;AACH,MAAM,OAAO,uBAAuB;IACN;IAA7B,YAA6B,OAAqB;QAArB,YAAO,GAAP,OAAO,CAAc;IAAG,CAAC;IAEtD,KAAK,CAAC,MAAM,CAAC,IAAoB,EAAE,MAAmB;QACrD,IAAI,CAAC;YACJ,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC;gBAC/E,QAAQ,EAAE,IAAI,CAAC,MAAM,IAAI,QAAQ;gBACjC,cAAc,EAAE,MAAM,CAAC,aAAa;gBACpC,aAAa,EAAE,MAAM,CAAC,YAAY;gBAClC,UAAU,EAAE,MAAM,CAAC,SAAS;gBAC5B,OAAO,EAAE,MAAM,CAAC,OAAO;gBACvB,MAAM,EAAE,MAAM,CAAC,KAAK;gBACpB,WAAW,EAAE,MAAM,CAAC,UAAU;gBAC9B,EAAE,EAAE,MAAM,CAAC,EAAE;gBACb,YAAY,EAAE,MAAM,CAAC,WAAW;gBAChC,WAAW,EAAE,MAAM,CAAC,UAAU;gBAC9B,aAAa,EAAE,MAAM,CAAC,YAAY;aAClC,CAAC,CAAC;YACH,IAAI,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;YACtF,CAAC;QACF,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,OAAO,CAAC,KAAK,CAAC,6CAA6C,EAAE,GAAG,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC/E,CAAC;IACF,CAAC;CACD"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solve-metric-sink-conformance.test.d.ts","sourceRoot":"","sources":["../../../src/data/__tests__/solve-metric-sink-conformance.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { describe, beforeEach, it } from 'vitest';
|
|
2
|
+
import { runSolveMetricSinkConformance } from '@selvajs/platform/testing';
|
|
3
|
+
import { SupabaseSolveMetricSink } from '../SupabaseSolveMetricSink.js';
|
|
4
|
+
import { buildClientBundle } from '../client.js';
|
|
5
|
+
import { readEnv, resetAllData } from './test-helpers.js';
|
|
6
|
+
const envCtx = readEnv();
|
|
7
|
+
if (!envCtx) {
|
|
8
|
+
describe.skip('SupabaseSolveMetricSink (skipped: no live stack)', () => {
|
|
9
|
+
it('populate packages/providers/supabase/.env.test with Supabase creds to run these tests', () => { });
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
const ctx = envCtx;
|
|
14
|
+
describe('SupabaseSolveMetricSink', () => {
|
|
15
|
+
beforeEach(async () => {
|
|
16
|
+
await resetAllData(ctx);
|
|
17
|
+
});
|
|
18
|
+
runSolveMetricSinkConformance({
|
|
19
|
+
name: 'SupabaseSolveMetricSink',
|
|
20
|
+
createSink: () => new SupabaseSolveMetricSink(ctx.bundle),
|
|
21
|
+
readRows: async () => {
|
|
22
|
+
const { data, error } = await ctx.adminClient
|
|
23
|
+
.from('solve_metrics')
|
|
24
|
+
.select('actor_id, definition_url, definition_id, version_id, channel, org_id, duration_ms, ok, failure_kind, error_count, warning_count')
|
|
25
|
+
.order('occurred_at', { ascending: true });
|
|
26
|
+
if (error)
|
|
27
|
+
throw new Error(`solve_metrics read failed: ${error.message}`);
|
|
28
|
+
return (data ?? []).map((r) => ({
|
|
29
|
+
actorId: r.actor_id,
|
|
30
|
+
definitionUrl: r.definition_url,
|
|
31
|
+
definitionId: r.definition_id,
|
|
32
|
+
versionId: r.version_id,
|
|
33
|
+
channel: r.channel,
|
|
34
|
+
orgId: r.org_id,
|
|
35
|
+
durationMs: r.duration_ms,
|
|
36
|
+
ok: r.ok,
|
|
37
|
+
failureKind: r.failure_kind,
|
|
38
|
+
errorCount: r.error_count,
|
|
39
|
+
warningCount: r.warning_count
|
|
40
|
+
}));
|
|
41
|
+
},
|
|
42
|
+
// Point the sink at a bundle whose service key is bogus, so the insert
|
|
43
|
+
// fails. record() must still resolve (contract: never throw).
|
|
44
|
+
createFailingSink: () => new SupabaseSolveMetricSink(buildClientBundle({
|
|
45
|
+
supabaseUrl: ctx.url,
|
|
46
|
+
anonKey: ctx.anonKey,
|
|
47
|
+
serviceRoleKey: 'invalid-service-role-key'
|
|
48
|
+
}))
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=solve-metric-sink-conformance.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solve-metric-sink-conformance.test.js","sourceRoot":"","sources":["../../../src/data/__tests__/solve-metric-sink-conformance.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,6BAA6B,EAA4B,MAAM,2BAA2B,CAAC;AACpG,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE1D,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC;AAEzB,IAAI,CAAC,MAAM,EAAE,CAAC;IACb,QAAQ,CAAC,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;QACtE,EAAE,CAAC,uFAAuF,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IACvG,CAAC,CAAC,CAAC;AACJ,CAAC;KAAM,CAAC;IACP,MAAM,GAAG,GAAG,MAAM,CAAC;IACnB,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACxC,UAAU,CAAC,KAAK,IAAI,EAAE;YACrB,MAAM,YAAY,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,6BAA6B,CAAC;YAC7B,IAAI,EAAE,yBAAyB;YAC/B,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC;YACzD,QAAQ,EAAE,KAAK,IAAI,EAAE;gBACpB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,GAAG,CAAC,WAAW;qBAC3C,IAAI,CAAC,eAAe,CAAC;qBACrB,MAAM,CACN,iIAAiI,CACjI;qBACA,KAAK,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5C,IAAI,KAAK;oBAAE,MAAM,IAAI,KAAK,CAAC,8BAA8B,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBAC1E,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CACtB,CAAC,CAAC,EAAuB,EAAE,CAAC,CAAC;oBAC5B,OAAO,EAAE,CAAC,CAAC,QAAQ;oBACnB,aAAa,EAAE,CAAC,CAAC,cAAc;oBAC/B,YAAY,EAAE,CAAC,CAAC,aAAa;oBAC7B,SAAS,EAAE,CAAC,CAAC,UAAU;oBACvB,OAAO,EAAE,CAAC,CAAC,OAAO;oBAClB,KAAK,EAAE,CAAC,CAAC,MAAM;oBACf,UAAU,EAAE,CAAC,CAAC,WAAW;oBACzB,EAAE,EAAE,CAAC,CAAC,EAAE;oBACR,WAAW,EAAE,CAAC,CAAC,YAAY;oBAC3B,UAAU,EAAE,CAAC,CAAC,WAAW;oBACzB,YAAY,EAAE,CAAC,CAAC,aAAa;iBAC7B,CAAC,CACF,CAAC;YACH,CAAC;YACD,uEAAuE;YACvE,8DAA8D;YAC9D,iBAAiB,EAAE,GAAG,EAAE,CACvB,IAAI,uBAAuB,CAC1B,iBAAiB,CAAC;gBACjB,WAAW,EAAE,GAAG,CAAC,GAAG;gBACpB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,cAAc,EAAE,0BAA0B;aAC1C,CAAC,CACF;SACF,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../../../src/data/__tests__/test-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAqB,KAAK,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAE5F,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,MAAM,EAAE,YAAY,CAAC;CACrB;AAED,wBAAgB,OAAO,IAAI,WAAW,GAAG,IAAI,CAuB5C;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"test-helpers.d.ts","sourceRoot":"","sources":["../../../src/data/__tests__/test-helpers.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAqB,KAAK,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAE5F,MAAM,WAAW,WAAW;IAC3B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,MAAM,EAAE,YAAY,CAAC;CACrB;AAED,wBAAgB,OAAO,IAAI,WAAW,GAAG,IAAI,CAuB5C;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAAC,GAAG,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBlE;AAuCD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,QAAQ,CAC7B,GAAG,EAAE,WAAW,EAChB,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAEnD;AAED;;;;GAIG;AACH,wBAAsB,aAAa,CAClC,GAAG,EAAE,WAAW,EAChB,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAEnD"}
|
|
@@ -42,6 +42,7 @@ export function readEnv() {
|
|
|
42
42
|
* dependents to parents.
|
|
43
43
|
*/
|
|
44
44
|
export async function resetAllData(ctx) {
|
|
45
|
+
await truncate(ctx, 'solve_metrics');
|
|
45
46
|
await truncate(ctx, 'share_links');
|
|
46
47
|
await truncate(ctx, 'invites');
|
|
47
48
|
// Versions FK to definitions ON DELETE CASCADE, but `definitions` can't
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../../src/data/__tests__/test-helpers.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"test-helpers.js","sourceRoot":"","sources":["../../../src/data/__tests__/test-helpers.ts"],"names":[],"mappings":"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"}
|
package/dist/data/index.d.ts
CHANGED
|
@@ -6,6 +6,7 @@ export { SupabaseComputeServerStore } from './SupabaseComputeServerStore.js';
|
|
|
6
6
|
export { SupabaseShareLinkStore } from './SupabaseShareLinkStore.js';
|
|
7
7
|
export { SupabaseDataProvider } from './SupabaseDataProvider.js';
|
|
8
8
|
export { SupabaseEventSink } from './SupabaseEventSink.js';
|
|
9
|
+
export { SupabaseSolveMetricSink } from './SupabaseSolveMetricSink.js';
|
|
9
10
|
export { SupabaseAuditQuery } from './SupabaseAuditQuery.js';
|
|
10
11
|
export { buildClientBundle } from './client.js';
|
|
11
12
|
export type { ClientBundle, BuildClientOptions } from './client.js';
|
package/dist/data/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/data/index.js
CHANGED
|
@@ -6,6 +6,7 @@ export { SupabaseComputeServerStore } from './SupabaseComputeServerStore.js';
|
|
|
6
6
|
export { SupabaseShareLinkStore } from './SupabaseShareLinkStore.js';
|
|
7
7
|
export { SupabaseDataProvider } from './SupabaseDataProvider.js';
|
|
8
8
|
export { SupabaseEventSink } from './SupabaseEventSink.js';
|
|
9
|
+
export { SupabaseSolveMetricSink } from './SupabaseSolveMetricSink.js';
|
|
9
10
|
export { SupabaseAuditQuery } from './SupabaseAuditQuery.js';
|
|
10
11
|
export { buildClientBundle } from './client.js';
|
|
11
12
|
//# sourceMappingURL=index.js.map
|
package/dist/data/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/data/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { SupabaseStorageProvider } from './storage/SupabaseStorageProvider.js';
|
|
2
2
|
export type { SupabaseStorageProviderConfig } from './storage/SupabaseStorageProvider.js';
|
|
3
|
-
export { SupabaseOrgStore, SupabaseProjectStore, SupabaseDefinitionStore, SupabaseInviteStore, SupabaseComputeServerStore, SupabaseShareLinkStore, SupabaseDataProvider, SupabaseEventSink, SupabaseAuditQuery, buildClientBundle } from './data/index.js';
|
|
3
|
+
export { SupabaseOrgStore, SupabaseProjectStore, SupabaseDefinitionStore, SupabaseInviteStore, SupabaseComputeServerStore, SupabaseShareLinkStore, SupabaseDataProvider, SupabaseEventSink, SupabaseSolveMetricSink, SupabaseAuditQuery, buildClientBundle } from './data/index.js';
|
|
4
4
|
export type { ClientBundle, BuildClientOptions } from './data/index.js';
|
|
5
5
|
export { SupabaseUserProfileProvider } from './userProfile/index.js';
|
|
6
6
|
export { SupabaseAuthProvider } from './auth/index.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,YAAY,EAAE,6BAA6B,EAAE,MAAM,sCAAsC,CAAC;AAE1F,OAAO,EACN,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,0BAA0B,EAC1B,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAExE,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAErE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,YAAY,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAElE,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAC/E,YAAY,EAAE,6BAA6B,EAAE,MAAM,sCAAsC,CAAC;AAE1F,OAAO,EACN,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,0BAA0B,EAC1B,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EACjB,MAAM,iBAAiB,CAAC;AACzB,YAAY,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAExE,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAErE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACvD,YAAY,EAAE,0BAA0B,EAAE,MAAM,iBAAiB,CAAC;AAElE,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { SupabaseStorageProvider } from './storage/SupabaseStorageProvider.js';
|
|
2
|
-
export { SupabaseOrgStore, SupabaseProjectStore, SupabaseDefinitionStore, SupabaseInviteStore, SupabaseComputeServerStore, SupabaseShareLinkStore, SupabaseDataProvider, SupabaseEventSink, SupabaseAuditQuery, buildClientBundle } from './data/index.js';
|
|
2
|
+
export { SupabaseOrgStore, SupabaseProjectStore, SupabaseDefinitionStore, SupabaseInviteStore, SupabaseComputeServerStore, SupabaseShareLinkStore, SupabaseDataProvider, SupabaseEventSink, SupabaseSolveMetricSink, SupabaseAuditQuery, buildClientBundle } from './data/index.js';
|
|
3
3
|
export { SupabaseUserProfileProvider } from './userProfile/index.js';
|
|
4
4
|
export { SupabaseAuthProvider } from './auth/index.js';
|
|
5
5
|
export { SupabasePlatformPermissionStore } from './permissions/index.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAG/E,OAAO,EACN,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,0BAA0B,EAC1B,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAErE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAGvD,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAG/E,OAAO,EACN,gBAAgB,EAChB,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,0BAA0B,EAC1B,sBAAsB,EACtB,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,kBAAkB,EAClB,iBAAiB,EACjB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAErE,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAGvD,OAAO,EAAE,+BAA+B,EAAE,MAAM,wBAAwB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@selvajs/supabase-provider",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.1",
|
|
4
4
|
"description": "Supabase (Auth + Postgres + Storage) implementations of @selvajs/platform interfaces",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
"dependencies": {
|
|
58
58
|
"@supabase/supabase-js": "^2.104.1",
|
|
59
59
|
"sharp": "^0.34.5",
|
|
60
|
-
"@selvajs/platform": "0.
|
|
60
|
+
"@selvajs/platform": "0.14.1"
|
|
61
61
|
},
|
|
62
62
|
"devDependencies": {
|
|
63
63
|
"@types/node": "^22.19.17",
|
|
@@ -3,6 +3,7 @@ import { ProviderError } from '@selvajs/platform';
|
|
|
3
3
|
import type { ClientBundle, BuildClientOptions } from './client.js';
|
|
4
4
|
import { buildClientBundle } from './client.js';
|
|
5
5
|
import { SupabaseEventSink } from './SupabaseEventSink.js';
|
|
6
|
+
import { SupabaseSolveMetricSink } from './SupabaseSolveMetricSink.js';
|
|
6
7
|
import { SupabaseAuditQuery } from './SupabaseAuditQuery.js';
|
|
7
8
|
import { SupabaseOrgStore } from './SupabaseOrgStore.js';
|
|
8
9
|
import { SupabaseProjectStore } from './SupabaseProjectStore.js';
|
|
@@ -53,11 +54,18 @@ export class SupabaseDataProvider implements IDataProvider {
|
|
|
53
54
|
readonly permissions: SupabasePlatformPermissionStore;
|
|
54
55
|
readonly platformProjectGrants: IPlatformProjectGrantStore;
|
|
55
56
|
readonly auditQuery: SupabaseAuditQuery;
|
|
57
|
+
/**
|
|
58
|
+
* Per-solve timing sink, built from the same client bundle. Exposed so the
|
|
59
|
+
* app's provider wiring can hand it to `SelvaConfig.solveMetrics` without
|
|
60
|
+
* constructing a second Supabase client.
|
|
61
|
+
*/
|
|
62
|
+
readonly solveMetrics: SupabaseSolveMetricSink;
|
|
56
63
|
|
|
57
64
|
private constructor(
|
|
58
65
|
private readonly clients: ClientBundle,
|
|
59
66
|
events: IEventSink
|
|
60
67
|
) {
|
|
68
|
+
this.solveMetrics = new SupabaseSolveMetricSink(clients);
|
|
61
69
|
this.orgs = new SupabaseOrgStore(clients, events);
|
|
62
70
|
this.projects = new SupabaseProjectStore(clients, events);
|
|
63
71
|
this.definitions = new SupabaseDefinitionStore(clients, events);
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ISolveMetricSink, RequestContext, SolveMetric } from '@selvajs/platform';
|
|
2
|
+
import type { ClientBundle } from './client.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Persists every solve's timing to `selva.solve_metrics`. Writes use the
|
|
6
|
+
* service-role client so RLS does not gate the telemetry — the sink runs as a
|
|
7
|
+
* system process attached to the compute route, not the requesting user.
|
|
8
|
+
*
|
|
9
|
+
* Per the `ISolveMetricSink` contract, `record` MUST NOT throw. It sits on the
|
|
10
|
+
* hot path of every solve and the response has already been produced by the
|
|
11
|
+
* time we're here, so a failed insert is logged and swallowed.
|
|
12
|
+
*/
|
|
13
|
+
export class SupabaseSolveMetricSink implements ISolveMetricSink {
|
|
14
|
+
constructor(private readonly clients: ClientBundle) {}
|
|
15
|
+
|
|
16
|
+
async record(_ctx: RequestContext, metric: SolveMetric): Promise<void> {
|
|
17
|
+
try {
|
|
18
|
+
const { error } = await this.clients.serviceClient.from('solve_metrics').insert({
|
|
19
|
+
actor_id: _ctx.userId || 'system',
|
|
20
|
+
definition_url: metric.definitionUrl,
|
|
21
|
+
definition_id: metric.definitionId,
|
|
22
|
+
version_id: metric.versionId,
|
|
23
|
+
channel: metric.channel,
|
|
24
|
+
org_id: metric.orgId,
|
|
25
|
+
duration_ms: metric.durationMs,
|
|
26
|
+
ok: metric.ok,
|
|
27
|
+
failure_kind: metric.failureKind,
|
|
28
|
+
error_count: metric.errorCount,
|
|
29
|
+
warning_count: metric.warningCount
|
|
30
|
+
});
|
|
31
|
+
if (error) {
|
|
32
|
+
console.error('[SupabaseSolveMetricSink] insert failed:', error.message, { metric });
|
|
33
|
+
}
|
|
34
|
+
} catch (err) {
|
|
35
|
+
console.error('[SupabaseSolveMetricSink] unexpected error:', err, { metric });
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { describe, beforeEach, it } from 'vitest';
|
|
2
|
+
import { runSolveMetricSinkConformance, type RecordedSolveMetric } from '@selvajs/platform/testing';
|
|
3
|
+
import { SupabaseSolveMetricSink } from '../SupabaseSolveMetricSink.js';
|
|
4
|
+
import { buildClientBundle } from '../client.js';
|
|
5
|
+
import { readEnv, resetAllData } from './test-helpers.js';
|
|
6
|
+
|
|
7
|
+
const envCtx = readEnv();
|
|
8
|
+
|
|
9
|
+
if (!envCtx) {
|
|
10
|
+
describe.skip('SupabaseSolveMetricSink (skipped: no live stack)', () => {
|
|
11
|
+
it('populate packages/providers/supabase/.env.test with Supabase creds to run these tests', () => {});
|
|
12
|
+
});
|
|
13
|
+
} else {
|
|
14
|
+
const ctx = envCtx;
|
|
15
|
+
describe('SupabaseSolveMetricSink', () => {
|
|
16
|
+
beforeEach(async () => {
|
|
17
|
+
await resetAllData(ctx);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
runSolveMetricSinkConformance({
|
|
21
|
+
name: 'SupabaseSolveMetricSink',
|
|
22
|
+
createSink: () => new SupabaseSolveMetricSink(ctx.bundle),
|
|
23
|
+
readRows: async () => {
|
|
24
|
+
const { data, error } = await ctx.adminClient
|
|
25
|
+
.from('solve_metrics')
|
|
26
|
+
.select(
|
|
27
|
+
'actor_id, definition_url, definition_id, version_id, channel, org_id, duration_ms, ok, failure_kind, error_count, warning_count'
|
|
28
|
+
)
|
|
29
|
+
.order('occurred_at', { ascending: true });
|
|
30
|
+
if (error) throw new Error(`solve_metrics read failed: ${error.message}`);
|
|
31
|
+
return (data ?? []).map(
|
|
32
|
+
(r): RecordedSolveMetric => ({
|
|
33
|
+
actorId: r.actor_id,
|
|
34
|
+
definitionUrl: r.definition_url,
|
|
35
|
+
definitionId: r.definition_id,
|
|
36
|
+
versionId: r.version_id,
|
|
37
|
+
channel: r.channel,
|
|
38
|
+
orgId: r.org_id,
|
|
39
|
+
durationMs: r.duration_ms,
|
|
40
|
+
ok: r.ok,
|
|
41
|
+
failureKind: r.failure_kind,
|
|
42
|
+
errorCount: r.error_count,
|
|
43
|
+
warningCount: r.warning_count
|
|
44
|
+
})
|
|
45
|
+
);
|
|
46
|
+
},
|
|
47
|
+
// Point the sink at a bundle whose service key is bogus, so the insert
|
|
48
|
+
// fails. record() must still resolve (contract: never throw).
|
|
49
|
+
createFailingSink: () =>
|
|
50
|
+
new SupabaseSolveMetricSink(
|
|
51
|
+
buildClientBundle({
|
|
52
|
+
supabaseUrl: ctx.url,
|
|
53
|
+
anonKey: ctx.anonKey,
|
|
54
|
+
serviceRoleKey: 'invalid-service-role-key'
|
|
55
|
+
})
|
|
56
|
+
)
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
@@ -50,6 +50,7 @@ export function readEnv(): TestContext | null {
|
|
|
50
50
|
* dependents to parents.
|
|
51
51
|
*/
|
|
52
52
|
export async function resetAllData(ctx: TestContext): Promise<void> {
|
|
53
|
+
await truncate(ctx, 'solve_metrics');
|
|
53
54
|
await truncate(ctx, 'share_links');
|
|
54
55
|
await truncate(ctx, 'invites');
|
|
55
56
|
// Versions FK to definitions ON DELETE CASCADE, but `definitions` can't
|
package/src/data/index.ts
CHANGED
|
@@ -6,6 +6,7 @@ export { SupabaseComputeServerStore } from './SupabaseComputeServerStore.js';
|
|
|
6
6
|
export { SupabaseShareLinkStore } from './SupabaseShareLinkStore.js';
|
|
7
7
|
export { SupabaseDataProvider } from './SupabaseDataProvider.js';
|
|
8
8
|
export { SupabaseEventSink } from './SupabaseEventSink.js';
|
|
9
|
+
export { SupabaseSolveMetricSink } from './SupabaseSolveMetricSink.js';
|
|
9
10
|
export { SupabaseAuditQuery } from './SupabaseAuditQuery.js';
|
|
10
11
|
export { buildClientBundle } from './client.js';
|
|
11
12
|
export type { ClientBundle, BuildClientOptions } from './client.js';
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
-- ============================================================================
|
|
2
|
+
-- solve_metrics
|
|
3
|
+
-- Per-solve timing telemetry. One row per solve attempt, written by
|
|
4
|
+
-- `SupabaseSolveMetricSink` from the compute route AFTER each solve resolves
|
|
5
|
+
-- or rejects. `duration_ms` is wall time around the Rhino.Compute solve call
|
|
6
|
+
-- only — it excludes definition loading, auth, schema work, and serialization.
|
|
7
|
+
--
|
|
8
|
+
-- Append-only from the application's point of view: the sink inserts, nothing
|
|
9
|
+
-- updates or deletes. Failed/timed-out solves are recorded with ok = false.
|
|
10
|
+
-- ============================================================================
|
|
11
|
+
|
|
12
|
+
create table if not exists selva.solve_metrics (
|
|
13
|
+
id uuid primary key default gen_random_uuid(),
|
|
14
|
+
-- The user who triggered the solve, or 'system' for share-link / server flows.
|
|
15
|
+
actor_id text not null,
|
|
16
|
+
definition_url text not null,
|
|
17
|
+
-- Local definition + the exact version solved; null for remote-URL solves.
|
|
18
|
+
-- Plain ids (not FKs) so a deleted definition does not cascade away its history.
|
|
19
|
+
definition_id uuid,
|
|
20
|
+
version_id uuid,
|
|
21
|
+
channel text not null,
|
|
22
|
+
org_id uuid,
|
|
23
|
+
duration_ms double precision not null,
|
|
24
|
+
ok boolean not null,
|
|
25
|
+
-- Why the solve did not return a result; 'ok' when it did. Mirrors
|
|
26
|
+
-- SolveFailureKind: ok | timeout | client_abort | rate_limited | share_cap |
|
|
27
|
+
-- too_large | compute_error.
|
|
28
|
+
failure_kind text not null default 'ok',
|
|
29
|
+
-- Grasshopper runtime error/warning counts from the solve response. A solve
|
|
30
|
+
-- can be ok yet still report component errors (error_count > 0).
|
|
31
|
+
error_count integer not null default 0,
|
|
32
|
+
warning_count integer not null default 0,
|
|
33
|
+
occurred_at timestamptz not null default now()
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
create index if not exists solve_metrics_occurred_at_idx
|
|
37
|
+
on selva.solve_metrics (occurred_at desc);
|
|
38
|
+
|
|
39
|
+
create index if not exists solve_metrics_org_occurred_at_idx
|
|
40
|
+
on selva.solve_metrics (org_id, occurred_at desc);
|
|
41
|
+
|
|
42
|
+
create index if not exists solve_metrics_definition_occurred_at_idx
|
|
43
|
+
on selva.solve_metrics (definition_url, occurred_at desc);
|
|
44
|
+
|
|
45
|
+
-- Per-version timing comparisons ("is this version slower than the last?").
|
|
46
|
+
create index if not exists solve_metrics_version_occurred_at_idx
|
|
47
|
+
on selva.solve_metrics (version_id, occurred_at desc);
|
|
48
|
+
|
|
49
|
+
-- Filter failures fast for error-rate dashboards.
|
|
50
|
+
create index if not exists solve_metrics_failure_kind_idx
|
|
51
|
+
on selva.solve_metrics (failure_kind, occurred_at desc);
|
|
52
|
+
|
|
53
|
+
-- RLS: writes always go through service-role (the sink uses the service
|
|
54
|
+
-- client). Authenticated users have NO read access today — an operator-facing
|
|
55
|
+
-- metrics UI would land later with its own instance_admin-only policy.
|
|
56
|
+
alter table selva.solve_metrics enable row level security;
|