@tier0/sdk-v2 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/README.md +29 -12
  2. package/dist/cjs/capabilities.js +2 -2
  3. package/dist/cjs/capabilities.js.map +1 -1
  4. package/dist/cjs/client.d.ts +284 -374
  5. package/dist/cjs/cloud-transport.js +6 -1
  6. package/dist/cjs/cloud-transport.js.map +1 -1
  7. package/dist/cjs/controls.d.ts +19 -7
  8. package/dist/cjs/controls.js +37 -34
  9. package/dist/cjs/controls.js.map +1 -1
  10. package/dist/cjs/data/bootstrap.js +3 -2
  11. package/dist/cjs/data/bootstrap.js.map +1 -1
  12. package/dist/cjs/data/collection.d.ts +64 -2
  13. package/dist/cjs/data/collection.js +15 -11
  14. package/dist/cjs/data/collection.js.map +1 -1
  15. package/dist/cjs/data/index.d.ts +1 -1
  16. package/dist/cjs/data/index.js.map +1 -1
  17. package/dist/cjs/files.d.ts +9 -9
  18. package/dist/cjs/mq/broker.d.ts +1 -1
  19. package/dist/cjs/mq/broker.js +1 -1
  20. package/dist/cjs/mq/broker.js.map +1 -1
  21. package/dist/cjs/mq/types.d.ts +1 -1
  22. package/dist/cjs/mq/types.js.map +1 -1
  23. package/dist/cjs/openapi/api.generated.d.ts +417 -541
  24. package/dist/cjs/openapi/api.generated.js +292 -377
  25. package/dist/cjs/openapi/api.generated.js.map +1 -1
  26. package/dist/cjs/openapi/client.js +1 -1
  27. package/dist/cjs/openapi/client.js.map +1 -1
  28. package/dist/cjs/openapi/codecs.generated.d.ts +394 -652
  29. package/dist/cjs/openapi/codecs.generated.js +2 -2
  30. package/dist/cjs/openapi/codecs.generated.js.map +1 -1
  31. package/dist/cjs/openapi/types.generated.d.ts +697 -906
  32. package/dist/cjs/openapi/types.generated.js.map +1 -1
  33. package/dist/cjs/source.d.ts +0 -7
  34. package/dist/cjs/source.js +1 -3
  35. package/dist/cjs/source.js.map +1 -1
  36. package/dist/cjs/stream.d.ts +0 -5
  37. package/dist/cjs/stream.js +3 -4
  38. package/dist/cjs/stream.js.map +1 -1
  39. package/dist/cjs/uns-v2/codec.js +1 -1
  40. package/dist/cjs/uns-v2/codec.js.map +1 -1
  41. package/dist/cjs/uns-v2/generated.d.ts +4741 -13453
  42. package/dist/cjs/uns-v2/generated.js +12 -33
  43. package/dist/cjs/uns-v2/generated.js.map +1 -1
  44. package/dist/esm/capabilities.js +2 -2
  45. package/dist/esm/capabilities.js.map +1 -1
  46. package/dist/esm/client.d.ts +284 -374
  47. package/dist/esm/cloud-transport.js +6 -1
  48. package/dist/esm/cloud-transport.js.map +1 -1
  49. package/dist/esm/controls.d.ts +19 -7
  50. package/dist/esm/controls.js +38 -35
  51. package/dist/esm/controls.js.map +1 -1
  52. package/dist/esm/data/bootstrap.js +4 -3
  53. package/dist/esm/data/bootstrap.js.map +1 -1
  54. package/dist/esm/data/collection.d.ts +64 -2
  55. package/dist/esm/data/collection.js +15 -12
  56. package/dist/esm/data/collection.js.map +1 -1
  57. package/dist/esm/data/index.d.ts +1 -1
  58. package/dist/esm/data/index.js.map +1 -1
  59. package/dist/esm/files.d.ts +9 -9
  60. package/dist/esm/mq/broker.d.ts +1 -1
  61. package/dist/esm/mq/broker.js +1 -1
  62. package/dist/esm/mq/broker.js.map +1 -1
  63. package/dist/esm/mq/types.d.ts +1 -1
  64. package/dist/esm/mq/types.js.map +1 -1
  65. package/dist/esm/openapi/api.generated.d.ts +417 -541
  66. package/dist/esm/openapi/api.generated.js +292 -377
  67. package/dist/esm/openapi/api.generated.js.map +1 -1
  68. package/dist/esm/openapi/client.js +1 -1
  69. package/dist/esm/openapi/client.js.map +1 -1
  70. package/dist/esm/openapi/codecs.generated.d.ts +394 -652
  71. package/dist/esm/openapi/codecs.generated.js +1 -1
  72. package/dist/esm/openapi/codecs.generated.js.map +1 -1
  73. package/dist/esm/openapi/types.generated.d.ts +697 -906
  74. package/dist/esm/openapi/types.generated.js.map +1 -1
  75. package/dist/esm/source.d.ts +0 -7
  76. package/dist/esm/source.js +1 -3
  77. package/dist/esm/source.js.map +1 -1
  78. package/dist/esm/stream.d.ts +0 -5
  79. package/dist/esm/stream.js +3 -4
  80. package/dist/esm/stream.js.map +1 -1
  81. package/dist/esm/uns-v2/codec.js +2 -2
  82. package/dist/esm/uns-v2/codec.js.map +1 -1
  83. package/dist/esm/uns-v2/generated.d.ts +4741 -13453
  84. package/dist/esm/uns-v2/generated.js +12 -33
  85. package/dist/esm/uns-v2/generated.js.map +1 -1
  86. package/package.json +17 -5
  87. package/skills/tier0-sdk-v2/SKILL.md +5 -3
  88. package/skills/tier0-sdk-v2/tier0-sdk-v2-agent/SKILL.md +4 -4
  89. package/skills/tier0-sdk-v2/tier0-sdk-v2-controls/SKILL.md +3 -3
  90. package/skills/tier0-sdk-v2/tier0-sdk-v2-data/references/read-write.md +17 -1
  91. package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/delete.md +1 -1
  92. package/skills/tier0-sdk-v2/tier0-sdk-v2-files/references/url.md +1 -1
  93. package/skills/tier0-sdk-v2/tier0-sdk-v2-members/references/app-members.md +1 -1
  94. package/skills/tier0-sdk-v2/tier0-sdk-v2-members/references/platform-members.md +1 -1
  95. package/skills/tier0-sdk-v2/tier0-sdk-v2-notifications/references/get.md +1 -1
  96. package/skills/tier0-sdk-v2/tier0-sdk-v2-notifications/references/send.md +1 -1
  97. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/SKILL.md +5 -5
  98. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/changes.md +4 -4
  99. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/create.md +3 -6
  100. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/delete.md +10 -18
  101. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/read.md +2 -2
  102. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/state.md +9 -10
  103. package/skills/tier0-sdk-v2/tier0-sdk-v2-source/references/update.md +39 -21
  104. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/SKILL.md +7 -7
  105. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/create.md +13 -13
  106. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/deploy.md +21 -11
  107. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/lifecycle.md +1 -1
  108. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/read.md +25 -5
  109. package/skills/tier0-sdk-v2/tier0-sdk-v2-stream/references/update.md +3 -5
  110. package/skills/tier0-sdk-v2/tier0-sdk-v2-system/references/info.md +1 -1
  111. package/skills/tier0-sdk-v2/tier0-sdk-v2-system/references/whoami.md +1 -1
  112. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/SKILL.md +3 -3
  113. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/create.md +14 -9
  114. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/delete.md +5 -5
  115. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/namespace.md +4 -4
  116. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/read.md +8 -7
  117. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/restore.md +2 -2
  118. package/skills/tier0-sdk-v2/tier0-sdk-v2-uns/references/update.md +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"broker.js","sourceRoot":"","sources":["../../../src/mq/broker.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MQTT broker 地址归一化工具。\n *\n * 平台 `/openapi/v1/info` 返回的 `mqttBroker` 格式随环境变化,不保证统一:\n * - enterprise:env 为空时后端兜底返回 `tcp://<host>:1883`(面向边缘/服务端客户端的连接串);\n * - SaaS(Tier0 Cloud):env 原样透传,常见为 `host:port` 或裸 `host`。\n *\n * 浏览器 wss 客户端不应直接把它当 hostname 拼 URL(会得到 `wss://tcp://...`\n * 这类非法地址),先经本模块解析/推导,再交给 `Tier0MQClient`。\n */\n\n/** 解析后的 broker 端点。hostname 保证为裸主机(无 scheme、无端口、无路径)。 */\nexport interface MqttBrokerEndpoint {\n /** 裸主机名(已剥离 scheme/path/query,不含端口)。 */\n hostname: string;\n /**\n * 原始端口。注意:对 `tcp://host:1883` 这是 **tcp 端口**,浏览器 wss 场景\n * 不能直接沿用(wss 通常是 8084),由 `toWebSocketUrl` 的 `wssPort` 决定。\n */\n port?: number;\n /** 原始 scheme(tcp/mqtt/mqtts/ws/wss/...),裸 host 输入时为 undefined。 */\n scheme?: string;\n}\n\nconst SCHEME_RE = /^([a-zA-Z][a-zA-Z0-9+.-]*):\\/\\//;\n\n/**\n * 解析各种形态的 broker 字符串为结构化端点。\n *\n * 兼容输入:`tcp://host:1883`、`mqtts://host:8883`、`wss://host:8084/mqtt`、\n * `host:1883`、裸 `host`。无法解析(空串、非法 URL)返回 undefined。\n */\nexport function parseMqttBroker(broker?: string | null): MqttBrokerEndpoint | undefined {\n const raw = broker?.trim();\n if (!raw) return undefined;\n\n if (SCHEME_RE.test(raw)) {\n try {\n const u = new URL(raw);\n if (!u.hostname) return undefined;\n const scheme = SCHEME_RE.exec(raw)?.[1]?.toLowerCase();\n return {\n hostname: u.hostname,\n port: u.port ? Number.parseInt(u.port, 10) : undefined,\n scheme,\n };\n } catch {\n return undefined;\n }\n }\n\n // 无 scheme:`host:port` 或裸 `host`;含路径/空白的是垃圾输入,拒绝\n if (/[\\s/]/.test(raw)) return undefined;\n const i = raw.lastIndexOf(':');\n if (i > 0 && /^\\d+$/.test(raw.slice(i + 1))) {\n const hostname = raw.slice(0, i);\n if (!hostname) return undefined;\n return { hostname, port: Number.parseInt(raw.slice(i + 1), 10) };\n }\n return { hostname: raw };\n}\n\n/** 浏览器 wss 默认端口(与平台 OS_MQTT_WEBSOCKET_TSL_PORT 默认值一致)。 */\nexport const DEFAULT_WSS_PORT = 8084;\n/** MQTT over WebSocket 路径。 */\nexport const DEFAULT_WS_PATH = '/mqtt';\n\nexport interface ToWebSocketUrlOptions {\n /** wss 端口,默认 {@link DEFAULT_WSS_PORT}(8084)。 */\n wssPort?: number;\n /**\n * 显式指定 ws(false)/wss(true)。缺省自适应:浏览器 https 页面用 wss,\n * 或 WebSocket 端口为 8084 时用 wss,其余用 ws。\n */\n secure?: boolean;\n}\n\n/**\n * 当前运行环境是否处于 https 安全上下文。\n *\n * 用 `globalThis.location` 而不是 `window.location`:Web Worker\n * (dedicated/shared)里 `window` 不存在,但 `location.protocol` 同样是 `https:`,\n * 应同等视为安全上下文(否则会被降级为 ws 而被浏览器按 mixed content 拦截)。\n */\nexport function isBrowserHttps(): boolean {\n const loc = (globalThis as { location?: { protocol?: string } }).location;\n return typeof loc?.protocol === 'string' && loc.protocol === 'https:';\n}\n\n/**\n * 把 `mqttBroker`(或 {@link MqttBrokerEndpoint})推导为可直接传给\n * `Tier0MQClient` 的 WebSocket URL。\n *\n * 规则:\n * - 输入已是 `ws(s)://` URL:原样归一(补 `/mqtt` 路径,端口、path、query 均保留);\n * - 输入 `tcp://host:1883` / `host:port` / 裸 `host`:按 `secure` 推导 scheme,\n * 端口一律用 `wssPort`(8084),**不沿用** tcp 端口;\n * - 输入为空/无法解析:返回 undefined(调用方应回退或报错,勿硬拼 URL)。\n *\n * @example\n * toWebSocketUrl('tcp://example.tier0.dev:1883', { secure: true });\n * // → 'wss://example.tier0.dev:8084/mqtt'\n */\nexport function toWebSocketUrl(\n broker: string | MqttBrokerEndpoint | undefined | null,\n opts: ToWebSocketUrlOptions = {},\n): string | undefined {\n if (broker == null || broker === '') return undefined;\n\n // 已是 ws(s) URL:解析后归一直通(保留其 scheme/端口/path/query,仅补 /mqtt 路径)\n if (typeof broker === 'string' && /^wss?:\\/\\//i.test(broker.trim())) {\n try {\n const u = new URL(broker.trim());\n if (!u.hostname) return undefined;\n if (!u.pathname || u.pathname === '/') {\n u.pathname = DEFAULT_WS_PATH;\n }\n return u.toString();\n } catch {\n return undefined;\n }\n }\n\n const endpoint = typeof broker === 'string' ? parseMqttBroker(broker) : broker;\n if (!endpoint?.hostname) return undefined;\n\n // ws(s) 端点:保留其 scheme 与端口(\"已是 WebSocket 地址\"的直通语义)\n if (endpoint.scheme === 'ws' || endpoint.scheme === 'wss') {\n const port = endpoint.port ? `:${endpoint.port}` : '';\n return `${endpoint.scheme}://${endpoint.hostname}${port}${DEFAULT_WS_PATH}`;\n }\n\n const port = opts.wssPort ?? DEFAULT_WSS_PORT;\n const secure = opts.secure ?? (isBrowserHttps() || port === DEFAULT_WSS_PORT);\n return `${secure ? 'wss' : 'ws'}://${endpoint.hostname}:${port}${DEFAULT_WS_PATH}`;\n}\n"]}
