@openfeature/flagd-provider 0.10.0 → 0.10.2

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/index.cjs.js CHANGED
@@ -5829,6 +5829,21 @@ function isSet$1(value) {
5829
5829
  return value !== null && value !== undefined;
5830
5830
  }
5831
5831
 
5832
+ const closeStreamIfDefined = (stream) => {
5833
+ /**
5834
+ * cancel() is necessary to prevent calls from hanging the process, so we need to we need to remove all the
5835
+ * handlers, and add a no-op for 'error' so we can cancel without bubbling up an exception
5836
+ */
5837
+ if (stream) {
5838
+ stream.removeAllListeners();
5839
+ stream.on('error', () => {
5840
+ // swallow errors after closed
5841
+ });
5842
+ stream.cancel();
5843
+ stream.destroy();
5844
+ }
5845
+ };
5846
+
5832
5847
  class GRPCService {
5833
5848
  get _cacheActive() {
5834
5849
  // the cache is "active" (able to be used) if the config enabled it, AND the gRPC stream is live
@@ -5866,10 +5881,8 @@ class GRPCService {
5866
5881
  return new Promise((resolve, reject) => this.listen(reconnectCallback, changedCallback, disconnectCallback, resolve, reject));
5867
5882
  }
5868
5883
  disconnect() {
5869
- var _a;
5870
5884
  return __awaiter(this, void 0, void 0, function* () {
5871
- // cancel the stream and close the connection
5872
- (_a = this._eventStream) === null || _a === void 0 ? void 0 : _a.cancel();
5885
+ closeStreamIfDefined(this._eventStream);
5873
5886
  this._client.close();
5874
5887
  });
5875
5888
  }
@@ -5896,6 +5909,8 @@ class GRPCService {
5896
5909
  listen(reconnectCallback, changedCallback, disconnectCallback, resolveConnect, rejectConnect) {
5897
5910
  var _a;
5898
5911
  (_a = this.logger) === null || _a === void 0 ? void 0 : _a.debug(`${FlagdProvider.name}: connecting stream...`);
5912
+ // close the previous stream if we're reconnecting
5913
+ closeStreamIfDefined(this._eventStream);
5899
5914
  const stream = this._client.eventStream({}, {});
5900
5915
  stream.on('error', (err) => {
5901
5916
  rejectConnect === null || rejectConnect === void 0 ? void 0 : rejectConnect(err);
@@ -6349,16 +6364,16 @@ class GrpcFetch {
6349
6364
  this._request = { providerId: '', selector: selector ? selector : '' };
6350
6365
  }
6351
6366
  connect(dataFillCallback, reconnectCallback, changedCallback, disconnectCallback) {
6352
- // note that we never reject the promise as sync is a long-running operation
6353
6367
  return new Promise((resolve, reject) => this.listen(dataFillCallback, reconnectCallback, changedCallback, disconnectCallback, resolve, reject));
6354
6368
  }
6355
6369
  disconnect() {
6356
- var _a, _b;
6370
+ var _a;
6357
6371
  (_a = this._logger) === null || _a === void 0 ? void 0 : _a.debug('Disconnecting gRPC sync connection');
6358
- (_b = this._syncStream) === null || _b === void 0 ? void 0 : _b.destroy();
6372
+ closeStreamIfDefined(this._syncStream);
6359
6373
  this._syncClient.close();
6360
6374
  }
6361
6375
  listen(dataFillCallback, reconnectCallback, changedCallback, disconnectCallback, resolveConnect, rejectConnect) {
6376
+ closeStreamIfDefined(this._syncStream);
6362
6377
  this._syncStream = this._syncClient.syncFlags(this._request);
6363
6378
  this._syncStream.on('data', (data) => {
6364
6379
  var _a;
package/index.esm.js CHANGED
@@ -5825,6 +5825,21 @@ function isSet$1(value) {
5825
5825
  return value !== null && value !== undefined;
5826
5826
  }
5827
5827
 
5828
+ const closeStreamIfDefined = (stream) => {
5829
+ /**
5830
+ * cancel() is necessary to prevent calls from hanging the process, so we need to we need to remove all the
5831
+ * handlers, and add a no-op for 'error' so we can cancel without bubbling up an exception
5832
+ */
5833
+ if (stream) {
5834
+ stream.removeAllListeners();
5835
+ stream.on('error', () => {
5836
+ // swallow errors after closed
5837
+ });
5838
+ stream.cancel();
5839
+ stream.destroy();
5840
+ }
5841
+ };
5842
+
5828
5843
  class GRPCService {
5829
5844
  get _cacheActive() {
5830
5845
  // the cache is "active" (able to be used) if the config enabled it, AND the gRPC stream is live
@@ -5862,10 +5877,8 @@ class GRPCService {
5862
5877
  return new Promise((resolve, reject) => this.listen(reconnectCallback, changedCallback, disconnectCallback, resolve, reject));
5863
5878
  }
5864
5879
  disconnect() {
5865
- var _a;
5866
5880
  return __awaiter(this, void 0, void 0, function* () {
5867
- // cancel the stream and close the connection
5868
- (_a = this._eventStream) === null || _a === void 0 ? void 0 : _a.cancel();
5881
+ closeStreamIfDefined(this._eventStream);
5869
5882
  this._client.close();
5870
5883
  });
5871
5884
  }
@@ -5892,6 +5905,8 @@ class GRPCService {
5892
5905
  listen(reconnectCallback, changedCallback, disconnectCallback, resolveConnect, rejectConnect) {
5893
5906
  var _a;
5894
5907
  (_a = this.logger) === null || _a === void 0 ? void 0 : _a.debug(`${FlagdProvider.name}: connecting stream...`);
5908
+ // close the previous stream if we're reconnecting
5909
+ closeStreamIfDefined(this._eventStream);
5895
5910
  const stream = this._client.eventStream({}, {});
5896
5911
  stream.on('error', (err) => {
5897
5912
  rejectConnect === null || rejectConnect === void 0 ? void 0 : rejectConnect(err);
@@ -6345,16 +6360,16 @@ class GrpcFetch {
6345
6360
  this._request = { providerId: '', selector: selector ? selector : '' };
6346
6361
  }
6347
6362
  connect(dataFillCallback, reconnectCallback, changedCallback, disconnectCallback) {
6348
- // note that we never reject the promise as sync is a long-running operation
6349
6363
  return new Promise((resolve, reject) => this.listen(dataFillCallback, reconnectCallback, changedCallback, disconnectCallback, resolve, reject));
6350
6364
  }
6351
6365
  disconnect() {
6352
- var _a, _b;
6366
+ var _a;
6353
6367
  (_a = this._logger) === null || _a === void 0 ? void 0 : _a.debug('Disconnecting gRPC sync connection');
6354
- (_b = this._syncStream) === null || _b === void 0 ? void 0 : _b.destroy();
6368
+ closeStreamIfDefined(this._syncStream);
6355
6369
  this._syncClient.close();
6356
6370
  }
6357
6371
  listen(dataFillCallback, reconnectCallback, changedCallback, disconnectCallback, resolveConnect, rejectConnect) {
6372
+ closeStreamIfDefined(this._syncStream);
6358
6373
  this._syncStream = this._syncClient.syncFlags(this._request);
6359
6374
  this._syncStream.on('data', (data) => {
6360
6375
  var _a;
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@openfeature/flagd-provider",
3
- "version": "0.10.0",
3
+ "version": "0.10.2",
4
4
  "scripts": {
5
5
  "publish-if-not-exists": "cp $NPM_CONFIG_USERCONFIG .npmrc && if [ \"$(npm show $npm_package_name@$npm_package_version version)\" = \"$(npm run current-version -s)\" ]; then echo 'already published, skipping'; else npm publish --access public; fi",
6
6
  "current-version": "echo $npm_package_version"
7
7
  },
8
8
  "dependencies": {
9
- "@openfeature/flagd-core": ">=0.1.1",
9
+ "@openfeature/flagd-core": ">=0.1.3",
10
10
  "@protobuf-ts/runtime-rpc": "2.9.0",
11
11
  "lru-cache": "10.0.1",
12
12
  "util": "0.12.5"
@@ -7,6 +7,5 @@ declare const _default: {
7
7
  moduleNameMapper: {
8
8
  '@openfeature/flagd-core': string[];
9
9
  };
10
- globalTeardown: string;
11
10
  };
12
11
  export default _default;
@@ -0,0 +1,2 @@
1
+ import { ClientReadableStream } from '@grpc/grpc-js';
2
+ export declare const closeStreamIfDefined: (stream: ClientReadableStream<unknown> | undefined) => void;
@@ -0,0 +1 @@
1
+ export * from './grpc-util';
@@ -1,2 +0,0 @@
1
- declare const tearDownTests: () => Promise<void>;
2
- export default tearDownTests;