Contoh
Contoh integrasi ini menggunakan API publik. Sediakan dokumen OpenAPI 3.2 yang sudah dimuat sebagai spec, dengan ID operasi dan path yang digunakan pada setiap contoh. Ganti URL, token, dan path berkas lokal dengan nilai Anda sendiri. Contoh jaringan memerlukan layanan yang dapat diakses; contoh ini bukan server simulasi mandiri.
1. Permintaan HTTP dengan SendOptions
prepare() dan send() sama-sama menerima objek SendOptions yang berisi spec, target, dan values.
import { createClient, createDebugger } from "@powerduck/openapi-request";
// Create client and debugger (options are optional)
const client = createClient();
const dbg = createDebugger();
// Plan a request by operationId
const plan = client.prepare({
spec,
target: { operationId: "getUserById" },
});
console.log(plan.protocol); // "http"
console.log(plan.display.mode); // "response"
console.log(plan.stream.kind); // "none"
// Send the request with concrete values
const result = await dbg.send({
spec,
target: { operationId: "getUserById" },
values: {
path: { id: "42" },
query: { include: "profile" },
},
serverUrl: "https://api.example.com",
auth: { type: "bearer", token: "your-token" },
timeout: 15000,
});
console.log(result.response.status); // e.g. 200
console.log(result.response.body); // body value returned by the adapter
console.log(result.response.headers); // response headers
console.log(result.response.timings.durationMs); // request duration in ms
Menentukan target berdasarkan metode dan path
const plan2 = client.prepare({
spec,
target: { method: "GET", path: "/users/{id}" },
});
Eksekusi batch dengan sendMany
const batch = await dbg.sendMany(
spec,
[
{ target: { operationId: "listUsers" } },
{ target: { operationId: "getUserById" }, values: { path: { id: "1" } } },
{ target: { operationId: "getUserById" }, values: { path: { id: "2" } } },
],
{
serverUrl: "https://api.example.com",
auth: { type: "bearer", token: "your-token" },
},
);
batch.results.forEach((r, i) => {
if ("error" in r) {
console.log(`Request ${i} failed:`, r.error);
} else {
console.log(`Request ${i} status:`, r.response.status);
}
});
2. Streaming SSE
Saat respons mendeklarasikan text/event-stream, klien otomatis merencanakan mode tampilan event-list.
const plan = client.prepare({
spec,
target: { operationId: "streamEvents" },
});
console.log(plan.stream.kind); // "sse"
console.log(plan.display.mode); // "event-list"
Memeriksa endpoint nyata
import { probeStreamingResponse } from "@powerduck/openapi-request";
const probe = await probeStreamingResponse("https://api.example.com/events");
console.log(probe.kind, probe.status); // "sse" | "ndjson" | "chunked" | "none"
// The probe performs a request; consume or cancel its response body.
await probe.response.body?.cancel();
Mengurai aliran SSE
import { SseParser } from "@powerduck/openapi-request/http";
const response = await fetch("https://api.example.com/events");
if (!response.ok || !response.body) throw new Error("SSE response unavailable");
const parser = new SseParser();
const reader = response.body.getReader();
try {
while (true) {
const { done, value } = await reader.read();
if (done) break;
for (const event of parser.push(value)) console.log(event.event, event.data);
}
for (const event of parser.flush()) console.log(event.event, event.data);
} finally {
await reader.cancel();
reader.releaseLock();
}
3. Sesi WebSocket
import { createManualSession } from "@powerduck/openapi-request";
const session = createManualSession({
kind: "websocket",
url: "wss://api.example.com/ws",
});
// Subscribe before opening so connection events are included.
const subscription = session.onEvent((event) => {
console.log("Event:", event.kind, event.data);
});
try {
await session.open();
await session.send({ type: "subscribe", channel: "updates" });
// Keep the session open for as long as your application needs it.
} finally {
await session.close();
subscription.unsubscribe();
}
4. Operasi GraphQL
import {
discoverAndWriteGraphQLSchema,
runGraphQL,
} from "@powerduck/openapi-request/graphql";
const endpoint = "https://api.example.com/graphql";
const headers = { Authorization: `Bearer ${token}` };
// Returns a new spec; introspection must be enabled by the server.
const discovered = await discoverAndWriteGraphQLSchema(spec, endpoint, { headers });
console.log(discovered.spec, discovered.warnings);
// Execute an explicit query with a matching server schema.
const result = await runGraphQL({
endpoint,
headers,
query: "query GetUser($id: ID!) { user(id: $id) { id name } }",
operationName: "GetUser",
variables: { id: "42" },
useGet: false,
}, {
spec,
target: { operationId: "getUserById" },
timeout: 15000,
});
console.log(result.response.body);
5. Pemanggilan alat MCP (HTTP dan stdio)
import { createManualSession } from "@powerduck/openapi-request";
// Streamable HTTP
const httpSession = createManualSession({
kind: "mcp",
endpoint: "https://mcp.example.com/mcp",
headers: { Authorization: `Bearer ${token}` },
});
// stdio child process
const stdioSession = createManualSession({
kind: "mcp",
transport: "stdio",
command: "node",
args: ["./mcp-server.js"],
});
// Only the HTTP session is opened here. Opening stdioSession starts its process.
try {
await httpSession.open();
const outcome = await httpSession.send({
method: "tools/call",
params: { name: "get_user", arguments: { id: "42" } },
});
console.log(outcome);
} finally {
await httpSession.close();
}
6. Pemanggilan unary gRPC
import { grpcCall } from "@powerduck/openapi-request/grpc";
const result = await grpcCall({
address: "grpc.example.com:50051",
service: "helloworld.Greeter",
method: "SayHello",
protoPaths: ["./protos/helloworld.proto"],
metadata: { "x-tenant": "acme" },
deadlineMs: 5000,
}, {
messages: [{ name: "World" }],
});
console.log(result.messages); // decoded response(s)
console.log(result.status); // { code, codeName, details }
Fungsi yang sama mendukung streaming server, klien, dan dua arah melalui options.messages serta batas seperti maxMessages, idleTimeoutMs, dan maxSessionMs. Untuk aliran berumur panjang, gunakan createGrpcManualSession().
7. Menuliskan respons ke spesifikasi
import { writeBackResponse, toResponseObject, locateOperation } from "@powerduck/openapi-request";
// Locate the operation
const located = locateOperation(spec, { operationId: "getUserById" });
// Build a response object from the result
const fragment = toResponseObject(result, {
// Optional: response normalization options
});
// Write back into the spec
const updated = writeBackResponse(
spec,
located.path,
located.method,
fragment,
{
// Optional: WriteBackOptions
overwriteExamples: true,
},
);
writeBackResponse() mengembalikan salinan yang diubah; fungsi ini tidak menyimpan berkas. Tinjau contoh yang direkam sebelum menerbitkannya. Berbeda dari alur pengiriman debugger, fungsi tingkat rendah ini tidak menerapkan requirePassingTests.
Menyimpulkan skema dan menghasilkan sampel dari respons
import { inferSchema, sampleFromSchema } from "@powerduck/openapi-request";
// Use this for JSON responses; handle parse errors for non-JSON bodies.
const body = result.response.body;
const schema = inferSchema(typeof body === "string" ? JSON.parse(body) : body);
// Generate a realistic sample from the schema
const sample = sampleFromSchema(schema);