1
+ {"version":3,"file":"broker.js","sourceRoot":"","sources":["../../../src/mq/broker.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * MQTT broker 地址归一化工具。\n *\n * 平台 `/openapi/v2/info` 返回的 `mqttBroker` 格式随环境变化,不保证统一:\n * - enterprise:env 为空时后端兜底返回 `tcp://<host>:1883`(面向边缘/服务端客户端的连接串);\n * - SaaS(Tier0 Cloud):env 原样透传,常见为 `host:port` 或裸 `host`。\n *\n * 浏览器 wss 客户端不应直接把它当 hostname 拼 URL(会得到 `wss://tcp://...`\n * 这类非法地址),先经本模块解析/推导,再交给 `Tier0MQClient`。\n */\n\n/** 解析后的 broker 端点。hostname 保证为裸主机(无 scheme、无端口、无路径)。 */\nexport interface MqttBrokerEndpoint {\n /** 裸主机名(已剥离 scheme/path/query,不含端口)。 */\n hostname: string;\n /**\n * 原始端口。注意:对 `tcp://host:1883` 这是 **tcp 端口**,浏览器 wss 场景\n * 不能直接沿用(wss 通常是 8084),由 `toWebSocketUrl` 的 `wssPort` 决定。\n */\n port?: number;\n /** 原始 scheme(tcp/mqtt/mqtts/ws/wss/...),裸 host 输入时为 undefined。 */\n scheme?: string;\n}\n\nconst SCHEME_RE = /^([a-zA-Z][a-zA-Z0-9+.-]*):\\/\\//;\n\n/**\n * 解析各种形态的 broker 字符串为结构化端点。\n *\n * 兼容输入:`tcp://host:1883`、`mqtts://host:8883`、`wss://host:8084/mqtt`、\n * `host:1883`、裸 `host`。无法解析(空串、非法 URL)返回 undefined。\n */\nexport function parseMqttBroker(broker?: string | null): MqttBrokerEndpoint | undefined {\n const raw = broker?.trim();\n if (!raw) return undefined;\n\n if (SCHEME_RE.test(raw)) {\n try {\n const u = new URL(raw);\n if (!u.hostname) return undefined;\n const scheme = SCHEME_RE.exec(raw)?.[1]?.toLowerCase();\n return {\n hostname: u.hostname,\n port: u.port ? Number.parseInt(u.port, 10) : undefined,\n scheme,\n };\n } catch {\n return undefined;\n }\n }\n\n // 无 scheme:`host:port` 或裸 `host`;含路径/空白的是垃圾输入,拒绝\n if (/[\\s/]/.test(raw)) return undefined;\n const i = raw.lastIndexOf(':');\n if (i > 0 && /^\\d+$/.test(raw.slice(i + 1))) {\n const hostname = raw.slice(0, i);\n if (!hostname) return undefined;\n return { hostname, port: Number.parseInt(raw.slice(i + 1), 10) };\n }\n return { hostname: raw };\n}\n\n/** 浏览器 wss 默认端口(与平台 OS_MQTT_WEBSOCKET_TSL_PORT 默认值一致)。 */\nexport const DEFAULT_WSS_PORT = 8084;\n/** MQTT over WebSocket 路径。 */\nexport const DEFAULT_WS_PATH = '/mqtt';\n\nexport interface ToWebSocketUrlOptions {\n /** wss 端口,默认 {@link DEFAULT_WSS_PORT}(8084)。 */\n wssPort?: number;\n /**\n * 显式指定 ws(false)/wss(true)。缺省自适应:浏览器 https 页面用 wss,\n * 或 WebSocket 端口为 8084 时用 wss,其余用 ws。\n */\n secure?: boolean;\n}\n\n/**\n * 当前运行环境是否处于 https 安全上下文。\n *\n * 用 `globalThis.location` 而不是 `window.location`:Web Worker\n * (dedicated/shared)里 `window` 不存在,但 `location.protocol` 同样是 `https:`,\n * 应同等视为安全上下文(否则会被降级为 ws 而被浏览器按 mixed content 拦截)。\n */\nexport function isBrowserHttps(): boolean {\n const loc = (globalThis as { location?: { protocol?: string } }).location;\n return typeof loc?.protocol === 'string' && loc.protocol === 'https:';\n}\n\n/**\n * 把 `mqttBroker`(或 {@link MqttBrokerEndpoint})推导为可直接传给\n * `Tier0MQClient` 的 WebSocket URL。\n *\n * 规则:\n * - 输入已是 `ws(s)://` URL:原样归一(补 `/mqtt` 路径,端口、path、query 均保留);\n * - 输入 `tcp://host:1883` / `host:port` / 裸 `host`:按 `secure` 推导 scheme,\n * 端口一律用 `wssPort`(8084),**不沿用** tcp 端口;\n * - 输入为空/无法解析:返回 undefined(调用方应回退或报错,勿硬拼 URL)。\n *\n * @example\n * toWebSocketUrl('tcp://example.tier0.dev:1883', { secure: true });\n * // → 'wss://example.tier0.dev:8084/mqtt'\n */\nexport function toWebSocketUrl(\n broker: string | MqttBrokerEndpoint | undefined | null,\n opts: ToWebSocketUrlOptions = {},\n): string | undefined {\n if (broker == null || broker === '') return undefined;\n\n // 已是 ws(s) URL:解析后归一直通(保留其 scheme/端口/path/query,仅补 /mqtt 路径)\n if (typeof broker === 'string' && /^wss?:\\/\\//i.test(broker.trim())) {\n try {\n const u = new URL(broker.trim());\n if (!u.hostname) return undefined;\n if (!u.pathname || u.pathname === '/') {\n u.pathname = DEFAULT_WS_PATH;\n }\n return u.toString();\n } catch {\n return undefined;\n }\n }\n\n const endpoint = typeof broker === 'string' ? parseMqttBroker(broker) : broker;\n if (!endpoint?.hostname) return undefined;\n\n // ws(s) 端点:保留其 scheme 与端口(\"已是 WebSocket 地址\"的直通语义)\n if (endpoint.scheme === 'ws' || endpoint.scheme === 'wss') {\n const port = endpoint.port ? `:${endpoint.port}` : '';\n return `${endpoint.scheme}://${endpoint.hostname}${port}${DEFAULT_WS_PATH}`;\n }\n\n const port = opts.wssPort ?? DEFAULT_WSS_PORT;\n const secure = opts.secure ?? (isBrowserHttps() || port === DEFAULT_WSS_PORT);\n return `${secure ? 'wss' : 'ws'}://${endpoint.hostname}:${port}${DEFAULT_WS_PATH}`;\n}\n"]}
@@ -3,7 +3,7 @@ export interface MQTTConfig {
3
3
  * broker 地址。支持三种形态:
4
4
  * - 完整 WebSocket URL,如 `wss://host:8084/mqtt`(推荐浏览器场景显式使用);
5
5
  * - 裸 `host`(可含端口,如 `host:8084`);
6
- * - 平台 `/openapi/v1/info` 返回的原始 `mqttBroker`(如 `tcp://host:1883`,
6
+ * - 平台 `/openapi/v2/info` 返回的原始 `mqttBroker`(如 `tcp://host:1883`,
7
7
  * 建议先用 {@link toWebSocketUrl} 归一后再传入,见 `@tier0/sdk-v2/mq` 的 broker 工具)。
8
8
  */
9
9
  host?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/mq/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface MQTTConfig {\n /**\n * broker 地址。支持三种形态:\n * - 完整 WebSocket URL,如 `wss://host:8084/mqtt`(推荐浏览器场景显式使用);\n * - 裸 `host`(可含端口,如 `host:8084`);\n * - 平台 `/openapi/v1/info` 返回的原始 `mqttBroker`(如 `tcp://host:1883`,\n * 建议先用 {@link toWebSocketUrl} 归一后再传入,见 `@tier0/sdk-v2/mq` 的 broker 工具)。\n */\n host?: string;\n /** WebSocket port fallback when host has no embedded WebSocket port. */\n port?: number;\n /**\n * 当 host 不带 ws(s) scheme 时,显式指定用 wss(true) 还是 ws(false)。\n * 缺省自适应:浏览器 https 页面或端口 8084 用 wss,其余用 ws。\n */\n secure?: boolean;\n clientId?: string;\n username?: string;\n /** Original API key; connect-time changes refresh automatically derived identity fields. */\n password?: string;\n keepAlive?: number;\n reconnectPeriod?: number;\n connectTimeout?: number;\n clean?: boolean;\n /**\n * 背压保护阈值:handler 连续返回 false(表示下游停滞/消费者已断开)达到\n * 该次数后,SDK 自动移除该订阅并向 broker 退订,避免消息在无消费者的\n * 应用内队列中持续堆积。0 或不设置表示关闭该保护(保持原有行为)。\n */\n maxBackpressuredDeliveries?: number;\n}\n\nexport type MQTTMessage = {\n topic: string;\n payload: string | Buffer;\n qos: number;\n retain: boolean;\n};\n\nexport type MQTTEventMap = {\n connect: () => void;\n disconnect: () => void;\n error: (error: Error) => void;\n message: (message: MQTTMessage) => void;\n /** 订阅因持续背压被 SDK 自动移除时触发。 */\n subscriptionDropped: (info: { topic: string; reason: string }) => void;\n};\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/mq/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface MQTTConfig {\n /**\n * broker 地址。支持三种形态:\n * - 完整 WebSocket URL,如 `wss://host:8084/mqtt`(推荐浏览器场景显式使用);\n * - 裸 `host`(可含端口,如 `host:8084`);\n * - 平台 `/openapi/v2/info` 返回的原始 `mqttBroker`(如 `tcp://host:1883`,\n * 建议先用 {@link toWebSocketUrl} 归一后再传入,见 `@tier0/sdk-v2/mq` 的 broker 工具)。\n */\n host?: string;\n /** WebSocket port fallback when host has no embedded WebSocket port. */\n port?: number;\n /**\n * 当 host 不带 ws(s) scheme 时,显式指定用 wss(true) 还是 ws(false)。\n * 缺省自适应:浏览器 https 页面或端口 8084 用 wss,其余用 ws。\n */\n secure?: boolean;\n clientId?: string;\n username?: string;\n /** Original API key; connect-time changes refresh automatically derived identity fields. */\n password?: string;\n keepAlive?: number;\n reconnectPeriod?: number;\n connectTimeout?: number;\n clean?: boolean;\n /**\n * 背压保护阈值:handler 连续返回 false(表示下游停滞/消费者已断开)达到\n * 该次数后,SDK 自动移除该订阅并向 broker 退订,避免消息在无消费者的\n * 应用内队列中持续堆积。0 或不设置表示关闭该保护(保持原有行为)。\n */\n maxBackpressuredDeliveries?: number;\n}\n\nexport type MQTTMessage = {\n topic: string;\n payload: string | Buffer;\n qos: number;\n retain: boolean;\n};\n\nexport type MQTTEventMap = {\n connect: () => void;\n disconnect: () => void;\n error: (error: Error) => void;\n message: (message: MQTTMessage) => void;\n /** 订阅因持续背压被 SDK 自动移除时触发。 */\n subscriptionDropped: (info: { topic: string; reason: string }) => void;\n};\n"]}