Lattice SDK 类型脚本库
Lattice SDK TypeScript库从TypeScript提供Lattice SDK API的方便访问.
目录
文档
API 备有参考文件 这里。 。 。 .
所需资源
要使用 SDK 请确保您安装以下设备 :
安装
npm i -s @anduril-industries/lattice-sdk
支助
请联系您的Anduril代表.
参考文献
该图书馆的全部参考资料可供查阅 这里。 。 。 .
使用量
以下列方式证明和使用客户端:
import { LatticeClient } from "@anduril-industries/lattice-sdk";
const client = new LatticeClient({ clientId: "YOUR_CLIENT_ID", clientSecret: "YOUR_CLIENT_SECRET" });
await client.entities.longPollEntityEvents({
sessionToken: "sessionToken"
});
环境
此 SDK 允许您为 API 请求配置不同的环境 .
import { LatticeClient, LatticeEnvironment } from "@anduril-industries/lattice-sdk";
const client = new LatticeClient({
environment: LatticeEnvironment.Default,
});
认证
SDK支持OAuth认证有两个选项:
备选方案1:OAuth客户端证书流程
如果您想要 SDK 自动处理 OAuth 令牌检索和刷新时使用此功能 :
import { LatticeClient } from "@anduril-industries/lattice-sdk";
const client = new LatticeClient({
clientId: "YOUR_CLIENT_ID",
clientSecret: "YOUR_CLIENT_SECRET",
...
});
备选案文2:推翻
当您已经拥有有效的无记名符号并想要跳过 OAuth 流时使用 :
import { LatticeClient } from "@anduril-industries/lattice-sdk";
const client = new LatticeClient({
token: "my-pre-generated-bearer-token",
...
});
请求和答复类型
SDK导出所有请求和响应类型为TypeScript接口. 只需用 以下命名空间:
import { Lattice } from "@anduril-industries/lattice-sdk";
const request: Lattice.GetEntityRequest = {
...
};
例外处理
当 API 返回一个非成功状态代码( 4xx 或 5xx 响应) 时, 以下错误的子类 将会被扔出.
import { LatticeError } from "@anduril-industries/lattice-sdk";
try {
await client.entities.longPollEntityEvents(...);
} catch (err) {
if (err instanceof LatticeError) {
console.log(err.statusCode);
console.log(err.message);
console.log(err.body);
console.log(err.rawResponse);
}
}
流化反应
一些端点返回流回响应,而不是立即返回全部响应.
SDK使用同步延时器,所以您可以使用 for await...of 循环.
import { LatticeClient } from "@anduril-industries/lattice-sdk";
const client = new LatticeClient({ clientId: "YOUR_CLIENT_ID", clientSecret: "YOUR_CLIENT_SECRET" });
const response = await client.entities.streamEntities();
for await (const item of response) {
console.log(item);
}
文件上传
您可以使用客户端上传文件 :
import { createReadStream } from "fs";
await client.objects.uploadObject(createReadStream("path/to/file"), ...);
await client.objects.uploadObject(new ReadableStream(), ...);
await client.objects.uploadObject(Buffer.from('binary data'), ...);
await client.objects.uploadObject(new Blob(['binary data'], { type: 'audio/mpeg' }), ...);
await client.objects.uploadObject(new File(['binary data'], 'file.mp3'), ...);
await client.objects.uploadObject(new ArrayBuffer(8), ...);
await client.objects.uploadObject(new Uint8Array([0, 1, 2]), ...);
客户端接受多种类型的文件上传参数:
- 流类型 :
fs.ReadStream, (中文(简体) ),stream.Readable,以及ReadableStream - 缓冲类型 :
Buffer, (中文(简体) ),Blob, (中文(简体) ),File, (中文(简体) ),ArrayBuffer, (中文(简体) ),ArrayBufferView,以及Uint8Array
元数据
您可以在上传文件时配置元数据 :
const file: Uploadable.WithMetadata = {
data: createReadStream("path/to/file"),
filename: "my-file", // optional
contentType: "audio/mpeg", // optional
contentLength: 1949, // optional
};
或者,您可以从文件路径直接上传文件 :
const file : Uploadable.FromPath = {
path: "path/to/file",
filename: "my-file", // optional
contentType: "audio/mpeg", // optional
contentLength: 1949, // optional
};
元数据用于设置 Content-Length, (中文(简体) ), Content-Type,以及 Content-Disposition 头. 如果不提供,客户端将尝试自动确定.
譬如说, fs.ReadStream 有一个 path 属性,SDK用于从文件系统取回文件大小而不将其装入内存.
二进制响应
您可以使用 BinaryResponse 类型,允许您选择如何消耗数据 :
const response = await client.objects.getObject(...);
const stream: ReadableStream<Uint8Array> = response.stream();
// const arrayBuffer: ArrayBuffer = await response.arrayBuffer();
// const blob: Blob = response.blob();
// const bytes: Uint8Array = response.bytes();
// You can only use the response body once, so you must choose one of the above methods.
// If you want to check if the response body has been used, you can use the following property.
const bodyUsed = response.bodyUsed;
对文件保存二进制响应
节点.js
可读结构(最高效)
import { createWriteStream } from 'fs'; import { Readable } from 'stream'; import { pipeline } from 'stream/promises'; const response = await client.objects.getObject(...); const stream = response.stream(); const nodeStream = Readable.fromWeb(stream); const writeStream = createWriteStream('path/to/file'); await pipeline(nodeStream, writeStream);矩阵缓冲
import { writeFile } from 'fs/promises'; const response = await client.objects.getObject(...); const arrayBuffer = await response.arrayBuffer(); await writeFile('path/to/file', Buffer.from(arrayBuffer));块
import { writeFile } from 'fs/promises'; const response = await client.objects.getObject(...); const blob = await response.blob(); const arrayBuffer = await blob.arrayBuffer(); await writeFile('output.bin', Buffer.from(arrayBuffer));字节 (UIntArray8)
import { writeFile } from 'fs/promises'; const response = await client.objects.getObject(...); const bytes = await response.bytes(); await writeFile('path/to/file', bytes);
阿宝
可读结构(最高效)
const response = await client.objects.getObject(...); const stream = response.stream(); await Bun.write('path/to/file', stream);矩阵缓冲
const response = await client.objects.getObject(...); const arrayBuffer = await response.arrayBuffer(); await Bun.write('path/to/file', arrayBuffer);块
const response = await client.objects.getObject(...); const blob = await response.blob(); await Bun.write('path/to/file', blob);字节 (UIntArray8)
const response = await client.objects.getObject(...); const bytes = await response.bytes(); await Bun.write('path/to/file', bytes);
德诺
可读结构(最高效)
const response = await client.objects.getObject(...); const stream = response.stream(); const file = await Deno.open('path/to/file', { write: true, create: true }); await stream.pipeTo(file.writable);矩阵缓冲
const response = await client.objects.getObject(...); const arrayBuffer = await response.arrayBuffer(); await Deno.writeFile('path/to/file', new Uint8Array(arrayBuffer));块
const response = await client.objects.getObject(...); const blob = await response.blob(); const arrayBuffer = await blob.arrayBuffer(); await Deno.writeFile('path/to/file', new Uint8Array(arrayBuffer));字节 (UIntArray8)
const response = await client.objects.getObject(...); const bytes = await response.bytes(); await Deno.writeFile('path/to/file', bytes);
浏览器
Blob( 效率最高)
const response = await client.objects.getObject(...); const blob = await response.blob(); const url = URL.createObjectURL(blob); // trigger download const a = document.createElement('a'); a.href = url; a.download = 'filename'; a.click(); URL.revokeObjectURL(url);可读结构
const response = await client.objects.getObject(...); const stream = response.stream(); const reader = stream.getReader(); const chunks = []; while (true) { const { done, value } = await reader.read(); if (done) break; chunks.push(value); } const blob = new Blob(chunks); const url = URL.createObjectURL(blob); // trigger download const a = document.createElement('a'); a.href = url; a.download = 'filename'; a.click(); URL.revokeObjectURL(url);矩阵缓冲
const response = await client.objects.getObject(...); const arrayBuffer = await response.arrayBuffer(); const blob = new Blob([arrayBuffer]); const url = URL.createObjectURL(blob); // trigger download const a = document.createElement('a'); a.href = url; a.download = 'filename'; a.click(); URL.revokeObjectURL(url);字节 (UIntArray8)
const response = await client.objects.getObject(...); const bytes = await response.bytes(); const blob = new Blob([bytes]); const url = URL.createObjectURL(blob); // trigger download const a = document.createElement('a'); a.href = url; a.download = 'filename'; a.click(); URL.revokeObjectURL(url);
将二进制响应转换为文本
可读结构
const response = await client.objects.getObject(...); const stream = response.stream(); const text = await new Response(stream).text();
矩阵缓冲
const response = await client.objects.getObject(...); const arrayBuffer = await response.arrayBuffer(); const text = new TextDecoder().decode(arrayBuffer);
块
const response = await client.objects.getObject(...); const blob = await response.blob(); const text = await blob.text();
字节 (UIntArray8)
const response = await client.objects.getObject(...); const bytes = await response.bytes(); const text = new TextDecoder().decode(bytes);
倾斜
列表终点为相接点. SDK提供了一个传动器,这样你就可以简单地绕过这些项目:
import { LatticeClient } from "@anduril-industries/lattice-sdk";
const client = new LatticeClient({ clientId: "YOUR_CLIENT_ID", clientSecret: "YOUR_CLIENT_SECRET" });
const pageableResponse = await client.objects.listObjects();
for await (const item of pageableResponse) {
console.log(item);
}
// Or you can manually iterate page-by-page
let page = await client.objects.listObjects();
while (page.hasNextPage()) {
page = await page.getNextPage();
}
// You can also access the underlying response
const response = page.response;
高级
出口
这个SDK支持子包客户端的直接进口,它允许JavaScript捆绑器进行树摇并只包括被导入子包代码. 这导致捆绑大小要小得多.
import { EntitiesClient } from '@anduril-industries/lattice-sdk/entities';
const client = new EntitiesClient({...});
其他信头
如果您希望作为请求的一部分发送额外的信头,请使用 headers 请求选项.
import { LatticeClient } from "@anduril-industries/lattice-sdk";
const client = new LatticeClient({
...
headers: {
'X-Custom-Header': 'custom value'
}
});
const response = await client.entities.longPollEntityEvents(..., {
headers: {
'X-Custom-Header': 'custom value'
}
});
其它查询字符串参数
如果您希望作为请求的一部分发送额外的查询字符串参数,请使用 queryParams 请求选项.
const response = await client.entities.longPollEntityEvents(..., {
queryParams: {
'customQueryParamKey': 'custom query param value'
}
});
检索
SDK是用有指数回放的自动回放装置. 申请要等会再审 由于请求被认为可以重试,且重试的次数没有超过所配置的 重试限制( 默认: 2) .
重审哪个状态代码取决于 retryStatusCodes 生成器配置 :
legacy (当前默认值):在
- 408 (简体中文) (超时)
- 429个 (太多请求)
- 第5XX条 (所有服务器错误,包括500个)
recommended: 重试
- 408 (简体中文) (超时)
- 429个 (太多请求)
- 502 (中文(简体) ) (坏门)
- 第503条 (服务不可用)
- 504 (中文(简体) ) (Gateway超时)
使用 maxRetries 请求选项来配置此行为.
const response = await client.entities.longPollEntityEvents(..., {
maxRetries: 0 // override maxRetries at the request level
});
超时
SDK默认为60第二次超时. 使用 timeoutInSeconds 选项来配置此行为.
const response = await client.entities.longPollEntityEvents(..., {
timeoutInSeconds: 30 // override timeout to 30s
});
中止请求
SDK允许用户在任何时刻通过一个中止信号来中止请求.
const controller = new AbortController();
const response = await client.entities.longPollEntityEvents(..., {
abortSignal: controller.signal
});
controller.abort(); // aborts the request
访问原始响应数据
SDK通过下列方式提供原始响应数据,包括信头: .withRawResponse() 方法.
这个 .withRawResponse() 方法返回给一个带有 data (单位:千美元) rawResponse 属性.
const { data, rawResponse } = await client.entities.longPollEntityEvents(...).withRawResponse();
console.log(data);
console.log(rawResponse.headers['X-My-Header']);
日志
SDK支持记录. 您可以通过通过一个 logging 对象对客户端选项.
import { LatticeClient, logging } from "@anduril-industries/lattice-sdk";
const client = new LatticeClient({
...
logging: {
level: logging.LogLevel.Debug, // defaults to logging.LogLevel.Info
logger: new logging.ConsoleLogger(), // defaults to ConsoleLogger
silent: false, // defaults to true, set to false to enable logging
}
});
这个 logging 对象可以具有以下属性:
level: 要使用的日志级别 。 默认为logging.LogLevel.Info。 。 。 .logger:要使用的伐木机. 默认为 alogging.ConsoleLogger。 。 。 .silent: 是否让伐木工安静. 默认为true。 。 。 .
这个 level 属性可以是下列值之一:
logging.LogLevel.Debuglogging.LogLevel.Infologging.LogLevel.Warnlogging.LogLevel.Error
要提供自定义日志, 您可以通过一个执行 logging.ILogger 接口.
自定义日志示例
举个例子,用流行的 winston 伐木图书馆.
import winston from 'winston';
const winstonLogger = winston.createLogger({...});
const logger: logging.ILogger = {
debug: (msg, ...args) => winstonLogger.debug(msg, ...args),
info: (msg, ...args) => winstonLogger.info(msg, ...args),
warn: (msg, ...args) => winstonLogger.warn(msg, ...args),
error: (msg, ...args) => winstonLogger.error(msg, ...args),
};
举个例子,用流行的 pino 伐木图书馆.
import pino from 'pino';
const pinoLogger = pino({...});
const logger: logging.ILogger = {
debug: (msg, ...args) => pinoLogger.debug(args, msg),
info: (msg, ...args) => pinoLogger.info(args, msg),
warn: (msg, ...args) => pinoLogger.warn(args, msg),
error: (msg, ...args) => pinoLogger.error(args, msg),
};
自定义抓取
SDK提供低级 fetch 将自定义的 HTTP 请求生成到当前
从SDK级配置中受益,如认证、重试、超时和记录.
这对调用SDK中尚未支持的API端点很有用.
const response = await client.fetch("/v1/custom/endpoint", {
method: "GET",
}, {
timeoutInSeconds: 30,
maxRetries: 3,
headers: {
"X-Custom-Header": "custom-value",
},
});
const data = await response.json();
运行时间相容性
SDK工作时间如下:
- 节点.js 18+
- 维塞尔
- 云花岗工人
- 德诺v1.25+
- 1.0+号舱
- 原生反应