{"_id":"@cmeslib/fe-monitor-sdk","_rev":"2-6d28447048c8298931bdd6584911384e","name":"@cmeslib/fe-monitor-sdk","dist-tags":{"latest":"1.0.0"},"versions":{"0.1.0":{"name":"@cmeslib/fe-monitor-sdk","version":"0.1.0","keywords":["monitor","rum","apm","error-tracking","web-vitals","frontend"],"author":{"name":"anchel","email":"anchel.xy@gmail.com"},"license":"MIT","_id":"@cmeslib/fe-monitor-sdk@0.1.0","maintainers":[{"name":"anchel","email":"anchel.xy@163.com"}],"homepage":"https://github.com/anchel/frontend-report-sdk-second#readme","bugs":{"url":"https://github.com/anchel/frontend-report-sdk-second/issues"},"dist":{"shasum":"679706d678d8fbdaf12933dee10cad7cf4063c5c","tarball":"https://registry.npmjs.org/@cmeslib/fe-monitor-sdk/-/fe-monitor-sdk-0.1.0.tgz","fileCount":11,"integrity":"sha512-iQnGomBvyZHtNEnrrzngDjKTnAiB/TYO0VWPC3GxwBqYbjK3gxwEBjGtsfBL1eAE/eDk4NisS25w1yK42X/n2Q==","signatures":[{"sig":"MEYCIQDUWEqa01PC8gdxejx2PMxQJlyWk0GCYygkcC3q9agTqgIhAOVsAK0BrFxbV93R76MUk1RZ+Pu8ifcK0XkdsiGu/Bk2","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":448816},"main":"./dist/index.cjs","type":"module","types":"./dist/index.d.ts","unpkg":"./dist/index.global.js","module":"./dist/index.js","engines":{"node":">=18"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.cjs"},"./package.json":"./package.json"},"gitHead":"bc55a9a433781ebe4ac18a1ad848ea41ce65a96d","scripts":{"dev":"tsup --watch","test":"vitest run","build":"tsup","test:cov":"vitest run --coverage","typecheck":"tsc --noEmit","test:watch":"vitest","check:version":"node scripts/check-version.mjs","prepublishOnly":"npm run check:version && npm run typecheck && npm run test && npm run build"},"_npmUser":{"name":"anchel","email":"anchel.xy@163.com"},"jsdelivr":"./dist/index.global.js","repository":{"url":"git+https://github.com/anchel/frontend-report-sdk-second.git","type":"git"},"_npmVersion":"10.8.2","description":"轻量级前端监控上报 SDK：错误、性能、接口、用户行为四合一","directories":{},"sideEffects":false,"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.3.5","vitest":"^2.1.8","happy-dom":"^15.11.7","typescript":"^5.7.2","@types/node":"^22.10.2","fake-indexeddb":"^6.2.5","@vitest/coverage-v8":"^2.1.8"},"_npmOperationalInternal":{"tmp":"tmp/fe-monitor-sdk_0.1.0_1788358518401_0.06747902028671304","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@cmeslib/fe-monitor-sdk","version":"1.0.0","description":"Self-hosted frontend monitoring SDK, compatible with the supplied Aegis 1.43.60 API and wire protocol","main":"./dist/cmes-monitor.cjs","scripts":{"build":"node scripts/build.mjs","test":"npm run build && node --test tests/*.test.mjs","typecheck":"tsc -p tsconfig.json","check":"npm run typecheck && npm test && npm run test:browser","test:browser":"node tests/browser.mjs","dev":"npm run build && node examples/server.mjs","prepack":"npm run build","reconstruct":"node scripts/reconstruct.mjs","fixtures":"node scripts/protocol-fixtures.mjs"},"keywords":[],"author":"","license":"MIT","repository":{"type":"git","url":"git+https://github.com/anchel/cmes-fe-monitor-sdk.git"},"bugs":{"url":"https://github.com/anchel/cmes-fe-monitor-sdk/issues"},"homepage":"https://github.com/anchel/cmes-fe-monitor-sdk#readme","publishConfig":{"access":"public","provenance":true},"devDependencies":{"@babel/generator":"8.0.0","@babel/parser":"8.0.4","@babel/traverse":"8.0.4","@babel/types":"8.0.4","@sinonjs/fake-timers":"15.4.0","esbuild":"0.28.2","jsdom":"29.1.1","playwright":"1.63.0","prettier":"3.9.6","typescript":"7.0.2"},"type":"module","module":"./dist/cmes-monitor.esm.js","types":"./dist/index.d.ts","unpkg":"./dist/cmes-monitor.min.js","jsdelivr":"./dist/cmes-monitor.min.js","exports":{".":{"import":{"types":"./dist/index.d.ts","default":"./dist/cmes-monitor.esm.js"},"require":{"types":"./dist/index.d.cts","default":"./dist/cmes-monitor.cjs"}},"./dist/*":"./dist/*","./package.json":"./package.json"},"engines":{"node":">=22"},"_id":"@cmeslib/fe-monitor-sdk@1.0.0","gitHead":"b8b6ad3aab52f5306a6efe48901c121a89ac4cf8","_nodeVersion":"22.23.2","_npmVersion":"10.9.8","dist":{"integrity":"sha512-FxyTQablv4bHc+3emBDI7CtFpDnCAgBTqKBeTIc/cWkMhIXPHoR62eMGPcYL0VhL0CgUB8OENOFQhQeuhLI8vQ==","shasum":"95a51008a724f60ccb0a27de432d36c19fb98168","tarball":"https://registry.npmjs.org/@cmeslib/fe-monitor-sdk/-/fe-monitor-sdk-1.0.0.tgz","fileCount":61,"unpackedSize":3715332,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@cmeslib%2ffe-monitor-sdk@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDVc9mvlPomIrrX0IKaKy6FwuNdXtnuumDL2wpJ0FMoYQIhAMDvs02kgaTqh+hmuDARQy/vC8hr7RnK8AhlrKubbwIC"}]},"_npmUser":{"name":"anchel","email":"anchel.xy@163.com"},"directories":{},"maintainers":[{"name":"anchel","email":"anchel.xy@163.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/fe-monitor-sdk_1.0.0_1789027797450_0.6802851000257819"},"_hasShrinkwrap":false}},"time":{"created":"2026-09-02T14:15:17.313Z","modified":"2026-09-10T08:09:57.977Z","0.1.0":"2026-09-02T14:15:18.543Z","1.0.0":"2026-09-10T08:09:57.584Z"},"bugs":{"url":"https://github.com/anchel/cmes-fe-monitor-sdk/issues"},"license":"MIT","homepage":"https://github.com/anchel/cmes-fe-monitor-sdk#readme","keywords":[],"repository":{"type":"git","url":"git+https://github.com/anchel/cmes-fe-monitor-sdk.git"},"description":"Self-hosted frontend monitoring SDK, compatible with the supplied Aegis 1.43.60 API and wire protocol","maintainers":[{"name":"anchel","email":"anchel.xy@163.com"}],"readme":"# @cmeslib/fe-monitor-sdk\n\n可自建接收端的前端监控 SDK。以用户提供的 `@tencent/aegis-web-sdk 1.43.60`（MIT）为基准，保留其构造方式、配置项、实例/静态 API、15 个插件和上报报文格式。\n\n**源码已在 `src/` 中，可直接修改和构建；运行时不加载原压缩文件，也不依赖腾讯 npm 包。** 默认上报基址从腾讯域名改为当前站点的 `/monitor`；浏览器提供 `CmesMonitor` 和兼容别名 `Aegis`。\n\n这是一份基于发布产物重建的派生源码。输入没有 source map，无法恢复腾讯未提供的原始 TypeScript、注释和局部变量名。已拆分插件、重命名共享符号，并保留编译后的部分状态机，以减少行为偏差。来源和修改见 [NOTICE](NOTICE)、[重建说明](docs/compatibility.md)。\n\n## 开始使用\n\n在项目根目录运行（开发工具链使用 Node.js 22+）：\n\n```sh\nnpm ci\nnpm run build\nnpm run dev\n```\n\n访问 `http://127.0.0.1:8787`，可触发日志、事件、计时、错误和接口请求，并查看接收端解析结果。这个 Node 接收端只用于联调，数据保存在内存中。\n\n### ESM / TypeScript\n\n从 npm 安装：\n\n```sh\nnpm i @cmeslib/fe-monitor-sdk\n```\n\n也可以通过本地目录或 `npm pack` 生成的 tarball 安装到业务项目，再使用：\n\n```ts\nimport CmesMonitor from '@cmeslib/fe-monitor-sdk';\n\nconst monitor = new CmesMonitor({\n  id: 'your-project-id',\n  uin: 'your-user-id',\n  hostUrl: 'https://monitor.your-company.example/monitor',\n  reportApiSpeed: true,\n  reportAssetSpeed: true,\n  spa: true,\n  env: 'production',\n  ext1: 'your-app-version',\n});\n\nmonitor.infoAll('应用启动');\nmonitor.error({ msg: '订单提交失败', ext2: 'order-123' });\nmonitor.reportEvent({ name: 'checkout', ext1: 'cart' });\nmonitor.reportTime('checkout_duration', 128);\nmonitor.time('render');\n// 执行业务操作后：\nmonitor.timeEnd('render');\nmonitor.setConfig({ uin: 'new-user-id' });\n```\n\n兼容旧代码：\n\n```ts\nimport Aegis from '@cmeslib/fe-monitor-sdk';\n// 或 import { Aegis } from '@cmeslib/fe-monitor-sdk';\nconst aegis = new Aegis({ id: 'project', hostUrl: '/monitor' });\n```\n\n### Script / CDN\n\n```html\n<script src=\"/assets/cmes-monitor.min.js\"></script>\n<script>\n  const monitor = new CmesMonitor({ id: 'project', hostUrl: '/monitor' });\n  // window.Aegis === window.CmesMonitor\n  monitor.report('hello');\n</script>\n```\n\nUMD 同时支持 AMD 和 `const CmesMonitor = require('@cmeslib/fe-monitor-sdk')`。这是浏览器 SDK；SSR 项目应在客户端挂载后动态导入，不要在服务端直接执行构造或导入浏览器运行时。\n\n## 后端接入\n\n请从 [后端协议](docs/backend-protocol.md) 开始。另有：\n\n- [真实参考报文](docs/wire-examples.json)：从原 SDK 捕获，包含原始请求和解码结果。\n- [OpenAPI](docs/openapi.json)：活动端点和请求结构的机器可读描述。\n- [报文解码器](examples/protocol.mjs)：处理列式日志、嵌套 JSON、gzip、Beacon 和内存指标。\n- [联调接收端](examples/server.mjs)：可运行的控制配置及接收响应示例。\n\n接入只需实现日志与指标端点。控制端点 `GET /monitor/rateConfig` 和 `GET /monitor/collect/whitelist` 默认不请求（这是与原 SDK 的刻意差异），需要时用 `enableRateConfig: true` / `enableWhitelist: true` 开启。\n\n开启白名单后，普通 `info()` 受到白名单过滤；希望无条件保留的日志使用 `infoAll()` 或 `report()`，它们仍受总采样和限流控制。开启限流配置后，日志会等到配置返回再按分类采样发出。两个开关都可以用 `setConfig()` 在运行时切换。\n\n`hostUrl` 是接口基址，应省略末尾 `/`。构造时单独设置 `url`、`eventUrl` 等会被原初始化逻辑覆盖。需要逐个修改地址时，先构造，再调用 `setConfig({ url: '...' })`；或者使用 `onBeforeRequest`。`setConfig({ hostUrl: '...' })` 本身不会重新派生端点。\n\n## 保留的功能\n\n| 插件 | 能力 | 默认启用 |\n| --- | --- | --- |\n| `onError` | JS、Promise、资源、媒体、WebSocket 错误 | 是 |\n| `reportApiSpeed` | Fetch/XHR 耗时、业务返回码、请求详情、Trace Header | 否 |\n| `reportAssetSpeed` | 资源 Performance Timing | 否 |\n| `pagePerformance` | DNS/TCP/SSL/TTFB/下载/DOM/首屏 | 是 |\n| `webVitals` | FCP/LCP/FID/CLS/INP/TTI | 是 |\n| `aid` | 匿名标识 | 是 |\n| `device` | 平台、屏幕、网络信息 | 是 |\n| `spa` | History/Hash 路由 PV | 否 |\n| `onClose` | 页面退出时批量刷新与 Beacon | 是 |\n| `clickElementLog` | 点击元素日志 | 否 |\n| `consoleLog` | Console 日志采集 | 否 |\n| `reportBridgeSpeed` | `h5Bridge` 方法测速 | 否 |\n| `blankScreen` | 白屏检测、可选 DOM/canvas 截图 | 否 |\n| `lagMonitor` | Long Animation Frame 卡顿/无响应检测 | 否 |\n| `memoryMonitor` | JS Heap 指标、OOM 阈值日志 | 否 |\n\n配置 `memoryMonitor: { enabled: true }`、`lagMonitor: { enabled: true }` 才启用这两个插件。具体浏览器须支持对应 Performance API。完整方法和配置类型见 [类型定义](src/index.d.ts)，主要使用方式见 [API 说明](docs/api.md)。\n\n## 源码目录\n\n```text\nsrc/index.js                包入口、品牌信息和 Aegis 别名\nsrc/config.js               默认地址与后端路径清单\nsrc/runtime.js              生命周期、管线、采样、传输、会话和共享算法\nsrc/plugins/*.js            15 个独立、可编辑插件模块\nsrc/index.d.ts              TypeScript API 声明\nscripts/build.mjs           从 src 构建；不读取 reference\nscripts/reconstruct.mjs     从参考包重新生成运行时/插件（仅用于审计复现）\nreference/aegis-1.43.60.min.js  未修改的兼容性测试基准\ntests/                     差分、协议、类型和真实浏览器测试\ndocs/                      API、协议、报文、兼容边界\nexamples/                  前端示例和最小接收端\n```\n\n日常开发修改 `src/` 后运行 `npm run build`。**`npm run reconstruct` 会覆盖 `src/runtime.js`、`src/plugins/` 中的重建文件；不要用它构建日常修改。** 可复现重建信息见 [reconstruction.json](docs/reconstruction.json)。\n\n## 构建、验证与打包\n\n```sh\nnpm run typecheck\nnpm test\nnpx playwright install chromium\nnpm run test:browser\nnpm pack\n```\n\n构建产物：\n\n| 文件 | 用途 |\n| --- | --- |\n| `dist/cmes-monitor.esm.js` | ESM，命名导出与默认导出 |\n| `dist/cmes-monitor.cjs` | CommonJS，直接导出构造函数 |\n| `dist/cmes-monitor.js` | 可读 UMD，Script/AMD/CommonJS |\n| `dist/cmes-monitor.min.js` | 压缩 UMD |\n| `dist/*.map` | 包含重建源码的 source map |\n| `dist/index.d.ts` | 类型提示 |\n\n兼容测试使用相同输入运行原 SDK、可读构建和压缩构建，对比请求方法、地址、查询参数、请求体、日志等级、钩子和实例状态。真实 Chromium 验证浏览器原生接口；覆盖详情和边界见 [兼容说明](docs/compatibility.md)。保留原 `version`/`__version__` 的 `1.43.60`，新增 `sdkName='cmes-monitor-sdk'`、`sdkVersion='1.0.0'` 标识自己的发行版本。\n\nMIT 许可。分发衍生源码或构建产物时一并保留 [LICENSE](LICENSE) 和 [NOTICE](NOTICE)。\n\n## 发布\n\n推送 `v` 前缀的 tag 会触发 GitHub Actions：校验 tag 与 `package.json` 版本一致，跑完类型检查、单元测试和 Chromium 测试后构建，再发布到 npm 并创建 GitHub Release。\n\n```sh\nnpm version 1.0.1\ngit push --follow-tags\n```\n\n仓库需要配置 `NPM_TOKEN` secret（npm automation token）。\n","readmeFilename":"README.md"}