@faststore/api 4.5.1-dev.4 → 4.6.0-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  export declare const ResolverTrace: <TContext extends {
2
- OTEL: Record<string, any>;
2
+ OTEL_ENABLED: boolean;
3
3
  account: string;
4
4
  discoveryConfig: Record<string, any>;
5
5
  }, TSource = any, TVars = any, TReturn = any>(fn: (source: TSource, vars: TVars, context: TContext, info: any) => TReturn, resolverName?: string) => (source: TSource, vars: TVars, graphqlContext: TContext, info: any) => TReturn;
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../../src/observability/telemetry.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa,GACxB,QAAQ,SAAS;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CACrC,EACD,OAAO,GAAG,GAAG,EACb,KAAK,GAAG,GAAG,EACX,OAAO,GAAG,GAAG,EAEb,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,KAAK,OAAO,EAC3E,eAAe,MAAM,MAGnB,QAAQ,OAAO,EACf,MAAM,KAAK,EACX,gBAAgB,QAAQ,EACxB,MAAM,GAAG,KACR,OA4CJ,CAAA"}
1
+ {"version":3,"file":"telemetry.d.ts","sourceRoot":"","sources":["../../../src/observability/telemetry.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,aAAa,GACxB,QAAQ,SAAS;IACf,YAAY,EAAE,OAAO,CAAA;IACrB,OAAO,EAAE,MAAM,CAAA;IACf,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAA;CACrC,EACD,OAAO,GAAG,GAAG,EACb,KAAK,GAAG,GAAG,EACX,OAAO,GAAG,GAAG,EAEb,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,KAAK,OAAO,EAC3E,qBAAyC,MAGvC,QAAQ,OAAO,EACf,MAAM,KAAK,EACX,gBAAgB,QAAQ,EACxB,MAAM,GAAG,KACR,OA2CJ,CAAA"}
@@ -30,7 +30,7 @@ export interface GraphqlContext {
30
30
  };
31
31
  headers: Record<string, string>;
32
32
  account: string;
33
- OTEL: Record<string, unknown>;
33
+ OTEL_ENABLED: boolean;
34
34
  /** Discovery config passed from @faststore/core, including localization settings. */
35
35
  discoveryConfig?: Record<string, unknown>;
36
36
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/platforms/vtex/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,aAAa,EAAY,MAAM,SAAS,CAAA;AAKtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAIxC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAG9C,MAAM,WAAW,cAAc;IAC7B,uBAAuB;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB;;;;;SAKK;IACL,OAAO,EAAE;QACP,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC1B,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,YAAY,CAAA;QACnB,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QACrC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;QAC5C;;;;;WAKG;QACH,wBAAwB,CAAC,EAAE,GAAG,CAC5B,MAAM,EACN,OAAO,CAAC,OAAO,mBAAmB,EAAE,qBAAqB,GAAG,IAAI,CAAC,CAClE,CAAA;KACF,CAAA;IACD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC7B,qFAAqF;IACrF,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC1C;AAED,eAAO,MAAM,yBAAyB,GAAU,SAAS,OAAO,mBAIpD,GAAG,KAAG,cAAc,CAmB/B,CAAA;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,QAAQ,CAC/D,cAAc,EACd,CAAC,EACD,CAAC,EACD,CAAC,CACF,CAAA;AAED,wBAAgB,YAAY;;;;;;gJAkC2H,6CAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAA+if,CAAC;mBAAsB,CAAC;kBAAqB,CAAC;yBAA8B,CAAC;uBAA0B,CAAC;yBAA4B,CAAC;uBAA0B,CAAC;iBAAoB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAAwzZ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAlBls5B;AAED,wBAAgB,iBAAiB,CAAC,WAAW,CAAC,EAAE,aAAa,iBAe5D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/platforms/vtex/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,aAAa,EAAY,MAAM,SAAS,CAAA;AAKtD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAExC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAClD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAIxC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AAG9C,MAAM,WAAW,cAAc;IAC7B,uBAAuB;IACvB,EAAE,EAAE,MAAM,CAAA;IACV,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,OAAO,CAAA;IAChB;;;;;SAKK;IACL,OAAO,EAAE;QACP,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;QAC1B,MAAM,EAAE,MAAM,CAAA;QACd,KAAK,EAAE,YAAY,CAAA;QACnB,UAAU,CAAC,EAAE,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QACrC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;QAC5C;;;;;WAKG;QACH,wBAAwB,CAAC,EAAE,GAAG,CAC5B,MAAM,EACN,OAAO,CAAC,OAAO,mBAAmB,EAAE,qBAAqB,GAAG,IAAI,CAAC,CAClE,CAAA;KACF,CAAA;IACD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC/B,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,OAAO,CAAA;IACrB,qFAAqF;IACrF,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC1C;AAED,eAAO,MAAM,yBAAyB,GAAU,SAAS,OAAO,mBACjD,GAAG,KAAG,cAAc,CAkBlC,CAAA;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,GAAG,GAAG,IAAI,QAAQ,CAC/D,cAAc,EACd,CAAC,EACD,CAAC,EACD,CAAC,CACF,CAAA;AAED,wBAAgB,YAAY;;;;;;gJAkCuV,6CAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAA+if,CAAC;mBAAsB,CAAC;kBAAqB,CAAC;yBAA8B,CAAC;uBAA0B,CAAC;yBAA4B,CAAC;uBAA0B,CAAC;iBAAoB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAAwzZ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAlB955B;AAED,wBAAgB,iBAAiB,CAAC,WAAW,CAAC,EAAE,aAAa,iBAe5D"}
@@ -14,12 +14,9 @@ interface Options {
14
14
  incrementAddress: boolean;
15
15
  flags?: FeatureFlags;
16
16
  version?: string;
17
- OTEL?: {
18
- enabled: boolean;
19
- traceparent?: string;
20
- tracestate?: string;
21
- };
22
17
  discoveryConfig?: Record<string, unknown>;
18
+ /** Emit OpenTelemetry spans from resolvers. Defaults to disabled. */
19
+ OTEL_ENABLED?: boolean;
23
20
  }
24
21
  interface FeatureFlags {
25
22
  enableOrderFormSync?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"globals.d.ts","sourceRoot":"","sources":["../../../src/typings/globals.ts"],"names":[],"mappings":"AAAA,KAAK,QAAQ,GAAG,MAAM,CAAA;AAEtB,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAExD,KAAK,gBAAgB,CAAC,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAE3D,UAAU,OAAO;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,oBAAoB,GAAG,kBAAkB,CAAA;IAEtD,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,oBAAoB,EAAE,OAAO,CAAA;IAC7B,kBAAkB,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAA;IAClD,aAAa,EAAE,OAAO,CAAA;IACtB,gBAAgB,EAAE,OAAO,CAAA;IACzB,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,IAAI,CAAC,EAAE;QACL,OAAO,EAAE,OAAO,CAAA;QAChB,WAAW,CAAC,EAAE,MAAM,CAAA;QACpB,UAAU,CAAC,EAAE,MAAM,CAAA;KACpB,CAAA;IACD,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC1C;AAED,UAAU,YAAY;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,4BAA4B,CAAC,EAAE,OAAO,CAAA;CACvC;AAED,KAAK,QAAQ,CACX,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACpC,OAAO,GAAG,GAAG,EACb,KAAK,GAAG,GAAG,EACX,OAAO,GAAG,GAAG,IACX,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,KAAK,OAAO,CAAA"}
1
+ {"version":3,"file":"globals.d.ts","sourceRoot":"","sources":["../../../src/typings/globals.ts"],"names":[],"mappings":"AAAA,KAAK,QAAQ,GAAG,MAAM,CAAA;AAEtB,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAExD,KAAK,gBAAgB,CAAC,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AAE3D,UAAU,OAAO;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,EAAE,oBAAoB,GAAG,kBAAkB,CAAA;IAEtD,eAAe,EAAE,MAAM,EAAE,CAAA;IACzB,OAAO,EAAE,MAAM,CAAA;IACf,MAAM,EAAE,MAAM,CAAA;IACd,oBAAoB,EAAE,OAAO,CAAA;IAC7B,kBAAkB,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAA;IAClD,aAAa,EAAE,OAAO,CAAA;IACtB,gBAAgB,EAAE,OAAO,CAAA;IACzB,KAAK,CAAC,EAAE,YAAY,CAAA;IACpB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IACzC,qEAAqE;IACrE,YAAY,CAAC,EAAE,OAAO,CAAA;CACvB;AAED,UAAU,YAAY;IACpB,mBAAmB,CAAC,EAAE,OAAO,CAAA;IAC7B,4BAA4B,CAAC,EAAE,OAAO,CAAA;CACvC;AAED,KAAK,QAAQ,CACX,QAAQ,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACpC,OAAO,GAAG,GAAG,EACb,KAAK,GAAG,GAAG,EACX,OAAO,GAAG,GAAG,IACX,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,KAAK,OAAO,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@faststore/api",
3
- "version": "4.5.1-dev.4",
3
+ "version": "4.6.0-dev.0",
4
4
  "license": "MIT",
5
5
  "main": "dist/cjs/index.js",
6
6
  "typings": "dist/src/index.d.ts",
@@ -49,7 +49,7 @@
49
49
  "@types/cookie": "^0.6.0",
50
50
  "@types/express": "^4.17.16",
51
51
  "@types/sanitize-html": "^2.9.1",
52
- "@vitest/coverage-v8": "4.0.7",
52
+ "@vitest/coverage-v8": "4.0.18",
53
53
  "concurrently": "^6.2.1",
54
54
  "copyfiles": "^2.4.1",
55
55
  "graphql": "16.11.0",
@@ -57,12 +57,12 @@
57
57
  "tslib": "2.8.1",
58
58
  "vite": "7.1.5",
59
59
  "vite-plugin-dts": "4.5.4",
60
- "vitest": "^4.0.7",
61
- "@faststore/diagnostics": "^4.5.1-dev.4"
60
+ "vitest": "4.0.18",
61
+ "@faststore/diagnostics": "^4.6.0-dev.0"
62
62
  },
63
63
  "peerDependencies": {
64
64
  "graphql": "16.11.0",
65
- "@faststore/diagnostics": "4.5.1-dev.4"
65
+ "@faststore/diagnostics": "4.6.0-dev.0"
66
66
  },
67
67
  "publishConfig": {
68
68
  "access": "public"
@@ -1,9 +1,11 @@
1
- import { OTELAPI } from '@faststore/diagnostics'
1
+ import { logger, OTELAPI } from '@faststore/diagnostics'
2
2
  import { name, version } from '../../package.json' with { type: 'json' }
3
3
 
4
+ const OTELLogger = logger('@faststore/api')
5
+
4
6
  export const ResolverTrace = <
5
7
  TContext extends {
6
- OTEL: Record<string, any>
8
+ OTEL_ENABLED: boolean
7
9
  account: string
8
10
  discoveryConfig: Record<string, any>
9
11
  },
@@ -12,7 +14,7 @@ export const ResolverTrace = <
12
14
  TReturn = any,
13
15
  >(
14
16
  fn: (source: TSource, vars: TVars, context: TContext, info: any) => TReturn,
15
- resolverName?: string
17
+ resolverName = 'Unknown Graphql Resolver'
16
18
  ) => {
17
19
  return (
18
20
  source: TSource,
@@ -20,47 +22,62 @@ export const ResolverTrace = <
20
22
  graphqlContext: TContext,
21
23
  info: any
22
24
  ): TReturn => {
23
- if ((graphqlContext?.OTEL?.enabled ?? false) === false) {
25
+ if (!graphqlContext?.OTEL_ENABLED) {
24
26
  return fn(source, vars, graphqlContext, info)
25
27
  }
26
28
 
27
- const trace = OTELAPI.trace.getTracer(name, version)
28
- const activeContext = OTELAPI.propagation.extract(
29
- OTELAPI.context.active(),
30
- graphqlContext.OTEL
31
- )
29
+ const span = OTELAPI.trace.getTracer('Graphql').startSpan(resolverName, {
30
+ kind: OTELAPI.SpanKind.INTERNAL,
31
+ attributes: {
32
+ timestamp: Date.now(),
33
+ '@faststore_version': version,
34
+ '@faststore_package_name': name,
35
+ '@faststore_account_name': graphqlContext.account,
36
+ '@faststore_environment': process.env.NODE_ENV,
37
+ '@faststore_resolver_parent_type': info?.parentType?.name,
38
+ '@faststore_resolver_field_name': info?.fieldName,
39
+ },
40
+ })
32
41
 
33
- return OTELAPI.context.with(activeContext, () => {
34
- const span = trace.startSpan(resolverName ?? 'Unknown Graphql Resolver', {
35
- startTime: Date.now(),
36
- kind: OTELAPI.SpanKind.INTERNAL,
37
- attributes: {
38
- timestamp: Date.now(),
39
- '@faststore_version': version,
40
- '@faststore_package_name': name,
41
- '@faststore_account_name': graphqlContext.account,
42
- '@faststore_environment': process.env.NODE_ENV,
43
- },
44
- })
42
+ const otelContext = OTELAPI.trace.setSpan(OTELAPI.context.active(), span)
45
43
 
46
- if (!span) return fn(source, vars, graphqlContext, info)
47
- try {
48
- const returnedValue = fn(source, vars, graphqlContext, info)
44
+ try {
45
+ const result = OTELAPI.context.with(otelContext, () =>
46
+ fn(source, vars, graphqlContext, info)
47
+ )
49
48
 
50
- if (!(returnedValue instanceof Promise)) {
51
- span.end()
52
- return returnedValue
53
- }
49
+ if (result instanceof Promise) {
50
+ return result.then(
51
+ (value) => {
52
+ span.end()
54
53
 
55
- return returnedValue.then((value) => {
56
- span.end()
57
- return value
58
- }) as TReturn
59
- } catch (error) {
60
- span.end()
61
- console.error(`Error when executing resolver: ${resolverName}`, error)
62
- throw error
54
+ return value
55
+ },
56
+ (error) => recordResolverError(error, span, resolverName)
57
+ ) as TReturn
63
58
  }
64
- })
59
+
60
+ span.end()
61
+
62
+ return result
63
+ } catch (error) {
64
+ return recordResolverError(error, span, resolverName)
65
+ }
65
66
  }
66
67
  }
68
+
69
+ /** Marks the span as failed and rethrows, keeping call sites linear. */
70
+ function recordResolverError(
71
+ error: unknown,
72
+ span: OTELAPI.Span,
73
+ resolverName: string
74
+ ): never {
75
+ span.setStatus({ code: OTELAPI.SpanStatusCode.ERROR })
76
+ span.recordException(error as Error)
77
+ span.end()
78
+
79
+ console.error(`Error at resolver: ${resolverName}: \n %o`, error)
80
+ OTELLogger('error', 'Error at resolver: %s\n%o', resolverName, error)
81
+
82
+ throw error
83
+ }
@@ -1,4 +1,3 @@
1
- import { OTELAPI } from '@faststore/diagnostics'
2
1
  import { mergeSchemas } from '@graphql-tools/schema'
3
2
  import { type GraphQLSchema, isSchema } from 'graphql'
4
3
  import { withDirectives } from '../../directives'
@@ -45,34 +44,30 @@ export interface GraphqlContext {
45
44
  }
46
45
  headers: Record<string, string>
47
46
  account: string
48
- OTEL: Record<string, unknown>
47
+ OTEL_ENABLED: boolean
49
48
  /** Discovery config passed from @faststore/core, including localization settings. */
50
49
  discoveryConfig?: Record<string, unknown>
51
50
  }
52
51
 
53
52
  export const GraphqlVtexContextFactory = async (options: Options) => {
54
- return OTELAPI.context.with(
55
- OTELAPI.propagation.extract(OTELAPI.context.active(), options.OTEL),
56
- () =>
57
- (ctx: any): GraphqlContext => {
58
- ctx.storage = {
59
- channel: ChannelMarshal.parse(options.channel),
60
- flags: options.flags ?? {},
61
- locale: options.locale,
62
- cookies: new Map<string, Record<string, string>>(),
63
- }
64
- ctx.account = options.account
65
- ctx.OTEL = options.OTEL
66
- ctx.discoveryConfig = options.discoveryConfig
67
- // Build clients/loaders last: they capture `ctx` and read storage,
68
- // discoveryConfig, etc. at request time, so everything they may depend on
69
- // must already be assigned.
70
- ctx.clients = getClients(options, ctx)
71
- ctx.loaders = getLoaders(options, ctx)
53
+ return (ctx: any): GraphqlContext => {
54
+ ctx.storage = {
55
+ channel: ChannelMarshal.parse(options.channel),
56
+ flags: options.flags ?? {},
57
+ locale: options.locale,
58
+ cookies: new Map<string, Record<string, string>>(),
59
+ }
60
+ ctx.account = options.account
61
+ ctx.OTEL_ENABLED = options.OTEL_ENABLED
62
+ ctx.discoveryConfig = options.discoveryConfig
63
+ // Build clients/loaders last: they capture `ctx` and read storage,
64
+ // discoveryConfig, etc. at request time, so everything they may depend on
65
+ // must already be assigned.
66
+ ctx.clients = getClients(options, ctx)
67
+ ctx.loaders = getLoaders(options, ctx)
72
68
 
73
- return ctx
74
- }
75
- )
69
+ return ctx
70
+ }
76
71
  }
77
72
 
78
73
  export type GraphqlResolver<S = any, V = any, R = any> = Resolver<
@@ -18,12 +18,9 @@ interface Options {
18
18
  incrementAddress: boolean
19
19
  flags?: FeatureFlags
20
20
  version?: string
21
- OTEL?: {
22
- enabled: boolean
23
- traceparent?: string
24
- tracestate?: string
25
- }
26
21
  discoveryConfig?: Record<string, unknown>
22
+ /** Emit OpenTelemetry spans from resolvers. Defaults to disabled. */
23
+ OTEL_ENABLED?: boolean
27
24
  }
28
25
 
29
26
  interface FeatureFlags {