@interfere/next 12.0.3 → 12.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -5
- package/dist/internal/build/pipeline.mjs +1 -1
- package/dist/package.mjs +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -84,11 +84,12 @@ export default function RootLayout({
|
|
|
84
84
|
|
|
85
85
|
### Environment Variables
|
|
86
86
|
|
|
87
|
-
| Variable
|
|
88
|
-
|
|
|
89
|
-
| `INTERFERE_PUBLIC_KEY`
|
|
90
|
-
| `INTERFERE_API_KEY`
|
|
91
|
-
| `
|
|
87
|
+
| Variable | Required | Description |
|
|
88
|
+
| ---------------------------------------- | ------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
89
|
+
| `INTERFERE_PUBLIC_KEY` | Yes | Surface public key in the `interfere_public_us_*` or `interfere_public_eu_*` format. Public by design; used for ingestion. |
|
|
90
|
+
| `INTERFERE_API_KEY` | Yes for release metadata | Interfere secret key in the `interfere_secret_us_*` or `interfere_secret_eu_*` format. Server-side build credential; never expose in browser code. |
|
|
91
|
+
| `INTERFERE_SOURCEMAP_UPLOAD_CONCURRENCY` | No | Maximum concurrent source-map uploads. Defaults to 20; must be a positive integer. |
|
|
92
|
+
| `INTERFERE_API_URL` | No | Override the ingest endpoint in `direct` mode (e.g. a regional endpoint). Defaults to Interfere's endpoint. |
|
|
92
93
|
|
|
93
94
|
### Migrating From 0.x
|
|
94
95
|
|
|
@@ -142,6 +143,10 @@ Keep `"auto"` in `spanProcessors` for Vercel drain delivery. For direct Interfer
|
|
|
142
143
|
|
|
143
144
|
`@vercel/otel@2.1.3` supports OTel API `>=1.9.0 <2`, stable SDK peers `>=2 <3`, and experimental peers `>=0.200.0 <0.300.0`. The SDK declares all required peers as dependencies, including `sdk-metrics`. Custom compositions must use compatible versions too.
|
|
144
145
|
|
|
146
|
+
### Browser session correlation
|
|
147
|
+
|
|
148
|
+
The browser SDK sends `session.id` in W3C baggage on instrumented requests to the same origin and configured `tracing.apiHosts`, unless analytics consent is explicitly denied. Cross-origin APIs must allow `baggage` and `traceparent` in CORS. The server kit's existing baggage processor attaches the session ID to request and child spans; `traceparent` continues to determine trace linkage. No additional flag is required.
|
|
149
|
+
|
|
145
150
|
## Ingest Endpoint
|
|
146
151
|
|
|
147
152
|
By default the SDK posts telemetry to Interfere's endpoint. Ingest requests never carry cookies. Set `apiHost` to a subdomain of your own site that resolves to Interfere via a DNS record — this survives ad-blockers with no server-side component:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{readNextMajorVersion}from"../setup-warnings.mjs";import{detectActiveBundler}from"./detect-bundler.mjs";import{resolveReleaseRequest}from"./release/index.mjs";import{discoverSourceMaps}from"./source-maps/discover.mjs";import{assertClientChunksAreMapped}from"./source-maps/guard.mjs";import{EMPTY_TELEMETRY}from"./telemetry.mjs";import{classifyReleasePipelineError}from"@interfere/types/sdk/build-diagnostics";import{InterfereClient}from"@interfere/javascript";import{cleanupSourceMaps}from"@interfere/build/cleanup-source-maps";import{uploadSourceMapChunks}from"@interfere/build/upload-source-map-chunks";import{completeSourceMapsResponse}from"@interfere/types/data/source-maps";import{releaseBuildResultSchema}from"@interfere/types/releases/build-telemetry";import{createReleaseResponse}from"@interfere/types/releases/definition";import{extractRichness}from"@interfere/types/sdk/source-map-richness";async function runBuildPipeline(context,metadata){let client=new InterfereClient({baseUrl:metadata.apiUrl,apiKey:{token:metadata.apiKey},maxRetries:4,timeoutInSeconds:10}),start=performance.now(),timing={...EMPTY_TELEMETRY},{releaseSlug}=metadata,report=async result=>{timing.total=Math.round(performance.now()-start),await client.releases.reportTelemetry({...timing,result,releaseSlug},{abortSignal:AbortSignal.timeout(1e4)}).catch(()=>void 0)};try{let bundler=detectActiveBundler(process.env,process.argv,readNextMajorVersion(context.projectDir)),[discovered,config]=await Promise.all([discoverSourceMaps({bundler,distDir:context.distDir,projectDir:context.projectDir}),client.releases.getReleasesConfig({abortSignal:AbortSignal.timeout(6e4)})]),{files,sourceFileCount}=discovered;if(timing.discover=Math.round(performance.now()-start),timing.fileCount=files.length,files.length===0)return await report(`no_source_maps`),{accepted:!1,fileCount:0,reason:`no_source_maps`};await assertClientChunksAreMapped({discovered:files,distDir:context.distDir,projectDir:context.projectDir});let registering=performance.now(),release=createReleaseResponse.parse(await client.releases.createRelease(resolveReleaseRequest(metadata.buildId,metadata.environment,metadata.releaseSlug,config),{abortSignal:AbortSignal.timeout(6e4)})),registered=performance.now();releaseSlug=release.destination.slug,timing.createRelease=Math.round(registered-registering);let signFiles=files.map(file=>({path:file.path,sizeBytes:new TextEncoder().encode(file.content).byteLength,...extractRichness(file.content)})),environment=metadata.environment??void 0,signed=await client.releases.signSourceMapUploads({releaseSlug,environment,files:signFiles},{abortSignal:AbortSignal.timeout(6e4)});timing.totalBytes=await uploadSourceMapChunks({client,environment,releaseSlug,files,signed});let accepted=completeSourceMapsResponse.safeParse(await client.releases.finalizeSourceMaps({releaseSlug,environment,bundler,sourceFileCount,files:files.map(({path,hash,debugId,chunkUrl})=>({path,hash,debugId,chunkUrl}))},{abortSignal:AbortSignal.timeout(Math.max(0,signed.expiresAt*1e3-Date.now()))}));if(!accepted.success||!accepted.data.ok||accepted.data.fileCount!==files.length)throw Error(`Source-map server did not accept the complete batch`);let cleanupStart=performance.now();timing.upload=Math.round(cleanupStart-registered);let cleanupFailures=metadata.purgeSourceMaps?await cleanupSourceMaps(files):[];return timing.cleanup=Math.round(performance.now()-cleanupStart),await report(`ok`),{accepted:!0,buildId:release.build.hash,cleanupFailures,config,fileCount:files.length,release,timing}}catch(error){let parsed=releaseBuildResultSchema.safeParse(classifyReleasePipelineError(error).toLowerCase());throw await report(parsed.success?parsed.data:`pipeline_failed`),error}}export{runBuildPipeline};
|
|
1
|
+
import{readNextMajorVersion}from"../setup-warnings.mjs";import{detectActiveBundler}from"./detect-bundler.mjs";import{resolveReleaseRequest}from"./release/index.mjs";import{discoverSourceMaps}from"./source-maps/discover.mjs";import{assertClientChunksAreMapped}from"./source-maps/guard.mjs";import{EMPTY_TELEMETRY}from"./telemetry.mjs";import{classifyReleasePipelineError}from"@interfere/types/sdk/build-diagnostics";import{InterfereClient}from"@interfere/javascript";import{sourceMapUploadFetch}from"@interfere/build/source-map-upload-fetch";import{cleanupSourceMaps}from"@interfere/build/cleanup-source-maps";import{uploadSourceMapChunks}from"@interfere/build/upload-source-map-chunks";import{completeSourceMapsResponse}from"@interfere/types/data/source-maps";import{releaseBuildResultSchema}from"@interfere/types/releases/build-telemetry";import{createReleaseResponse}from"@interfere/types/releases/definition";import{extractRichness}from"@interfere/types/sdk/source-map-richness";async function runBuildPipeline(context,metadata){let client=new InterfereClient({fetch:sourceMapUploadFetch,baseUrl:metadata.apiUrl,apiKey:{token:metadata.apiKey},maxRetries:4,timeoutInSeconds:10}),start=performance.now(),timing={...EMPTY_TELEMETRY},{releaseSlug}=metadata,report=async result=>{timing.total=Math.round(performance.now()-start),await client.releases.reportTelemetry({...timing,result,releaseSlug},{abortSignal:AbortSignal.timeout(1e4)}).catch(()=>void 0)};try{let bundler=detectActiveBundler(process.env,process.argv,readNextMajorVersion(context.projectDir)),[discovered,config]=await Promise.all([discoverSourceMaps({bundler,distDir:context.distDir,projectDir:context.projectDir}),client.releases.getReleasesConfig({abortSignal:AbortSignal.timeout(6e4)})]),{files,sourceFileCount}=discovered;if(timing.discover=Math.round(performance.now()-start),timing.fileCount=files.length,files.length===0)return await report(`no_source_maps`),{accepted:!1,fileCount:0,reason:`no_source_maps`};await assertClientChunksAreMapped({discovered:files,distDir:context.distDir,projectDir:context.projectDir});let registering=performance.now(),release=createReleaseResponse.parse(await client.releases.createRelease(resolveReleaseRequest(metadata.buildId,metadata.environment,metadata.releaseSlug,config),{abortSignal:AbortSignal.timeout(6e4)})),registered=performance.now();releaseSlug=release.destination.slug,timing.createRelease=Math.round(registered-registering);let signFiles=files.map(file=>({path:file.path,sizeBytes:new TextEncoder().encode(file.content).byteLength,...extractRichness(file.content)})),environment=metadata.environment??void 0,signed=await client.releases.signSourceMapUploads({releaseSlug,environment,files:signFiles},{abortSignal:AbortSignal.timeout(6e4)});timing.totalBytes=await uploadSourceMapChunks({compression:`gzip`,client,environment,releaseSlug,files,signed});let accepted=completeSourceMapsResponse.safeParse(await client.releases.finalizeSourceMaps({releaseSlug,environment,bundler,sourceFileCount,files:files.map(({path,hash,debugId,chunkUrl})=>({path,hash,debugId,chunkUrl}))},{abortSignal:AbortSignal.timeout(Math.max(0,signed.expiresAt*1e3-Date.now()))}));if(!accepted.success||!accepted.data.ok||accepted.data.fileCount!==files.length)throw Error(`Source-map server did not accept the complete batch`);let cleanupStart=performance.now();timing.upload=Math.round(cleanupStart-registered);let cleanupFailures=metadata.purgeSourceMaps?await cleanupSourceMaps(files):[];return timing.cleanup=Math.round(performance.now()-cleanupStart),await report(`ok`),{accepted:!0,buildId:release.build.hash,cleanupFailures,config,fileCount:files.length,release,timing}}catch(error){let parsed=releaseBuildResultSchema.safeParse(classifyReleasePipelineError(error).toLowerCase());throw await report(parsed.success?parsed.data:`pipeline_failed`),error}}export{runBuildPipeline};
|
package/dist/package.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var name=`@interfere/next`,version=`12.0.
|
|
1
|
+
var name=`@interfere/next`,version=`12.0.5`;export{name,version};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@interfere/next",
|
|
3
|
-
"version": "12.0.
|
|
3
|
+
"version": "12.0.5",
|
|
4
4
|
"description": "Build software that never breaks.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"error-tracking",
|
|
@@ -96,12 +96,12 @@
|
|
|
96
96
|
"typecheck": "bun check"
|
|
97
97
|
},
|
|
98
98
|
"dependencies": {
|
|
99
|
-
"@interfere/build": "^0.
|
|
99
|
+
"@interfere/build": "^0.3.0",
|
|
100
100
|
"@interfere/constants": "^9.2.0",
|
|
101
101
|
"@interfere/helpers": "^9.2.0",
|
|
102
102
|
"@interfere/javascript": "^0.2.1",
|
|
103
|
-
"@interfere/react": "^12.0.
|
|
104
|
-
"@interfere/types": "^10.2.
|
|
103
|
+
"@interfere/react": "^12.0.5",
|
|
104
|
+
"@interfere/types": "^10.2.2",
|
|
105
105
|
"@opentelemetry/api": "^1.9.1",
|
|
106
106
|
"@opentelemetry/api-logs": "^0.222.0",
|
|
107
107
|
"@opentelemetry/baggage-span-processor": "^0.5.0",
|