Chuyển đến nội dung

Tài liệu tham khảo SDK frontend cho plugin ​

Mã frontend của plugin chạy trong iframe được cách ly bằng sandbox. Tài liệu này là tài liệu tham khảo cấp thấp. Để xem phần giới thiệu ở cấp cao hơn, xem README.md.


Mô hình bảo mật ​

Thuộc tínhGiá trị
Sandbox của iframeChỉ có allow-scripts (không có allow-same-origin)
CSP script-srcGiới hạn bằng nonce; chỉ tải tập lệnh tại điểm vào
CSP connect-src'self' - plugin có thể gửi POST đến /plugins/{id}/api/* và truy vấn định kỳ /plugins/{id}/events/poll
CSP default-src'none'
Truy cập DOM của trang chaBị chặn (không có allow-same-origin)
Cookie phiên OgmaPlugin không thể truy cập
Giao tiếp giữa các pluginKhông khả dụng

Các lệnh gọi dữ liệu qua cầu nối được kiểm tra quyền ở phía máy chủ với mỗi yêu cầu; thao tác hiển thị và điều hướng do giao diện ứng dụng chủ xử lý. Bộ nhớ đệm quyền hiển thị trong thẻ Quyền chỉ dùng để hiển thị; nó không kiểm soát quyền truy cập dữ liệu.


Giao thức cầu nối ​

JavaScript của plugin giao tiếp với ứng dụng chủ Ogma qua postMessage. Thành phần chủ nằm trong PluginsView.vue và xử lý thông điệp bridge_request.

Cấu trúc bao của yêu cầu ​

ts
interface BridgeRequest {
  type: 'bridge_request'
  sessionId: string     // nonce assigned when the bridge is set up; prevents stale messages
  requestId: string     // caller-generated correlation id (max 128 chars)
  command: string       // e.g. "ogma.requests.get"
  payload?: unknown     // command-specific input
}

Tổng kích thước thông điệp tối đa: 65 536 byte.

Cấu trúc bao của phản hồi ​

ts
interface BridgeResponse {
  type: 'bridge_response'
  requestId: string
  ok: boolean
  result?: unknown
  error?: string
  code?: string
}

Không gửi thủ công yêu cầu cầu nối thô bằng postMessage. Dùng đối tượng toàn cục ogmaSDK:

js
ogmaSDK.ready(function(sdk) {
  sdk.meta.get().then(function(meta) {
    sdk.log.info("running as " + meta.pluginId);
  });
});

SDK bao bọc toàn bộ giao tiếp cầu nối và xử lý việc đối chiếu yêu cầu, quản lý sessionId và hoàn tất Promise.


Tài liệu tham khảo lệnh ​

ogma.meta.get ​

Không cần payload.

Trả về { pluginId, packageId, name, version, ogmaVersion }.

ogma.requests.get ​

Payload: { id: string }

Trả về mục HTTP dưới dạng bản chiếu. Các trường: id, method, host, port, path, query, req_len, resp_status, resp_len, roundtrip_ms, created_at. Bản chiếu này không bao gồm header hoặc byte nội dung.

Yêu cầu: read_http_history (được cấp tự động).

ogma.requests.getRaw ​

Payload: { id: string }. Gọi thông qua sdk.requests.getRaw(id).

Trả về requestBodyBase64, responseBodyBase64, độ dài sau khi giải mã của chúng (requestBodyLength, responseBodyLength), requestBodyTruncated, responseBodyTruncated và maxBodyBytes. Dù có tên như vậy, thao tác này trả về byte nội dung, không phải toàn bộ thông điệp HTTP thô. Các kiểu mã hóa nội dung được hỗ trợ sẽ được giải mã trước khi tạo bản chiếu. Mỗi phần nội dung bị giới hạn ở 256 KiB; kiểm tra cờ cắt ngắn trước khi xử lý một tài nguyên hoàn chỉnh.

Yêu cầu: read_http_history (được cấp tự động).

Payload: { limit?: number, offset?: number, query?: string }

query hỗ trợ biểu thức lọc HTTPQL. limit tối đa: 20. Trả về { items: [...], total: number, limit: number, offset: number }.

Yêu cầu: read_http_history (được cấp tự động).

ogma.findings.list ​

Payload: { limit?: number, offset?: number }

Trả về { items: [...], total: number, limit: number, offset: number }, với tối đa 20 phát hiện mỗi trang. Các mục là bản tóm tắt; các trường bao gồm id, title, severity, status, reporter, tags và created_at.

Yêu cầu: read_findings (được cấp tự động).

ogma.scope.getActive ​

Không có payload. Trả về bộ thiết lập sẵn cho phạm vi đang hoạt động hoặc null.

Yêu cầu: read_scope (được cấp tự động).

ogma.projects.getCurrent ​

Không có payload. Trả về { id, name, status } hoặc null.

Yêu cầu: read_projects (được cấp tự động).

ogma.log ​

Payload: { message: string }

Ghi vào bộ đệm nhật ký của plugin.

ogma.ui.resize ​

Payload: { height: number } (tối đa 2000)

Yêu cầu ứng dụng chủ đặt chiều cao iframe.

ogma.ui.sidebar.registerItem ​

Payload: { name: string, path: string } (tên tối đa 64 ký tự, đường dẫn tối đa 256 ký tự)

Đăng ký điều hướng trong bảng plugin. Tối đa 20 mục cho mỗi plugin. Đăng ký nội dung các trang tương ứng bằng sdk.navigation.addPage(path, { title, body }); chọn mục sẽ hiển thị trang đó trong iframe, không phải một tuyến cấp cao nhất mới của không gian làm việc Ogma.

ogma.backend.call ​

Payload: { method: string, args: unknown[] }

Gọi hàm xử lý RPC backend được đăng ký qua sdk.api.register(method, fn). Độ dài tên phương thức tối đa là 64 ký tự.

Trả về giá trị hàm xử lý backend đã trả về, được tuần tự hóa thành JSON.

ogma.backend.onEvent ​

Payload: không cần.

Chỉ xác nhận đã nhận. Dùng ogma.events.poll để thực sự lấy sự kiện.

ogma.events.poll ​

Payload: { since: number } (chỉ số từ lần truy vấn định kỳ trước; bắt đầu ở 0)

Trả về { events: [{ event: string, args: unknown[] }], next_since: number }.

ogma.navigation.addPage ​

Payload: { path: string, title?: string }

Cầu nối xác nhận đã nhận đường dẫn trang. SDK được chèn vào còn chấp nhận { body: HTMLElement } làm tùy chọn cho sdk.navigation.addPage(path, options), gắn nội dung trong iframe và chuyển trạng thái hiển thị trang khi ứng dụng chủ chọn mục tương ứng trên thanh bên. Nút DOM vẫn ở cục bộ; nó không được tuần tự hóa qua cầu nối.

ogma.window.showToast ​

Payload: { message: string, variant?: "info"|"success"|"warning"|"error", duration?: number }

Hiển thị thông báo tạm thời trong bảng plugin. Thời lượng tính bằng ms (tối đa 10000, mặc định 3000).

ogma.commands.register ​

Payload: { id: string, name: string }

Đăng ký lệnh plugin vào kho lệnh của ứng dụng chủ. Khi thực thi, ứng dụng chủ gửi thông điệp plugin_command chứa commandId và ngữ cảnh trở lại iframe; plugin phải cung cấp callback tương ứng. Chỉ đăng ký không thực thi lệnh.

ogma.menu.registerItem ​

Payload: { type?: "Request" | "RequestRow" | "Response", commandId: string, label?: string }

Đăng ký mục menu ngữ cảnh gắn với lệnh plugin. Đăng ký lệnh trước. Nhãn mặc định là tên đã đăng ký của lệnh, nếu không có thì dùng ID; khi bỏ qua type, mặc định là Request. Cầu nối của ứng dụng chủ không sử dụng leadingIcon.

Hàm hỗ trợ chủ đề giao diện ​

SDK được chèn vào cũng cung cấp sdk.theme.get() và sdk.theme.onChange(callback). Các hàm này đọc chủ đề giao diện của iframe và đăng ký nhận cập nhật chủ đề từ ứng dụng chủ mà không cần lệnh dữ liệu cầu nối riêng. Dùng chúng để giao diện plugin nhất quán với giao diện sáng/tối của Ogma.


Mã lỗi ​

MãÝ nghĩa
PERMISSION_DENIEDPlugin thiếu quyền cần thiết.
PLUGIN_DISABLEDPlugin hiện chưa được bật.
UNKNOWN_COMMANDLệnh không nằm trong danh sách được hỗ trợ.
INVALID_PAYLOADTrường payload bắt buộc bị thiếu hoặc có kiểu không đúng.
NOT_FOUNDTài nguyên được yêu cầu không tồn tại.
LIMIT_EXCEEDEDĐã đạt giới hạn số lượng cho mỗi plugin (ví dụ: mục trên thanh bên).
SERVER_ERRORLỗi nội bộ. Kiểm tra nhật ký plugin.

Danh sách lệnh được hỗ trợ ​

ogma.meta.get, ogma.log, ogma.ui.resize, ogma.ui.sidebar.registerItem, ogma.requests.get, ogma.requests.getRaw, ogma.requests.search, ogma.findings.list, ogma.scope.getActive, ogma.projects.getCurrent, ogma.backend.call, ogma.backend.onEvent, ogma.events.poll, ogma.navigation.addPage, ogma.window.showToast, ogma.commands.register, ogma.menu.registerItem.

Phần mềm độc quyền. Bảo lưu mọi quyền.