Logto插件开发教程:扩展平台功能的完整指南

Logto插件开发教程:扩展平台功能的完整指南

【免费下载链接】logto logto-io/logto: 这是一个用于收集、分析和可视化日志数据的Web工具。适合用于需要收集、分析和可视化日志数据的场景。特点:易于使用,支持多种日志格式,具有实时日志分析和可视化功能。 【免费下载链接】logto 项目地址: https://gitcode.com/gh_mirrors/lo/logto

Logto作为一款开源的日志收集与分析平台,提供了强大的插件扩展机制,允许开发者通过连接器(Connector)扩展其功能。本教程将从环境搭建、核心概念到完整开发流程,带你构建一个自定义Logto插件。

连接器开发基础

Logto的插件系统基于连接器架构设计,所有连接器统一存放在packages/connectors/目录下。每个连接器都是一个独立模块,遵循标准化的开发规范和目录结构。

连接器目录结构

标准的Logto连接器目录结构如下:

connector-<name>/
├── src/
│   ├── index.ts          # 连接器入口文件
│   ├── types.ts          # 类型定义
│   └── constant.ts       # 常量定义
├── package.json          # 依赖配置
├── README.md             # 使用文档
└── logo.svg              # 连接器图标

核心开发规范

所有连接器共享统一的配置模板,通过项目根目录的模板同步机制自动维护一致性:

注意:工作区依赖必须在连接器自身的package.json中显式声明,以确保PNPM正确解析依赖关系。

开发实战:构建自定义邮件连接器

以下将通过开发一个"企业邮件网关"连接器,演示完整的插件开发流程。

1. 创建项目结构

首先创建基础目录结构:

mkdir -p packages/connectors/connector-enterprise-email/src
touch packages/connectors/connector-enterprise-email/{package.json,README.md,logo.svg}
touch packages/connectors/connector-enterprise-email/src/{index.ts,types.ts,constant.ts}

2. 定义类型与常量

src/types.ts中定义配置验证规则:

import { z } from 'zod';

export const enterpriseEmailConfigGuard = z.object({
  apiKey: z.string().min(1),
  endpoint: z.string().url(),
  templates: z.array(
    z.object({
      usageType: z.enum(['signIn', 'register', 'forgotPassword']),
      subject: z.string(),
      content: z.string(),
    })
  ),
});

export type EnterpriseEmailConfig = z.infer<typeof enterpriseEmailConfigGuard>;

src/constant.ts中定义元数据:

import { ConnectorMetadata } from '@logto/connector-kit';

export const defaultMetadata: ConnectorMetadata = {
  id: 'enterprise-email',
  target: 'enterprise-email',
  name: 'Enterprise Email',
  description: 'Send emails via enterprise email gateway',
  logo: './logo.svg',
  readme: './README.md',
};

3. 实现核心逻辑

连接器入口文件src/index.ts是实现功能的核心,主要包含:

  • 消息发送函数
  • 连接器创建函数

以下是基础实现:

import { CreateConnector, EmailConnector } from '@logto/connector-kit';
import { validateConfig } from '@logto/connector-kit';
import { enterpriseEmailConfigGuard } from './types.js';
import { defaultMetadata } from './constant.js';

