@wishknish/knishio-client-js 0.8.0 → 0.8.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wishknish/knishio-client-js",
3
- "version": "0.8.0",
3
+ "version": "0.8.1",
4
4
  "type": "module",
5
5
  "productName": "Knish.IO Javascript SDK Client",
6
6
  "description": "JavaScript implementation of the Knish.IO SDK to consume Knish.IO GraphQL APIs.",
@@ -127,7 +127,8 @@ export default class KnishIOClient {
127
127
  client = null,
128
128
  socket = null,
129
129
  serverSdkVersion = 3,
130
- logging = false
130
+ logging = false,
131
+ defaultRequestPolicy = null
131
132
  }) {
132
133
  this.initialize({
133
134
  uri,
@@ -135,7 +136,8 @@ export default class KnishIOClient {
135
136
  socket,
136
137
  client,
137
138
  serverSdkVersion,
138
- logging
139
+ logging,
140
+ defaultRequestPolicy
139
141
  })
140
142
  }
141
143
 
@@ -155,11 +157,16 @@ export default class KnishIOClient {
155
157
  socket = null,
156
158
  client = null,
157
159
  serverSdkVersion = 3,
158
- logging = false
160
+ logging = false,
161
+ defaultRequestPolicy = null
159
162
  }) {
160
163
  this.reset()
161
164
 
162
165
  this.$__logging = logging
166
+ // Client-level urql request policy applied to reads that omit a per-call
167
+ // policy. A long-lived server/sync client set to 'network-only' never serves
168
+ // a stale cache-first read; browser/SPA consumers leave this null (cache-first).
169
+ this.$__defaultRequestPolicy = defaultRequestPolicy
163
170
  this.$__authTokenObjects = {}
164
171
  this.$__authInProcess = false
165
172
  this.abortControllers = new Map()
@@ -247,6 +254,25 @@ export default class KnishIOClient {
247
254
  return this.$__serverSdkVersion
248
255
  }
249
256
 
257
+ /**
258
+ * Returns the client-level default urql request policy (or null)
259
+ *
260
+ * @return {string|null}
261
+ */
262
+ getDefaultRequestPolicy () {
263
+ return this.$__defaultRequestPolicy || null
264
+ }
265
+
266
+ /**
267
+ * Sets the client-level default urql request policy applied to reads that
268
+ * omit a per-call policy (e.g. 'network-only' for a long-lived server client)
269
+ *
270
+ * @param {string|null} policy - 'cache-first'|'cache-only'|'network-only'|'cache-and-network'|null
271
+ */
272
+ setDefaultRequestPolicy (policy) {
273
+ this.$__defaultRequestPolicy = policy
274
+ }
275
+
250
276
  /**
251
277
  * Reset common properties
252
278
  */
@@ -255,6 +281,7 @@ export default class KnishIOClient {
255
281
  this.$__bundle = ''
256
282
  this.remainderWallet = null
257
283
  this.$__capabilityCache = {}
284
+ this.$__defaultRequestPolicy = null
258
285
  }
259
286
 
260
287
  /**
@@ -580,7 +607,7 @@ export default class KnishIOClient {
580
607
  * @param variables
581
608
  * @returns {Promise<*>}
582
609
  */
583
- async executeQuery (query, variables = null) {
610
+ async executeQuery (query, variables = null, context = {}) {
584
611
  // Check and refresh authorization token if needed
585
612
  // Guard with $__authInProcess to prevent concurrent auth requests
586
613
  if (this.$__authToken && this.$__authToken.isExpired() && !this.$__authInProcess) {
@@ -601,13 +628,25 @@ export default class KnishIOClient {
601
628
  this.abortControllers.set(queryKey, abortController)
602
629
 
603
630
  try {
631
+ // Apply the client-level default request policy when neither the caller
632
+ // nor the query's own createQueryContext specifies one, so a long-lived
633
+ // server/sync client (defaultRequestPolicy:'network-only') never serves a
634
+ // stale cache-first read. Precedence: a query's own createQueryContext
635
+ // (e.g. ContinuId's network-only, applied in Query.execute's merge) >
636
+ // per-call context.requestPolicy > this client default > urql default.
637
+ const requestContext = { ...context }
638
+ if (this.$__defaultRequestPolicy && !requestContext.requestPolicy) {
639
+ requestContext.requestPolicy = this.$__defaultRequestPolicy
640
+ }
641
+
604
642
  // Use the existing query execution method, but add the abort signal
605
643
  const result = await query.execute({
606
644
  variables,
607
645
  context: {
608
646
  fetchOptions: {
609
647
  signal: abortController.signal
610
- }
648
+ },
649
+ ...requestContext
611
650
  }
612
651
  })
613
652
 
@@ -839,7 +878,8 @@ export default class KnishIOClient {
839
878
  throughMolecule = false,
840
879
  values = null,
841
880
  keys = null,
842
- atomValues = null
881
+ atomValues = null,
882
+ requestPolicy = null
843
883
  }) {
844
884
  this.log('info', `KnishIOClient::queryMeta() - Querying metaType: ${ metaType }, metaId: ${ metaId }...`)
845
885
 
@@ -903,7 +943,7 @@ export default class KnishIOClient {
903
943
  })
904
944
  }
905
945
 
906
- return this.executeQuery(query, variables)
946
+ return this.executeQuery(query, variables, requestPolicy ? { requestPolicy } : {})
907
947
  }
908
948
 
909
949
  /**
@@ -68,14 +68,24 @@ class UrqlClientWrapper {
68
68
  }
69
69
 
70
70
  async query (request) {
71
- const { query, variables } = request
72
- const result = await this.$__client.query(query, variables).toPromise()
71
+ const { query, variables, context } = request
72
+ // Forward ONLY urql's requestPolicy (e.g. 'network-only') so a long-lived
73
+ // client does not serve stale cache-first reads. We deliberately do NOT
74
+ // forward the whole context: urql REPLACES (not merges) the client-level
75
+ // fetchOptions with any context.fetchOptions (createRequestOperation builds
76
+ // the op context as {...baseOpts, ...opts}), which would drop the
77
+ // X-Auth-Token header set in createUrqlClient and break authentication.
78
+ const opts = (context && context.requestPolicy) ? { requestPolicy: context.requestPolicy } : undefined
79
+ const result = await this.$__client.query(query, variables || {}, opts).toPromise()
73
80
  return this.formatResponse(result)
74
81
  }
75
82
 
76
83
  async mutate (request) {
77
- const { mutation, variables } = request
78
- const result = await this.$__client.mutation(mutation, variables).toPromise()
84
+ const { mutation, variables, context } = request
85
+ // Forward requestPolicy only (see query() — never the whole context, which
86
+ // would clobber the auth-bearing client-level fetchOptions).
87
+ const opts = (context && context.requestPolicy) ? { requestPolicy: context.requestPolicy } : undefined
88
+ const result = await this.$__client.mutation(mutation, variables || {}, opts).toPromise()
79
89
  return this.formatResponse(result)
80
90
  }
81
91