{"id":16439972,"url":"https://github.com/waynecz/session-recorder","last_synced_at":"2025-03-16T17:36:23.921Z","repository":{"id":47130707,"uuid":"156536006","full_name":"waynecz/session-recorder","owner":"waynecz","description":"📷 Record every movement in web ( DOM, http, error, mouse...","archived":false,"fork":false,"pushed_at":"2019-03-04T10:41:21.000Z","size":651,"stargazers_count":58,"open_issues_count":3,"forks_count":21,"subscribers_count":3,"default_branch":"master","last_synced_at":"2024-09-21T09:03:55.127Z","etag":null,"topics":["recorderui"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/waynecz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2018-11-07T11:24:37.000Z","updated_at":"2024-09-17T14:56:20.000Z","dependencies_parsed_at":"2022-09-26T16:22:23.059Z","dependency_job_id":null,"html_url":"https://github.com/waynecz/session-recorder","commit_stats":null,"previous_names":["waynecz/ui-recorder"],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/waynecz%2Fsession-recorder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/waynecz%2Fsession-recorder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/waynecz%2Fsession-recorder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/waynecz%2Fsession-recorder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/waynecz","download_url":"https://codeload.github.com/waynecz/session-recorder/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":219861939,"owners_count":16555980,"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":["recorderui"],"created_at":"2024-10-11T09:10:51.591Z","updated_at":"2024-10-11T09:10:52.089Z","avatar_url":"https://github.com/waynecz.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# (🚧 WIP) Session Recorder\n\n\u003e Imagine that a video camera continuously record the whole page\n\nSee also [Session-Player](https://github.com/waynecz/session-player) for consuming Recorder's data\n\n\u003cp align=\"center\"\u003e\n\u003cimg width=\"48%\" src=\"https://github.com/waynecz/DS/raw/master/session-recorder/record.gif\" /\u003e\n\n\u003cimg width=\"48%\" src=\"https://github.com/waynecz/DS/raw/master/session-recorder/replay.gif\" /\u003e\n\u003c/p\u003e\n\n### Record list:\n\n- DOM mutation\n- Network(xhr, fetch, beacon)\n- Global Error, Unhandled rejection\n- Mouse, Scroll\n- Console\n\n### Output like:\n\n```json\n[\n  {\"t\": 0, \"type\": \"snapshot\", \"snapshot\": \"#document snapshot\", \"scroll\": ... },\n  { \"t\": 1, \"type\": \"node\", \"add\": [{ \"html\": \"\u003cdiv id\u003etextContent\u003c/div\u003e\" }], \"target\": 6 },\n  { \"t\": 2, \"type\": \"form\", \"target\": 16, \"k\": \"value\", \"v\": \"2312\" },\n  { \"t\": 3, \"type\": \"attr\", \"target\": 14, \"attr\": { \"k\": \"class\", \"v\": \"a\" } },\n  { \"t\": 4, \"type\": \"scroll\", \"x\": 0, \"y\": 10 },\n  { \"t\": 5, \"type\": \"click\", \"x\": 71, \"y\": 13 },\n  { \"t\": 6, \"type\": \"form\", \"target\": 19, \"k\": \"checked\", \"v\": true },\n  { \"t\": 7, \"type\": \"jserr\", \"msg\": \"Type Error: ...\", \"url\": \"...\", \"err\": \"...\" },\n  { \"t\": 8, \"type\": \"xhr\", \"url\": \"...\", \"method\": \"GET\", \"response\": \"21asdcxz\" },\n  { \"t\": 9, \"type\": \"fetch\", \"status\": 503, \"response\": \"21asdcxz\" },\n  { \"t\": 10, \"type\": \"move\", \"x\": 38, \"y\": 510 },\n  { \"t\": 11, \"type\": \"console\", \"l\": \"warn\", \"msg\": \"...\" }\n]\n```\n\n### Code intergration:\n\n\u003cdiv align=\"center\"\u003e\n\u003cpre\u003enpm i \u003ca href=\"https://www.npmjs.com/package/session-recorder\"\u003esession-recorder\u003c/a\u003e\u003c/pre\u003e\n\u003c/div\u003e\n\n```javascript\nimport SessionRecorder from 'session-recorder'\n\nconst myReocrder = new SessionRecorder()\n\nmyReocrder.start() // make sure start after DOMContentLoaded\nmyReocrder.end() // stop record\n```\n\n\u003cbr\u003e\n\n### TODO\n\n- [ ] Use VDOM record mutation\n- [ ] Using WebWorker store trail data\n\n\u003cbr\u003e\n\n### Build Setup\n\n```shell\n# serve file with hot reload at http://localhost:8000\nnpm run dev\n\n# build with tsc, complie into ESModule\nnpm run build\n```\n\n\u003cbr\u003e\n\n### Document (constructing)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwaynecz%2Fsession-recorder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwaynecz%2Fsession-recorder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwaynecz%2Fsession-recorder/lists"}