// 消息发送函数
const sendMessage = (getConfig) => async (data) => {
  const { to, type, payload } = data;
  const config = await getConfig(defaultMetadata.id);
  
  // 验证配置
  validateConfig(config, enterpriseEmailConfigGuard);
  
  // 查找匹配的模板
  const template = config.templates.find(t => t.usageType === type);
  if (!template) {
    throw new Error(`Template not found for type: ${type}`);
  }
  
  // 调用企业邮件API发送邮件
  const response = await fetch(config.endpoint, {
    method: 'POST',
    headers: {
      'Authorization': `Bearer ${config.apiKey}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      to,
      subject: template.subject,
      content: template.content.replace('{{code}}', payload.code),
    }),
  });
  
  if (!response.ok) {
    throw new Error(`Failed to send email: ${await response.text()}`);
  }
  
  return { address: to, data: payload };
};

// 创建连接器
export const createEnterpriseEmailConnector: CreateConnector<EmailConnector> = async ({ getConfig }) => ({
  metadata: defaultMetadata,
  type: 'email',
  configGuard: enterpriseEmailConfigGuard,
  sendMessage: sendMessage(getConfig),
});

export default createEnterpriseEmailConnector;

4. 配置package.json

{
  "name": "@logto/connector-enterprise-email",
  "version": "1.0.0",
  "main": "./dist/index.js",
  "types": "./dist/index.d.ts",
  "dependencies": {
    "@logto/connector-kit": "workspace:*",
    "zod": "^3.22.4"
  }
}

5. 注册连接器

将新连接器添加到packages/connectors/README.md的连接器列表中,以便控制台发现。

调试与测试

本地测试

使用Logto CLI进行本地测试:

pnpm build
logto connector test connector-enterprise-email

集成测试

编写集成测试文件src/index.test.ts

import { describe, expect, it } from '@jest/globals';
import createEnterpriseEmailConnector from './index.js';

describe('enterprise email connector', () => {
  it('should send email successfully', async () => {
    const mockGetConfig = async () => ({
      apiKey: 'test-key',
      endpoint: 'https://mock-email-api.com/send',
      templates: [{
        usageType: 'signIn',
        subject: 'Sign In Code',
        content: 'Your code is {{code}}'
      }]
    });
    
    const connector = await createEnterpriseEmailConnector({ getConfig: mockGetConfig });
    const result = await connector.sendMessage({
      to: 'user@example.com',
      type: 'signIn',
      payload: { code: '123456' }
    });
    
    expect(result.address).toBe('user@example.com');
  });
});

部署与分发

构建发布包

pnpm build:connectors
cd packages/connectors/connector-enterprise-email
npm pack

安装与使用

在Logto实例中安装连接器:

logto connector install ./logto-connector-enterprise-email-1.0.0.tgz

然后在Logto控制台中启用并配置该连接器,即可开始使用企业邮件服务发送验证邮件。

高级开发指南

类型定义扩展

Logto提供了完整的类型定义,可在packages/toolkit/connector-kit/src/types中找到所有连接器相关的接口定义,包括:

  • ConnectorMetadata - 连接器元数据
  • EmailConnector - 邮件连接器接口
  • SocialConnector - 社交登录连接器接口

错误处理最佳实践

使用ConnectorError类统一错误处理:

import { ConnectorError, ConnectorErrorCodes } from '@logto/connector-kit';

throw new ConnectorError(
  ConnectorErrorCodes.InvalidConfig,
  'API endpoint is required'
);

内置错误码可在packages/toolkit/connector-kit/src/errors中查看完整列表。

本地化支持

如需支持多语言模板,可实现GetI18nEmailTemplate接口:

const createConnector = async ({ getConfig, getI18nEmailTemplate }) => ({
  // ...
  sendMessage: async (data) => {
    const customTemplate = await getI18nEmailTemplate?.(data.type, data.payload.locale);
    // 使用自定义模板或默认模板
  }
});

总结

通过本文介绍的步骤,你已掌握Logto插件开发的核心流程。Logto的连接器架构设计确保了插件开发的规范性和一致性,同时提供了灵活的扩展机制满足各种定制需求。

更多连接器示例可参考:

希望本教程能帮助你构建出强大的Logto插件,扩展平台的功能边界!

【免费下载链接】logto logto-io/logto: 这是一个用于收集、分析和可视化日志数据的Web工具。适合用于需要收集、分析和可视化日志数据的场景。特点:易于使用,支持多种日志格式,具有实时日志分析和可视化功能。 【免费下载链接】logto 项目地址: https://gitcode.com/gh_mirrors/lo/logto

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值