GRPC Session - Beta
Installation:
yarn add @asfweb/grpc-session
or
npm install @asfweb/grpc-session --save
Usage:
// Sessions.ts
import { Session, SessionRedisStore } from "@asfweb/grpc-session";
// Creates Session Store
// SessionRedisStore is using ioredis under the hood so all options for ioredis are available
// https://github.com/luin/ioredis
const sessionStore = new SessionRedisStore({ password: "12345" });
// Creates session
const session = new Session(sessionStore, { expires: 60 * 30 /* In seconds: 60 seconds * 30 = 30 min. */ });
export default session;
Auth Service:
// AuthService.ts
import path from "path";
import * as grpc from "@grpc/grpc-js";
import * as protoLoader from "@grpc/proto-loader";
import { ProtoGrpcType } from "./proto/auth";
import Session from "./lib/Session";
const PORT = 9060;
const PROTO_FILE = "./proto/auth.proto";
const packageDef = protoLoader.loadSync(path.resolve(__dirname, PROTO_FILE));
const grpcObj = grpc.loadPackageDefinition(
packageDef
) as unknown as ProtoGrpcType;
const authPackage = grpcObj.auth.v1;
function main() {
const server = getServer();
server.bindAsync(
`0.0.0.0:${PORT}`,
grpc.ServerCredentials.createInsecure(),
(err, port) => {
if (err) {
console.error(err);
return;
}
console.log(`Your auth server has started on port ${port}`);
server.start();
}
);
}
function getServer() {
const server = new grpc.Server();
server.addService(authPackage.AuthService.service, {
Login: async (call, callback) => {
// Check for existing session or create new one if doesn't exist
await Session.gRPC(call);
// Save some data in session
await Session.set("userId", 10).save();
return callback(null, {
sessionId: Session.id(),
});
},
});
return server;
}
main();
Some Service
// SomeService.ts
import path from "path";
import * as grpc from "@grpc/grpc-js";
import * as protoLoader from "@grpc/proto-loader";
import { ProtoGrpcType } from "./proto/some";
const PORT = 9070;
const PROTO_FILE = "../../proto/some.proto";
const packageDef = protoLoader.loadSync(path.resolve(__dirname, PROTO_FILE));
const grpcObj = grpc.loadPackageDefinition(
packageDef
) as unknown as ProtoGrpcType;
const grpcPackage = grpcObj.some.v1;
function main() {
const server = getServer();
server.bindAsync(
`0.0.0.0:${PORT}`,
grpc.ServerCredentials.createInsecure(),
(err, port) => {
if (err) {
console.error(err);
return;
}
console.log(`Your some server as started on port ${port}`);
server.start();
}
);
}
/**
* Creates a gRPC server
*
* @returns gRPC Server
*/
function getServer() {
const server = new grpc.Server();
// Add Services Here
server.addService(grpcPackage.SomeService.service, {
ListSome: async (call, callback) => {
try {
// Init Session
await Session.gRPC(call, {someKey:"someKeyToOverwrite"});
// Add Session Data
// chained
await Session
.set('someKey', 'someValue')
.set('anotherKey', 'anotherValue')
.save();
// or
Session.set('key1', 'value1');
Session.set('key2', 'value2');
// NOTE: Save must be executed after set in order to persist session data
await Session.save();
// Get Session Data
let someKey = Session.get('someKey');
console.log(someKey);
// Get all data
let sessionData = Session.get();
console.log(sessionData);
return callback(null, {...});
} catch (err) {
if (err instanceof Error) {
return callback(
{ code: grpc.status.INTERNAL, message: err.message },
null
);
}
}
}
});
return server;
}
// Start
main();
TODO:
- SessionFileStore
- SessionMongoStore
- SessionMysqlStore
- SessionSharedConfig