InsForge SDK Skill
This skill covers client-side SDK integration using @insforge/sdk. For backend infrastructure operations (creating tables, inspecting schema, deploying functions, secrets, managing storage buckets, website deployments, cron job and schedules, logs, etc.), use the insforge-cli skill.
Quick Setup
CODEBLOCK0
CODEBLOCK1
Module Reference
auth/sdk-integration.md |
|
Storage |
storage/sdk-integration.md |
|
Functions |
functions/sdk-integration.md |
|
AI |
ai/sdk-integration.md |
|
Real-time |
realtime/sdk-integration.md |
What Each Module Covers
| Module | Content |
|---|
| Database | CRUD operations, filters, pagination, RPC calls |
| Auth |
Sign up/in, OAuth, sessions, profiles, password reset |
|
Storage | Upload, download, delete files |
|
Functions | Invoke edge functions |
|
AI | Chat completions, image generation, embeddings |
|
Real-time | Connect, subscribe, publish events |
Guides
| Guide | When to Use |
|---|
| database/postgres-rls.md | Writing or reviewing RLS policies — covers infinite recursion prevention, SECURITY DEFINER patterns, performance tips, and common InsForge RLS patterns |
Real-time Configuration
For real-time channels and database triggers, use insforge db query with SQL to create triggers that publish to channels. The real-time SDK is for frontend event handling and messaging, not backend configuration.
Create Database Triggers
Automatically publish events when database records change.
CODEBLOCK2
Conditional Trigger (Status Changes Only)
CODEBLOCK3
Access Control (RLS)
RLS is disabled by default. To restrict channel access:
CODEBLOCK4
- - Restrict Subscribe (SELECT on channels)
CODEBLOCK5
- - Restrict Publish (INSERT on messages)
CODEBLOCK6
| Task | SQL |
|---|
| Create channel | INLINECODE3 |
| Create trigger |
CREATE TRIGGER ... EXECUTE FUNCTION ... |
| Publish from SQL |
PERFORM realtime.publish(channel, event, payload) |
| Enable RLS |
ALTER TABLE realtime.channels ENABLE ROW LEVEL SECURITY |
Best Practices
- 1. Create channel patterns first before subscribing from frontend
- Insert channel patterns into
realtime.channels table
- Ensure
enabled is set to INLINECODE9
- 2. Use specific channel patterns
- Use wildcard
% patterns for dynamic channels (e.g.,
order:% for
order:123)
- Use exact patterns for global channels (e.g.,
notifications)
Common Mistakes
| Mistake | Solution |
|---|
| Subscribing to undefined channel pattern | Create channel pattern in realtime.channels first |
| Channel not receiving messages |
Ensure channel
enabled is
true |
| Publishing without trigger | Create database trigger to auto-publish on changes |
Recommended Workflow
CODEBLOCK7
Backend Configuration (Not Yet in CLI)
These modules still require HTTP API calls because the CLI does not yet support them:
ai/backend-configuration.md |
SDK Quick Reference
All SDK methods return { data, error }.
| Module | Methods |
|---|
| INLINECODE18 | INLINECODE19 , .insert(), .update(), .delete(), INLINECODE23 |
| INLINECODE24 |
.signUp(),
.signInWithPassword(),
.signInWithOAuth(),
.signOut(),
.getCurrentSession() |
|
insforge.storage |
.from().upload(),
.uploadAuto(),
.download(),
.remove() |
|
insforge.functions |
.invoke() |
|
insforge.ai |
.chat.completions.create(),
.images.generate(),
.embeddings.create() |
|
insforge.realtime |
.connect(),
.subscribe(),
.publish(),
.on(),
.disconnect() |
Important Notes
- - Database inserts require array format:
insert([{...}]) not INLINECODE48 - Storage: Save both
url AND key to database for download/delete operations - Functions invoke URL:
/functions/{slug} (without /api prefix) - Use Tailwind CSS v3.4 (do not upgrade to v4)
- Always local build before deploy: Prevents wasted build resources and faster debugging
InsForge SDK 技能
本技能涵盖使用 @insforge/sdk 的客户端 SDK 集成。对于后端基础设施操作(创建表、检查模式、部署函数、密钥、管理存储桶、网站部署、定时任务和计划、日志等),请使用 insforge-cli 技能。
快速设置
bash
npm install @insforge/sdk@latest
javascript
import { createClient } from @insforge/sdk
const insforge = createClient({
baseUrl: https://your-project.region.insforge.app,
anonKey: your-anon-key
})
模块参考
auth/sdk-integration.md |
|
存储 |
storage/sdk-integration.md |
|
函数 |
functions/sdk-integration.md |
|
AI |
ai/sdk-integration.md |
|
实时 |
realtime/sdk-integration.md |
各模块涵盖内容
| 模块 | 内容 |
|---|
| 数据库 | CRUD 操作、过滤器、分页、RPC 调用 |
| 认证 |
注册/登录、OAuth、会话、个人资料、密码重置 |
|
存储 | 上传、下载、删除文件 |
|
函数 | 调用边缘函数 |
|
AI | 聊天补全、图像生成、嵌入 |
|
实时 | 连接、订阅、发布事件 |
指南
实时配置
对于实时通道和数据库触发器,请使用 insforge db query 配合 SQL 创建触发器以发布到通道。实时 SDK 用于前端事件处理和消息传递,而非后端配置。
创建数据库触发器
当数据库记录发生变化时自动发布事件。
sql
-- 创建触发器函数
CREATE OR REPLACE FUNCTION notifyorderchanges()
RETURNS TRIGGER AS $$
BEGIN
PERFORM realtime.publish(
order: || NEW.id::text, -- 通道
TGOP || order, -- 事件:INSERTorder, UPDATEorder
jsonbbuildobject(
id, NEW.id,
status, NEW.status,
total, NEW.total
)
);
RETURN NEW;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
-- 附加到表
CREATE TRIGGER order_realtime
AFTER INSERT OR UPDATE ON orders
FOR EACH ROW
EXECUTE FUNCTION notifyorderchanges();
条件触发器(仅状态变更)
sql
CREATE OR REPLACE FUNCTION notifyorderstatus()
RETURNS TRIGGER AS $$
BEGIN
PERFORM realtime.publish(
order: || NEW.id::text,
status_changed,
jsonbbuildobject(id, NEW.id, status, NEW.status)
);
RETURN NEW;
END;
$$ LANGUAGE plpgsql SECURITY DEFINER;
CREATE TRIGGER orderstatustrigger
AFTER UPDATE ON orders
FOR EACH ROW
WHEN (OLD.status IS DISTINCT FROM NEW.status)
EXECUTE FUNCTION notifyorderstatus();
访问控制(RLS)
RLS 默认禁用。要限制通道访问:
sql
ALTER TABLE realtime.channels ENABLE ROW LEVEL SECURITY;
ALTER TABLE realtime.messages ENABLE ROW LEVEL SECURITY;
- - 限制订阅(对 channels 的 SELECT)
sql
CREATE POLICY userssubscribeown_orders
ON realtime.channels FOR SELECT
TO authenticated
USING (
pattern = order:%
AND EXISTS (
SELECT 1 FROM orders
WHERE id = NULLIF(splitpart(realtime.channelname(), :, 2), )::uuid
AND user_id = auth.uid()
)
);
- - 限制发布(对 messages 的 INSERT)
sql
CREATE POLICY memberspublishchat
ON realtime.messages FOR INSERT
TO authenticated
WITH CHECK (
channel_name LIKE chat:%
AND EXISTS (
SELECT 1 FROM chat_members
WHERE roomid = NULLIF(splitpart(channel_name, :, 2), )::uuid
AND user_id = auth.uid()
)
);
| 任务 | SQL |
|---|
| 创建通道 | INSERT INTO realtime.channels (pattern, description, enabled) VALUES (...) |
| 创建触发器 |
CREATE TRIGGER ... EXECUTE FUNCTION ... |
| 从 SQL 发布 | PERFORM realtime.publish(channel, event, payload) |
| 启用 RLS | ALTER TABLE realtime.channels ENABLE ROW LEVEL SECURITY |
最佳实践
- 1. 先创建通道模式,再从前端订阅
- 将通道模式插入 realtime.channels 表
- 确保 enabled 设置为 true
- 2. 使用特定的通道模式
- 对动态通道使用通配符 % 模式(例如,order:% 对应 order:123)
- 对全局通道使用精确模式(例如,notifications)
常见错误
| 错误 | 解决方案 |
|---|
| 订阅未定义的通道模式 | 先在 realtime.channels 中创建通道模式 |
| 通道未接收消息 |
确保通道 enabled 为 true |
| 无触发器发布 | 创建数据库触发器以在变更时自动发布 |
推荐工作流程
text
- 1. 创建通道模式 → INSERT INTO realtime.channels
- 确保 enabled = true → 将 enabled 设置为 true
- 按需创建触发器 → 在数据库变更时自动发布
- 继续 SDK 订阅 → 使用匹配模式的通道名称
后端配置(CLI 尚不支持)
这些模块仍需 HTTP API 调用,因为 CLI 尚不支持:
ai/backend-configuration.md |
SDK 快速参考
所有 SDK 方法返回 { data, error }。
| 模块 | 方法 |
|---|
| insforge.database | .from().select(), .insert(), .update(), .delete(), .rpc() |
| insforge.auth |
.signUp(), .signInWithPassword(), .signInWithOAuth(), .signOut(), .getCurrentSession() |
| insforge.storage | .from().upload(), .uploadAuto(), .download(), .remove() |
| insforge.functions | .invoke() |
| insforge.ai | .chat.completions.create(), .images.generate(), .embeddings.create() |
| insforge.realtime | .connect(), .subscribe(), .publish(), .on(), .disconnect() |
重要说明
- - 数据库插入需要数组格式:insert([{...}]) 而非 insert({...})
- 存储:将 url 和 key 都保存到数据库,用于下载/删除操作
- 函数调用 URL:/functions/{slug}(不带 /api 前缀)
- 使用 Tailwind CSS v3.4(不要升级到 v4)
- 部署前始终本地构建:避免浪费构建资源并加快调试速度