{"id":22532089,"url":"https://github.com/subframe7536/typesafe-electron-ipc","last_synced_at":"2025-04-09T17:03:03.772Z","repository":{"id":170197187,"uuid":"646182974","full_name":"subframe7536/typesafe-electron-ipc","owner":"subframe7536","description":"typesafe ipc utils for electron","archived":false,"fork":false,"pushed_at":"2024-09-03T03:47:18.000Z","size":445,"stargazers_count":7,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"v1","last_synced_at":"2025-04-09T17:02:42.830Z","etag":null,"topics":["electron","ipc","typesafe"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/typesafe-electron-ipc","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/subframe7536.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2023-05-27T14:54:16.000Z","updated_at":"2025-01-17T03:52:54.000Z","dependencies_parsed_at":null,"dependency_job_id":"801d119d-5ec3-4e84-9a65-d23430648e36","html_url":"https://github.com/subframe7536/typesafe-electron-ipc","commit_stats":null,"previous_names":["subframe7536/typesafe-electron-ipc"],"tags_count":22,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/subframe7536%2Ftypesafe-electron-ipc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/subframe7536%2Ftypesafe-electron-ipc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/subframe7536%2Ftypesafe-electron-ipc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/subframe7536%2Ftypesafe-electron-ipc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/subframe7536","download_url":"https://codeload.github.com/subframe7536/typesafe-electron-ipc/tar.gz/refs/heads/v1","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248074966,"owners_count":21043490,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["electron","ipc","typesafe"],"created_at":"2024-12-07T08:10:15.166Z","updated_at":"2025-04-09T17:03:03.749Z","avatar_url":"https://github.com/subframe7536.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"## typesafe electron ipc\r\n\r\ntypesafe wrapper for IPC in Electron\r\n\r\n### install\r\n\r\n```shell\r\nnpm i typesafe-electron-ipc\r\n```\r\n```shell\r\nyarn add typesafe-electron-ipc\r\n```\r\n```shell\r\npnpm add typesafe-electron-ipc\r\n```\r\n\r\nv1 rewrite all the codes to reduce the runtime part.\r\n\r\nfor older version, please install `typesafe-electron-ipc@0.6.8` and see at [v0 branch](https://github.com/subframe7536/typesafe-electron-ipc/tree/v0)\r\n\r\n### Quick start\r\n\r\n#### Define IpcSchema\r\n\r\nthe event name is combine the schema's object path\r\n\r\n```typescript\r\nimport type { DefineIpcSchema, MainSend, RendererFetch, RendererSend } from 'typesafe-electron-ipc/define'\r\n\r\nexport type IpcSchema = DefineIpcSchema\u003c{\r\n  ipcTest: {\r\n    msg: RendererFetch\u003cstring, string\u003e\r\n    front: RendererSend\u003c[test: { test: number }, stamp: number]\u003e\r\n    back: MainSend\u003cboolean\u003e\r\n    no: RendererSend\r\n    test: {\r\n      deep: RendererFetch\u003cundefined, string\u003e\r\n    }\r\n  }\r\n  another: RendererFetch\u003c{ a: number } | { b: string }, string\u003e\r\n}, '::'\u003e // ==\u003e chars that combine the key path, '::' by default, customable\r\n```\r\n\r\n#### In main\r\n\r\n```typescript\r\nimport { BrowserWindow, app } from 'electron'\r\nimport { useIpcMain } from 'typesafe-electron-ipc'\r\nimport type { IpcSchema } from '../ipc'\r\n\r\nconst main = useIpcMain\u003cIpcSchema\u003e()\r\n\r\n// all functions are typesafe\r\napp.whenReady().then(() =\u003e {\r\n  main.send(BrowserWindow.getAllWindows()[0], 'ipcTest::back', true)\r\n})\r\nmain.handle('ipcTest::msg', (_, data) =\u003e {\r\n  return 'return from main'\r\n})\r\nmain.on('ipcTest::front', (_, data, stamp) =\u003e {\r\n  console.log(data, stamp)\r\n})\r\n\r\nconst clearListener = main.on('ipcTest::no', () =\u003e console.log('no parameter'))\r\nclearListener()\r\n\r\nmain.handle('ipcTest::test::deep', () =\u003e {\r\n  return 'deep test from main'\r\n})\r\nconst clearHandler = main.handle('another', (_, data) =\u003e {\r\n  console.log(data)\r\n  return {\r\n    msg: 'receive from main',\r\n    data,\r\n  }\r\n})\r\nclearHandler() // clear handler\r\n```\r\n\r\n#### In preload\r\n\r\n```typescript\r\nimport { exposeIpcRenderer } from 'typesafe-electron-ipc'\r\n\r\nexposeIpcRenderer()\r\n```\r\n\r\n#### In renderer\r\n\r\n```typescript\r\nimport { useIpcRenderer } from 'typesafe-electron-ipc/renderer'\r\nimport type { IpcSchema } from '../ipc'\r\n\r\nconst renderer = useIpcRenderer\u003cIpcSchema\u003e()\r\n\r\n// all functions are typesafe\r\nconsole.log(await renderer.invoke('ipcTest::msg', 'fetch from renderer'))\r\nconsole.log(await renderer.invoke('ipcTest::test::deep'))\r\nconsole.log(await renderer.invoke('another', { a: 1 }))\r\n\r\nrenderer.send('ipcTest::front', { test: 1 }, Date.now())\r\nrenderer.send('ipcTest::no')\r\n\r\nconst clearListener = renderer.on('ipcTest::back', (_, data) =\u003e {\r\n  console.log(`send from main process: ${data}`)\r\n})\r\nclearListener()\r\n```\r\n\r\n### Example\r\n\r\nmore usage see in [playground](./playground)\r\n\r\n### Custom Serializer\r\n\r\n```ts\r\nimport { exposeCustomIpcRenderer, useCustomIpcMain } from 'typesafe-electron-ipc'\r\nimport type { SerializerOptions } from 'typesafe-electron-ipc'\r\n\r\nconst options: SerializerOptions = {\r\n  serializer: {/* options */}\r\n}\r\n\r\n// main\r\nconst customMain = useCustomIpcMain\u003cIpcSchema\u003e(options)\r\n\r\n// preload\r\nexposeCustomIpcRenderer(options)\r\n```\r\n\r\n## Typesafe EventEmitter\r\n\r\n```typescript\r\nimport type { TypedEventEmitter } from 'typesafe-electron-ipc'\r\n\r\ntype Test = {\r\n  test: string\r\n  version: [data: string, num: number]\r\n  downloadUrl: [string]\r\n}\r\n\r\nconst ee = new EventEmitter() as TypedEventEmitter\u003cTest\u003e\r\n\r\n// all type safe\r\nee.on('version', (data, num) =\u003e {\r\n  console.log(data, num)\r\n})\r\nee.emit('version', 'emit', 123456)\r\n```\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsubframe7536%2Ftypesafe-electron-ipc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsubframe7536%2Ftypesafe-electron-ipc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsubframe7536%2Ftypesafe-electron-ipc/lists"}