joe 2 роки тому
батько
коміт
d256fa61f2

+ 217 - 0
content/middleware/centrifugo.md

@@ -0,0 +1,217 @@
+---
+title: "Centrifugo"
+date: 2023-10-17T16:29:48+07:00
+draft: true
+---
+
+## What
+
+[Centrifugo](https://github.com/centrifugal/centrifugo) 是一个实时消息服务器。Golang 开发基于 Websocket。
+
+### 命令行
+
+```shell
+centrifugo -h
+
+centrifugo genconfig
+
+centrifugo --config=config.toml
+
+
+```
+
+### 配置
+
+配置优先级
+- 命令行参数
+- 环境变量
+- 配置文件
+
+#### 环境变量
+
+使用 CENTRIFUGO——<OPTION_NAME> 
+
+#### 配置文件
+
+同时支持 JSON, YAML, TOML 格式
+
+- allowed_origins				\[\]			安全 CORS CSRF 相关			\["https://*.example.com"\]
+- address						""			监听地址/IP 						"127.0.0.1"
+- port 							"8000" 		绑定端口							8000
+- engine 						""			memory/redis/taranpool			"redis"
+- token_hmac_secret_key
+- token_rsa_public_key
+- token_ecdsa_public_key
+- api_key
+- log_level
+- client_channel_limit  		128			单客户端最大 channel 订阅数
+- channel_max_length			255			channel 名称限制
+- client_user_connection_limit	0 			单个IP到服务的连接数限制(0不限制)
+- client_connection_limit		0 			HTTP 模式下服务处理的最大连接数
+- client_connection_rate_limit 	0 			HTTP 模式服务每秒接受连接数
+- client_queue_max_size 		1048576 	客户端接收队列长度(bytes)
+- client_concurrency 			bool(0) 	单个客户端的请求是否并行
+- client_stale_close_delay		10s 		从连接到验证包的最大时长
+- allow_anonymous_connect_without_token bool(false) 	客户端不需要 JWT, 当作匿名用户对待
+- disallow_anonymous_connection_tokens bool(false) 		匿名用户即使提供有效 JWT 也不行
+- gomaxprocs					0 			服务运行使用的 core 数量
+- debug 						true
+- health 						false
+- swagger 						false
+- internal_port 				9000
+- websocket_disable
+- api_disable
+- client_insecure 
+- client_insecure_skip_token_signature_verify 
+- api_insecure 
+- admin_insecure 
+- history_ttl 
+- usage_stats_disable
+- shutdown_timeout 				30(s)
+- token_audience 				"centrifugo"
+- token_issuer 					"myapp"
+- token_issuer_regex			""
+- token_audience_regex 			""
+- token_jwks_public_endpoint 
+- namespaces: [{"name": "facts", "history_size": 10, "history_ttl": "300s"}]
+
+### JWT Claims
+
+- sub: string user ID.
+- exp: UNIX timestamp when the token will expire
+- iat: UNIX timstamp when token was issued.
+- jti: token unique ID
+- aud: audience
+- iss: issuer
+- info: optional. additional information about client.
+- b64info: base64 representation of bytes(because of using binary protocol)
+- channels: array of strings with server-side channels to subscribe a client to.
+- subs: an optional map of channels with options.
+
+
+### Endpoints
+
+- Websocket
+> ws://localhost:8000/connection/websocket
+- Bidirectional emulation with HTTP-streaming (disabled by default)
+> ws://localhost:8000/connection/http_stream
+- Bidirectional emulation with SSE
+> ws://localhost:8000/connection/sse
+- Bidirectional SockJS 
+> http://localhost:8000/connection/sockjs
+- Unidirectional EventSource endpoint 
+> http://localhost:8000/connection/uni_sse
+- Unidirectional HTTP streaming endpoint 
+> http://localhost:8000/connection/uni_http_stream
+- Unidirectional WebSocket endpoint
+> http://localhost:8000/connection/uni_websocket
+- Unidirectional SSE 
+> http://localhost:8000/connection/uni_sse
+- Server HTTP API endpoint
+> http://localhost:8000/api
+- Admin web UI 
+> http://localhost:8000
+- Debug
+> http://localhost:8000/debug/pprof/
+- Health
+> http://localhost:8000/health
+- Swagger
+> http://localhost:8000/swagger
+- Prometheus
+> http://localhost:8000/metrics
+
+### ServerSide API
+
+[官方文档](https://centrifugal.dev/docs/server/server_api)
+
+- /publish: publishing data into a channel.
+- /broadcast: publishing data into many channels.
+- /subscribe: allows subscribing active user's sessions to a channel. (server-side mostly)
+- /unsubscribe: allows unsubscribing user from a channel.
+- /disconnect: allows disconnectiong a user by ID
+- /refresh: allows refreshing user connection
+- /presence: allows getting channel online presence information(all client currently subscribed on this channel)
+- /presence_stats: allows getting short channel presence information
+- /history: allows getting channel history information.
+- /history_remove: allows removing publications in channel history.
+- /channels: active channels.
+- /info: getting information about running Centrifugo nodes.
+- /batch: allows sending many commands in one requests.
+
+
+### Channels, Namespaces
+
+**Channel**: 时 publications 的路由器。
+
+Channel 是包含预定义规则的字符串。
+
+- : - namespace 边界符
+> public:news
+- '#' - user channel 边界符
+> new#42
+> personal:user#42
+> personal:user#42,43
+- $ - 私有 channel 前缀
+> $personal_news
+> $dialogs:gossip
+- "* & /" - 保留,未来使用
+
+Channel 不需要创建/删除。第一个发布到来时自动创建,最后一个订阅退出后自动清理
+
+Channel 可以属于一个 Namespace。Namespace 需要在配置文件中预定义。
+
+#### [Channel options](https://centrifugal.dev/docs/server/channels#channel-options)
+
+- presence					boolean(false)
+- join_leave				boolean(false)		sending join/leave message when the client subscribe to a channel(unsubscribe from a channel)
+- force_push_join_leave		boolean(false)		同 namespace 的客户端都会受到 join/leave 通知
+- history_size				int(0)				amount of messages for channels (配合 history_ttl)
+- history_ttl 				duration(0s)		how long to keep channel history messages
+- history_meta_ttl			duration(30d)		history stream metadata expiration
+- force_positioning			boolean(false)		forces all subscriptions in a namespace to be positioned
+- force_recovery			bool(false)			forces all subscriptions in a namespace to be recoverable
+- allow_subscribe_for_client    bool(false)     non-anonymous clients will be able to subscribe to any channel in a namespace
+- allow_subscribe_for_anonymous bool(false)     anonymous clients (with empty user ID) should be able to subscribe on channels in a namespace.
+- allow_publish_for_subscriber  bool(false)     client can publish into a channel in namespace directly from the client side over real-time connection but only if client subscribed to that channe
+- allow_publish_for_client      bool(false)     allows clients to publish messages into channels directly (from a client-side)
+- allow_publish_for_anonymous   bool(false)     anonymous clients should be able to publish into channels in a namespace
+- allow_history_for_subscriber  bool(false)     allows clients who subscribed on a channel to call history API from that channel
+- allow_history_for_anonymous   bool(false)     anonymous clients should be able to call history from channels in a namespace
+- allow_presence_for_subscriber bool(false)     
+- allow_presence_for_client     bool(false)
+- allow_presence_for_anonymous  bool(false)
+- allow_user_limited_channels   bool(false)     allows using user-limited channels in a namespace for checking subscribe permission
+- channel_regex             string("")          set a regular expression for channels allowed in the namespace
+- proxy_subscribe           bool(false)         
+- proxy_publish             bool(false)         
+- proxy_sub_refresh         bool(false)
+- proxy_subscribe_stream    bool(false)
+- subscribe_proxy_name      string("")
+- publish_proxy_name        string("")
+- sub_refresh_proxy_name    string("")
+- subscribe_stream_proxy_name   string("")
+
+
+### Channel 权限模型
+
+### Channel JWT 认证
+
+### ServerSide 订阅
+
+### 引擎和扩展性
+
+### 历史和恢复
+
+### 在线状态
+
+### 代理事件到后端应用
+
+### 代理订阅数据
+
+### Admin UI
+
+### 服务监控
+
+### TLS
+
+### 负载均衡

+ 4 - 0
content/res/github_projects.md

@@ -79,6 +79,8 @@ draft: false
 > Tiny cross-platform webview library for C/C++/Golang. Uses WebKit (Gtk/Cocoa) and Edge (Windows)
 - [luvit](https://github.com/luvit/luvit)
 > Lua + libuv + jit
+- [Duktape](https://duktape.org/)
+> an embeddable Javascript engine for c/c++
 
 ### Golang
 
@@ -181,6 +183,8 @@ draft: false
 > 游戏类的 dnd 库
 - [dndkit](https://docs.dndkit.com/)
 > 支持控件拖动
+- [supabase](https://github.com/supabase/supabase)
+> firebase 的开源替代品
 
 ### Rust
 

+ 26 - 0
content/specs/chat_server.md

@@ -0,0 +1,26 @@
+
+chat 类工具的几个场景
+
+1. 聊天室/群模式
+
+N 个人在一个 Room,有 x 个管理员,每个发言可被所有人看到。
+
+额外的功能
+
+- 加入验证
+- 禁言,踢出
+- 机器人
+
+2. 客服模式
+
+1 对 1 聊天,不需要好友验证。
+
+3. 好友模式
+
+1 对 1 聊天,需要验证。可使用 p2p 技术。可加密。
+
+4. channel 模式
+
+1 人发言,其他人只可订阅
+
+