catalyst-datastreams
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseHow It Works
工作原理
-
Channels and access control are console-only. Create the channel and choose its access control in Console → Cloud Scale → Data Streams; no SDK, REST, or MCP tool creates channels. Ask the user for the channel ID and its access control type, or list channels with(
getAllChannels()0 = User Roles, 1 = Custom Logic). Loadcontrol_typefor concepts, the token rules, subscribe types, acknowledgement, and the REST API.references/datastreams-basics.md -
Pick the token identifier from the access control — it is not interchangeable.
- User Roles → = an app user's ID from Catalyst Authentication. A console admin's user ID is rejected;
userIdfails with "Mandatory parameter app_user_id is missing."connectionName - Custom Logic → , and the token must be generated inside the Advanced I/O function selected as the channel's access control. That function is the token endpoint: it runs your check, then calls
connectionName. Catalyst never calls it on its own. From any other function or REST: "Invalid access control source!". User-ID tokens on these channels are issued but the WebSocket rejects them (getTokenPair).3000
- User Roles →
-
Server code (publish, token pair, channel reads) — load the runtime reference.
- Node.js / JavaScript → . Initialize with the app:
references/datastreams-javascript-basics.md. Advanced I/O handlers get Node's rawnew DataStreams(await zcAuth.init(req))/req: nores,req.body, orres.status().res.json() - Python → . Requires
references/datastreams-python-basics.md1.5.0+ (Python 3.10+).zcatalyst-sdk, thenapp = zcatalyst_sdk.initialize(req=request)(plural). Passapp.datastreams()a string channel ID and a keywordget_token_pair/user_id=; the result's keys are hyphenated (connection_name=). The subscriber does nothing untiltoken["wss-id"].connect() - Java → . Dependency is
references/datastreams-java-basics.md(2.5.0+) fromcom.zoho.catalyst:java-sdk; nohttps://maven.zohodl.comartifact exists.datastreams - ,
publishData,getAllChannelsandgetChannelDetailsare admin methods: server only, never in browser or mobile code.getLiveCountalso exists in the browser SDK, but a Custom Logic token must come from the configured function.getTokenPair
- Node.js / JavaScript →
-
Subscriber code — read the token correctly and always acknowledge. The token pair's keys are hyphenated: passas
token['wss-id'], pluszuidandtoken.url. Subscribe only after thetoken.keyevent. Callopenafter every message, or the next message is never delivered. Messages carrysendAck()(always a string) anddata(plusstreamingId/urlon API-operation messages). To reconnect, release the old session (old token →method), take a fresh token,unsubscribe(), and reload state from your own store; resuming a dropped session withsubscribe('0')redelivers missed messages twice and replays the 48-hour retention. Unsubscribe before every deliberate close; the'-2'event with codeerrorthat follows your own1000is expected. In Node,unsubscribe()returnsgetLiveCount(). Java:{ status, data: { connections } }throws the checkedsubscribe(), and outside a Catalyst function create the client withZCDataStreamException, notnew ZCDataStreamsWebSocket(config).ZCDatastream.getInstance() -
Verify end to end before reporting success. Open a subscriber, checkshows it, publish a test message, and confirm the subscriber received it. For anything the references do not cover, fetch the page under https://docs.catalyst.zoho.com/en/cloud-scale/help/data-streams/ as Markdown (
getLiveCount()), and prefer the references where they disagree.<page-url>/index.md
-
通道和访问控制仅支持在 Console 中操作。 在 Console → Cloud Scale → Data Streams 中创建通道并选择其访问控制;任何 SDK、REST 或 MCP 工具都无法创建通道。向用户询问通道 ID 及其访问控制类型,或使用列出通道(
getAllChannels()0 = User Roles,1 = Custom Logic)。加载control_type,以了解相关概念、token 规则、订阅类型、确认机制和 REST API。references/datastreams-basics.md -
根据访问控制方式选择 token 标识符,两者不可互换。
- User Roles → = Catalyst Authentication 中应用用户的 ID。控制台管理员的用户 ID 会被拒绝;使用
userId时会报错 "Mandatory parameter app_user_id is missing."connectionName - Custom Logic → 使用 ,并且 token 必须在被选为该通道访问控制的 Advanced I/O 函数内部生成。该函数就是 token 端点:它先执行检查,再调用
connectionName。Catalyst 不会自行调用该函数。从其他函数或 REST 调用时会报错 "Invalid access control source!"。在这类通道上可以签发基于 User ID 的 token,但 WebSocket 会拒绝它们(getTokenPair)。3000
- User Roles →
-
服务端代码(发布、token 对、通道读取)——加载运行时参考文档。
- Node.js / JavaScript → 。使用应用进行初始化:
references/datastreams-javascript-basics.md。Advanced I/O 处理器会收到 Node 的原始new DataStreams(await zcAuth.init(req))/req:不能使用res、req.body或res.status()。res.json() - Python → 。需要
references/datastreams-python-basics.md1.5.0+(Python 3.10+)。使用zcatalyst-sdk,然后调用app = zcatalyst_sdk.initialize(req=request)(复数形式)。向app.datastreams()传入字符串类型的通道 ID,以及关键字参数get_token_pair/user_id=;返回结果的键使用连字符(connection_name=)。在调用token["wss-id"]之前,订阅者不会执行任何操作。connect() - Java → 。依赖项为
references/datastreams-java-basics.md(2.5.0+),来源于com.zoho.catalyst:java-sdk;不存在名为https://maven.zohodl.com的 artifact。datastreams - 、
publishData、getAllChannels和getChannelDetails都是管理员方法:仅限在服务端使用,绝不能用于浏览器或移动端代码。浏览器 SDK 中也提供了getLiveCount,但 Custom Logic token 必须来自配置的函数。getTokenPair
- Node.js / JavaScript →
-
订阅者代码——正确读取 token,并始终进行确认。 token 对的键使用连字符:将作为
token['wss-id']传入,同时传入zuid和token.url。仅在token.key事件触发后进行订阅。每次收到消息后都要调用open,否则下一条消息将不会被投递。消息包含sendAck()(始终为字符串)和data(API 操作消息还会包含streamingId/url)。要重新连接,应释放旧会话(旧 token →method),获取新的 token,调用unsubscribe(),并从自己的存储中重新加载状态;使用subscribe('0')恢复已断开的会话会将错过的消息重复投递两次,并重放 48 小时保留期内的消息。每次主动关闭前都要先取消订阅;执行自己的'-2'后出现的unsubscribe()事件(代码error)属于预期行为。在 Node 中,1000返回getLiveCount()。Java 中,{ status, data: { connections } }会抛出受检异常subscribe();在 Catalyst 函数之外创建客户端时,使用ZCDataStreamException,不要使用new ZCDataStreamsWebSocket(config)。ZCDatastream.getInstance() -
在报告成功之前进行端到端验证。 打开一个订阅者,确认显示了该连接,发布一条测试消息,并确认订阅者已收到消息。对于参考资料未涵盖的内容,将 https://docs.catalyst.zoho.com/en/cloud-scale/help/data-streams/ 下的页面以 Markdown 格式获取(
getLiveCount());当参考资料与页面内容不一致时,优先采用参考资料。<page-url>/index.md
Security Checklist
安全检查清单
- and the channel-read methods are admin operations: run them only in a Catalyst function, never in a browser or mobile app.
publishData - Protect the token endpoint. Anyone who can call it can subscribe to the channel, so authenticate the caller before issuing a token.
- On Custom Logic channels, the configured function is the only gatekeeper: put the real validation there before calling .
getTokenPair - Do not log or return the token anywhere except to the client that asked for it.
key
- 和通道读取方法属于管理员操作:仅在 Catalyst 函数中运行,绝不能用于浏览器或移动端应用。
publishData - 保护 token 端点。任何能够调用它的人都可以订阅通道,因此必须在签发 token 前验证调用方身份。
- 在 Custom Logic 通道上,配置的函数是唯一的守门人:在调用 前,必须在其中执行真正的验证逻辑。
getTokenPair - 除返回给发起请求的客户端外,不得在任何位置记录或返回 token 。
key
Triggers
触发条件
Use this skill for: "Data Streams", "Catalyst Data Streams", "datastreams", "real-time channel", "live updates", "push updates to the browser", "pub/sub", "publish data", , , "token pair", "wss-id", , , , "WebSocket subscriber", , "subscribe type", "resume from last message", "live count", , "channel access control", "User Roles channel", "Custom Logic channel", "app_user_id is missing", "Invalid access control source", "Authentication failed 3000", "reconnect", "duplicate messages after reconnect", "DUPLICATE_VALUE", , , , , , or "Data Streams Python".
publishDatagetTokenPairDataStreamsWebSocketZCDataStreamsWebSocketZCDatastreamsendAckgetLiveCount@zcatalyst/datastreamszcatalyst_sdkget_token_pairpublish_datasend_ack在以下场景使用此 skill:"Data Streams"、"Catalyst Data Streams"、"datastreams"、"real-time channel"、"live updates"、"push updates to the browser"、"pub/sub"、"publish data"、、、"token pair"、"wss-id"、、、、"WebSocket subscriber"、、"subscribe type"、"resume from last message"、"live count"、、"channel access control"、"User Roles channel"、"Custom Logic channel"、"app_user_id is missing"、"Invalid access control source"、"Authentication failed 3000"、"reconnect"、"duplicate messages after reconnect"、"DUPLICATE_VALUE"、、、、、 或 "Data Streams Python"。
publishDatagetTokenPairDataStreamsWebSocketZCDataStreamsWebSocketZCDatastreamsendAckgetLiveCount@zcatalyst/datastreamszcatalyst_sdkget_token_pairpublish_datasend_ackReferences
参考资料
| Reference | Load when the query is about… |
|---|---|
| Concepts, channels, access control (User Roles vs Custom Logic), which token identifier to use, token pair shape, subscribe types, acknowledgement, retention, message fields, REST API endpoints and scopes |
| Node.js functions (init, publish, token endpoint, Custom Logic function, channel reads), Node and browser subscribers, package versions |
| Python functions and subscribers: |
| Java functions and subscribers: Maven setup, |
| 参考资料 | 何时加载 |
|---|---|
| 概念、通道、访问控制(User Roles 与 Custom Logic)、应使用的 token 标识符、token 对结构、订阅类型、确认机制、保留期、消息字段、REST API 端点和 scope |
| Node.js 函数(初始化、发布、token 端点、Custom Logic 函数、通道读取)、Node 和浏览器订阅者、包版本 |
| Python 函数和订阅者: |
| Java 函数和订阅者:Maven 配置、 |