@contello/sdk-client 8.21.2 → 8.22.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.
package/dist/index.cjs CHANGED
@@ -1,7 +1,9 @@
1
1
  "use strict";
2
+ var __create = Object.create;
2
3
  var __defProp = Object.defineProperty;
3
4
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
5
  var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
5
7
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
8
  var __export = (target, all) => {
7
9
  for (var name in all)
@@ -15,6 +17,14 @@ var __copyProps = (to, from, except, desc) => {
15
17
  }
16
18
  return to;
17
19
  };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
18
28
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
29
 
20
30
  // src/index.ts
@@ -26,6 +36,62 @@ module.exports = __toCommonJS(index_exports);
26
36
 
27
37
  // src/client.ts
28
38
  var import_graphql_ws = require("graphql-ws");
39
+ var import_rxjs2 = require("rxjs");
40
+
41
+ // src/diagnostics.ts
42
+ var import_node_diagnostics_channel = __toESM(require("diagnostics_channel"), 1);
43
+ var channels = {
44
+ start: "contello:sdk.start",
45
+ end: "contello:sdk.end",
46
+ error: "contello:sdk.error",
47
+ /** subscribe to decorate outgoing GraphQL WebSocket messages (e.g. inject traceparent) */
48
+ message: "contello:sdk.message"
49
+ };
50
+ var onStart = import_node_diagnostics_channel.default.channel(channels.start);
51
+ var onEnd = import_node_diagnostics_channel.default.channel(channels.end);
52
+ var onError = import_node_diagnostics_channel.default.channel(channels.error);
53
+ var onMessage = import_node_diagnostics_channel.default.channel(channels.message);
54
+ function hasOperationSubscribers() {
55
+ return onStart.hasSubscribers || onEnd.hasSubscribers || onError.hasSubscribers;
56
+ }
57
+ function getWrap() {
58
+ if (!hasOperationSubscribers()) {
59
+ return void 0;
60
+ }
61
+ return (name, fn) => {
62
+ const start = performance.now();
63
+ onStart.publish({ name });
64
+ let result;
65
+ try {
66
+ result = fn();
67
+ } catch (error) {
68
+ onError.publish({ name, error, durationMs: performance.now() - start });
69
+ throw error;
70
+ }
71
+ if (result instanceof Promise) {
72
+ return result.then(
73
+ (r) => {
74
+ onEnd.publish({ name, durationMs: performance.now() - start });
75
+ return r;
76
+ },
77
+ (error) => {
78
+ onError.publish({ name, error, durationMs: performance.now() - start });
79
+ throw error;
80
+ }
81
+ );
82
+ }
83
+ onEnd.publish({ name, durationMs: performance.now() - start });
84
+ return result;
85
+ };
86
+ }
87
+ function decorateMessage(message) {
88
+ if (!onMessage.hasSubscribers) {
89
+ return message;
90
+ }
91
+ const msg = { message };
92
+ onMessage.publish(msg);
93
+ return msg.message;
94
+ }
29
95
 
30
96
  // src/pool.ts
