@linklabjs/core 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/DomainNode.d.ts +154 -0
- package/dist/api/DomainNode.d.ts.map +1 -0
- package/dist/api/DomainNode.js +1157 -0
- package/dist/api/DomainNode.js.map +1 -0
- package/dist/api/Graph.d.ts +117 -0
- package/dist/api/Graph.d.ts.map +1 -0
- package/dist/api/Graph.js +212 -0
- package/dist/api/Graph.js.map +1 -0
- package/dist/api/PathBuilder.d.ts +76 -0
- package/dist/api/PathBuilder.d.ts.map +1 -0
- package/dist/api/PathBuilder.js +182 -0
- package/dist/api/PathBuilder.js.map +1 -0
- package/dist/api/index.d.ts +8 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +7 -0
- package/dist/api/index.js.map +1 -0
- package/dist/api/loadGraph.d.ts +57 -0
- package/dist/api/loadGraph.d.ts.map +1 -0
- package/dist/api/loadGraph.js +153 -0
- package/dist/api/loadGraph.js.map +1 -0
- package/dist/api/test-api.d.ts +9 -0
- package/dist/api/test-api.d.ts.map +1 -0
- package/dist/api/test-api.js +133 -0
- package/dist/api/test-api.js.map +1 -0
- package/dist/api/test-domain.d.ts +13 -0
- package/dist/api/test-domain.d.ts.map +1 -0
- package/dist/api/test-domain.js +105 -0
- package/dist/api/test-domain.js.map +1 -0
- package/dist/api/types.d.ts +69 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +22 -0
- package/dist/api/types.js.map +1 -0
- package/dist/config/synonyms.json +25 -0
- package/dist/core/EventBus.d.ts +56 -0
- package/dist/core/EventBus.d.ts.map +1 -0
- package/dist/core/EventBus.js +147 -0
- package/dist/core/EventBus.js.map +1 -0
- package/dist/core/GraphEvents.d.ts +118 -0
- package/dist/core/GraphEvents.d.ts.map +1 -0
- package/dist/core/GraphEvents.js +23 -0
- package/dist/core/GraphEvents.js.map +1 -0
- package/dist/core/PathFinder.d.ts +43 -0
- package/dist/core/PathFinder.d.ts.map +1 -0
- package/dist/core/PathFinder.js +264 -0
- package/dist/core/PathFinder.js.map +1 -0
- package/dist/formatters/BaseFormatter.d.ts +15 -0
- package/dist/formatters/BaseFormatter.d.ts.map +1 -0
- package/dist/formatters/BaseFormatter.js +9 -0
- package/dist/formatters/BaseFormatter.js.map +1 -0
- package/dist/graph/GraphAssembler.d.ts +14 -0
- package/dist/graph/GraphAssembler.d.ts.map +1 -0
- package/dist/graph/GraphAssembler.js +44 -0
- package/dist/graph/GraphAssembler.js.map +1 -0
- package/dist/graph/GraphCompiler.d.ts +37 -0
- package/dist/graph/GraphCompiler.d.ts.map +1 -0
- package/dist/graph/GraphCompiler.js +355 -0
- package/dist/graph/GraphCompiler.js.map +1 -0
- package/dist/graph/GraphExtractor.d.ts +21 -0
- package/dist/graph/GraphExtractor.d.ts.map +1 -0
- package/dist/graph/GraphExtractor.js +145 -0
- package/dist/graph/GraphExtractor.js.map +1 -0
- package/dist/graph/GraphOptimizer.d.ts +104 -0
- package/dist/graph/GraphOptimizer.d.ts.map +1 -0
- package/dist/graph/GraphOptimizer.js +306 -0
- package/dist/graph/GraphOptimizer.js.map +1 -0
- package/dist/graph/GraphTrainer.d.ts +52 -0
- package/dist/graph/GraphTrainer.d.ts.map +1 -0
- package/dist/graph/GraphTrainer.js +188 -0
- package/dist/graph/GraphTrainer.js.map +1 -0
- package/dist/http/LinkBuilder.d.ts +82 -0
- package/dist/http/LinkBuilder.d.ts.map +1 -0
- package/dist/http/LinkBuilder.js +190 -0
- package/dist/http/LinkBuilder.js.map +1 -0
- package/dist/http/TrailRequest.d.ts +39 -0
- package/dist/http/TrailRequest.d.ts.map +1 -0
- package/dist/http/TrailRequest.js +22 -0
- package/dist/http/TrailRequest.js.map +1 -0
- package/dist/http/example-netflix.d.ts +6 -0
- package/dist/http/example-netflix.d.ts.map +1 -0
- package/dist/http/example-netflix.js +52 -0
- package/dist/http/example-netflix.js.map +1 -0
- package/dist/http/index.d.ts +32 -0
- package/dist/http/index.d.ts.map +1 -0
- package/dist/http/index.js +27 -0
- package/dist/http/index.js.map +1 -0
- package/dist/http/plugin.d.ts +110 -0
- package/dist/http/plugin.d.ts.map +1 -0
- package/dist/http/plugin.js +217 -0
- package/dist/http/plugin.js.map +1 -0
- package/dist/index.d.ts +55 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +71 -0
- package/dist/index.js.map +1 -0
- package/dist/instrumentation/TelemetryShim.d.ts +114 -0
- package/dist/instrumentation/TelemetryShim.d.ts.map +1 -0
- package/dist/instrumentation/TelemetryShim.js +107 -0
- package/dist/instrumentation/TelemetryShim.js.map +1 -0
- package/dist/navigation/NavigationEngine.d.ts +69 -0
- package/dist/navigation/NavigationEngine.d.ts.map +1 -0
- package/dist/navigation/NavigationEngine.js +361 -0
- package/dist/navigation/NavigationEngine.js.map +1 -0
- package/dist/navigation/Resolver.d.ts +35 -0
- package/dist/navigation/Resolver.d.ts.map +1 -0
- package/dist/navigation/Resolver.js +113 -0
- package/dist/navigation/Resolver.js.map +1 -0
- package/dist/navigation/Scheduler.d.ts +36 -0
- package/dist/navigation/Scheduler.d.ts.map +1 -0
- package/dist/navigation/Scheduler.js +107 -0
- package/dist/navigation/Scheduler.js.map +1 -0
- package/dist/navigation/Trail.d.ts +129 -0
- package/dist/navigation/Trail.d.ts.map +1 -0
- package/dist/navigation/Trail.js +202 -0
- package/dist/navigation/Trail.js.map +1 -0
- package/dist/navigation/TrailParser.d.ts +96 -0
- package/dist/navigation/TrailParser.d.ts.map +1 -0
- package/dist/navigation/TrailParser.js +180 -0
- package/dist/navigation/TrailParser.js.map +1 -0
- package/dist/navigation/index.d.ts +10 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +9 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/providers/MockProvider.d.ts +29 -0
- package/dist/providers/MockProvider.d.ts.map +1 -0
- package/dist/providers/MockProvider.js +55 -0
- package/dist/providers/MockProvider.js.map +1 -0
- package/dist/providers/PostgresProvider.d.ts +46 -0
- package/dist/providers/PostgresProvider.d.ts.map +1 -0
- package/dist/providers/PostgresProvider.js +152 -0
- package/dist/providers/PostgresProvider.js.map +1 -0
- package/dist/runtime/CompiledGraphEngine.d.ts +74 -0
- package/dist/runtime/CompiledGraphEngine.d.ts.map +1 -0
- package/dist/runtime/CompiledGraphEngine.js +211 -0
- package/dist/runtime/CompiledGraphEngine.js.map +1 -0
- package/dist/runtime/DataLoader.d.ts +90 -0
- package/dist/runtime/DataLoader.d.ts.map +1 -0
- package/dist/runtime/DataLoader.js +178 -0
- package/dist/runtime/DataLoader.js.map +1 -0
- package/dist/runtime/Engine.d.ts +36 -0
- package/dist/runtime/Engine.d.ts.map +1 -0
- package/dist/runtime/Engine.js +128 -0
- package/dist/runtime/Engine.js.map +1 -0
- package/dist/runtime/QueryEngine.d.ts +80 -0
- package/dist/runtime/QueryEngine.d.ts.map +1 -0
- package/dist/runtime/QueryEngine.js +188 -0
- package/dist/runtime/QueryEngine.js.map +1 -0
- package/dist/scenarios/test-metro-paris/config.json +6 -0
- package/dist/scenarios/test-metro-paris/graph.json +16325 -0
- package/dist/scenarios/test-metro-paris/queries.d.ts +22 -0
- package/dist/scenarios/test-metro-paris/queries.d.ts.map +1 -0
- package/dist/scenarios/test-metro-paris/queries.js +128 -0
- package/dist/scenarios/test-metro-paris/queries.js.map +1 -0
- package/dist/scenarios/test-metro-paris/stack.json +1 -0
- package/dist/scenarios/test-musicians/config.json +10 -0
- package/dist/scenarios/test-musicians/graph.json +20 -0
- package/dist/scenarios/test-musicians/stack.json +1 -0
- package/dist/scenarios/test-netflix/actions.d.ts +14 -0
- package/dist/scenarios/test-netflix/actions.d.ts.map +1 -0
- package/dist/scenarios/test-netflix/actions.js +86 -0
- package/dist/scenarios/test-netflix/actions.js.map +1 -0
- package/dist/scenarios/test-netflix/config.json +6 -0
- package/dist/scenarios/test-netflix/data/categories.json +1 -0
- package/dist/scenarios/test-netflix/data/companies.json +1 -0
- package/dist/scenarios/test-netflix/data/credits.json +19797 -0
- package/dist/scenarios/test-netflix/data/departments.json +18 -0
- package/dist/scenarios/test-netflix/data/jobs.json +142 -0
- package/dist/scenarios/test-netflix/data/movies.json +3497 -0
- package/dist/scenarios/test-netflix/data/people.json +1 -0
- package/dist/scenarios/test-netflix/data/synonyms.json +7 -0
- package/dist/scenarios/test-netflix/data/users.json +70 -0
- package/dist/scenarios/test-netflix/graph.json +1017 -0
- package/dist/scenarios/test-netflix/queries.d.ts +29 -0
- package/dist/scenarios/test-netflix/queries.d.ts.map +1 -0
- package/dist/scenarios/test-netflix/queries.js +134 -0
- package/dist/scenarios/test-netflix/queries.js.map +1 -0
- package/dist/scenarios/test-netflix/stack.json +14 -0
- package/dist/schema/GraphBuilder.d.ts +9 -0
- package/dist/schema/GraphBuilder.d.ts.map +1 -0
- package/dist/schema/GraphBuilder.js +90 -0
- package/dist/schema/GraphBuilder.js.map +1 -0
- package/dist/schema/JsonSchemaExtractor.d.ts +21 -0
- package/dist/schema/JsonSchemaExtractor.d.ts.map +1 -0
- package/dist/schema/JsonSchemaExtractor.js +88 -0
- package/dist/schema/JsonSchemaExtractor.js.map +1 -0
- package/dist/schema/SchemaAnalyzer.d.ts +41 -0
- package/dist/schema/SchemaAnalyzer.d.ts.map +1 -0
- package/dist/schema/SchemaAnalyzer.js +144 -0
- package/dist/schema/SchemaAnalyzer.js.map +1 -0
- package/dist/schema/SchemaExtractor.d.ts +10 -0
- package/dist/schema/SchemaExtractor.d.ts.map +1 -0
- package/dist/schema/SchemaExtractor.js +90 -0
- package/dist/schema/SchemaExtractor.js.map +1 -0
- package/dist/schema/SynonymResolver.d.ts +55 -0
- package/dist/schema/SynonymResolver.d.ts.map +1 -0
- package/dist/schema/SynonymResolver.js +121 -0
- package/dist/schema/SynonymResolver.js.map +1 -0
- package/dist/scripts/dictionary.json +796 -0
- package/dist/scripts/graph.json +664 -0
- package/dist/scripts/regenerate.d.ts +23 -0
- package/dist/scripts/regenerate.d.ts.map +1 -0
- package/dist/scripts/regenerate.js +206 -0
- package/dist/scripts/regenerate.js.map +1 -0
- package/dist/types/index.d.ts +394 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +21 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LinkLab Fastify Plugin
|
|
3
|
+
*
|
|
4
|
+
* Transforme automatiquement chaque requête HTTP en Trail,
|
|
5
|
+
* résout la navigation via le graphe, et retourne une réponse
|
|
6
|
+
* HATEOAS Level 3 — liens générés automatiquement depuis le graphe.
|
|
7
|
+
*
|
|
8
|
+
* Usage minimal :
|
|
9
|
+
* ```typescript
|
|
10
|
+
* import Fastify from 'fastify'
|
|
11
|
+
* import { linklabPlugin } from '@linklab/http'
|
|
12
|
+
*
|
|
13
|
+
* const fastify = Fastify()
|
|
14
|
+
* await fastify.register(linklabPlugin, {
|
|
15
|
+
* graph: compiledGraph,
|
|
16
|
+
* prefix: '/api'
|
|
17
|
+
* })
|
|
18
|
+
* await fastify.listen({ port: 3000 })
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* Toutes ces routes fonctionnent sans configuration supplémentaire :
|
|
22
|
+
* GET /api/people
|
|
23
|
+
* GET /api/people/Nolan
|
|
24
|
+
* GET /api/people/Nolan/movies
|
|
25
|
+
* GET /api/people/Nolan/movies/1/actors
|
|
26
|
+
*
|
|
27
|
+
* Hooks disponibles sur chaque requête :
|
|
28
|
+
* ```typescript
|
|
29
|
+
* fastify.register(linklabPlugin, {
|
|
30
|
+
* graph,
|
|
31
|
+
* onEngine: (engine, req) => {
|
|
32
|
+
* engine.hooks.on('access.check', async (ctx) => {
|
|
33
|
+
* if (!ctx.trail.user.userId) {
|
|
34
|
+
* return { cancelled: true, reason: 'unauthenticated' }
|
|
35
|
+
* }
|
|
36
|
+
* })
|
|
37
|
+
* }
|
|
38
|
+
* })
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
import fp from 'fastify-plugin';
|
|
42
|
+
import { TrailParser } from '../navigation/TrailParser.js';
|
|
43
|
+
import { NavigationEngine } from '../navigation/NavigationEngine.js';
|
|
44
|
+
import { LinkBuilder } from './LinkBuilder.js';
|
|
45
|
+
import { DataLoader } from '../runtime/DataLoader.js';
|
|
46
|
+
import { defaultUserExtractor, } from './TrailRequest.js';
|
|
47
|
+
// ── Helper — vérifie qu'un node est exposé ───────────────────
|
|
48
|
+
// Un node sans flag exposed (graphe ancien) est considéré exposé
|
|
49
|
+
// pour assurer la rétrocompatibilité.
|
|
50
|
+
// Un node avec exposed: false est bloqué.
|
|
51
|
+
function isExposed(graph, entity) {
|
|
52
|
+
const node = graph.nodes.find(n => n.id === entity);
|
|
53
|
+
if (!node)
|
|
54
|
+
return false;
|
|
55
|
+
// Rétrocompatibilité : si exposed n'est pas défini, on expose
|
|
56
|
+
if (node.exposed === undefined)
|
|
57
|
+
return true;
|
|
58
|
+
return node.exposed === true;
|
|
59
|
+
}
|
|
60
|
+
// ── Plugin ────────────────────────────────────────────────────
|
|
61
|
+
const linklabPluginImpl = async (fastify, options) => {
|
|
62
|
+
const { graph, prefix = '', global = {}, extractUser = defaultUserExtractor, onEngine, dataLoader, transformData, } = options;
|
|
63
|
+
const linkBuilder = new LinkBuilder(graph, { prefix });
|
|
64
|
+
// compiledGraph peut être passé séparément (semantic graph + compiled graph distincts)
|
|
65
|
+
// ou graph peut lui-même être un CompiledGraph (avec .routes)
|
|
66
|
+
const effectiveCompiled = options.compiledGraph
|
|
67
|
+
?? ('routes' in graph && Array.isArray(graph.routes) ? graph : null);
|
|
68
|
+
const loader = (dataLoader && effectiveCompiled)
|
|
69
|
+
? new DataLoader(effectiveCompiled, dataLoader)
|
|
70
|
+
: null;
|
|
71
|
+
if (dataLoader && !effectiveCompiled) {
|
|
72
|
+
fastify.log.warn('[LinkLab] dataLoader ignoré : graph doit être un CompiledGraph (avec .routes)');
|
|
73
|
+
}
|
|
74
|
+
// ── Décorer chaque request avec trail + linkBuilder ─────────
|
|
75
|
+
fastify.decorateRequest('trail', null);
|
|
76
|
+
fastify.decorateRequest('linkBuilder', null);
|
|
77
|
+
// ── Hook preHandler — parse le Trail avant chaque requête ───
|
|
78
|
+
fastify.addHook('preHandler', async (req) => {
|
|
79
|
+
const userCtx = await extractUser(req);
|
|
80
|
+
const rawPath = req.url.split('?')[0];
|
|
81
|
+
const path = prefix ? rawPath.replace(new RegExp(`^${prefix}`), '') : rawPath;
|
|
82
|
+
const trail = TrailParser.fromPath(path, {
|
|
83
|
+
global: { ...global },
|
|
84
|
+
user: userCtx,
|
|
85
|
+
});
|
|
86
|
+
req.trail = trail;
|
|
87
|
+
req.linkBuilder = linkBuilder;
|
|
88
|
+
});
|
|
89
|
+
// ── Routes génériques — capture tous les paths ─────────────
|
|
90
|
+
const routePath = prefix ? `${prefix}/*` : '/*';
|
|
91
|
+
const rootPath = prefix || '/';
|
|
92
|
+
// Route pour le prefix exact ex: GET /api
|
|
93
|
+
fastify.get(rootPath, async (req, reply) => {
|
|
94
|
+
const links = buildRootLinks(graph, prefix);
|
|
95
|
+
return { data: null, _links: links, _trail: '', _meta: { entity: 'root', depth: 0, resolved: 0, timing: 0 } };
|
|
96
|
+
});
|
|
97
|
+
fastify.get(routePath, async (req, reply) => {
|
|
98
|
+
const trail = req.trail;
|
|
99
|
+
const start = Date.now();
|
|
100
|
+
// Trail vide = index — retourner les nœuds racines du graphe
|
|
101
|
+
if (trail.depth === 0) {
|
|
102
|
+
const rootLinks = buildRootLinks(graph, prefix);
|
|
103
|
+
return {
|
|
104
|
+
data: null,
|
|
105
|
+
_links: rootLinks,
|
|
106
|
+
_trail: '',
|
|
107
|
+
_meta: { entity: 'root', depth: 0, resolved: 0, timing: Date.now() - start },
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
// ── Vérifier que toutes les frames du Trail pointent vers des nodes exposés
|
|
111
|
+
// On vérifie chaque entité du Trail — si l'une est non exposée → 404.
|
|
112
|
+
// Cela couvre aussi les vues sémantiques : leur entité cible résolue
|
|
113
|
+
// est vérifiée au moment de la résolution du Trail.
|
|
114
|
+
for (const frame of trail.frames) {
|
|
115
|
+
if (!isExposed(graph, frame.entity)) {
|
|
116
|
+
reply.code(404);
|
|
117
|
+
return reply.send({
|
|
118
|
+
error: 'NOT_FOUND',
|
|
119
|
+
reason: `Entity '${frame.entity}' is not exposed`,
|
|
120
|
+
_trail: TrailParser.toFluent(trail),
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// ── Créer le moteur de navigation ─────────────────────────
|
|
125
|
+
const engine = NavigationEngine.forNavigation(graph, { trail });
|
|
126
|
+
// Laisser Netflix (ou tout autre app) brancher ses hooks
|
|
127
|
+
if (onEngine) {
|
|
128
|
+
await onEngine(engine, req);
|
|
129
|
+
}
|
|
130
|
+
// ── Résoudre le Trail ─────────────────────────────────────
|
|
131
|
+
const results = await engine.run(trail.depth + 1);
|
|
132
|
+
const lastResult = results[results.length - 1];
|
|
133
|
+
// ── Gérer les erreurs de navigation ───────────────────────
|
|
134
|
+
if (lastResult?.result?.type === 'FAIL') {
|
|
135
|
+
const reason = lastResult.result.reason ?? 'Navigation failed';
|
|
136
|
+
if (reason.includes('notfound') || reason.includes('Aucun chemin')) {
|
|
137
|
+
reply.code(404);
|
|
138
|
+
return reply.send({
|
|
139
|
+
error: 'NOT_FOUND',
|
|
140
|
+
reason,
|
|
141
|
+
_trail: TrailParser.toFluent(trail),
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
if (reason.includes('forbidden') || reason.includes('denied') || reason.includes('unauthenticated')) {
|
|
145
|
+
reply.code(403);
|
|
146
|
+
return reply.send({
|
|
147
|
+
error: 'FORBIDDEN',
|
|
148
|
+
reason,
|
|
149
|
+
_trail: TrailParser.toFluent(trail),
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
reply.code(400);
|
|
153
|
+
return reply.send({
|
|
154
|
+
error: 'BAD_REQUEST',
|
|
155
|
+
reason,
|
|
156
|
+
_trail: TrailParser.toFluent(trail),
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
// ── Charger les données via DataLoader ───────────────────
|
|
160
|
+
if (loader) {
|
|
161
|
+
await loader.load(engine.trail);
|
|
162
|
+
}
|
|
163
|
+
// ── Récupérer les données de la frame courante ────────────
|
|
164
|
+
const current = engine.trail.current;
|
|
165
|
+
const rawData = current?.data ?? null;
|
|
166
|
+
const data = transformData ? transformData(rawData, engine.trail) : rawData;
|
|
167
|
+
// ── Générer les liens HATEOAS ─────────────────────────────
|
|
168
|
+
const links = linkBuilder.from(engine.trail);
|
|
169
|
+
// Si data est une liste, enrichir chaque item avec ses liens
|
|
170
|
+
const isCollection = Array.isArray(data);
|
|
171
|
+
let responseData = data;
|
|
172
|
+
if (isCollection && data.length > 0) {
|
|
173
|
+
const itemLinks = linkBuilder.forItems(engine.trail, data);
|
|
174
|
+
responseData = data.map((item, i) => ({
|
|
175
|
+
...item,
|
|
176
|
+
_links: itemLinks[i],
|
|
177
|
+
}));
|
|
178
|
+
}
|
|
179
|
+
// ── Construire la réponse ─────────────────────────────────
|
|
180
|
+
const resolved = engine.trail.frames.filter(f => f.state === 'RESOLVED').length;
|
|
181
|
+
return {
|
|
182
|
+
data: responseData,
|
|
183
|
+
_links: links,
|
|
184
|
+
_trail: TrailParser.toFluent(engine.trail),
|
|
185
|
+
_meta: {
|
|
186
|
+
entity: current?.entity ?? '',
|
|
187
|
+
depth: engine.trail.depth,
|
|
188
|
+
resolved,
|
|
189
|
+
timing: Date.now() - start,
|
|
190
|
+
count: isCollection ? data.length : undefined,
|
|
191
|
+
},
|
|
192
|
+
};
|
|
193
|
+
});
|
|
194
|
+
};
|
|
195
|
+
// ── Helper — liens racines ────────────────────────────────────
|
|
196
|
+
// Filtre les nodes non exposés des liens racines.
|
|
197
|
+
function buildRootLinks(graph, prefix) {
|
|
198
|
+
const hasIncoming = new Set(graph.edges.map(e => e.to));
|
|
199
|
+
const roots = graph.nodes.filter(n => !hasIncoming.has(n.id) && isExposed(graph, n.id));
|
|
200
|
+
const links = {
|
|
201
|
+
self: { href: prefix || '/', method: 'GET' }
|
|
202
|
+
};
|
|
203
|
+
for (const node of roots) {
|
|
204
|
+
links[node.id] = {
|
|
205
|
+
href: `${prefix}/${node.id}`,
|
|
206
|
+
method: 'GET',
|
|
207
|
+
rel: node.id,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
return links;
|
|
211
|
+
}
|
|
212
|
+
// ── Export avec fastify-plugin (preserve encapsulation) ───────
|
|
213
|
+
export const linklabPlugin = fp(linklabPluginImpl, {
|
|
214
|
+
fastify: '4.x || 5.x',
|
|
215
|
+
name: 'linklab',
|
|
216
|
+
});
|
|
217
|
+
//# sourceMappingURL=plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/http/plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @linklab/core — Point d'entrée public
|
|
3
|
+
*
|
|
4
|
+
* Trois zones d'export, du plus utilisé au plus technique :
|
|
5
|
+
*
|
|
6
|
+
* ┌─────────────────────────────────────────────────────────┐
|
|
7
|
+
* │ API — ce que 80% des utilisateurs importent │
|
|
8
|
+
* │ BUILD — pipeline schema → graph (setup, CI) │
|
|
9
|
+
* │ HTTP — plugin Fastify HATEOAS (optionnel) │
|
|
10
|
+
* │ ADVANCED — internals pour extensions et tests │
|
|
11
|
+
* └─────────────────────────────────────────────────────────┘
|
|
12
|
+
*
|
|
13
|
+
* Usage typique :
|
|
14
|
+
*
|
|
15
|
+
* import { Graph, Strategy } from '@linklab/core'
|
|
16
|
+
*
|
|
17
|
+
* const cinema = new Graph(graphJson, { compiled, dataset }).domain()
|
|
18
|
+
* const cast = await cinema.movies(278).people
|
|
19
|
+
* const route = cinema.from('Pigalle').to('Alesia').path(Strategy.Comfort())
|
|
20
|
+
*/
|
|
21
|
+
export { Graph } from './api/Graph.js';
|
|
22
|
+
export { Strategy } from './api/types.js';
|
|
23
|
+
export type { PathResult, ResolvedPath, PathStep, QueryResult, PathBuilderOptions } from './api/types.js';
|
|
24
|
+
export { PathBuilder } from './api/PathBuilder.js';
|
|
25
|
+
export { SchemaExtractor } from './schema/SchemaExtractor.js';
|
|
26
|
+
export { JsonSchemaExtractor } from './schema/JsonSchemaExtractor.js';
|
|
27
|
+
export { SchemaAnalyzer } from './schema/SchemaAnalyzer.js';
|
|
28
|
+
export { GraphBuilder } from './schema/GraphBuilder.js';
|
|
29
|
+
export { GraphAssembler } from './graph/GraphAssembler.js';
|
|
30
|
+
export { GraphCompiler } from './graph/GraphCompiler.js';
|
|
31
|
+
export { GraphTrainer } from './graph/GraphTrainer.js';
|
|
32
|
+
export { GraphOptimizer } from './graph/GraphOptimizer.js';
|
|
33
|
+
export { GraphExtractor } from './graph/GraphExtractor.js';
|
|
34
|
+
export { linklabPlugin } from './http/plugin.js';
|
|
35
|
+
export { LinkBuilder } from './http/LinkBuilder.js';
|
|
36
|
+
export type { LinklabPluginOptions } from './http/plugin.js';
|
|
37
|
+
export { NavigationEngine } from './navigation/NavigationEngine.js';
|
|
38
|
+
export { Resolver } from './navigation/Resolver.js';
|
|
39
|
+
export { Scheduler } from './navigation/Scheduler.js';
|
|
40
|
+
export { Trail } from './navigation/Trail.js';
|
|
41
|
+
export { TrailParser } from './navigation/TrailParser.js';
|
|
42
|
+
export { QueryEngine } from './runtime/QueryEngine.js';
|
|
43
|
+
export { Engine } from './runtime/Engine.js';
|
|
44
|
+
export { DataLoader } from './runtime/DataLoader.js';
|
|
45
|
+
export { PostgresProvider } from './providers/PostgresProvider.js';
|
|
46
|
+
export { MockProvider } from './providers/MockProvider.js';
|
|
47
|
+
export type { PathFormatter } from './formatters/BaseFormatter.js';
|
|
48
|
+
export { PathFinder } from './core/PathFinder.js';
|
|
49
|
+
export type { Graph as GraphData, // renommé pour éviter le conflit avec la classe Graph
|
|
50
|
+
GraphNode, GraphEdge, CompiledGraph, RouteInfo, Dictionary, Frame, Path, PathQuery } from './types/index.js';
|
|
51
|
+
export type { MetricsMap, TrainingMetrics, UseCase } from './types/index.js';
|
|
52
|
+
export { injectTelemetry, resetTelemetry, preloadTelemetry, shim } from './instrumentation/TelemetryShim.js';
|
|
53
|
+
export type { TelemetryModule } from './instrumentation/TelemetryShim.js';
|
|
54
|
+
export type { ExposeConfig } from './types/index.js';
|
|
55
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAOH,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,YAAY,EACV,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,WAAW,EACX,kBAAkB,EACnB,MAAM,gBAAgB,CAAA;AAGvB,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAQlD,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAQ1D,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AACnD,YAAY,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAQ5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAGzD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAGpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAG1D,YAAY,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAGlE,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAOjD,YAAY,EACV,KAAK,IAAI,SAAS,EAAE,sDAAsD;AAC1E,SAAS,EACT,SAAS,EACT,aAAa,EACb,SAAS,EACT,UAAU,EACV,KAAK,EACL,IAAI,EACJ,SAAS,EACV,MAAM,kBAAkB,CAAA;AAEzB,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAA;AAG5E,OAAO,EACL,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,IAAI,EACL,MAAM,oCAAoC,CAAA;AAC3C,YAAY,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAA;AAEzE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @linklab/core — Point d'entrée public
|
|
3
|
+
*
|
|
4
|
+
* Trois zones d'export, du plus utilisé au plus technique :
|
|
5
|
+
*
|
|
6
|
+
* ┌─────────────────────────────────────────────────────────┐
|
|
7
|
+
* │ API — ce que 80% des utilisateurs importent │
|
|
8
|
+
* │ BUILD — pipeline schema → graph (setup, CI) │
|
|
9
|
+
* │ HTTP — plugin Fastify HATEOAS (optionnel) │
|
|
10
|
+
* │ ADVANCED — internals pour extensions et tests │
|
|
11
|
+
* └─────────────────────────────────────────────────────────┘
|
|
12
|
+
*
|
|
13
|
+
* Usage typique :
|
|
14
|
+
*
|
|
15
|
+
* import { Graph, Strategy } from '@linklab/core'
|
|
16
|
+
*
|
|
17
|
+
* const cinema = new Graph(graphJson, { compiled, dataset }).domain()
|
|
18
|
+
* const cast = await cinema.movies(278).people
|
|
19
|
+
* const route = cinema.from('Pigalle').to('Alesia').path(Strategy.Comfort())
|
|
20
|
+
*/
|
|
21
|
+
// ══════════════════════════════════════════════════════════════
|
|
22
|
+
// API — Surface publique principale
|
|
23
|
+
// import { Graph, Strategy } from '@linklab/core'
|
|
24
|
+
// ══════════════════════════════════════════════════════════════
|
|
25
|
+
export { Graph } from './api/Graph.js';
|
|
26
|
+
export { Strategy } from './api/types.js';
|
|
27
|
+
// PathBuilder est retourné par graph.from() — exposé pour le typage
|
|
28
|
+
export { PathBuilder } from './api/PathBuilder.js';
|
|
29
|
+
// ══════════════════════════════════════════════════════════════
|
|
30
|
+
// BUILD — Pipeline schema → graph
|
|
31
|
+
// Usage : scripts de génération, CI, pipeline.ts
|
|
32
|
+
// import { SchemaExtractor, GraphCompiler } from '@linklab/core/build'
|
|
33
|
+
// ══════════════════════════════════════════════════════════════
|
|
34
|
+
export { SchemaExtractor } from './schema/SchemaExtractor.js';
|
|
35
|
+
export { JsonSchemaExtractor } from './schema/JsonSchemaExtractor.js';
|
|
36
|
+
export { SchemaAnalyzer } from './schema/SchemaAnalyzer.js';
|
|
37
|
+
export { GraphBuilder } from './schema/GraphBuilder.js';
|
|
38
|
+
export { GraphAssembler } from './graph/GraphAssembler.js';
|
|
39
|
+
export { GraphCompiler } from './graph/GraphCompiler.js';
|
|
40
|
+
export { GraphTrainer } from './graph/GraphTrainer.js';
|
|
41
|
+
export { GraphOptimizer } from './graph/GraphOptimizer.js';
|
|
42
|
+
export { GraphExtractor } from './graph/GraphExtractor.js';
|
|
43
|
+
// ══════════════════════════════════════════════════════════════
|
|
44
|
+
// HTTP — Plugin Fastify HATEOAS
|
|
45
|
+
// Usage : apps serveur
|
|
46
|
+
// import { linklabPlugin } from '@linklab/core'
|
|
47
|
+
// ══════════════════════════════════════════════════════════════
|
|
48
|
+
export { linklabPlugin } from './http/plugin.js';
|
|
49
|
+
export { LinkBuilder } from './http/LinkBuilder.js';
|
|
50
|
+
// ══════════════════════════════════════════════════════════════
|
|
51
|
+
// ADVANCED — Internals pour extensions, providers, tests
|
|
52
|
+
// Stable mais sans garantie de compatibilité entre versions
|
|
53
|
+
// ══════════════════════════════════════════════════════════════
|
|
54
|
+
// Moteur de navigation bas niveau
|
|
55
|
+
export { NavigationEngine } from './navigation/NavigationEngine.js';
|
|
56
|
+
export { Resolver } from './navigation/Resolver.js';
|
|
57
|
+
export { Scheduler } from './navigation/Scheduler.js';
|
|
58
|
+
export { Trail } from './navigation/Trail.js';
|
|
59
|
+
export { TrailParser } from './navigation/TrailParser.js';
|
|
60
|
+
// Runtime
|
|
61
|
+
export { QueryEngine } from './runtime/QueryEngine.js';
|
|
62
|
+
export { Engine } from './runtime/Engine.js';
|
|
63
|
+
export { DataLoader } from './runtime/DataLoader.js';
|
|
64
|
+
// Providers
|
|
65
|
+
export { PostgresProvider } from './providers/PostgresProvider.js';
|
|
66
|
+
export { MockProvider } from './providers/MockProvider.js';
|
|
67
|
+
// PathFinder — algorithme Dijkstra brut
|
|
68
|
+
export { PathFinder } from './core/PathFinder.js';
|
|
69
|
+
// ── Instrumentation — opt-in telemetry bridge ─────────────────────────────
|
|
70
|
+
export { injectTelemetry, resetTelemetry, preloadTelemetry, shim } from './instrumentation/TelemetryShim.js';
|
|
71
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,iEAAiE;AACjE,qCAAqC;AACrC,mDAAmD;AACnD,iEAAiE;AAEjE,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAA;AACtC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AASzC,oEAAoE;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAElD,iEAAiE;AACjE,mCAAmC;AACnC,kDAAkD;AAClD,wEAAwE;AACxE,iEAAiE;AAEjE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAA;AACrE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAC3D,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAA;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAE1D,iEAAiE;AACjE,iCAAiC;AACjC,wBAAwB;AACxB,iDAAiD;AACjD,iEAAiE;AAEjE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAA;AAGnD,iEAAiE;AACjE,0DAA0D;AAC1D,6DAA6D;AAC7D,iEAAiE;AAEjE,kCAAkC;AAClC,OAAO,EAAE,gBAAgB,EAAE,MAAM,kCAAkC,CAAA;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AACrD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAA;AAEzD,UAAU;AACV,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAA;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAA;AAEpD,YAAY;AACZ,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAA;AAK1D,wCAAwC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AAqBjD,6EAA6E;AAC7E,OAAO,EACL,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,IAAI,EACL,MAAM,oCAAoC,CAAA"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TelemetryShim.ts — Pont opt-in entre @linklab/core et @linklab/telemetry
|
|
3
|
+
*
|
|
4
|
+
* @linklab/core ne dépend PAS de @linklab/telemetry.
|
|
5
|
+
*
|
|
6
|
+
* Deux modes d'activation :
|
|
7
|
+
*
|
|
8
|
+
* 1. INJECTION (recommandé, toujours fiable) :
|
|
9
|
+
* L'appelant qui connaît les deux packages injecte les modules directement.
|
|
10
|
+
* Utilisé dans les tests (@linklab/telemetry) et en production (Netflix-backend).
|
|
11
|
+
*
|
|
12
|
+
* import { injectTelemetry } from '@linklab/core'
|
|
13
|
+
* import { SpanBuilder, traceBus } from '@linklab/telemetry'
|
|
14
|
+
* injectTelemetry({ SpanBuilder, traceBus })
|
|
15
|
+
*
|
|
16
|
+
* 2. PRELOAD (production uniquement) :
|
|
17
|
+
* Import dynamique — fonctionne si @linklab/telemetry est installé ET
|
|
18
|
+
* accessible depuis le même module resolver que @linklab/core.
|
|
19
|
+
* Ne pas utiliser dans les tests (résolution cross-package impossible sous Vitest).
|
|
20
|
+
*
|
|
21
|
+
* import { preloadTelemetry } from '@linklab/core'
|
|
22
|
+
* await preloadTelemetry()
|
|
23
|
+
*
|
|
24
|
+
* Sans activation → toutes les opérations sont des no-ops silencieux.
|
|
25
|
+
*/
|
|
26
|
+
interface MinimalSpanBuilder {
|
|
27
|
+
stepStart(step: string): this;
|
|
28
|
+
stepEnd(step: string): this;
|
|
29
|
+
addCacheEvent(event: {
|
|
30
|
+
level: 'L1' | 'L2' | 'MISS';
|
|
31
|
+
hit: boolean;
|
|
32
|
+
entity?: string;
|
|
33
|
+
promoted: boolean;
|
|
34
|
+
yoyo?: boolean;
|
|
35
|
+
}): this;
|
|
36
|
+
end(opts: {
|
|
37
|
+
rowCount: number;
|
|
38
|
+
}): MinimalSpan;
|
|
39
|
+
endWithError(err: Error, state: MinimalEngineState): MinimalSpan;
|
|
40
|
+
withPath?(path: string[]): this;
|
|
41
|
+
withFilters?(filters: Record<string, any>): this;
|
|
42
|
+
readonly routeKey: string;
|
|
43
|
+
}
|
|
44
|
+
interface MinimalSpan {
|
|
45
|
+
spanId: string;
|
|
46
|
+
traceId: string;
|
|
47
|
+
timestamp: number;
|
|
48
|
+
trail: string;
|
|
49
|
+
from: string;
|
|
50
|
+
to: string;
|
|
51
|
+
path: string[];
|
|
52
|
+
filters: Record<string, any>;
|
|
53
|
+
timings: any[];
|
|
54
|
+
totalMs: number;
|
|
55
|
+
cacheEvents: any[];
|
|
56
|
+
rowCount: number;
|
|
57
|
+
error?: any;
|
|
58
|
+
metrics?: any;
|
|
59
|
+
}
|
|
60
|
+
interface MinimalEngineState {
|
|
61
|
+
compiledGraphHash: string;
|
|
62
|
+
weights: Record<string, number>;
|
|
63
|
+
cacheState: {
|
|
64
|
+
l1HitRate: number;
|
|
65
|
+
l2HitRate: number;
|
|
66
|
+
globalHitRate: number;
|
|
67
|
+
yoyoEvents: number;
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export interface TelemetryModule {
|
|
71
|
+
SpanBuilder: {
|
|
72
|
+
start(opts: {
|
|
73
|
+
trail: string;
|
|
74
|
+
from: string;
|
|
75
|
+
to: string;
|
|
76
|
+
traceId?: string;
|
|
77
|
+
}): MinimalSpanBuilder;
|
|
78
|
+
};
|
|
79
|
+
traceBus: {
|
|
80
|
+
emit(event: 'span:end' | 'span:error', span: MinimalSpan): void;
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Injecte les composants de @linklab/telemetry dans le shim.
|
|
85
|
+
* Méthode universelle — fonctionne dans tous les contextes (tests, prod).
|
|
86
|
+
* Prend effet immédiatement et de manière synchrone.
|
|
87
|
+
*/
|
|
88
|
+
export declare function injectTelemetry(module: TelemetryModule): void;
|
|
89
|
+
/**
|
|
90
|
+
* Réinitialise le shim — utile pour les tests d'isolation.
|
|
91
|
+
*/
|
|
92
|
+
export declare function resetTelemetry(): void;
|
|
93
|
+
/**
|
|
94
|
+
* Précharge le module telemetry via import dynamique.
|
|
95
|
+
* Uniquement pour la production (Netflix-backend) où les deux packages
|
|
96
|
+
* partagent le même module resolver Node.js.
|
|
97
|
+
* Ne pas utiliser dans les tests — préférer injectTelemetry().
|
|
98
|
+
*/
|
|
99
|
+
export declare function preloadTelemetry(): Promise<void>;
|
|
100
|
+
export declare const shim: {
|
|
101
|
+
startSpan(opts: {
|
|
102
|
+
trail: string;
|
|
103
|
+
from: string;
|
|
104
|
+
to: string;
|
|
105
|
+
traceId?: string;
|
|
106
|
+
path?: string[];
|
|
107
|
+
filters?: Record<string, any>;
|
|
108
|
+
}): MinimalSpanBuilder | null;
|
|
109
|
+
emitEnd(span: MinimalSpan): void;
|
|
110
|
+
emitError(span: MinimalSpan): void;
|
|
111
|
+
readonly active: boolean;
|
|
112
|
+
};
|
|
113
|
+
export type { MinimalSpanBuilder, MinimalSpan, MinimalEngineState };
|
|
114
|
+
//# sourceMappingURL=TelemetryShim.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelemetryShim.d.ts","sourceRoot":"","sources":["../../src/instrumentation/TelemetryShim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,UAAU,kBAAkB;IAC1B,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC7B,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,aAAa,CAAC,KAAK,EAAE;QACnB,KAAK,EAAE,IAAI,GAAG,IAAI,GAAG,MAAM,CAAA;QAC3B,GAAG,EAAE,OAAO,CAAA;QACZ,MAAM,CAAC,EAAE,MAAM,CAAA;QACf,QAAQ,EAAE,OAAO,CAAA;QACjB,IAAI,CAAC,EAAE,OAAO,CAAA;KACf,GAAG,IAAI,CAAA;IACR,GAAG,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,WAAW,CAAA;IAC5C,YAAY,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,kBAAkB,GAAG,WAAW,CAAA;IAChE,QAAQ,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;IAC/B,WAAW,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAA;IAChD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;CAC1B;AAED,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IAC5B,OAAO,EAAE,GAAG,EAAE,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,GAAG,EAAE,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,GAAG,CAAA;IACX,OAAO,CAAC,EAAE,GAAG,CAAA;CACd;AAED,UAAU,kBAAkB;IAC1B,iBAAiB,EAAE,MAAM,CAAA;IACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,UAAU,EAAE;QACV,SAAS,EAAE,MAAM,CAAA;QACjB,SAAS,EAAE,MAAM,CAAA;QACjB,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;CACF;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE;QACX,KAAK,CAAC,IAAI,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,GAAG,kBAAkB,CAAA;KAC/F,CAAA;IACD,QAAQ,EAAE;QACR,IAAI,CAAC,KAAK,EAAE,UAAU,GAAG,YAAY,EAAE,IAAI,EAAE,WAAW,GAAG,IAAI,CAAA;KAChE,CAAA;CACF;AASD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,eAAe,GAAG,IAAI,CAG7D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAGrC;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAUtD;AAID,eAAO,MAAM,IAAI;oBACC;QACd,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,EAAE,MAAM,CAAA;QACZ,EAAE,EAAE,MAAM,CAAA;QACV,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;QACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;KAC9B,GAAG,kBAAkB,GAAG,IAAI;kBAiBf,WAAW,GAAG,IAAI;oBAOhB,WAAW,GAAG,IAAI;qBAOpB,OAAO;CAGtB,CAAA;AAED,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAA"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TelemetryShim.ts — Pont opt-in entre @linklab/core et @linklab/telemetry
|
|
3
|
+
*
|
|
4
|
+
* @linklab/core ne dépend PAS de @linklab/telemetry.
|
|
5
|
+
*
|
|
6
|
+
* Deux modes d'activation :
|
|
7
|
+
*
|
|
8
|
+
* 1. INJECTION (recommandé, toujours fiable) :
|
|
9
|
+
* L'appelant qui connaît les deux packages injecte les modules directement.
|
|
10
|
+
* Utilisé dans les tests (@linklab/telemetry) et en production (Netflix-backend).
|
|
11
|
+
*
|
|
12
|
+
* import { injectTelemetry } from '@linklab/core'
|
|
13
|
+
* import { SpanBuilder, traceBus } from '@linklab/telemetry'
|
|
14
|
+
* injectTelemetry({ SpanBuilder, traceBus })
|
|
15
|
+
*
|
|
16
|
+
* 2. PRELOAD (production uniquement) :
|
|
17
|
+
* Import dynamique — fonctionne si @linklab/telemetry est installé ET
|
|
18
|
+
* accessible depuis le même module resolver que @linklab/core.
|
|
19
|
+
* Ne pas utiliser dans les tests (résolution cross-package impossible sous Vitest).
|
|
20
|
+
*
|
|
21
|
+
* import { preloadTelemetry } from '@linklab/core'
|
|
22
|
+
* await preloadTelemetry()
|
|
23
|
+
*
|
|
24
|
+
* Sans activation → toutes les opérations sont des no-ops silencieux.
|
|
25
|
+
*/
|
|
26
|
+
// ── Registre interne ──────────────────────────────────────────────────────────
|
|
27
|
+
let _module = null;
|
|
28
|
+
let _attempted = false;
|
|
29
|
+
// ── API d'injection ───────────────────────────────────────────────────────────
|
|
30
|
+
/**
|
|
31
|
+
* Injecte les composants de @linklab/telemetry dans le shim.
|
|
32
|
+
* Méthode universelle — fonctionne dans tous les contextes (tests, prod).
|
|
33
|
+
* Prend effet immédiatement et de manière synchrone.
|
|
34
|
+
*/
|
|
35
|
+
export function injectTelemetry(module) {
|
|
36
|
+
_module = module;
|
|
37
|
+
_attempted = true; // bloquer tout preloadTelemetry() ultérieur
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Réinitialise le shim — utile pour les tests d'isolation.
|
|
41
|
+
*/
|
|
42
|
+
export function resetTelemetry() {
|
|
43
|
+
_module = null;
|
|
44
|
+
_attempted = false;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Précharge le module telemetry via import dynamique.
|
|
48
|
+
* Uniquement pour la production (Netflix-backend) où les deux packages
|
|
49
|
+
* partagent le même module resolver Node.js.
|
|
50
|
+
* Ne pas utiliser dans les tests — préférer injectTelemetry().
|
|
51
|
+
*/
|
|
52
|
+
export async function preloadTelemetry() {
|
|
53
|
+
if (_attempted)
|
|
54
|
+
return;
|
|
55
|
+
_attempted = true;
|
|
56
|
+
try {
|
|
57
|
+
const specifier = '@linklab/telemetry';
|
|
58
|
+
const mod = await new Function('s', 'return import(s)')(specifier);
|
|
59
|
+
_module = mod;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
_module = null;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
// ── API du shim ───────────────────────────────────────────────────────────────
|
|
66
|
+
export const shim = {
|
|
67
|
+
startSpan(opts) {
|
|
68
|
+
if (!_module)
|
|
69
|
+
return null;
|
|
70
|
+
try {
|
|
71
|
+
const builder = _module.SpanBuilder.start({
|
|
72
|
+
trail: opts.trail,
|
|
73
|
+
from: opts.from,
|
|
74
|
+
to: opts.to,
|
|
75
|
+
traceId: opts.traceId
|
|
76
|
+
});
|
|
77
|
+
if (opts.path)
|
|
78
|
+
builder.withPath?.(opts.path);
|
|
79
|
+
if (opts.filters)
|
|
80
|
+
builder.withFilters?.(opts.filters);
|
|
81
|
+
return builder;
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
return null;
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
emitEnd(span) {
|
|
88
|
+
if (!_module)
|
|
89
|
+
return;
|
|
90
|
+
try {
|
|
91
|
+
_module.traceBus.emit('span:end', span);
|
|
92
|
+
}
|
|
93
|
+
catch { }
|
|
94
|
+
},
|
|
95
|
+
emitError(span) {
|
|
96
|
+
if (!_module)
|
|
97
|
+
return;
|
|
98
|
+
try {
|
|
99
|
+
_module.traceBus.emit('span:error', span);
|
|
100
|
+
}
|
|
101
|
+
catch { }
|
|
102
|
+
},
|
|
103
|
+
get active() {
|
|
104
|
+
return _module !== null;
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
//# sourceMappingURL=TelemetryShim.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TelemetryShim.js","sourceRoot":"","sources":["../../src/instrumentation/TelemetryShim.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AA0DH,iFAAiF;AAEjF,IAAI,OAAO,GAA2B,IAAI,CAAA;AAC1C,IAAI,UAAU,GAAG,KAAK,CAAA;AAEtB,iFAAiF;AAEjF;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAAC,MAAuB;IACrD,OAAO,GAAG,MAAM,CAAA;IAChB,UAAU,GAAG,IAAI,CAAA,CAAC,4CAA4C;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,GAAG,IAAI,CAAA;IACd,UAAU,GAAG,KAAK,CAAA;AACpB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,IAAI,UAAU;QAAE,OAAM;IACtB,UAAU,GAAG,IAAI,CAAA;IACjB,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,oBAAoB,CAAA;QACtC,MAAM,GAAG,GAAG,MAAM,IAAI,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,SAAS,CAAC,CAAA;QAClE,OAAO,GAAG,GAAsB,CAAA;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,IAAI,CAAA;IAChB,CAAC;AACH,CAAC;AAED,iFAAiF;AAEjF,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,SAAS,CAAC,IAOT;QACC,IAAI,CAAC,OAAO;YAAE,OAAO,IAAI,CAAA;QACzB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC;gBACxC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,EAAE,EAAE,IAAI,CAAC,EAAE;gBACX,OAAO,EAAE,IAAI,CAAC,OAAO;aACtB,CAAC,CAAA;YACF,IAAI,IAAI,CAAC,IAAI;gBAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC5C,IAAI,IAAI,CAAC,OAAO;gBAAE,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;YACrD,OAAO,OAAO,CAAA;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IAED,OAAO,CAAC,IAAiB;QACvB,IAAI,CAAC,OAAO;YAAE,OAAM;QACpB,IAAI,CAAC;YACH,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAA;QACzC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,SAAS,CAAC,IAAiB;QACzB,IAAI,CAAC,OAAO;YAAE,OAAM;QACpB,IAAI,CAAC;YACH,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAA;QAC3C,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IACZ,CAAC;IAED,IAAI,MAAM;QACR,OAAO,OAAO,KAAK,IAAI,CAAA;IACzB,CAAC;CACF,CAAA"}
|