{"_id":"123peterkim-minirpc","name":"123peterkim-minirpc","dist-tags":{"latest":"0.0.1"},"versions":{"0.0.1":{"name":"123peterkim-minirpc","version":"0.0.1","type":"module","exports":{".":{"types":"./lib/types.d.ts","node":"./dist/node.js","default":"./dist/core.js"},"./core":{"types":"./lib/types.d.ts","default":"./dist/core.js"},"./node":{"types":"./lib/types.d.ts","default":"./dist/node.js"}},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/123peterkim/minirpc.git"},"scripts":{"build":"tsc lib/*.ts --rootDir ./lib --outDir ./dist --skipLibCheck --target esnext --module esnext --moduleResolution bundler","test":"npm run build && node --test --import tsx ./test/test.ts","lint":"tsc --noEmit && eslint lib test"},"dependencies":{"devalue":"^5.0.0","ws":"^8.18.0"},"devDependencies":{"@types/node":"^22.5.4","@types/ws":"^8.5.12","eslint":"^9.10.0","tsx":"^4.19.0","typescript":"^5.5.4","typescript-eslint":"^8.4.0"},"prettier":{"semi":false,"singleQuote":true,"trailingComma":"all","useTabs":true},"_id":"123peterkim-minirpc@0.0.1","gitHead":"c695b4034f26344923a3943fa30ac188d400ee47","description":"Server:","bugs":{"url":"https://github.com/123peterkim/minirpc/issues"},"homepage":"https://github.com/123peterkim/minirpc#readme","_nodeVersion":"20.17.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-odPAVWHfkQ+M9z+P71raMpw67NX2PHfnd9DkOF1n31KC+hq56f+1vMWa1uoVooIreRFeS2jsNYt4q5wJqSGdwg==","shasum":"31b163c6044015ec6b68ca396e37a0ca2d3e2200","tarball":"https://registry.npmjs.org/123peterkim-minirpc/-/123peterkim-minirpc-0.0.1.tgz","fileCount":5,"unpackedSize":35892,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIH7L/+ZkGeogsqyBwGGG/LvUccKd8De0cIUqhd3q/kH2AiEAya+r2ytPXvXeXSc7lzth/QQgg78dGoDdvAAdbbT6Iv4="}]},"_npmUser":{"name":"123peterkim","email":"123peterkim@gmail.com"},"directories":{},"maintainers":[{"name":"123peterkim","email":"123peterkim@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/123peterkim-minirpc_0.0.1_1729940942946_0.46404093814555347"},"_hasShrinkwrap":false}},"time":{"created":"2024-10-26T11:09:02.944Z","0.0.1":"2024-10-26T11:09:03.129Z","modified":"2024-10-26T11:09:03.416Z"},"maintainers":[{"name":"123peterkim","email":"123peterkim@gmail.com"}],"description":"Server:","homepage":"https://github.com/123peterkim/minirpc#readme","repository":{"type":"git","url":"git+https://github.com/123peterkim/minirpc.git"},"bugs":{"url":"https://github.com/123peterkim/minirpc/issues"},"license":"MIT","readme":"## Basic Usage\n\nServer:\n\n```ts\nimport { createServer } from 'minirpc'\n\nconst server = createServer()\n\nconst router = server.router({\n\tgreet(name: string) {\n\t\treturn `Hello ${name}`\n\t},\n})\n\nexport type Router = typeof router\n\nawait server.serve({ port: 3000 })\n```\n\nClient:\n\n```ts\nimport createClient from 'minirpc'\nimport type { Router } from './server'\n\nconst api = createClient<Router>({\n\turl: 'ws://localhost:3000',\n})\n\nconsole.log(await api.greet('World')) // Hello World\n```\n\n## Subscriptions\n\nServer:\n\n```ts\nimport { createChannel } from 'minirpc'\n\nconst channel = createChannel((name: string) => {\n\treturn `Welcome ${name} to this channel`\n})\n\nsetInterval(() => {\n\tchannel.push(`This channel has ${channel.size} subscribers`)\n}, 1000)\n\nrouter({\n\tgetEvents: channel.pull,\n})\n```\n\nClient:\n\n```ts\napi.getEvents('John Doe').subscribe((event) => {\n\t// Welcome John Doe to this channel\n\t// This channel has 1 subscribers\n\tconsole.log(event)\n})\n```\n\n## Context\n\n```ts\nimport { createContext, RPCClientError } from 'minirpc'\n\nconst userIdContext = createContext<string>()\n\nrouter({\n\tlogIn(username: string, password: string) {\n\t\tconst userId = userIdContext()\n\t\tif (username === 'Admin' && password === '123456') {\n\t\t\tuserId.set('admin')\n\t\t} else {\n\t\t\tthrow new RPCClientError('Wrong credentials')\n\t\t}\n\t},\n\tgetAdminData() {\n\t\tconst userId = userIdContext()\n\t\tif (userId.get() === 'admin') {\n\t\t\treturn 'secret'\n\t\t} else {\n\t\t\tthrow new RPCClientError('Expected Admin')\n\t\t}\n\t},\n})\n```\n\n## Connection Options\n\nServer:\n\n```ts\nserver.serve({\n\tonUpgrade(ctx) {\n\t\tif (ctx.request.url === '/forbidden') {\n\t\t\tctx.error(401)\n\t\t\treturn\n\t\t}\n\t\tconst ws = ctx.upgrade()\n\t\tconsole.log('connection open')\n\t\tws.on('close', (code, reason) => {\n\t\t\tconsole.log('connection closed')\n\t\t})\n\t},\n})\n```\n\nClient:\n\n```ts\nconst api = createClient<Router>({\n\turl: 'ws://localhost:3000',\n\tbackoff: {\n\t\tjitter: false,\n\t\tmaxDelay: Infinity,\n\t\tnumOfAttempts: 10,\n\t\tretry: () => true,\n\t\tstartingDelay: 100,\n\t\ttimeMultiple: 2,\n\t},\n\tonConnection((connection) => {\n\t\tconsole.log('connection opened')\n\t\tawait connection.closed // wait for connection to close\n\t\tconsole.log('connection closed')\n\t})\n})\n```\n\n## Pruning Stale Connections\n\nServer:\n\n```ts\nconst server = createServer({\n\tpingTimeout: 60_000,\n\tpongTimeout: 1_000,\n})\n```\n\nClient:\n\n```ts\nconst api = createClient({\n\tpingInterval: 30_000,\n\tpongTimeout: 1_000,\n})\n```\n","readmeFilename":"README.md"}