31
97
  var ConnectionPool = class {
@@ -79,7 +145,7 @@ var ConnectionPool = class {
79
145
 
80
146
  // src/sdk.ts
81
147
  var import_rxjs = require("rxjs");
82
- var createSdk = (client, middlewares, getSdk) => {
148
+ var createSdk = (client, getSdk) => {
83
149
  return getSdk((doc, vars, options) => {
84
150
  if (options) {
85
151
  console.warn("options are not supported yet");
@@ -96,28 +162,16 @@ var createSdk = (client, middlewares, getSdk) => {
96
162
  throw new Error("No operation definition found");
97
163
  }
98
164
  const kind = operationDef.operation;
99
- const executeRequest = () => {
165
+ const execute = () => {
100
166
  const wsClient = client();
101
- return new import_rxjs.Observable((obs) => wsClient.subscribe({ query, variables: vars }, obs));
167
+ const res = new import_rxjs.Observable((obs) => wsClient.subscribe({ query, variables: vars }, obs));
168
+ return kind !== "subscription" ? (0, import_rxjs.firstValueFrom)(res) : res;
102
169
  };
103
- const request = {
104
- kind,
105
- operationName: operationDef.name?.value ?? "",
106
- query,
107
- variables: vars || {}
108
- };
109
- const executeWithMiddlewares = (middlewares2, index) => {
110
- if (index >= middlewares2.length) {
111
- return executeRequest();
112
- }
113
- const middleware = middlewares2[index];
114
- if (middleware?.onRequest) {
115
- return middleware.onRequest(request, () => executeWithMiddlewares(middlewares2, index + 1));
116
- }
117
- return executeWithMiddlewares(middlewares2, index + 1);
118
- };
119
- const res = executeWithMiddlewares(middlewares, 0);
120
- return kind !== "subscription" ? (0, import_rxjs.firstValueFrom)(res) : res;
170
+ const wrapFn = getWrap();
171
+ if (wrapFn && kind !== "subscription") {
172
+ return wrapFn(`sdk:${operationDef.name?.value ?? ""}`, execute);
173
+ }
174
+ return execute();
121
175
  });
122
176
  };
123
177
 
@@ -140,13 +194,7 @@ var ContelloSdkClient = class {
140
194
  shouldRetry: () => true,
141
195
  jsonMessageReplacer: (key, value) => {
142
196
  if (!key) {
143
- let message = value;
144
- for (const middleware of params.middlewares ?? []) {
145
- if (middleware.onOutgoingMessage) {
146
- message = middleware.onOutgoingMessage(message);
147
- }
148
- }
149
- return message;
197
+ return decorateMessage(value);
150
198
  }
151
199
  return value;
152
200
  },
@@ -165,7 +213,7 @@ var ContelloSdkClient = class {
165
213
  },
166
214
  pooling?.enabled === false ? 1 : pooling?.size ?? 5
167
215
  );
168
- this._sdk = { sdk: createSdk(() => this._pool.get(), params.middlewares ?? [], getSdk) };
216
+ this._sdk = { sdk: createSdk(() => this._pool.get(), getSdk) };
169
217
  }
170
218
  get sdk() {
171
219
  return this._sdk.sdk;
@@ -176,6 +224,25 @@ var ContelloSdkClient = class {
176
224
  async disconnect() {
177
225
  await this._pool.disconnect();
178
226
  }
227
+ /**
228
+ * Subscribes to a raw GraphQL operation against the connection pool.
229
+ * Returns an Observable that emits each result's data.
230
+ */
231
+ subscribe(query, variables) {
232
+ const wsClient = this._pool.get();
233
+ return new import_rxjs2.Observable((obs) => wsClient.subscribe({ query, variables }, obs)).pipe(
234
+ (0, import_rxjs2.map)((r) => r.data)
235
+ );
236
+ }
237
+ /**
238
+ * Executes a raw GraphQL query/mutation and returns the first result.
239
+ * Convenience wrapper around subscribe + firstValueFrom.
240
+ */
241
+ execute(query, variables) {
242
+ const fn = () => (0, import_rxjs2.firstValueFrom)(this.subscribe(query, variables));
243
+ const wrap = getWrap();
244
+ return wrap ? wrap("sdk:execute", fn) : fn();
245
+ }
179
246
  };
180
247
  // Annotate the CommonJS export names for ESM import in node:
181
248
  0 && (module.exports = {
package/dist/index.d.cts CHANGED
@@ -1,16 +1,6 @@
1
1
  import { Observable } from 'rxjs';
2
2
  import { DocumentNode, ExecutionResult } from 'graphql';
3
3
 
4
- type ContelloSdkClientMiddleware = {
5
- onRequest?: (request: {
6
- kind: 'query' | 'mutation' | 'subscription';
7
- operationName: string;
8
- query: string;
9
- variables: Record<string, any>;
10
- }, next: () => Observable<any>) => Observable<any>;
11
- onOutgoingMessage?: (message: any) => any;
12
- };
13
-
14
4
  type Requester<C = any, E = unknown> = <R, V>(doc: DocumentNode, vars?: V, options?: C) => Promise<ExecutionResult<R, E>> | Observable<ExecutionResult<R, E>>;
15
5
 
16
6
  type ClientEventContext = {
@@ -21,7 +11,6 @@ type ContelloSdkClientParams = {
21
11
  url: string;
22
12
  project: string;
23
13
  token: string;
24
- middlewares?: ContelloSdkClientMiddleware[] | undefined;
25
14
  pooling?: {
26
15
  enabled?: boolean | undefined;
27
16
  size?: number | undefined;
@@ -45,6 +34,16 @@ declare class ContelloSdkClient<T> {
45
34
  get sdk(): T;
46
35
  connect(): Promise<void>;
47
36
  disconnect(): Promise<void>;
37
+ /**
38
+ * Subscribes to a raw GraphQL operation against the connection pool.
39
+ * Returns an Observable that emits each result's data.
40
+ */
41
+ subscribe<TData>(query: string, variables?: Record<string, unknown> | undefined): Observable<TData>;
42
+ /**
43
+ * Executes a raw GraphQL query/mutation and returns the first result.
44
+ * Convenience wrapper around subscribe + firstValueFrom.
45
+ */
46
+ execute<TData>(query: string, variables?: Record<string, unknown> | undefined): Promise<TData>;
48
47
  }
49
48
 
50
- export { ContelloSdkClient, type ContelloSdkClientMiddleware, type ContelloSdkClientParams };
49
+ export { ContelloSdkClient, type ContelloSdkClientParams };
package/dist/index.d.ts CHANGED
@@ -1,16 +1,6 @@
1
1
  import { Observable } from 'rxjs';
2
2
  import { DocumentNode, ExecutionResult } from 'graphql';
3
3
 
4
- type ContelloSdkClientMiddleware = {
5
- onRequest?: (request: {
6
- kind: 'query' | 'mutation' | 'subscription';
7
- operationName: string;
8
- query: string;
9
- variables: Record<string, any>;
10
- }, next: () => Observable<any>) => Observable<any>;
11
- onOutgoingMessage?: (message: any) => any;
12
- };
13
-
14
4
  type Requester<C = any, E = unknown> = <R, V>(doc: DocumentNode, vars?: V, options?: C) => Promise<ExecutionResult<R, E>> | Observable<ExecutionResult<R, E>>;
15
5
 
16
6
  type ClientEventContext = {
@@ -21,7 +11,6 @@ type ContelloSdkClientParams = {
21
11
  url: string;
22
12
  project: string;
23
13
  token: string;
24
- middlewares?: ContelloSdkClientMiddleware[] | undefined;
25
14
  pooling?: {
26
15
  enabled?: boolean | undefined;
27
16
  size?: number | undefined;
@@ -45,6 +34,16 @@ declare class ContelloSdkClient<T> {
45
34
  get sdk(): T;
46
35
  connect(): Promise<void>;
47
36
  disconnect(): Promise<void>;
37
+ /**
38
+ * Subscribes to a raw GraphQL operation against the connection pool.
39
+ * Returns an Observable that emits each result's data.
40
+ */
41
+ subscribe<TData>(query: string, variables?: Record<string, unknown> | undefined): Observable<TData>;
42
+ /**
43
+ * Executes a raw GraphQL query/mutation and returns the first result.
44
+ * Convenience wrapper around subscribe + firstValueFrom.
45
+ */
46
+ execute<TData>(query: string, variables?: Record<string, unknown> | undefined): Promise<TData>;
48
47
  }
49
48
 
50
- export { ContelloSdkClient, type ContelloSdkClientMiddleware, type ContelloSdkClientParams };
49
+ export { ContelloSdkClient, type ContelloSdkClientParams };
package/dist/index.js CHANGED
@@ -1,5 +1,61 @@
1
1
  // src/client.ts
2
2
  import { createClient } from "graphql-ws";
3
+ import { Observable as Observable2, firstValueFrom as firstValueFrom2, map } from "rxjs";
4
+
5
+ // src/diagnostics.ts
6
+ import dc from "diagnostics_channel";
7
+ var channels = {
8
+ start: "contello:sdk.start",
9
+ end: "contello:sdk.end",
10
+ error: "contello:sdk.error",
11
+ /** subscribe to decorate outgoing GraphQL WebSocket messages (e.g. inject traceparent) */
12
+ message: "contello:sdk.message"
13
+ };
14
+ var onStart = dc.channel(channels.start);
15
+ var onEnd = dc.channel(channels.end);
16
+ var onError = dc.channel(channels.error);
17
+ var onMessage = dc.channel(channels.message);
18
+ function hasOperationSubscribers() {
19
+ return onStart.hasSubscribers || onEnd.hasSubscribers || onError.hasSubscribers;
20
+ }
21
+ function getWrap() {
22
+ if (!hasOperationSubscribers()) {
23
+ return void 0;
24
+ }
25
+ return (name, fn) => {
26
+ const start = performance.now();
27
+ onStart.publish({ name });
28
+ let result;
29
+ try {
30
+ result = fn();
31
+ } catch (error) {
32
+ onError.publish({ name, error, durationMs: performance.now() - start });
33
+ throw error;
34
+ }
35
+ if (result instanceof Promise) {
36
+ return result.then(
37
+ (r) => {
38
+ onEnd.publish({ name, durationMs: performance.now() - start });
39
+ return r;
40
+ },
41
+ (error) => {
42
+ onError.publish({ name, error, durationMs: performance.now() - start });
43
+ throw error;
44
+ }
45
+ );
46
+ }
47
+ onEnd.publish({ name, durationMs: performance.now() - start });
48
+ return result;
49
+ };
50
+ }
51
+ function decorateMessage(message) {
52
+ if (!onMessage.hasSubscribers) {
53
+ return message;
54
+ }
55
+ const msg = { message };
56
+ onMessage.publish(msg);
57
+ return msg.message;
58
+ }
3
59
 
4
60
  // src/pool.ts
5
61
  var ConnectionPool = class {
@@ -53,7 +109,7 @@ var ConnectionPool = class {
53
109
 
54
110
  // src/sdk.ts
55
111
  import { Observable, firstValueFrom } from "rxjs";
56
- var createSdk = (client, middlewares, getSdk) => {
112
+ var createSdk = (client, getSdk) => {
57
113
  return getSdk((doc, vars, options) => {
58
114
  if (options) {
59
115
  console.warn("options are not supported yet");
@@ -70,28 +126,16 @@ var createSdk = (client, middlewares, getSdk) => {
70
126
  throw new Error("No operation definition found");
71
127
  }
72
128
  const kind = operationDef.operation;
73
- const executeRequest = () => {
129
+ const execute = () => {
74
130
  const wsClient = client();
75
- return new Observable((obs) => wsClient.subscribe({ query, variables: vars }, obs));
131
+ const res = new Observable((obs) => wsClient.subscribe({ query, variables: vars }, obs));
132
+ return kind !== "subscription" ? firstValueFrom(res) : res;
76
133
  };
77
- const request = {
78
- kind,
79
- operationName: operationDef.name?.value ?? "",
80
- query,
81
- variables: vars || {}
82
- };
83
- const executeWithMiddlewares = (middlewares2, index) => {
84
- if (index >= middlewares2.length) {
85
- return executeRequest();
86
- }
87
- const middleware = middlewares2[index];
88
- if (middleware?.onRequest) {
89
- return middleware.onRequest(request, () => executeWithMiddlewares(middlewares2, index + 1));
90
- }
91
- return executeWithMiddlewares(middlewares2, index + 1);
92
- };
93
- const res = executeWithMiddlewares(middlewares, 0);
94
- return kind !== "subscription" ? firstValueFrom(res) : res;
134
+ const wrapFn = getWrap();
135
+ if (wrapFn && kind !== "subscription") {
136
+ return wrapFn(`sdk:${operationDef.name?.value ?? ""}`, execute);
137
+ }
138
+ return execute();
95
139
  });
96
140
  };
97
141
 
@@ -114,13 +158,7 @@ var ContelloSdkClient = class {
114
158
  shouldRetry: () => true,
115
159
  jsonMessageReplacer: (key, value) => {
116
160
  if (!key) {
117
- let message = value;
118
- for (const middleware of params.middlewares ?? []) {
119
- if (middleware.onOutgoingMessage) {
120
- message = middleware.onOutgoingMessage(message);
121
- }
122
- }
123
- return message;
161
+ return decorateMessage(value);
124
162
  }
125
163
  return value;
126
164
  },
@@ -139,7 +177,7 @@ var ContelloSdkClient = class {
139
177
  },
140
178
  pooling?.enabled === false ? 1 : pooling?.size ?? 5
141
179
  );
142
- this._sdk = { sdk: createSdk(() => this._pool.get(), params.middlewares ?? [], getSdk) };
180
+ this._sdk = { sdk: createSdk(() => this._pool.get(), getSdk) };
143
181
  }
144
182
  get sdk() {
145
183
  return this._sdk.sdk;
@@ -150,6 +188,25 @@ var ContelloSdkClient = class {
150
188
  async disconnect() {
151
189
  await this._pool.disconnect();
152
190
  }
191
+ /**
192
+ * Subscribes to a raw GraphQL operation against the connection pool.
193
+ * Returns an Observable that emits each result's data.
194
+ */
195
+ subscribe(query, variables) {
196
+ const wsClient = this._pool.get();
197
+ return new Observable2((obs) => wsClient.subscribe({ query, variables }, obs)).pipe(
198
+ map((r) => r.data)
199
+ );
200
+ }
201
+ /**
202
+ * Executes a raw GraphQL query/mutation and returns the first result.
203
+ * Convenience wrapper around subscribe + firstValueFrom.
204
+ */
205
+ execute(query, variables) {
206
+ const fn = () => firstValueFrom2(this.subscribe(query, variables));
207
+ const wrap = getWrap();
208
+ return wrap ? wrap("sdk:execute", fn) : fn();
209
+ }
153
210
  };
154
211
  export {
155
212
  ContelloSdkClient
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contello/sdk-client",
3
- "version": "8.21.2",
3
+ "version": "8.22.0",
4
4
  "description": "GraphQL SDK client for Contello CMS with WebSocket transport and connection pooling",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -23,8 +23,8 @@
23
23
  },
24
24
  "devDependencies": {
25
25
  "rxjs": "^7.8.2",
26
- "graphql": "^16.11.0",
27
- "graphql-ws": "^6.0.6"
26
+ "graphql": "^16.13.1",
27
+ "graphql-ws": "^6.0.7"
28
28
  },
29
29
  "files": [
30
30
  "dist"