Tài liệu dành cho nhà phát triển Lingara
Trang này được dịch từ tiếng Anh. Nếu hai bản khác nhau, trang tiếng Anh là bản đúng. Đọc trang tiếng Anh
Một kết nối được tạo thành từ các bước, và bước nào cũng có thể mang một tập lệnh. Tập lệnh của một bước là phần thân của một hàm. Nó nhận hai giá trị: lingara, API trên trang này, và input, các trường của chính bước đó cùng với ứng dụng khách của nó và các bước được nối trước nó. Kiểu của input phụ thuộc vào loại bước, nên tập lệnh của một bước webhook đọc các trường của bước webhook. Tập lệnh trả về đúng một đối tượng, được tạo bởi một trong các hàm trợ giúp bên dưới.
Tập lệnh không bao giờ nhìn thấy khóa bí mật. Khi một bước cần ứng dụng khách của nó, bước đó nhận một handle, chẳng hạn input.client, và hàm trợ giúp ghi lại handle đó. Lingara điền các giá trị thật khi bạn áp dụng kết nối.
Những điều tập lệnh không được làm
Tập lệnh chạy trong trình duyệt của chính bạn, trong một worker không có mạng và không có bộ nhớ lưu trữ. Nó phải tuân theo các giới hạn sau:
- Nó kết thúc trong vòng 1 giây.
- Một chuỗi nó trả về dài tối đa 2048 ký tự.
- Một danh sách nó trả về có tối đa 64 mục.
- Toàn bộ kết quả của nó tối đa 16 KiB.
Tập lệnh vi phạm một giới hạn, ném ra ngoại lệ, hoặc trả về thứ gì khác ngoài kết quả của một hàm trợ giúp sẽ làm bước của nó thất bại, và “Kiểm tra ngay” cho biết bước nào và vì sao.
Cam kết về phiên bản
Mọi thứ trên trang này là lingara.v1. Trong v1, API chỉ mở rộng thêm: một hàm trợ giúp mới, một tùy chọn không bắt buộc mới hoặc một loại bước mới có thể xuất hiện, nhưng không gì bạn có thể dùng hôm nay bị xóa, đổi tên hay thu hẹp. Một thay đổi có thể làm hỏng tập lệnh sẽ là một phiên bản mới bên cạnh phiên bản này, và v1 vẫn giữ nguyên.
Các khai báo
Mỗi khai báo bên dưới được tạo ra từ chính tệp mà trình soạn thảo tập lệnh dùng để tự động hoàn thành.
NodeHandle
Id của một bước khác, chẳng hạn "n1". Một bước phụ thuộc gọi tên ứng dụng khách của nó bằng handle.
export type NodeHandle = string;
Scope
Một quyền mà ứng dụng khách API có thể nắm giữ. Máy chủ quyết định tài khoản của bạn được dùng những quyền nào.
export type Scope = 'vocab:generate' | 'lesson_plans:read' | 'lesson_plans:write' | 'tutor:converse' | 'usage:read' | 'events:read' | 'events:write' | 'embed:mint' | 'embed:play';
AppSlot
Một vị trí trong ứng dụng Lingara nơi thẻ của một ứng dụng có thể xuất hiện.
export type AppSlot = 'plans.empty_detail' | 'home.side';
ContextSlice
Một phần ngữ cảnh của người học mà ứng dụng có thể yêu cầu nhận.
export type ContextSlice = 'languages' | 'plan_summary' | 'review_due' | 'tutor_topic';
ClientOptions
Các tùy chọn cho lingara.client.
export interface ClientOptions {
name: string;
scopes: readonly Scope[];
redirectUris?: readonly string[];
}
name(string) — Tên của ứng dụng khách, như Công cụ dành cho nhà phát triển hiển thị.scopes(readonly Scope[]) — Các quyền mà ứng dụng khách yêu cầu.redirectUris?(readonly string[]) — Nơi luồng mã ủy quyền có thể đưa người học quay về. Bỏ qua đối với ứng dụng khách giữa máy chủ với máy chủ.
WebhookOptions
Các tùy chọn cho lingara.webhook.
export interface WebhookOptions {
client: NodeHandle;
url: string;
events: readonly string[];
}
client(NodeHandle) — Bước ứng dụng khách mà webhook này thuộc về:input.client.url(string) — Địa chỉ HTTPS mà Lingara gửi sự kiện đến.events(readonly string[]) — Các loại sự kiện cần gửi, chẳng hạn"lesson_plan.ready".
ManifestOptions
Các tùy chọn cho lingara.manifest, viết theo camelCase; hàm trợ giúp viết ra dạng truyền tải của tệp kê khai.
export interface ManifestOptions {
name: string | Readonly<Record<string, string>>;
description: string | Readonly<Record<string, string>>;
renderUrl: string;
slots: readonly AppSlot[];
context?: readonly ContextSlice[];
scopes?: readonly Scope[];
tutorNote?: boolean;
defaultLocale?: string;
}
name(string | Readonly<Record<string, string>>) — Tên của ứng dụng: một chuỗi, hoặc một chuỗi cho mỗi mã ngôn ngữ.description(string | Readonly<Record<string, string>>) — Một câu về ứng dụng: một chuỗi, hoặc một chuỗi cho mỗi mã ngôn ngữ.renderUrl(string) — Địa chỉ HTTPS mà Lingara yêu cầu thẻ của ứng dụng.slots(readonly AppSlot[]) — Nơi thẻ của ứng dụng có thể xuất hiện.context?(readonly ContextSlice[]) — Các phần ngữ cảnh mà ứng dụng nhận. Mặc định là không có.scopes?(readonly Scope[]) — Các quyền mà ứng dụng xin người học. Mặc định là không có.tutorNote?(boolean) — Ứng dụng có được để lại ghi chú cho gia sư hay không. Mặc định làfalse.defaultLocale?(string) — Ngôn ngữ mà tên hoặc mô tả dạng chuỗi đơn được lưu dưới đó. Mặc định là"en".
AppOptions
Các tùy chọn cho lingara.app.
export interface AppOptions {
client: NodeHandle;
manifest: Manifest;
}
client(NodeHandle) — Bước ứng dụng khách mà ứng dụng này thuộc về:input.client.manifest(Manifest) — Tệp kê khai của ứng dụng, được tạo bằnglingara.manifest.
ClientSpec
Những gì một bước ứng dụng khách tạo ra: một ứng dụng khách API.
export interface ClientSpec {
readonly kind: 'client';
readonly name: string;
readonly scopes: readonly Scope[];
readonly redirectUris?: readonly string[];
}
kind('client') — Luôn là"client".name(string) — Tên của ứng dụng khách.scopes(readonly Scope[]) — Các quyền mà ứng dụng khách yêu cầu.redirectUris?(readonly string[]) — Các URI chuyển hướng của ứng dụng khách, nếu có.
SecretSpec
Những gì một bước khóa bí mật tạo ra: một khóa bí mật mới cho ứng dụng khách của nó.
export interface SecretSpec {
readonly kind: 'secret';
readonly client: NodeHandle;
}
kind('secret') — Luôn là"secret".client(NodeHandle) — Bước ứng dụng khách mà khóa bí mật thuộc về.
WebhookSpec
Những gì một bước webhook tạo ra: một điểm cuối webhook.
export interface WebhookSpec {
readonly kind: 'webhook';
readonly client: NodeHandle;
readonly url: string;
readonly events: readonly string[];
}
kind('webhook') — Luôn là"webhook".client(NodeHandle) — Bước ứng dụng khách mà webhook thuộc về.url(string) — Địa chỉ mà sự kiện được gửi đến.events(readonly string[]) — Các loại sự kiện được gửi.
AppSpec
Những gì một bước ứng dụng tạo ra: một ứng dụng hiển thị thẻ bên trong Lingara.
export interface AppSpec {
readonly kind: 'app';
readonly client: NodeHandle;
readonly manifest: Manifest;
}
kind('app') — Luôn là"app".client(NodeHandle) — Bước ứng dụng khách mà ứng dụng thuộc về.manifest(Manifest) — Tệp kê khai của ứng dụng.
Manifest
Một tệp kê khai ứng dụng ở dạng truyền tải, đúng như máy chủ lưu trữ.
export interface Manifest {
readonly manifest_version: 1;
readonly default_locale: string;
readonly name: Readonly<Record<string, string>>;
readonly description: Readonly<Record<string, string>>;
readonly render_url: string;
readonly slots: readonly AppSlot[];
readonly context: readonly ContextSlice[];
readonly scopes: readonly Scope[];
readonly tutor_note: boolean;
}
manifest_version(1) — Luôn là1.default_locale(string) — Ngôn ngữ được hiển thị khi ngôn ngữ của người học không có mục tương ứng.name(Readonly<Record<string, string>>) — Tên của ứng dụng, theo từng mã ngôn ngữ.description(Readonly<Record<string, string>>) — Một câu về ứng dụng, theo từng mã ngôn ngữ.render_url(string) — Địa chỉ HTTPS mà Lingara yêu cầu thẻ của ứng dụng.slots(readonly AppSlot[]) — Nơi thẻ của ứng dụng có thể xuất hiện.context(readonly ContextSlice[]) — Các phần ngữ cảnh mà ứng dụng nhận.scopes(readonly Scope[]) — Các quyền mà ứng dụng xin người học.tutor_note(boolean) — Ứng dụng có được để lại ghi chú cho gia sư hay không.
Spec
Bất kỳ spec nào mà một hàm trợ giúp trả về. Một tập lệnh trả về đúng một spec.
export type Spec = ClientSpec | SecretSpec | WebhookSpec | AppSpec;
Upstream
Đầu ra của từng bước thượng nguồn trực tiếp, theo handle.
export type Upstream = Readonly<Record<NodeHandle, Spec & {
readonly handle: NodeHandle;
}>>;
ClientInput
Đầu vào của một bước ứng dụng khách: các trường của nó, chính là các tùy chọn của lingara.client.
export interface ClientInput {
readonly name: string;
readonly scopes: readonly Scope[];
readonly redirectUris?: readonly string[];
readonly upstream: Upstream;
}
name(string) — Tên của ứng dụng khách.scopes(readonly Scope[]) — Các quyền mà ứng dụng khách yêu cầu.redirectUris?(readonly string[]) — Các URI chuyển hướng của ứng dụng khách, nếu bước có.upstream(Upstream) — Đầu ra của từng bước thượng nguồn trực tiếp.
SecretInput
Đầu vào của một bước khóa bí mật. client là bước ứng dụng khách duy nhất được nối với bước này.
export interface SecretInput {
readonly client: NodeHandle;
readonly upstream: Upstream;
}
client(NodeHandle) — Bước ứng dụng khách được nối với bước này.upstream(Upstream) — Đầu ra của từng bước thượng nguồn trực tiếp.
WebhookInput
Đầu vào của một bước webhook: các trường của nó, cộng với ứng dụng khách được nối.
export interface WebhookInput {
readonly client: NodeHandle;
readonly url: string;
readonly events: readonly string[];
readonly upstream: Upstream;
}
client(NodeHandle) — Bước ứng dụng khách được nối với bước này.url(string) — Địa chỉ mà các trường của bước nêu ra.events(readonly string[]) — Các loại sự kiện mà các trường của bước nêu ra.upstream(Upstream) — Đầu ra của từng bước thượng nguồn trực tiếp.
AppInput
Đầu vào của một bước ứng dụng: các trường tệp kê khai của nó, cộng với ứng dụng khách được nối.
export interface AppInput {
readonly client: NodeHandle;
readonly manifest: ManifestOptions;
readonly upstream: Upstream;
}
client(NodeHandle) — Bước ứng dụng khách được nối với bước này.manifest(ManifestOptions) — Tệp kê khai mà các trường của bước mô tả.upstream(Upstream) — Đầu ra của từng bước thượng nguồn trực tiếp.
InputFor
Đầu vào mà tập lệnh của loại bước đã cho nhận được.
export type InputFor<K extends Spec['kind']> = K extends 'client' ? ClientInput : K extends 'secret' ? SecretInput : K extends 'webhook' ? WebhookInput : AppInput;
LingaraV1
Các hàm trợ giúp mà tập lệnh gọi. Mỗi hàm trả về một spec đã đóng băng, và một tùy chọn sai kiểu sẽ ném ra TypeError nêu tên tùy chọn đó.
export interface LingaraV1 {
readonly version: 'v1';
client(options: ClientOptions): ClientSpec;
secret(client: NodeHandle): SecretSpec;
webhook(options: WebhookOptions): WebhookSpec;
app(options: AppOptions): AppSpec;
manifest(options: ManifestOptions): Manifest;
}
version('v1') — Luôn là"v1".client(options: ClientOptions): ClientSpec— Một ứng dụng khách API.secret(client: NodeHandle): SecretSpec— Một khóa bí mật mới cho một bước ứng dụng khách.webhook(options: WebhookOptions): WebhookSpec— Một điểm cuối webhook trên một bước ứng dụng khách.app(options: AppOptions): AppSpec— Một ứng dụng trên một bước ứng dụng khách.manifest(options: ManifestOptions): Manifest— Một tệp kê khai ở dạng truyền tải, với các tùy chọn mà v1 để không bắt buộc đã được điền sẵn.
return lingara.client({ name: input.name, scopes: input.scopes })
return lingara.secret(input.client)
return lingara.webhook({ client: input.client, url: input.url, events: input.events })
return lingara.app({ client: input.client, manifest: lingara.manifest(input.manifest) })
NodeScript
Tập lệnh của một bước là phần thân của hàm này: return lingara.webhook({ client: input.client, url: input.url, events: input.events }).
export type NodeScript<K extends Spec['kind']> = (lingara: LingaraV1, input: InputFor<K>) => Spec;