Registry /
devops / alvintanudjaja-grpc-lib
Install & Compatibility
Where this runs
No compatibility data collected yet for this library.
Code
Verified usage
Verified import paths — ran on the pinned version, not inferred.
BaseService
✓ import { BaseService } from 'alvintanudjaja-grpc-lib';
Named export; package is ESM/CJS hybrid but recommends import syntax.
BaseClient
✓ import { BaseClient } from 'alvintanudjaja-grpc-lib';
✗ const { BaseClient } = require('alvintanudjaja-grpc-lib');
CommonJS require works but TypeScript consumers should use import.
Middleware
✓ import { Middleware } from 'alvintanudjaja-grpc-lib';
Type exported for middleware signature (type only).
Authenticate
✓ import { Authenticate } from 'alvintanudjaja-grpc-lib';
✗ import { authenticate } from 'alvintanudjaja-grpc-lib';
Class names are PascalCase; incorrect casing is a common mistake.
jwtUtil
✓ import { jwtUtil } from 'alvintanudjaja-grpc-lib';
Utility object with functions generate() and verify().
Demonstrates using BaseService with custom middleware (auth, audit, monitor), BaseClient for calling RPC, JWT utility, and config loader.
import { BaseService, BaseClient, Middleware, Authenticate, Authorize, Audit, ErrorHandler, Init, Monitor, jwtUtil, config } from 'alvintanudjaja-grpc-lib';
import * as protoLoader from '@grpc/proto-loader';
import { loadPackageDefinition, Server, ServerCredentials, credentials } from '@grpc/grpc-js';
// Load proto
const packageDefinition = protoLoader.loadSync('service.proto', { keepCase: true, longs: String, enums: String, defaults: true, oneofs: true });
const proto = loadPackageDefinition(packageDefinition).helloworld;
// Server
class GreeterService extends BaseService {
constructor() {
super();
}
async sayHello(call) {
return { message: 'Hello ' + call.request.name };
}
}
const middleware = [
new Init(),
new Authenticate({ secret: process.env.JWT_SECRET ?? 'default_secret' }),
new Authorize({ service: 'greeter' }),
new Audit(),
new Monitor(),
new ErrorHandler()
];
const server = new Server();
server.addService(proto.Greeter.service, new GreeterService().handleMiddlewares(middleware));
server.bindAsync('0.0.0.0:50051', ServerCredentials.createInsecure(), (err) => {
if (err) throw err;
console.log('Server running at 0.0.0.0:50051');
});
// Client
const client = new BaseClient(proto.Greeter, 'localhost:50051', credentials.createInsecure());
client.call('sayHello', { name: 'World' }).then(res => console.log(res.message)).catch(err => console.error(err));
// JWT
const token = jwtUtil.generate({ userId: 1, permissions: ['greeter.sayHello'] }, process.env.JWT_SECRET ?? 'secret', { expiresIn: '1h' });
const payload = jwtUtil.verify(token, process.env.JWT_SECRET ?? 'secret');
// Config (uses dotenv)
config.load();
console.log(process.env.DB_HOST);
Errors
Common errors & fixes
Error: Cannot find module '@grpc/grpc-js'
Missing peer dependency.
fixRun: npm install @grpc/grpc-js @grpc/proto-loader
TypeError: Class extends value undefined is not a constructor or null
BaseService or BaseClient not imported correctly (likely wrong import path or CommonJS mismatch).
fixUse: import { BaseService } from 'alvintanudjaja-grpc-lib' Error: Unexpected token o in JSON at position 1
Returning a non-object from service method; gRPC expects serializable object.
fixEnsure methods return an object, e.g., `return { message: 'Hello' }`. TypeError: middleware is not a function
`handleMiddlewares` expects an array of middleware instances; passing something else.
fixPass array: `new MyService().handleMiddlewares([new Authenticate({...})])`. Audit
Dependencies
@grpc/grpc-jsrequiredgRPC core library
@grpc/proto-loaderrequiredProtocol buffer file loading
dotenvrequiredLoading .env files (config utility)
jsonwebtokenrequiredJWT generation/verification