@tangle-network/sdk-telemetry 0.6.2 → 0.6.4
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/server-timing.d.mts
CHANGED
|
@@ -48,6 +48,9 @@ declare function createUpstreamHttpPhaseProjection(): {
|
|
|
48
48
|
entries(): string[];
|
|
49
49
|
};
|
|
50
50
|
declare const HTTP_PHASE_COVERAGE_FIELDS: readonly ["stored", "emitted", "omitted", "invalid", "collisions", "headerDropped"];
|
|
51
|
+
declare const FAILURE_FACT_NAMES: readonly string[];
|
|
52
|
+
declare const FAILURE_FACT_CODES: readonly string[];
|
|
53
|
+
declare const FAILURE_FACT_KINDS: readonly string[];
|
|
51
54
|
//#endregion
|
|
52
|
-
export { CREATE_WALL_PHASES, type CreateWallMeasurement, type CreateWallPhase, type CreateWallPhases, HTTP_PHASE_COVERAGE_FIELDS, HTTP_REQUEST_PHASE_NAMES, type HttpRequestPhaseName, type LifecycleWallFlow, type LifecycleWallSample, PLATFORM_VERDICT_EVIDENCE_ORDERS, PLATFORM_VERDICT_REUSE_REASONS, PLATFORM_VERDICT_SCOPE_CLASSES, type PlatformVerdictDependencyMismatch, type PlatformVerdictReuseRejection, type ServerTimingEntry, createBookkeepingPostWall, createUpstreamHttpPhaseProjection, createWallTiming, parseServerTiming, parseServerTimingDurations, partitionLifecycleWalls, readCreateWallTiming };
|
|
55
|
+
export { CREATE_WALL_PHASES, type CreateWallMeasurement, type CreateWallPhase, type CreateWallPhases, FAILURE_FACT_CODES, FAILURE_FACT_KINDS, FAILURE_FACT_NAMES, HTTP_PHASE_COVERAGE_FIELDS, HTTP_REQUEST_PHASE_NAMES, type HttpRequestPhaseName, type LifecycleWallFlow, type LifecycleWallSample, PLATFORM_VERDICT_EVIDENCE_ORDERS, PLATFORM_VERDICT_REUSE_REASONS, PLATFORM_VERDICT_SCOPE_CLASSES, type PlatformVerdictDependencyMismatch, type PlatformVerdictReuseRejection, type ServerTimingEntry, createBookkeepingPostWall, createUpstreamHttpPhaseProjection, createWallTiming, parseServerTiming, parseServerTimingDurations, partitionLifecycleWalls, readCreateWallTiming };
|
|
53
56
|
//# sourceMappingURL=server-timing.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-timing.d.mts","names":["ServerTimingEntry","name","dur","desc","parseServerTiming","header","parseServerTimingDurations","Record","PLATFORM_VERDICT_REUSE_REASONS","PlatformVerdictReuseRejection","HTTP_REQUEST_PHASE_NAMES","HttpRequestPhaseName","httpRequestPhaseFromTimingName","PLATFORM_VERDICT_SCOPE_CLASSES","PLATFORM_VERDICT_EVIDENCE_ORDERS","PlatformVerdictDependencyMismatch","scopeClass","evidenceOrder","createUpstreamHttpPhaseProjection","absorb","entries","HTTP_PHASE_COVERAGE_FIELDS"],"sources":["../src/create-wall.ts","../src/server-timing-parser.d.mts"],"mappings":";;;;cACa,kBAAA;AAAA,KAiBD,eAAA,WAA0B,kBAAA;AAAA,KAC1B,gBAAA,GAAmB,MAAA,CAAO,eAAA;AAAA,UACrB,qBAAA;EACf,MAAA,EAAQ,gBAAA;EACR,OAAA;EANQ;EAQR,uBAAA;AAAA;;iBAWc,yBAAA,CAA0B,MAAA,EAAQ,gBAAA;;AAhBlD;;;;iBA8BgB,gBAAA,CAAiB,SAAA;cAUjB,eAAA,EAAe,EAAA;6BAWP,WAAA,WAEjB,qBAAA;AAAA;;iBA6BS,oBAAA,CACd,MAAA,EAAQ,QAAA,CAAS,MAAA,oBAChB,qBAAA;;;UCvGcA,iBAAAA;EACfC,IAAAA;EACAC,GAAAA;EACAC,IAAAA;AAAAA;AAAAA,iBAGcC,iBAAAA,CACdC,MAAAA,8BACCL,iBAAAA;AAAAA,iBAEaM,0BAAAA,CACdD,MAAAA,8BACCE,MAAAA;AAAAA,cAEUC,8BAAAA;AAAAA,KA4BDC,6BAAAA,WACFD,8BAAAA;AAAAA,cAEGE,wBAAAA;AAAAA,KAqCDC,oBAAAA,WAA+BD,wBAAAA;AAAAA,cAI9BG,8BAAAA;AAAAA,cAQAC,gCAAAA;AAAAA,KAMDC,iCAAAA;EACVC,UAAAA,UAAoBH,8BAAAA;EACpBI,aAAAA,UAAuBH,gCAAAA;AAAAA;AAAAA,iBAGTI,iCAAAA,CAAAA;EACdC,MAAAA,CAAOd,MAAAA;EACPe,OAAAA;AAAAA;AAAAA,cAGWC,0BAAAA"}
|
|
1
|
+
{"version":3,"file":"server-timing.d.mts","names":["ServerTimingEntry","name","dur","desc","parseServerTiming","header","parseServerTimingDurations","Record","PLATFORM_VERDICT_REUSE_REASONS","PlatformVerdictReuseRejection","HTTP_REQUEST_PHASE_NAMES","HttpRequestPhaseName","httpRequestPhaseFromTimingName","PLATFORM_VERDICT_SCOPE_CLASSES","PLATFORM_VERDICT_EVIDENCE_ORDERS","PlatformVerdictDependencyMismatch","scopeClass","evidenceOrder","createUpstreamHttpPhaseProjection","absorb","entries","HTTP_PHASE_COVERAGE_FIELDS","FAILURE_FACT_NAMES","FAILURE_FACT_CODES","FAILURE_FACT_KINDS"],"sources":["../src/create-wall.ts","../src/server-timing-parser.d.mts"],"mappings":";;;;cACa,kBAAA;AAAA,KAiBD,eAAA,WAA0B,kBAAA;AAAA,KAC1B,gBAAA,GAAmB,MAAA,CAAO,eAAA;AAAA,UACrB,qBAAA;EACf,MAAA,EAAQ,gBAAA;EACR,OAAA;EANQ;EAQR,uBAAA;AAAA;;iBAWc,yBAAA,CAA0B,MAAA,EAAQ,gBAAA;;AAhBlD;;;;iBA8BgB,gBAAA,CAAiB,SAAA;cAUjB,eAAA,EAAe,EAAA;6BAWP,WAAA,WAEjB,qBAAA;AAAA;;iBA6BS,oBAAA,CACd,MAAA,EAAQ,QAAA,CAAS,MAAA,oBAChB,qBAAA;;;UCvGcA,iBAAAA;EACfC,IAAAA;EACAC,GAAAA;EACAC,IAAAA;AAAAA;AAAAA,iBAGcC,iBAAAA,CACdC,MAAAA,8BACCL,iBAAAA;AAAAA,iBAEaM,0BAAAA,CACdD,MAAAA,8BACCE,MAAAA;AAAAA,cAEUC,8BAAAA;AAAAA,KA4BDC,6BAAAA,WACFD,8BAAAA;AAAAA,cAEGE,wBAAAA;AAAAA,KAqCDC,oBAAAA,WAA+BD,wBAAAA;AAAAA,cAI9BG,8BAAAA;AAAAA,cAQAC,gCAAAA;AAAAA,KAMDC,iCAAAA;EACVC,UAAAA,UAAoBH,8BAAAA;EACpBI,aAAAA,UAAuBH,gCAAAA;AAAAA;AAAAA,iBAGTI,iCAAAA,CAAAA;EACdC,MAAAA,CAAOd,MAAAA;EACPe,OAAAA;AAAAA;AAAAA,cAGWC,0BAAAA;AAAAA,cAQAC,kBAAAA;AAAAA,cACAC,kBAAAA;AAAAA,cACAC,kBAAAA"}
|
package/dist/server-timing.mjs
CHANGED
|
@@ -217,6 +217,38 @@ const PLATFORM_VERDICT_EVIDENCE_ORDERS = Object.freeze([
|
|
|
217
217
|
"feed_after_observation",
|
|
218
218
|
"unknown"
|
|
219
219
|
]);
|
|
220
|
+
/** Closed failure facts: thrown values can carry credentials or URLs, so only these names leave. */
|
|
221
|
+
const FAILURE_FACT_NAMES = Object.freeze([
|
|
222
|
+
"Error",
|
|
223
|
+
"TypeError",
|
|
224
|
+
"AbortError",
|
|
225
|
+
"TimeoutError",
|
|
226
|
+
"RangeError",
|
|
227
|
+
"Other"
|
|
228
|
+
]);
|
|
229
|
+
const FAILURE_FACT_CODES = Object.freeze([
|
|
230
|
+
"ECONNRESET",
|
|
231
|
+
"ECONNREFUSED",
|
|
232
|
+
"ECONNABORTED",
|
|
233
|
+
"ETIMEDOUT",
|
|
234
|
+
"EPIPE",
|
|
235
|
+
"ENOTFOUND",
|
|
236
|
+
"EAI_AGAIN",
|
|
237
|
+
"ENETUNREACH",
|
|
238
|
+
"EHOSTUNREACH",
|
|
239
|
+
"ENETDOWN",
|
|
240
|
+
"EADDRNOTAVAIL",
|
|
241
|
+
"UND_ERR_CONNECT_TIMEOUT",
|
|
242
|
+
"UND_ERR_HEADERS_TIMEOUT",
|
|
243
|
+
"UND_ERR_BODY_TIMEOUT",
|
|
244
|
+
"UND_ERR_SOCKET",
|
|
245
|
+
"UND_ERR_ABORTED"
|
|
246
|
+
]);
|
|
247
|
+
const FAILURE_FACT_KINDS = Object.freeze([
|
|
248
|
+
"request-context",
|
|
249
|
+
"connection-lost",
|
|
250
|
+
"fetch-failed"
|
|
251
|
+
]);
|
|
220
252
|
/** Bounded, closed-schema origin phase projection for the two Worker ledgers.
|
|
221
253
|
* Duplicate observations remain separate; different origins/attempts cannot be summed.
|
|
222
254
|
*/
|
|
@@ -282,6 +314,6 @@ function createUpstreamHttpPhaseProjection() {
|
|
|
282
314
|
};
|
|
283
315
|
}
|
|
284
316
|
//#endregion
|
|
285
|
-
export { CREATE_WALL_PHASES, HTTP_PHASE_COVERAGE_FIELDS, HTTP_REQUEST_PHASE_NAMES, PLATFORM_VERDICT_EVIDENCE_ORDERS, PLATFORM_VERDICT_REUSE_REASONS, PLATFORM_VERDICT_SCOPE_CLASSES, createBookkeepingPostWall, createUpstreamHttpPhaseProjection, createWallTiming, parseServerTiming, parseServerTimingDurations, partitionLifecycleWalls, readCreateWallTiming };
|
|
317
|
+
export { CREATE_WALL_PHASES, FAILURE_FACT_CODES, FAILURE_FACT_KINDS, FAILURE_FACT_NAMES, HTTP_PHASE_COVERAGE_FIELDS, HTTP_REQUEST_PHASE_NAMES, PLATFORM_VERDICT_EVIDENCE_ORDERS, PLATFORM_VERDICT_REUSE_REASONS, PLATFORM_VERDICT_SCOPE_CLASSES, createBookkeepingPostWall, createUpstreamHttpPhaseProjection, createWallTiming, parseServerTiming, parseServerTimingDurations, partitionLifecycleWalls, readCreateWallTiming };
|
|
286
318
|
|
|
287
319
|
//# sourceMappingURL=server-timing.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-timing.mjs","names":[],"sources":["../src/create-wall.ts","../src/server-timing-parser.mjs"],"sourcesContent":["/** Exclusive create-request wall phases; nested service spans are a separate view. */\nexport const CREATE_WALL_PHASES = [\n \"middleware\",\n \"identity\",\n \"preflight\",\n \"tenantCoordination\",\n \"configuration\",\n \"leaseSelection\",\n \"credentialJournal\",\n \"quotaReservation\",\n \"orchestrator\",\n \"provisionResponse\",\n \"responseBody\",\n \"credentialAllocation\",\n \"postCreate\",\n \"response\",\n] as const;\n\nexport type CreateWallPhase = (typeof CREATE_WALL_PHASES)[number];\nexport type CreateWallPhases = Record<CreateWallPhase, number>;\nexport interface CreateWallMeasurement {\n phases: CreateWallPhases;\n totalMs: number;\n /** Includes middleware/auth, preserving the original bookkeeping + post budget. */\n bookkeepingPostCreateMs: number;\n}\n\nconst REQUIRED_PHASES = CREATE_WALL_PHASES.filter(\n (phase) =>\n phase !== \"middleware\" &&\n phase !== \"leaseSelection\" &&\n phase !== \"tenantCoordination\",\n);\n\n/** The original other-Worker + post-create budget, including auth/middleware. */\nexport function createBookkeepingPostWall(phases: CreateWallPhases): number {\n return CREATE_WALL_PHASES.reduce(\n (sum, phase) =>\n sum +\n (phase === \"preflight\" || phase === \"orchestrator\" ? 0 : phases[phase]),\n 0,\n );\n}\n\n/**\n * One cursor owned by the sequential request path. Parallel operations keep\n * their own spans and never transition this cursor from their callbacks.\n * Invalid clocks or missing caller hooks withhold a complete measurement.\n */\nexport function createWallTiming(startedAt: number) {\n const phases = Object.fromEntries(\n CREATE_WALL_PHASES.map((phase) => [phase, 0]),\n ) as CreateWallPhases;\n const visited = new Set<CreateWallPhase>([\"identity\"]);\n let current: CreateWallPhase = \"identity\";\n let cursor = startedAt;\n let valid = Number.isFinite(startedAt);\n let finished = false;\n return {\n phase(name: CreateWallPhase, at: number): void {\n if (finished || !Number.isFinite(at) || at < cursor) {\n valid = false;\n return;\n }\n phases[current] += at - cursor;\n cursor = at;\n current = name;\n visited.add(name);\n },\n finish(\n receivedAt: number,\n respondedAt: number,\n ): CreateWallMeasurement | null {\n if (\n finished ||\n !valid ||\n !Number.isFinite(receivedAt) ||\n !Number.isFinite(respondedAt) ||\n receivedAt > startedAt ||\n respondedAt < cursor ||\n REQUIRED_PHASES.some((phase) => !visited.has(phase))\n ) {\n finished = true;\n return null;\n }\n finished = true;\n phases[current] += respondedAt - cursor;\n phases.middleware = startedAt - receivedAt;\n const totalMs = respondedAt - receivedAt;\n if (Object.values(phases).reduce((sum, ms) => sum + ms, 0) !== totalMs)\n return null;\n return {\n phases: { ...phases },\n totalMs,\n bookkeepingPostCreateMs: createBookkeepingPostWall(phases),\n };\n },\n };\n}\n\n/** Read the already-parsed header. Historical/incomplete/overlapping rows stay unknown. */\nexport function readCreateWallTiming(\n stages: Readonly<Record<string, number>>,\n): CreateWallMeasurement | null {\n const totalMs = stages[\"createWall.total\"];\n if (!Number.isFinite(totalMs) || totalMs < 0 || totalMs !== stages.outerWall)\n return null;\n const phases = {} as CreateWallPhases;\n for (const phase of CREATE_WALL_PHASES) {\n const value = stages[`createWall.${phase}`];\n if (!Number.isFinite(value) || value < 0) return null;\n phases[phase] = value;\n }\n if (Object.values(phases).reduce((sum, ms) => sum + ms, 0) !== totalMs)\n return null;\n return {\n phases,\n totalMs,\n bookkeepingPostCreateMs: createBookkeepingPostWall(phases),\n };\n}\n","// HTTP quoted strings can contain both separators and escaped quotes.\nfunction splitHeader(value, separator) {\n const parts = [];\n let start = 0;\n let quoted = false;\n for (let i = 0; i < value.length; i++) {\n if (quoted && value[i] === \"\\\\\") i++;\n else if (value[i] === '\"') quoted = !quoted;\n else if (!quoted && value[i] === separator) {\n parts.push(value.slice(start, i));\n start = i + 1;\n }\n }\n parts.push(value.slice(start));\n return parts;\n}\n\n/** Missing or malformed durations remain unmeasured, never zero. */\nexport function parseServerTiming(header) {\n if (!header) return [];\n const entries = [];\n for (const metric of splitHeader(header, \",\")) {\n const [rawName, ...params] = splitHeader(metric, \";\");\n const name = rawName.trim();\n if (!/^[!#$%&'*+.^_`|~\\w-]+$/.test(name)) continue;\n const entry = { name };\n const seen = new Set();\n for (const param of params) {\n const eq = param.indexOf(\"=\");\n const key = (eq < 0 ? param : param.slice(0, eq)).trim().toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n if (eq < 0) continue;\n let value = param.slice(eq + 1).trim();\n if (value.startsWith('\"')) {\n if (!/^\"(?:[^\"\\\\]|\\\\[\\s\\S])*\"$/.test(value)) continue;\n value = value.slice(1, -1).replace(/\\\\([\\s\\S])/g, \"$1\");\n }\n if (key === \"desc\") entry.desc = value;\n else if (\n key === \"dur\" &&\n /^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?$/i.test(value)\n ) {\n const duration = Number(value);\n if (Number.isFinite(duration)) entry.dur = duration;\n }\n }\n entries.push(entry);\n }\n return entries;\n}\n\n/** A stage ledger retains only duration-bearing entries; later metrics win. */\nexport function parseServerTimingDurations(header) {\n return Object.fromEntries(\n parseServerTiming(header)\n .filter((entry) => entry.dur !== undefined)\n .map(({ name, dur }) => [name, dur]),\n );\n}\n\n/** Closed wire observations; these names carry no credential or authority values. */\nexport const PLATFORM_VERDICT_REUSE_REASONS = Object.freeze([\n \"entry_changed\",\n \"refusal_observed\",\n \"current_compliance\",\n \"negative_age\",\n \"retention_elapsed\",\n \"key_expired\",\n \"feed_missing\",\n \"feed_stale\",\n \"feed_generation\",\n \"dependencies_empty\",\n \"dependency_revision\",\n \"dependency_floor\",\n \"grant_missing\",\n \"grant_unreadable\",\n \"grant_shape\",\n \"grant_negative_age\",\n \"grant_retention_elapsed\",\n \"shared_refusal_observed\",\n \"shared_refusal_unreadable\",\n \"shared_read_unavailable\",\n \"grant_invalid\",\n \"grant_validation\",\n \"verification_inflight\",\n \"feed_contradiction\",\n \"current_required\",\n \"lkg_retention_elapsed\",\n]);\n\n/** Closed request-phase wire vocabulary, shared by producer and safe consumers. */\nexport const HTTP_REQUEST_PHASE_NAMES = Object.freeze([\n \"external.provision\",\n \"benchmarks.records.load\",\n \"benchmarks.records.build\",\n \"benchmarks.records.page\",\n \"benchmarks.records.json\",\n \"admission.host.list\",\n \"host.records.ready\",\n \"host.records.scan\",\n \"host.records.read\",\n \"host.records.metadata\",\n \"host.records.project\",\n \"host.records.retry\",\n \"admission.metadata\",\n \"admission.json\",\n \"observability.refresh.wait\",\n \"fleet.sidecars\",\n \"native-export.snapshot.wait\",\n \"native-export.prepare.wait\",\n \"native-export.collect.wait\",\n \"scorecard.fleet.wait\",\n \"scorecard.capacity.wait\",\n \"scorecard.coverage.wait\",\n \"scorecard.compose\",\n \"scorecard.json\",\n \"proxy.model_refresh\",\n \"proxy.hub.lock_wait\",\n \"proxy.hub.refresh\",\n \"proxy.hub.state\",\n \"proxy.hub.proof\",\n \"proxy.hub.delivery\",\n \"proxy.runtime_token\",\n \"snapshot.delete.lock\",\n \"snapshot.delete.credentials\",\n \"snapshot.delete.list\",\n \"snapshot.delete.generation\",\n]);\n\nexport function httpRequestPhaseFromTimingName(name) {\n const prefix = name.startsWith(\"orch.phase.\") ? \"orch.phase.\" : \"phase.\";\n if (!name.startsWith(prefix)) return undefined;\n const phase = name.slice(prefix.length);\n return HTTP_REQUEST_PHASE_NAMES.includes(phase) ? phase : undefined;\n}\n\nexport const PLATFORM_VERDICT_SCOPE_CLASSES = Object.freeze([\n \"key\",\n \"identity\",\n \"owner_user\",\n \"owner_team\",\n \"lineage\",\n \"other\",\n]);\nexport const PLATFORM_VERDICT_EVIDENCE_ORDERS = Object.freeze([\n \"feed_before_observation\",\n \"feed_at_observation\",\n \"feed_after_observation\",\n \"unknown\",\n]);\n\n/** Bounded, closed-schema origin phase projection for the two Worker ledgers.\n * Duplicate observations remain separate; different origins/attempts cannot be summed.\n */\nexport const HTTP_PHASE_COVERAGE_FIELDS = Object.freeze([\n \"stored\",\n \"emitted\",\n \"omitted\",\n \"invalid\",\n \"collisions\",\n \"headerDropped\",\n]);\n\nexport function createUpstreamHttpPhaseProjection() {\n const entries = [];\n let bytes = 0;\n let dropped = 0;\n let rejectedInputs = 0;\n const fields = HTTP_PHASE_COVERAGE_FIELDS;\n const byteLength = (value) => new TextEncoder().encode(value).length;\n const keep = (entry) => {\n // Reserve a bounded forwarding-coverage entry inside this component's 4 KiB.\n const size = byteLength(entry) + 2;\n if (entries.length >= 31 || bytes + size > 3900) {\n dropped++;\n return;\n }\n entries.push(entry);\n bytes += size;\n };\n return {\n absorb(header) {\n if (header == null) return;\n if (\n typeof header !== \"string\" ||\n header.length > 4096 ||\n byteLength(header) > 4096\n ) {\n rejectedInputs++;\n return;\n }\n for (const entry of parseServerTiming(header)) {\n // Only direct origin names enter this fold; never prefix orch. twice.\n if (entry.name === \"phase.coverage\") {\n const counts = {};\n const parts = (entry.desc ?? \"\").split(\",\");\n if (parts.length !== fields.length) {\n dropped++;\n continue;\n }\n for (const part of parts) {\n const [key, value, ...extra] = part.split(\"=\");\n if (\n extra.length ||\n !fields.includes(key) ||\n Object.hasOwn(counts, key) ||\n !/^(?:0|[1-9]\\d*)$/.test(value ?? \"\") ||\n !Number.isSafeInteger(Number(value))\n )\n break;\n counts[key] = Number(value);\n }\n if (Object.keys(counts).length !== fields.length) {\n dropped++;\n continue;\n }\n keep(\n `orch.phase.coverage;desc=\"${fields.map((key) => `${key}=${counts[key]}`).join(\",\")}\"`,\n );\n } else if (entry.name.startsWith(\"phase.\")) {\n if (\n !httpRequestPhaseFromTimingName(entry.name) ||\n !Number.isFinite(entry.dur) ||\n entry.dur < 0 ||\n !/^outcome=(?:completed|error)$/.test(entry.desc ?? \"\")\n ) {\n dropped++;\n continue;\n }\n keep(\n `orch.${entry.name};dur=${Math.round(entry.dur)};desc=\"${entry.desc}\"`,\n );\n }\n }\n },\n entries() {\n return [\n ...entries,\n ...(dropped || rejectedInputs\n ? [\n `orch.phase.forwarding;desc=\"dropped=${dropped},rejectedInputs=${rejectedInputs}\"`,\n ]\n : []),\n ];\n },\n };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server-timing.mjs","names":[],"sources":["../src/create-wall.ts","../src/server-timing-parser.mjs"],"sourcesContent":["/** Exclusive create-request wall phases; nested service spans are a separate view. */\nexport const CREATE_WALL_PHASES = [\n \"middleware\",\n \"identity\",\n \"preflight\",\n \"tenantCoordination\",\n \"configuration\",\n \"leaseSelection\",\n \"credentialJournal\",\n \"quotaReservation\",\n \"orchestrator\",\n \"provisionResponse\",\n \"responseBody\",\n \"credentialAllocation\",\n \"postCreate\",\n \"response\",\n] as const;\n\nexport type CreateWallPhase = (typeof CREATE_WALL_PHASES)[number];\nexport type CreateWallPhases = Record<CreateWallPhase, number>;\nexport interface CreateWallMeasurement {\n phases: CreateWallPhases;\n totalMs: number;\n /** Includes middleware/auth, preserving the original bookkeeping + post budget. */\n bookkeepingPostCreateMs: number;\n}\n\nconst REQUIRED_PHASES = CREATE_WALL_PHASES.filter(\n (phase) =>\n phase !== \"middleware\" &&\n phase !== \"leaseSelection\" &&\n phase !== \"tenantCoordination\",\n);\n\n/** The original other-Worker + post-create budget, including auth/middleware. */\nexport function createBookkeepingPostWall(phases: CreateWallPhases): number {\n return CREATE_WALL_PHASES.reduce(\n (sum, phase) =>\n sum +\n (phase === \"preflight\" || phase === \"orchestrator\" ? 0 : phases[phase]),\n 0,\n );\n}\n\n/**\n * One cursor owned by the sequential request path. Parallel operations keep\n * their own spans and never transition this cursor from their callbacks.\n * Invalid clocks or missing caller hooks withhold a complete measurement.\n */\nexport function createWallTiming(startedAt: number) {\n const phases = Object.fromEntries(\n CREATE_WALL_PHASES.map((phase) => [phase, 0]),\n ) as CreateWallPhases;\n const visited = new Set<CreateWallPhase>([\"identity\"]);\n let current: CreateWallPhase = \"identity\";\n let cursor = startedAt;\n let valid = Number.isFinite(startedAt);\n let finished = false;\n return {\n phase(name: CreateWallPhase, at: number): void {\n if (finished || !Number.isFinite(at) || at < cursor) {\n valid = false;\n return;\n }\n phases[current] += at - cursor;\n cursor = at;\n current = name;\n visited.add(name);\n },\n finish(\n receivedAt: number,\n respondedAt: number,\n ): CreateWallMeasurement | null {\n if (\n finished ||\n !valid ||\n !Number.isFinite(receivedAt) ||\n !Number.isFinite(respondedAt) ||\n receivedAt > startedAt ||\n respondedAt < cursor ||\n REQUIRED_PHASES.some((phase) => !visited.has(phase))\n ) {\n finished = true;\n return null;\n }\n finished = true;\n phases[current] += respondedAt - cursor;\n phases.middleware = startedAt - receivedAt;\n const totalMs = respondedAt - receivedAt;\n if (Object.values(phases).reduce((sum, ms) => sum + ms, 0) !== totalMs)\n return null;\n return {\n phases: { ...phases },\n totalMs,\n bookkeepingPostCreateMs: createBookkeepingPostWall(phases),\n };\n },\n };\n}\n\n/** Read the already-parsed header. Historical/incomplete/overlapping rows stay unknown. */\nexport function readCreateWallTiming(\n stages: Readonly<Record<string, number>>,\n): CreateWallMeasurement | null {\n const totalMs = stages[\"createWall.total\"];\n if (!Number.isFinite(totalMs) || totalMs < 0 || totalMs !== stages.outerWall)\n return null;\n const phases = {} as CreateWallPhases;\n for (const phase of CREATE_WALL_PHASES) {\n const value = stages[`createWall.${phase}`];\n if (!Number.isFinite(value) || value < 0) return null;\n phases[phase] = value;\n }\n if (Object.values(phases).reduce((sum, ms) => sum + ms, 0) !== totalMs)\n return null;\n return {\n phases,\n totalMs,\n bookkeepingPostCreateMs: createBookkeepingPostWall(phases),\n };\n}\n","// HTTP quoted strings can contain both separators and escaped quotes.\nfunction splitHeader(value, separator) {\n const parts = [];\n let start = 0;\n let quoted = false;\n for (let i = 0; i < value.length; i++) {\n if (quoted && value[i] === \"\\\\\") i++;\n else if (value[i] === '\"') quoted = !quoted;\n else if (!quoted && value[i] === separator) {\n parts.push(value.slice(start, i));\n start = i + 1;\n }\n }\n parts.push(value.slice(start));\n return parts;\n}\n\n/** Missing or malformed durations remain unmeasured, never zero. */\nexport function parseServerTiming(header) {\n if (!header) return [];\n const entries = [];\n for (const metric of splitHeader(header, \",\")) {\n const [rawName, ...params] = splitHeader(metric, \";\");\n const name = rawName.trim();\n if (!/^[!#$%&'*+.^_`|~\\w-]+$/.test(name)) continue;\n const entry = { name };\n const seen = new Set();\n for (const param of params) {\n const eq = param.indexOf(\"=\");\n const key = (eq < 0 ? param : param.slice(0, eq)).trim().toLowerCase();\n if (seen.has(key)) continue;\n seen.add(key);\n if (eq < 0) continue;\n let value = param.slice(eq + 1).trim();\n if (value.startsWith('\"')) {\n if (!/^\"(?:[^\"\\\\]|\\\\[\\s\\S])*\"$/.test(value)) continue;\n value = value.slice(1, -1).replace(/\\\\([\\s\\S])/g, \"$1\");\n }\n if (key === \"desc\") entry.desc = value;\n else if (\n key === \"dur\" &&\n /^[+-]?(?:\\d+\\.?\\d*|\\.\\d+)(?:e[+-]?\\d+)?$/i.test(value)\n ) {\n const duration = Number(value);\n if (Number.isFinite(duration)) entry.dur = duration;\n }\n }\n entries.push(entry);\n }\n return entries;\n}\n\n/** A stage ledger retains only duration-bearing entries; later metrics win. */\nexport function parseServerTimingDurations(header) {\n return Object.fromEntries(\n parseServerTiming(header)\n .filter((entry) => entry.dur !== undefined)\n .map(({ name, dur }) => [name, dur]),\n );\n}\n\n/** Closed wire observations; these names carry no credential or authority values. */\nexport const PLATFORM_VERDICT_REUSE_REASONS = Object.freeze([\n \"entry_changed\",\n \"refusal_observed\",\n \"current_compliance\",\n \"negative_age\",\n \"retention_elapsed\",\n \"key_expired\",\n \"feed_missing\",\n \"feed_stale\",\n \"feed_generation\",\n \"dependencies_empty\",\n \"dependency_revision\",\n \"dependency_floor\",\n \"grant_missing\",\n \"grant_unreadable\",\n \"grant_shape\",\n \"grant_negative_age\",\n \"grant_retention_elapsed\",\n \"shared_refusal_observed\",\n \"shared_refusal_unreadable\",\n \"shared_read_unavailable\",\n \"grant_invalid\",\n \"grant_validation\",\n \"verification_inflight\",\n \"feed_contradiction\",\n \"current_required\",\n \"lkg_retention_elapsed\",\n]);\n\n/** Closed request-phase wire vocabulary, shared by producer and safe consumers. */\nexport const HTTP_REQUEST_PHASE_NAMES = Object.freeze([\n \"external.provision\",\n \"benchmarks.records.load\",\n \"benchmarks.records.build\",\n \"benchmarks.records.page\",\n \"benchmarks.records.json\",\n \"admission.host.list\",\n \"host.records.ready\",\n \"host.records.scan\",\n \"host.records.read\",\n \"host.records.metadata\",\n \"host.records.project\",\n \"host.records.retry\",\n \"admission.metadata\",\n \"admission.json\",\n \"observability.refresh.wait\",\n \"fleet.sidecars\",\n \"native-export.snapshot.wait\",\n \"native-export.prepare.wait\",\n \"native-export.collect.wait\",\n \"scorecard.fleet.wait\",\n \"scorecard.capacity.wait\",\n \"scorecard.coverage.wait\",\n \"scorecard.compose\",\n \"scorecard.json\",\n \"proxy.model_refresh\",\n \"proxy.hub.lock_wait\",\n \"proxy.hub.refresh\",\n \"proxy.hub.state\",\n \"proxy.hub.proof\",\n \"proxy.hub.delivery\",\n \"proxy.runtime_token\",\n \"snapshot.delete.lock\",\n \"snapshot.delete.credentials\",\n \"snapshot.delete.list\",\n \"snapshot.delete.generation\",\n]);\n\nexport function httpRequestPhaseFromTimingName(name) {\n const prefix = name.startsWith(\"orch.phase.\") ? \"orch.phase.\" : \"phase.\";\n if (!name.startsWith(prefix)) return undefined;\n const phase = name.slice(prefix.length);\n return HTTP_REQUEST_PHASE_NAMES.includes(phase) ? phase : undefined;\n}\n\nexport const PLATFORM_VERDICT_SCOPE_CLASSES = Object.freeze([\n \"key\",\n \"identity\",\n \"owner_user\",\n \"owner_team\",\n \"lineage\",\n \"other\",\n]);\nexport const PLATFORM_VERDICT_EVIDENCE_ORDERS = Object.freeze([\n \"feed_before_observation\",\n \"feed_at_observation\",\n \"feed_after_observation\",\n \"unknown\",\n]);\n\n/** Closed failure facts: thrown values can carry credentials or URLs, so only these names leave. */\nexport const FAILURE_FACT_NAMES = Object.freeze([\n \"Error\",\n \"TypeError\",\n \"AbortError\",\n \"TimeoutError\",\n \"RangeError\",\n \"Other\",\n]);\nexport const FAILURE_FACT_CODES = Object.freeze([\n \"ECONNRESET\",\n \"ECONNREFUSED\",\n \"ECONNABORTED\",\n \"ETIMEDOUT\",\n \"EPIPE\",\n \"ENOTFOUND\",\n \"EAI_AGAIN\",\n \"ENETUNREACH\",\n \"EHOSTUNREACH\",\n \"ENETDOWN\",\n \"EADDRNOTAVAIL\",\n \"UND_ERR_CONNECT_TIMEOUT\",\n \"UND_ERR_HEADERS_TIMEOUT\",\n \"UND_ERR_BODY_TIMEOUT\",\n \"UND_ERR_SOCKET\",\n \"UND_ERR_ABORTED\",\n]);\nexport const FAILURE_FACT_KINDS = Object.freeze([\n \"request-context\",\n \"connection-lost\",\n \"fetch-failed\",\n]);\n\n/** Bounded, closed-schema origin phase projection for the two Worker ledgers.\n * Duplicate observations remain separate; different origins/attempts cannot be summed.\n */\nexport const HTTP_PHASE_COVERAGE_FIELDS = Object.freeze([\n \"stored\",\n \"emitted\",\n \"omitted\",\n \"invalid\",\n \"collisions\",\n \"headerDropped\",\n]);\n\nexport function createUpstreamHttpPhaseProjection() {\n const entries = [];\n let bytes = 0;\n let dropped = 0;\n let rejectedInputs = 0;\n const fields = HTTP_PHASE_COVERAGE_FIELDS;\n const byteLength = (value) => new TextEncoder().encode(value).length;\n const keep = (entry) => {\n // Reserve a bounded forwarding-coverage entry inside this component's 4 KiB.\n const size = byteLength(entry) + 2;\n if (entries.length >= 31 || bytes + size > 3900) {\n dropped++;\n return;\n }\n entries.push(entry);\n bytes += size;\n };\n return {\n absorb(header) {\n if (header == null) return;\n if (\n typeof header !== \"string\" ||\n header.length > 4096 ||\n byteLength(header) > 4096\n ) {\n rejectedInputs++;\n return;\n }\n for (const entry of parseServerTiming(header)) {\n // Only direct origin names enter this fold; never prefix orch. twice.\n if (entry.name === \"phase.coverage\") {\n const counts = {};\n const parts = (entry.desc ?? \"\").split(\",\");\n if (parts.length !== fields.length) {\n dropped++;\n continue;\n }\n for (const part of parts) {\n const [key, value, ...extra] = part.split(\"=\");\n if (\n extra.length ||\n !fields.includes(key) ||\n Object.hasOwn(counts, key) ||\n !/^(?:0|[1-9]\\d*)$/.test(value ?? \"\") ||\n !Number.isSafeInteger(Number(value))\n )\n break;\n counts[key] = Number(value);\n }\n if (Object.keys(counts).length !== fields.length) {\n dropped++;\n continue;\n }\n keep(\n `orch.phase.coverage;desc=\"${fields.map((key) => `${key}=${counts[key]}`).join(\",\")}\"`,\n );\n } else if (entry.name.startsWith(\"phase.\")) {\n if (\n !httpRequestPhaseFromTimingName(entry.name) ||\n !Number.isFinite(entry.dur) ||\n entry.dur < 0 ||\n !/^outcome=(?:completed|error)$/.test(entry.desc ?? \"\")\n ) {\n dropped++;\n continue;\n }\n keep(\n `orch.${entry.name};dur=${Math.round(entry.dur)};desc=\"${entry.desc}\"`,\n );\n }\n }\n },\n entries() {\n return [\n ...entries,\n ...(dropped || rejectedInputs\n ? [\n `orch.phase.forwarding;desc=\"dropped=${dropped},rejectedInputs=${rejectedInputs}\"`,\n ]\n : []),\n ];\n },\n };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tangle-network/sdk-telemetry",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.4",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -74,8 +74,8 @@
|
|
|
74
74
|
}
|
|
75
75
|
},
|
|
76
76
|
"tangleRelease": {
|
|
77
|
-
"sourceSha": "
|
|
78
|
-
"mergedAt": "2026-10-
|
|
77
|
+
"sourceSha": "ed199c82026205deaeab484d4051ae966db746b0",
|
|
78
|
+
"mergedAt": "2026-10-26T17:27:45-06:00"
|
|
79
79
|
},
|
|
80
80
|
"scripts": {
|
|
81
81
|
"build": "tsdown",
|