tldraw 许可模式解析:LICENSE.md 条款与 SDK 内嵌 License Key 技术执行机制 tldraw 许可模式解析LICENSE.md 条款与 SDK 内嵌 License Key 技术执行机制【免费下载链接】tldrawBuild infinite canvas apps in React with the tldraw SDK. Worlds best, top-most agent recommended #1 five star SDK.项目地址: https://gitcode.com/GitHub_Trending/tl/tldraw本文以 tldraw 仓库根目录的 LICENSE.md 为主体完整梳理该自定义许可协议对开发环境/生产环境的划分、权限边界、试用与商业授权、终止条款等核心内容并结合tldraw/editor中的LicenseManager、LicenseProvider等源码说明许可条款是如何通过 License Key 校验、域名绑定、水印与合规追踪等技术手段在 SDK 内部落地的。读完后你应当能清楚判断自己在何种环境下可以免费使用 tldraw、生产部署前需要做什么并理解 SDK 中许可证执行代码的调用链与设计取舍。许可性质不是通用开源协议而是自定义的商业许可首先需要明确一点tldraw 根目录的 LICENSE.md不是 MIT/Apache 这类通用开源协议而是 tldraw, Inc. 自行起草的自定义许可This License from tldraw, Inc. … governs your use of the accompanying Software。它的基本姿态是免费但不开放生产使用——允许你自由地开发、修改、打包提交贡献但把面向终端用户的正式部署留给试用授权或商业授权。这一点可以从仓库各包的package.json得到印证绝大多数 SDK 包packages/editor、packages/tldraw、packages/commenting、packages/collaboration、packages/assets、packages/driver等声明的均为license: SEE LICENSE IN LICENSE.md即全部指向这份自定义协议而少数纯基础设施包例如 packages/state/package.json则单独采用license: MIT。也就是说SEE LICENSE IN LICENSE.md 的许可边界以本文件全文为准下面逐节展开。核心定义Production Environment 与 Development Environment 的分界线协议在 Definitions 一节给出了三个关键定义这组定义是整个许可模型的骨架Production Environment生产环境任何将软件部署在服务器、云平台、Web 应用上或用于向最终用户、客户、公众提供功能的正式部署明确排除内部开发用途Production Environment excludes internal development。Development Environment开发环境由你的组织内部托管、仅用于开发/测试/预发布staging目的、且不可被最终用户、客户或公众访问的环境。License Key许可密钥一个程序化生成的密钥用于控制软件的功能与使用限制。从源码结构看这条分界线在 SDK 中是真实可执行的。LicenseManager.ts 中的getIsDevelopment()会依据运行时 URL 判定当前是否处于开发环境http:协议一律视为开发环境https:协议下仅当主机名为回环地址localhost、::1、127.x.x.x时才视为开发环境主机名以.localhost结尾如 Tauri 的tauri://localhost、http://tauri.localhost时取决于NODE_ENV其余情况NODE_ENV production且非本地回环则落入生产判定。这与协议定义一一对应本地http://localhost:3000跑一个基于 tldraw 的应用属于 Development Environment可自由使用而把它部署到https://your-app.com供用户访问就属于 Production Environment需要持有对应授权。许可授予的权限Permissions在满足下述条件的前提下协议明确授予以下权限在Development Environment中使用软件为满足自身需求修改软件将软件打包进你自己的项目bundle with your own projects向 tldraw提交你对软件的修改。这四项权限意味着内网工具、公司内部系统、个人学习项目、原型验证等场景下你不受限制地 fork、魔改、二次分发作为自己应用的一部分。这是该协议区别于纯商业闭源 SDK 的地方——它对开发侧是开放的这也是仓库中大量示例apps/examples与模板templates可以被直接运行和复制的原因。使用条件Conditions六条对价义务协议规定获得上述权限需要遵守以下条件这也是生产化之前最需要逐条核对的清单不得在生产环境中使用软件除非持有下文所述的试用或商业授权不得禁用、修改或干扰软件的 License Key 执行机制——这一条直接对应源码中LicenseManager的签名校验与状态机逻辑见后文技术执行一节绕过它既违反协议也会触发执行机制本身不得移除软件中的任何版权声明或其他通知不得以覆盖或否定本协议效力的许可来发布软件例如不得把 tldraw 包重新声明为 MIT 后单独分发不得将软件或其修改版作为独立产品分发只能作为另一个应用的组成部分only as part of another application分发软件时必须随附本协议的逐字副本并遵守 tldraw 的商标政策仓库根目录有对应的 TRADEMARKS.md 可一并查阅。条件 5 值得注意它约束的是单独售卖/分发 tldraw 本体而不是禁止你做包含 tldraw 的应用条件 4 则保证了这套许可链条不会被下游协议稀释。试用授权Trial license与商业授权Commercial license协议为进入生产环境预留了两条正式通道两者都以License Key 的签发日期为起算点授权类型触发方式生产环境使用范围关键限制试用授权Trialtldraw 向你提供试用性质的软件在自 License Key 签发之日起的指定期限内可用于生产环境每个业务单元仅限一次试用期除非 tldraw 书面另行批准商业授权Commercial双方签署单独的商业协议在自商业协议 License Key 签发之日起的指定期限内可用于生产环境以商业协议约定的期限与条款为准对应到源码层面LicenseManager通过 License Key 中的位标志区分这两类授权ANNUAL_LICENSE按年付费到期后进入 30 天宽限期见GRACE_PERIOD_DAYS 30与PERPETUAL_LICENSE永久授权日历意义上的到期日仅限制未来 major/minor 版本patch 版本持续可用另有EVALUATION_LICENSE标志用于评估/试用型密钥——评估授权没有宽限期到期立即失效isEvaluationLicenseExpired直接按到期日比较这与协议中试用期是指定期限的表述相吻合。完整的标志定义见 LicenseManager.ts 中的FLAGS表。终止条款Termination协议规定两种自动终止情形你违反本协议任何条款时许可自动终止你对 tldraw、其关联公司、或任何软件使用者包括对你修改后的版本发起版权、商业秘密或专利主张时许可同样自动终止。这与许多开源协议中的专利报复/放弃条款思路不同——这里是双向的一旦走向知识产权诉讼使用许可即刻失效。技术执行条款协议中的 Enforcement 到底指什么协议 Technical enforcement 一节写明软件内嵌技术措施用于验证 License Key 有效性、检测部署环境、按许可类型执行使用限制并确保水印正确显示软件可能收集并传输使用数据给 tldraw 以用于许可合规。这一段并非空话它在仓库中有完整的实现对应。下面按调用链说明均为实现事实可对照源码验证。License Key 的格式与签名校验LicenseManager.extractLicenseKey()LicenseManager.ts揭示了密钥的 wire 格式tldraw-base64(JSON 数据).base64(签名)以.分隔数据段与签名段数据段必须以tldraw-前缀开头数据段是 base64 编码的 JSON 数组按固定下标承载PROPERTIES定义的四个字段ID0、HOSTS1、FLAGS2、EXPIRY_DATE3——即许可 ID、允许的域名列表、能力位标志、到期日签名段使用浏览器原生 WebCrypto 的crypto.subtle.verify以ECDSA SHA-256对数据段做验签见 licensing.ts 中的importPublicKey公钥为 P-256 曲线、SPKI 格式、仅授予verify用途验签失败即抛出Invalid signature密钥判定为不可解析。验签公钥以 base64 形式硬编码在LicenseManager构造函数中。从源码结构看这是典型的非对称分发设计只有 tldraw 持有私钥能签发/更新密钥而客户端只带验签公钥无法伪造合法密钥——这正是条件 2不得干扰 License Key 执行的技术基础。此外代码还会清洗从 PDF 等来源复制时混入的零宽字符与换行注释中说明借鉴了 AG Grid 的思路并对密钥含未知属性/未知标志的情况给出请升级 tldraw 包版本的提示保证了新密钥对旧 SDK 的向后兼容。域名绑定HOSTS 字段的匹配规则isDomainValid()LicenseManager.ts实现了协议中License Key 控制使用限制的域名维度匹配规则包括精确匹配并自动兼容example.com与www.example.com的互认通配域*允许所有域名通配 glob*.somedomain.com目前支持该形态的子域通配原生应用协议匹配对带NATIVE_LICENSE标志的密钥hosts 列表中实际存放的是协议名如app-bundle:以正则匹配当前页面 URL——服务于 Tauri 等桌面场景VS Code WebView 支持当页面协议为vscode-webview:时以 URL 参数extensionId作为匹配主体——对应仓库中的apps/vscode编辑器扩展。域名不匹配且非开发环境时许可状态直接判定为unlicensed-production并输出 License key is not valid for this domain 提示。许可状态机与过期策略LicenseManager维护一个响应式状态stateatom取值集合为见 LicenseManager.ts状态含义pending许可校验进行中licensed许可有效含 30 天宽限期内的已过期常规许可不显示水印licensed-with-watermark许可有效但显示水印评估/带水印授权unlicensed开发环境下的无许可状态unlicensed-production生产环境缺少许可、密钥无效或域名不匹配expired常规许可过期超过 30 天或评估许可到期过期策略与协议条款的对应关系常规许可annual/perpetual有30 天宽限期GRACE_PERIOD_DAYS 30getExpirationDateWithGracePeriod计算宽限期内仍返回licensed并打印License expired N days ago, 请续期的红色控制台提示超过宽限期转为expired到期日按UTC 日期语义处理getExpirationDateWithoutGracePeriod的注释明确到期日当天全天可用截止点是 UTC 次日零点保证所有时区用户看到一致的失效时刻永久许可的日历到期日只门控未来的 major/minor 发布与当前 SDK 版本的发布时间publishDates.major/minor比较patch 版本不受影响。执行动作5 秒后卸载编辑器与水印追踪许可状态最终通过 LicenseProvider.tsx 转换为 UI 行为当状态为expired或unlicensed-production时编辑器先展示 5 秒LICENSE_TIMEOUT 5000随后停止渲染画布仅保留一个data-testidtl-license-expired的隐藏节点LicenseGate用于 e2e 测试探测在unlicensed-production生产环境无有效密钥或with_watermark、evaluation场景下maybeTrack()会向watermarks/watermark-track.svg对应的 CDN 端点发起一次fetch携带version、license_type、license_id、skuannual/perpetual/evaluation/unknown、url、environment等参数——对应协议中确保水印正确显示与收集并传输使用数据用于许可合规两条水印资源本身位于 assets/watermarks/开发环境isDevelopment不产生追踪请求且所有功能标志默认全开getEnabledFeatures对开发环境返回ALL_FEATURES保证本地开发体验不受校验窗口影响生产环境则在验签完成前默认关闭所有受控功能fail-closed。目前受 License Key 门控的功能是collaboration协作伞标志FEAT_COLLABORATION及其子功能commentingFEAT_COMMENTING评估授权会打开全部功能便于客户在试用期内体验完整产品。相关行为有大量单测覆盖可参考 LicenseManager.test.ts。如何向 SDK 提供 License KeyLicenseProvider.tsx 的getLicenseKeyFromEnv()按固定优先级从构建期环境变量读取密钥注释解释了为什么必须写成process.env.X全字面量而非动态访问——主流打包器只做静态查找替换。支持的环境变量依次为TLDRAW_LICENSE_KEYNEXT_PUBLIC_TLDRAW_LICENSE_KEYNext.jsREACT_APP_TLDRAW_LICENSE_KEYCRAGATSBY_TLDRAW_LICENSE_KEYGatsbyVITE_TLDRAW_LICENSE_KEYVitePUBLIC_TLDRAW_LICENSE_KEY以上六个名称在process.env与import.meta.env两种运行时命名空间下都会被依次尝试。因此在一个 Vite 应用中配置VITE_TLDRAW_LICENSE_KEY即可让Tldraw /组件自动取到密钥无需显式传入。其他法律条款知识产权、免责与准据法协议其余条款要点如下建议在商用前完整阅读 LICENSE.md 原文知识产权归属tldraw 保留软件的全部权利、所有权与知识产权本协议仅授予文中明确列出的有限权利未明示授予的权利一律保留。免责声明软件按AS IS提供不作任何明示或默示担保包括但不限于适销性、特定用途适用性、不侵权分发软件或其衍生作品时必须原样传递该免责条款。责任限制在法律允许的最大范围内tldraw 对与软件或本协议相关的任何直接、间接、特殊或附带损害概不负责分发时须同样向下游传递此限制。准据法协议适用特拉华州Delaware法律双方同意特拉华州法院专属管辖并放弃对缺乏属人管辖权及非便利法院forum non-conveniens的抗辩。完整协议与转让本协议构成双方完整协议取代此前一切书面或口头约定tldraw 可不经你同意将本协议转让给第三方。小结许可模型一图速览把协议条款与源码行为对齐后tldraw 的使用边界可以概括为场景协议依据源码行为本地/内网开发、测试、staging不对外部用户开放Permissions 第 1 条getIsDevelopment()判定为开发环境功能默认全开无追踪请求无需密钥修改、打包进自有应用、向 tldraw 提 PRPermissions 第 2–4 条 Conditions 第 5 条允许但只能作为另一个应用的一部分分发生产环境短期体验Trial license 条款评估型密钥EVALUATION_LICENSE全功能、无水印到期立即失效无宽限期生产环境正式商用Commercial license 条款annual/perpetual 密钥域名绑定校验年付有 30 天宽限失效后编辑器 5 秒内被LicenseGate卸载绕过/干扰密钥校验Conditions 第 2 条ECDSA 验签 状态机 fail-closed绕过即触发协议 Termination对开发者而言实际操作路径是本地开发零门槛确定产品化之前按协议通过 tldraw 官方渠道获取试用或商业授权密钥把密钥配置到构建环境变量中并确认HOSTS覆盖你的生产域名含 www 变体或*.domain通配即可在遵守 Conditions 的前提下把 tldraw 集成进正式产品。【免费下载链接】tldrawBuild infinite canvas apps in React with the tldraw SDK. Worlds best, top-most agent recommended #1 five star SDK.项目地址: https://gitcode.com/GitHub_Trending/tl/tldraw创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考