├── .gitignore
├── tRPC
├── client
│ ├── src
│ │ ├── vite-env.d.ts
│ │ └── client.ts
│ ├── vite.config.ts
│ ├── tsconfig.node.json
│ ├── .gitignore
│ ├── index.html
│ ├── package.json
│ ├── tsconfig.json
│ └── public
│ │ └── vite.svg
└── server
│ ├── package.json
│ ├── api.ts
│ ├── trpc.ts
│ ├── router.ts
│ ├── tsconfig.json
│ └── package-lock.json
├── protobuf
├── data.json
├── binaryData
├── employees.proto
├── package.json
├── index.js
├── package-lock.json
└── employees_pb.js
├── gRPC
├── package.json
├── todo.proto
├── client.js
└── server.js
└── Zod
├── package.json
├── index.ts
├── index.js
├── tsconfig.json
└── package-lock.json
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
--------------------------------------------------------------------------------
/tRPC/client/src/vite-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/protobuf/data.json:
--------------------------------------------------------------------------------
1 | [{ "name": "Rakesh" }, { "name": "Ramesh" }, { "name": "Rajesh" }]
2 |
--------------------------------------------------------------------------------
/protobuf/binaryData:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/aidenk-dev/grpc-trpc/HEAD/protobuf/binaryData
--------------------------------------------------------------------------------
/tRPC/client/vite.config.ts:
--------------------------------------------------------------------------------
1 | import { defineConfig } from 'vite'
2 | import react from '@vitejs/plugin-react'
3 |
4 | // https://vitejs.dev/config/
5 | export default defineConfig({
6 | plugins: [react()]
7 | })
8 |
--------------------------------------------------------------------------------
/protobuf/employees.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto3";
2 | message Employee{
3 | int32 id = 1;
4 | string name = 2;
5 | float salary = 3;
6 | }
7 |
8 | message Employees{
9 | repeated Employee employees = 1;
10 | }
11 |
--------------------------------------------------------------------------------
/tRPC/client/tsconfig.node.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "composite": true,
4 | "module": "ESNext",
5 | "moduleResolution": "Node",
6 | "allowSyntheticDefaultImports": true
7 | },
8 | "include": ["vite.config.ts"]
9 | }
10 |
--------------------------------------------------------------------------------
/protobuf/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "protobuf",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "google-protobuf": "^3.21.2"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/tRPC/client/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 | npm-debug.log*
5 | yarn-debug.log*
6 | yarn-error.log*
7 | pnpm-debug.log*
8 | lerna-debug.log*
9 |
10 | node_modules
11 | dist
12 | dist-ssr
13 | *.local
14 |
15 | # Editor directories and files
16 | .vscode/*
17 | !.vscode/extensions.json
18 | .idea
19 | .DS_Store
20 | *.suo
21 | *.ntvs*
22 | *.njsproj
23 | *.sln
24 | *.sw?
25 |
--------------------------------------------------------------------------------
/tRPC/server/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "@trpc/server": "^10.14.0",
4 | "cors": "^2.8.5",
5 | "express": "^4.18.2",
6 | "ts-node": "^10.9.1",
7 | "ws": "^8.12.1",
8 | "zod": "^3.21.0"
9 | },
10 | "devDependencies": {
11 | "@types/cors": "^2.8.13",
12 | "@types/express": "^4.17.17",
13 | "@types/ws": "^8.5.4"
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/gRPC/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "simpletodo",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "echo \"Error: no test specified\" && exit 1"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "@grpc/proto-loader": "^0.7.5",
14 | "grpc": "^1.24.11"
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/tRPC/client/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 | Vite + React + TS
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/gRPC/todo.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto3";
2 |
3 | package todo;
4 |
5 | service Todo{
6 | rpc createTodo(TodoInput) returns (TodoItem);
7 | rpc readTodos(noparameter) returns (TodoItems);
8 | rpc readTodosStream(noparameter) returns (stream TodoItem);
9 | }
10 |
11 | message noparameter{}
12 |
13 | message TodoItem{
14 | int32 id = 1;
15 | string text =2;
16 | }
17 |
18 | message TodoInput{
19 | string text = 1;
20 | }
21 |
22 | message TodoItems{
23 | repeated TodoItem items = 1;
24 | }
25 |
--------------------------------------------------------------------------------
/Zod/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "zod",
3 | "version": "1.0.0",
4 | "description": "Zod is a validation library, It uses required by default.",
5 | "main": "index.js",
6 | "scripts": {
7 | "start": "tsc && nodemon index.js"
8 | },
9 | "keywords": [],
10 | "author": "",
11 | "license": "ISC",
12 | "dependencies": {
13 | "express": "^4.18.2",
14 | "zod": "^3.21.0"
15 | },
16 | "devDependencies": {
17 | "nodemon": "^2.0.21",
18 | "ts-node": "^10.9.1",
19 | "typescript": "^4.9.5"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/tRPC/client/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "client",
3 | "private": true,
4 | "version": "0.0.0",
5 | "type": "module",
6 | "scripts": {
7 | "dev": "vite",
8 | "build": "tsc && vite build",
9 | "preview": "vite preview"
10 | },
11 | "dependencies": {
12 | "@trpc/client": "^10.14.0",
13 | "react": "^18.2.0",
14 | "react-dom": "^18.2.0"
15 | },
16 | "devDependencies": {
17 | "@types/react": "^18.0.24",
18 | "@types/react-dom": "^18.0.8",
19 | "@vitejs/plugin-react": "^2.2.0",
20 | "typescript": "^4.6.4",
21 | "vite": "^3.2.3"
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/tRPC/client/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "ESNext",
4 | "useDefineForClassFields": true,
5 | "lib": ["DOM", "DOM.Iterable", "ESNext"],
6 | "allowJs": false,
7 | "skipLibCheck": true,
8 | "esModuleInterop": false,
9 | "allowSyntheticDefaultImports": true,
10 | "strict": true,
11 | "forceConsistentCasingInFileNames": true,
12 | "module": "ESNext",
13 | "moduleResolution": "Node",
14 | "resolveJsonModule": true,
15 | "isolatedModules": true,
16 | "noEmit": true,
17 | "jsx": "react-jsx"
18 | },
19 | "include": ["src"],
20 | "references": [{ "path": "./tsconfig.node.json" }]
21 | }
22 |
--------------------------------------------------------------------------------
/tRPC/server/api.ts:
--------------------------------------------------------------------------------
1 | import express from "express";
2 | import cors from "cors";
3 | import * as trpcExpress from "@trpc/server/adapters/express";
4 | import createContext from "./trpc";
5 | import { appRouter } from "./router";
6 | import * as trpcWS from "@trpc/server/adapters/ws";
7 | import ws from "ws";
8 |
9 | const app = express();
10 | app.use(cors());
11 |
12 | app.use(
13 | "/trpc",
14 | trpcExpress.createExpressMiddleware({
15 | router: appRouter,
16 | createContext
17 | })
18 | );
19 |
20 | const server = app.listen(3000);
21 |
22 | trpcWS.applyWSSHandler({
23 | wss: new ws.Server({ server }),
24 | router: appRouter,
25 | createContext
26 | });
27 |
28 | export type AppRouter = typeof appRouter;
29 |
--------------------------------------------------------------------------------
/tRPC/server/trpc.ts:
--------------------------------------------------------------------------------
1 | import * as trpcExpress from "@trpc/server/adapters/express";
2 | import { initTRPC, inferAsyncReturnType, TRPCError } from "@trpc/server";
3 | const createContext = () => {
4 | return {
5 | role: true
6 | };
7 | };
8 | type Context = inferAsyncReturnType;
9 | export const t = initTRPC.context().create();
10 | const isAdminMiddleware = t.middleware(({ ctx, next }) => {
11 | if (!ctx.role) {
12 | throw new TRPCError({
13 | code: "UNAUTHORIZED"
14 | });
15 | }
16 | return next({
17 | ctx: {
18 | user: {
19 | id: 1
20 | }
21 | }
22 | });
23 | });
24 | export const adminProcedure = t.procedure.use(isAdminMiddleware);
25 | export default createContext;
26 |
--------------------------------------------------------------------------------
/protobuf/index.js:
--------------------------------------------------------------------------------
1 | const fs = require("fs");
2 | const Schema = require("./employees_pb");
3 | const ritvik = new Schema.Employee();
4 | ritvik.setId(100);
5 | ritvik.setName("Rakesh");
6 | ritvik.setSalary(20000);
7 | const ramesh = new Schema.Employee();
8 | ramesh.setId(11200);
9 | ramesh.setName("Rakesh");
10 | ramesh.setSalary(20222);
11 | const employees = new Schema.Employees();
12 | employees.addEmployees(ritvik);
13 | employees.addEmployees(ramesh);
14 | console.log(employees);
15 | console.log("binary: " + employees.serializeBinary());
16 | fs.writeFileSync("./binaryData", employees.serializeBinary());
17 | const buffer = fs.readFileSync("./binaryData");
18 | const employees2 = Schema.Employees.deserializeBinary(buffer);
19 | console.log(employees2);
20 |
--------------------------------------------------------------------------------
/gRPC/client.js:
--------------------------------------------------------------------------------
1 | const grpc = require("grpc");
2 | const protoLoader = require("@grpc/proto-loader");
3 | const packageDef = protoLoader.loadSync("./todo.proto", {});
4 | const g = grpc.loadPackageDefinition(packageDef);
5 | const todoPackage = g.todo;
6 |
7 | const client = new todoPackage.Todo(
8 | "localhost:5000",
9 | grpc.credentials.createInsecure()
10 | );
11 | client.createTodo(
12 | {
13 | text: "I am todo"
14 | },
15 | (err, resp) => {
16 | console.log(resp);
17 | }
18 | );
19 |
20 | client.readTodos({}, (err, resp) => {
21 | console.log(resp);
22 | });
23 |
24 | const call = client.readTodosStream();
25 | call.on("data", (item) => {
26 | console.log(item);
27 | });
28 | call.on("end", () => {
29 | console.log("Done");
30 | });
31 |
--------------------------------------------------------------------------------
/gRPC/server.js:
--------------------------------------------------------------------------------
1 | const grpc = require("grpc");
2 | const protoLoader = require("@grpc/proto-loader");
3 | const packageDef = protoLoader.loadSync("./todo.proto", {});
4 | const g = grpc.loadPackageDefinition(packageDef);
5 | const todoPackage = g.todo;
6 |
7 | const server = new grpc.Server();
8 | server.bind("0.0.0.0:5000", grpc.ServerCredentials.createInsecure());
9 | server.addService(todoPackage.Todo.service, {
10 | createTodo: createTodo,
11 | readTodos: readTodos,
12 | readTodosStream: readTodosStream
13 | });
14 | server.start();
15 |
16 | const Todos = [];
17 | function createTodo(call, callback) {
18 | const item = {
19 | id: Todos.length + 1,
20 | text: call.request.text
21 | };
22 | Todos.push(item);
23 | callback(null, item);
24 | }
25 | function readTodos(call, callback) {
26 | callback(null, {
27 | items: Todos
28 | });
29 | }
30 | function readTodosStream(call, callback) {
31 | Todos.forEach((t) => call.write(t));
32 | call.end();
33 | }
34 |
--------------------------------------------------------------------------------
/protobuf/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "protobuf",
3 | "version": "1.0.0",
4 | "lockfileVersion": 2,
5 | "requires": true,
6 | "packages": {
7 | "": {
8 | "name": "protobuf",
9 | "version": "1.0.0",
10 | "license": "ISC",
11 | "dependencies": {
12 | "google-protobuf": "^3.21.2"
13 | }
14 | },
15 | "node_modules/google-protobuf": {
16 | "version": "3.21.2",
17 | "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz",
18 | "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA=="
19 | }
20 | },
21 | "dependencies": {
22 | "google-protobuf": {
23 | "version": "3.21.2",
24 | "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.21.2.tgz",
25 | "integrity": "sha512-3MSOYFO5U9mPGikIYCzK0SaThypfGgS6bHqrUGXG3DPHCrb+txNqeEcns1W0lkGfk0rCyNXm7xB9rMxnCiZOoA=="
26 | }
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/tRPC/server/router.ts:
--------------------------------------------------------------------------------
1 | import { adminProcedure, t } from "./trpc";
2 | import { z } from "zod";
3 | import { observable } from "@trpc/server/observable";
4 | import { EventEmitter } from "stream";
5 |
6 | const events = new EventEmitter();
7 |
8 | const userRouter = t.router({
9 | getUser: t.procedure.query((req) => {
10 | return [{ id: 1, name: "RAKESH" }];
11 | })
12 | });
13 |
14 | export const appRouter = t.router({
15 | greet: t.procedure.input(z.string()).query((req) => {
16 | console.log(req.ctx);
17 | return req.input;
18 | }),
19 | addData: t.procedure
20 | .input(
21 | z.object({
22 | name: z.string(),
23 | email: z.string().email()
24 | })
25 | )
26 | .mutation((req) => {
27 | console.log(req.input);
28 | events.emit("add", req.input.email);
29 | }),
30 | secretData: adminProcedure.query(({ ctx }) => {
31 | console.log(ctx.user);
32 | }),
33 | users: userRouter,
34 | onaddData: t.procedure.subscription(() => {
35 | return observable