New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@zum/flash-client

Package Overview
Dependencies
Maintainers
0
Versions
40
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@zum/flash-client - npm Package Compare versions

Comparing version 0.0.17 to 0.0.18

7

dist/connect/flashSocket.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.FlashSocket = void 0;
const async_1 = require("async");

@@ -22,5 +23,4 @@ const socket_io_client_1 = require("socket.io-client");

};
this.execute = async (operationArgument) => {
console.log(`Executing ${JSON.stringify(operationArgument)}`);
await this.commandQueue.pushAsync(operationArgument);
this.execute = (operationArgument) => {
return this.commandQueue.pushAsync(operationArgument);
};

@@ -64,2 +64,3 @@ this.disconnect = () => {

this.commandQueue = async_1.queue((operationArgument, operationCompleteHandler) => {
console.log(`[Flash] Command: ${JSON.stringify(operationArgument)}`);
this.socket.emit(operationArgument.operation, operationArgument.args, (response) => {

@@ -66,0 +67,0 @@ switch (response.status) {

import { Observable } from 'rxjs';
import { FlashSocket } from './flashSocket';
import { FlashEvent } from './types';
import { EntityId, FlashEvent, Topic } from './types';
export declare class SubscriptionManager {

@@ -8,4 +8,4 @@ private flashSocket;

constructor(flashSocket: FlashSocket);
subscribe: (topic: string, entityIds: string[]) => Observable<FlashEvent>;
unsubscribeTopic: (topic: string) => Promise<void>;
subscribe: (topic: Topic, entityIds: EntityId[]) => Observable<FlashEvent>;
unsubscribeTopic: (topic: Topic) => Promise<void>;
disconnect: () => void;

@@ -12,0 +12,0 @@ private resubscribe;

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.SubscriptionManager = void 0;
const rxjs_1 = require("rxjs");

@@ -11,15 +12,29 @@ const types_1 = require("./types");

return new rxjs_1.Observable((subscriber) => {
this.subscriptions.set(topic, { entityIds, subscriber });
const subscriptionEntry = { entityIds, subscriber };
this.subscriptions.set(topic, subscriptionEntry);
void this.socketSubscribe(topic, entityIds, subscriber);
return () => this.unsubscribeTopic(topic);
return () => {
if (this.subscriptions.get(topic) === subscriptionEntry) {
return this.unsubscribeTopic(topic);
}
};
});
};
this.unsubscribeTopic = async (topic) => {
const subscription = this.subscriptions.get(topic);
this.subscriptions.delete(topic);
await this.flashSocket.execute({
this.unsubscribeTopic = (topic) => {
const currentSubscription = this.subscriptions.get(topic);
if (!currentSubscription) {
return Promise.resolve();
}
return this.flashSocket
.execute({
operation: types_1.FlashOperation.UNSUBSCRIBE_ALL,
args: { topic },
})
.then(() => {
const latestSubscription = this.subscriptions.get(topic);
if (latestSubscription === currentSubscription) {
this.subscriptions.delete(topic);
}
currentSubscription === null || currentSubscription === void 0 ? void 0 : currentSubscription.subscriber.complete();
});
subscription === null || subscription === void 0 ? void 0 : subscription.subscriber.complete();
};

@@ -26,0 +41,0 @@ this.disconnect = () => {

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.FlashOperationResponseEnum = exports.FlashOperationError = exports.FlashOperation = void 0;
var FlashOperation;

@@ -4,0 +5,0 @@ (function (FlashOperation) {

"use strict";
function __export(m) {
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
}
Object.defineProperty(exports, "__esModule", { value: true });
__export(require("./flashOperation"));
const tslib_1 = require("tslib");
tslib_1.__exportStar(require("./flashConfig"), exports);
tslib_1.__exportStar(require("./flashEvent"), exports);
tslib_1.__exportStar(require("./flashOperation"), exports);
//# sourceMappingURL=index.js.map
"use strict";
function __export(m) {
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
}
Object.defineProperty(exports, "__esModule", { value: true });
__export(require("./connect/types"));
__export(require("./sdk/api/ride"));
exports.FlashTopic = exports.disconnect = exports.connect = void 0;
const tslib_1 = require("tslib");
tslib_1.__exportStar(require("./connect/types"), exports);
tslib_1.__exportStar(require("./sdk/api/ride"), exports);
var initializer_1 = require("./sdk/init/initializer");
exports.connect = initializer_1.connect;
exports.disconnect = initializer_1.disconnect;
Object.defineProperty(exports, "connect", { enumerable: true, get: function () { return initializer_1.connect; } });
Object.defineProperty(exports, "disconnect", { enumerable: true, get: function () { return initializer_1.disconnect; } });
var topicTypes_1 = require("./sdk/topic/topicTypes");
exports.FlashTopic = topicTypes_1.FlashTopic;
Object.defineProperty(exports, "FlashTopic", { enumerable: true, get: function () { return topicTypes_1.FlashTopic; } });
//# sourceMappingURL=index.js.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.unsubscribeToRideRouteTrace = exports.subscribeToRideRouteTrace = exports.unsubscribeToRidesSecondary = exports.subscribeToRidesSecondary = exports.unsubscribeToRidesPrimary = exports.subscribeToRidesPrimary = void 0;
const rxjs_1 = require("rxjs");
const operators_1 = require("rxjs/operators");

@@ -10,24 +12,38 @@ const initializer_1 = require("../init/initializer");

};
const DEFAULT_THROTTLE_MS = 1000;
exports.subscribeToRidesPrimary = (rideIds, getRideImpl) => {
const DEFAULT_THROTTLE_MS = 2000;
const subscribeToRidesPrimary = (rideIds, getRideImpl) => {
return subscribeToRides(topicTypes_1.FlashTopic.RIDE_LIST_PRIMARY, rideIds, getRideImpl);
};
exports.unsubscribeToRidesPrimary = () => unsubscribe(topicTypes_1.FlashTopic.RIDE_LIST_PRIMARY);
exports.subscribeToRidesSecondary = (rideIds, getRideImpl) => {
exports.subscribeToRidesPrimary = subscribeToRidesPrimary;
const unsubscribeToRidesPrimary = () => unsubscribe(topicTypes_1.FlashTopic.RIDE_LIST_PRIMARY);
exports.unsubscribeToRidesPrimary = unsubscribeToRidesPrimary;
const subscribeToRidesSecondary = (rideIds, getRideImpl) => {
return subscribeToRides(topicTypes_1.FlashTopic.RIDE_LIST_SECONDARY, rideIds, getRideImpl);
};
exports.unsubscribeToRidesSecondary = () => unsubscribe(topicTypes_1.FlashTopic.RIDE_LIST_SECONDARY);
exports.subscribeToRidesSecondary = subscribeToRidesSecondary;
const unsubscribeToRidesSecondary = () => unsubscribe(topicTypes_1.FlashTopic.RIDE_LIST_SECONDARY);
exports.unsubscribeToRidesSecondary = unsubscribeToRidesSecondary;
const subscribeToRides = (topic, rideIds, getRideDetail) => {
return initializer_1.getSubscriptionManager()
.subscribe(topic, rideIds)
.pipe(operators_1.switchMap((event) => {
return getRideDetail(event.entityId).pipe(operators_1.map((ride) => {
return { rideId: event.entityId, result: ride };
const ridesObservable = initializer_1.getSubscriptionManager().subscribe(topic, rideIds);
const ridesObservableSubject = new rxjs_1.Subject();
const ridesObservableSubscription = ridesObservable.subscribe(ridesObservableSubject);
const rideObservableArray = rideIds.map((rideId) => {
return ridesObservableSubject.pipe(operators_1.filter((event) => event.entityId === rideId), operators_1.throttleTime(DEFAULT_THROTTLE_MS, rxjs_1.asyncScheduler, throttleConfig), operators_1.switchMap((event) => {
return getRideDetail(event.entityId).pipe(operators_1.map((ride) => {
return { rideId: event.entityId, result: ride };
}));
}));
}), operators_1.tap((val) => console.log(`Ride Flash Event ${JSON.stringify(val)}`)));
});
//Placeholder Observable for executing tier down logic on Merged Observable
const tearDownObservable = new rxjs_1.Observable(() => {
return () => {
ridesObservableSubscription.unsubscribe();
};
});
return rxjs_1.merge(...rideObservableArray, tearDownObservable);
};
exports.subscribeToRideRouteTrace = (rideId, getRideTraceLastFetchIndex, getActiveRideTrace) => {
const subscribeToRideRouteTrace = (rideId, getRideTraceLastFetchIndex, getActiveRideTrace) => {
return initializer_1.getSubscriptionManager()
.subscribe(topicTypes_1.FlashTopic.ROUTE_TRACE, [rideId])
.pipe(operators_1.switchMap((event) => {
.pipe(operators_1.throttleTime(DEFAULT_THROTTLE_MS, rxjs_1.asyncScheduler, throttleConfig), operators_1.switchMap((event) => {
return getRideTraceLastFetchIndex().pipe(operators_1.switchMap((traceLastFetchIndex) => getActiveRideTrace({

@@ -37,5 +53,7 @@ rideId: event.entityId,

})));
}), operators_1.map((traces) => ({ rideId, result: traces })), operators_1.tap((val) => console.log(`Ride Trace Flash Event: ${JSON.stringify(val)}`)));
}), operators_1.map((traces) => ({ rideId, result: traces })));
};
exports.unsubscribeToRideRouteTrace = () => unsubscribe(topicTypes_1.FlashTopic.ROUTE_TRACE);
exports.subscribeToRideRouteTrace = subscribeToRideRouteTrace;
const unsubscribeToRideRouteTrace = () => unsubscribe(topicTypes_1.FlashTopic.ROUTE_TRACE);
exports.unsubscribeToRideRouteTrace = unsubscribeToRideRouteTrace;
const unsubscribe = (topic) => {

@@ -42,0 +60,0 @@ return initializer_1.getSubscriptionManager().unsubscribeTopic(topic);

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.disconnect = exports.connect = exports.getSubscriptionManager = void 0;
const flashSocket_1 = require("../../connect/flashSocket");
const subscriptionManager_1 = require("../../connect/subscriptionManager");
let subscriptionManager;
exports.getSubscriptionManager = () => {
const getSubscriptionManager = () => {
if (!subscriptionManager) {

@@ -12,10 +13,13 @@ throw new Error('Flash client must be initialized first');

};
exports.connect = (config) => {
exports.disconnect(); // TODO(Sreejith): please check if this allows for clients to re-initialize cleanly if needed
exports.getSubscriptionManager = getSubscriptionManager;
const connect = (config) => {
exports.disconnect();
const flashSocket = new flashSocket_1.FlashSocket(config);
subscriptionManager = new subscriptionManager_1.SubscriptionManager(flashSocket);
};
exports.disconnect = () => {
exports.connect = connect;
const disconnect = () => {
subscriptionManager === null || subscriptionManager === void 0 ? void 0 : subscriptionManager.disconnect();
};
exports.disconnect = disconnect;
//# sourceMappingURL=initializer.js.map
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.FlashTopic = void 0;
var FlashTopic;

@@ -4,0 +5,0 @@ (function (FlashTopic) {

@@ -24,2 +24,3 @@ import { AsyncQueue, queue } from 'async';

(operationArgument, operationCompleteHandler) => {
console.log(`[Flash] Command: ${JSON.stringify(operationArgument)}`);
this.socket.emit(operationArgument.operation, operationArgument.args, (response: FlashOperationResponse) => {

@@ -57,5 +58,4 @@ switch (response.status) {

public execute = async (operationArgument: FlashOperationArgument): Promise<void> => {
console.log(`Executing ${JSON.stringify(operationArgument)}`);
await this.commandQueue.pushAsync(operationArgument);
public execute = (operationArgument: FlashOperationArgument): Promise<void> => {
return this.commandQueue.pushAsync(operationArgument);
};

@@ -62,0 +62,0 @@

@@ -24,16 +24,31 @@ import { Observable, Subscriber } from 'rxjs';

return new Observable<FlashEvent>((subscriber: Subscriber<FlashEvent>) => {
this.subscriptions.set(topic, { entityIds, subscriber });
const subscriptionEntry = { entityIds, subscriber };
this.subscriptions.set(topic, subscriptionEntry);
void this.socketSubscribe(topic, entityIds, subscriber);
return () => this.unsubscribeTopic(topic);
return () => {
if (this.subscriptions.get(topic) === subscriptionEntry) {
return this.unsubscribeTopic(topic);
}
};
});
};
public unsubscribeTopic = async (topic: Topic): Promise<void> => {
const subscription = this.subscriptions.get(topic);
this.subscriptions.delete(topic);
await this.flashSocket.execute({
operation: FlashOperation.UNSUBSCRIBE_ALL,
args: { topic },
});
subscription?.subscriber.complete();
public unsubscribeTopic = (topic: Topic): Promise<void> => {
const currentSubscription = this.subscriptions.get(topic);
if (!currentSubscription) {
return Promise.resolve();
}
return this.flashSocket
.execute({
operation: FlashOperation.UNSUBSCRIBE_ALL,
args: { topic },
})
.then(() => {
const latestSubscription = this.subscriptions.get(topic);
if (latestSubscription === currentSubscription) {
this.subscriptions.delete(topic);
}
currentSubscription?.subscriber.complete();
});
};

@@ -40,0 +55,0 @@

@@ -1,3 +0,3 @@

import { Observable } from 'rxjs';
import { map, switchMap, tap } from 'rxjs/operators';
import { asyncScheduler, merge, Observable, Subject } from 'rxjs';
import { filter, map, switchMap, throttleTime } from 'rxjs/operators';
import { FlashEvent } from '../../connect/types/flashEvent';

@@ -12,3 +12,3 @@ import { getSubscriptionManager } from '../init/initializer';

};
const DEFAULT_THROTTLE_MS = 1000;
const DEFAULT_THROTTLE_MS = 2000;

@@ -37,5 +37,10 @@ export const subscribeToRidesPrimary = <T>(

): RideResponseObservable<T> => {
return getSubscriptionManager()
.subscribe(topic, rideIds)
.pipe(
const ridesObservable = getSubscriptionManager().subscribe(topic, rideIds);
const ridesObservableSubject = new Subject<FlashEvent>();
const ridesObservableSubscription = ridesObservable.subscribe(ridesObservableSubject);
const rideObservableArray: RideResponseObservable<T>[] = rideIds.map((rideId) => {
return ridesObservableSubject.pipe(
filter((event) => event.entityId === rideId),
throttleTime(DEFAULT_THROTTLE_MS, asyncScheduler, throttleConfig),
switchMap((event: FlashEvent) => {

@@ -48,4 +53,13 @@ return getRideDetail(event.entityId).pipe(

}),
tap((val) => console.log(`Ride Flash Event ${JSON.stringify(val)}`)),
);
});
//Placeholder Observable for executing tier down logic on Merged Observable
const tearDownObservable = new Observable<T>(() => {
return () => {
ridesObservableSubscription.unsubscribe();
};
});
return merge(...rideObservableArray, tearDownObservable);
};

@@ -61,2 +75,3 @@

.pipe(
throttleTime(DEFAULT_THROTTLE_MS, asyncScheduler, throttleConfig),
switchMap((event: FlashEvent) => {

@@ -73,3 +88,2 @@ return getRideTraceLastFetchIndex().pipe(

map((traces) => ({ rideId, result: traces })),
tap((val) => console.log(`Ride Trace Flash Event: ${JSON.stringify(val)}`)),
);

@@ -76,0 +90,0 @@ };

@@ -15,3 +15,3 @@ import { FlashSocket } from '../../connect/flashSocket';

export const connect = (config: FlashConfig): void => {
disconnect(); // TODO(Sreejith): please check if this allows for clients to re-initialize cleanly if needed
disconnect();
const flashSocket = new FlashSocket(config);

@@ -18,0 +18,0 @@ subscriptionManager = new SubscriptionManager(flashSocket);

{
"name": "@zum/flash-client",
"version": "0.0.17",
"version": "0.0.18",
"description": "Client for connecting to Zum Flash server",

@@ -20,4 +20,3 @@ "license": "UNLICENSED",

"rxjs": "^6.5.5",
"socket.io": "^3.1.1",
"socket.io-client": "^3.1.1"
"socket.io-client": "^3.1.2"
},

@@ -24,0 +23,0 @@ "devDependencies": {

@@ -1,4 +0,11 @@

import { from, Observable } from 'rxjs';
import { Observable, of } from 'rxjs';
import { io as socketIO } from 'socket.io-client';
import { connect, subscribeToRidesPrimary } from '../lib';
import {
connect,
FlashOperation,
FlashOperationResponseEnum,
FlashTopic,
subscribeToRidesPrimary,
unsubscribeToRidesPrimary,
} from '../lib';

@@ -10,15 +17,82 @@ jest.mock('socket.io-client');

describe('rideFlashSdk.spec.ts', function () {
test('should create flash client', (done) => {
connect({
baseUrl: 'testUrl',
accessTokenIssuer: async () => 'token1',
appRole: 'admin',
});
(socketIO as jest.Mock).mockReturnValue(jest.fn());
subscribeToRidesPrimary(['rideId1', 'rideId2'], (rideId): Observable<string> => from(rideId)).subscribe((x) => {
console.log(x);
done();
});
test('should be able to subscribe to a topic', (done) => {
const mockSocketConnection = getMockedSocket();
const rides = ['rideId1', 'rideId2'];
let count = 0;
const ridesSubscription = subscribeToRidesPrimary(
rides,
(rideId: string): Observable<{ rideId: string }> => of({ rideId }),
).subscribe(async (event) => {
expect(mockSocketConnection.emit).toBeCalledWith(
FlashOperation.SUBSCRIBE,
expect.objectContaining({
entityIds: expect.arrayContaining(rides),
topic: FlashTopic.RIDE_LIST_PRIMARY,
}),
expect.anything(),
);
expect(rides.includes(event.rideId)).toBeTruthy();
expect(event.result).toBeDefined();
expect(mockSocketConnection.emit).not.toBeCalledWith(
FlashOperation.UNSUBSCRIBE_ALL,
expect.objectContaining({
topic: FlashTopic.RIDE_LIST_PRIMARY,
}),
expect.anything(),
);
if (++count === 2) {
ridesSubscription.unsubscribe();
//Moving the expect to the end of next tick so that the unsubscribe call is complete
setTimeout(() => {
expect(mockSocketConnection.emit).toBeCalledWith(
FlashOperation.UNSUBSCRIBE_ALL,
expect.objectContaining({
topic: FlashTopic.RIDE_LIST_PRIMARY,
}),
expect.anything(),
);
done();
}, 0);
}
});
});
test('should be able to unsubscribe all topic', async () => {
const mockSocketConnection = getMockedSocket();
connect({
baseUrl: 'testUrl',
accessTokenIssuer: async () => 'token1',
appRole: 'admin',
});
subscribeToRidesPrimary(['ride1'], (rideId: string): Observable<{ rideId: string }> => of({ rideId }));
await unsubscribeToRidesPrimary();
expect(mockSocketConnection.emit).toBeCalledWith(
FlashOperation.UNSUBSCRIBE_ALL,
expect.objectContaining({
topic: FlashTopic.RIDE_LIST_PRIMARY,
}),
expect.anything(),
);
});
function getMockedSocket() {
const mockSocketConnection = {
on: jest.fn(),
disconnect: jest.fn(),
emit: jest.fn((operation, args, returnHandler) => {
returnHandler({ status: FlashOperationResponseEnum.SUCCESS });
}),
};
(socketIO as jest.Mock).mockReturnValue(mockSocketConnection);
connect({
baseUrl: 'testUrl',
accessTokenIssuer: async () => 'token1',
appRole: 'admin',
});
return mockSocketConnection;
}

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc