@asfweb/grpc-session
TypeScript icon, indicating that this package has built-in type declarations

1.0.55 • Public • Published

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

Package Sidebar

Install

npm i @asfweb/grpc-session

Weekly Downloads

1

Version

1.0.55

License

ISC

Unpacked Size

31.8 kB

Total Files

12

Last publish

Collaborators

  • frangolet