sonamu 0.9.18 → 0.9.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/providers/rtzr/api.d.ts +4 -0
- package/dist/ai/providers/rtzr/api.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/api.js +5 -1
- package/dist/ai/providers/rtzr/error.d.ts +15 -6
- package/dist/ai/providers/rtzr/error.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/error.js +88 -11
- package/dist/ai/providers/rtzr/index.js +2 -2
- package/dist/ai/providers/rtzr/model.d.ts.map +1 -1
- package/dist/ai/providers/rtzr/model.js +20 -9
- package/package.json +3 -3
- package/src/ai/providers/rtzr/__tests__/model.test.ts +284 -0
- package/src/ai/providers/rtzr/api.ts +6 -0
- package/src/ai/providers/rtzr/error.ts +122 -9
- package/src/ai/providers/rtzr/model.ts +39 -8
- package/src/skills/sonamu/entity-basic.md +31 -0
- package/src/skills/sonamu/puri.md +22 -0
- package/src/skills/sonamu/upsert.md +53 -6
|
@@ -9,6 +9,10 @@ export declare const rtzrTranscriptionResponseSchema: import("@ai-sdk/provider-u
|
|
|
9
9
|
export declare const rtzrTranscriptionResultResponseSchema: import("@ai-sdk/provider-utils").LazySchema<{
|
|
10
10
|
id: string;
|
|
11
11
|
status: "completed" | "failed" | "transcribing";
|
|
12
|
+
error?: {
|
|
13
|
+
code?: string | number | null | undefined;
|
|
14
|
+
message?: string | null | undefined;
|
|
15
|
+
} | null | undefined;
|
|
12
16
|
results?: {
|
|
13
17
|
utterances: {
|
|
14
18
|
start_at: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/rtzr/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,sBAAsB;;;iBAGjC,CAAC;AAEH,eAAO,MAAM,+BAA+B;;EAM3C,CAAC;AAEF,eAAO,MAAM,qCAAqC
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/rtzr/api.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,sBAAsB;;;iBAGjC,CAAC;AAEH,eAAO,MAAM,+BAA+B;;EAM3C,CAAC;AAEF,eAAO,MAAM,qCAAqC;;;;;;;;;;;;;;;;EA0BjD,CAAC"}
|
|
@@ -14,6 +14,10 @@ const rtzrTranscriptionResultResponseSchema = lazySchema(() => zodSchema(z$1.obj
|
|
|
14
14
|
"completed",
|
|
15
15
|
"failed"
|
|
16
16
|
]),
|
|
17
|
+
error: z$1.object({
|
|
18
|
+
code: z$1.union([z$1.string(), z$1.number()]).nullish(),
|
|
19
|
+
message: z$1.string().nullish()
|
|
20
|
+
}).nullish(),
|
|
17
21
|
results: z$1.object({ utterances: z$1.array(z$1.object({
|
|
18
22
|
start_at: z$1.number(),
|
|
19
23
|
duration: z$1.number(),
|
|
@@ -25,4 +29,4 @@ const rtzrTranscriptionResultResponseSchema = lazySchema(() => zodSchema(z$1.obj
|
|
|
25
29
|
|
|
26
30
|
//#endregion
|
|
27
31
|
export { rtzrAuthResponseSchema, rtzrTranscriptionResponseSchema, rtzrTranscriptionResultResponseSchema };
|
|
28
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwibmFtZXMiOlsieiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9haS9wcm92aWRlcnMvcnR6ci9hcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbGF6eVNjaGVtYSwgem9kU2NoZW1hIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmV4cG9ydCBjb25zdCBydHpyQXV0aFJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBhY2Nlc3NfdG9rZW46IHouc3RyaW5nKCksXG4gIGV4cGlyZV9hdDogei5udW1iZXIoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgcnR6clRyYW5zY3JpcHRpb25SZXNwb25zZVNjaGVtYSA9IGxhenlTY2hlbWEoKCkgPT5cbiAgem9kU2NoZW1hKFxuICAgIHoub2JqZWN0KHtcbiAgICAgIGlkOiB6LnN0cmluZygpLFxuICAgIH0pLFxuICApLFxuKTtcblxuZXhwb3J0IGNvbnN0IHJ0enJUcmFuc2NyaXB0aW9uUmVzdWx0UmVzcG9uc2VTY2hlbWEgPSBsYXp5U2NoZW1hKCgpID0+
|
|
32
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwibmFtZXMiOlsieiJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9haS9wcm92aWRlcnMvcnR6ci9hcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbGF6eVNjaGVtYSwgem9kU2NoZW1hIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmV4cG9ydCBjb25zdCBydHpyQXV0aFJlc3BvbnNlU2NoZW1hID0gei5vYmplY3Qoe1xuICBhY2Nlc3NfdG9rZW46IHouc3RyaW5nKCksXG4gIGV4cGlyZV9hdDogei5udW1iZXIoKSxcbn0pO1xuXG5leHBvcnQgY29uc3QgcnR6clRyYW5zY3JpcHRpb25SZXNwb25zZVNjaGVtYSA9IGxhenlTY2hlbWEoKCkgPT5cbiAgem9kU2NoZW1hKFxuICAgIHoub2JqZWN0KHtcbiAgICAgIGlkOiB6LnN0cmluZygpLFxuICAgIH0pLFxuICApLFxuKTtcblxuZXhwb3J0IGNvbnN0IHJ0enJUcmFuc2NyaXB0aW9uUmVzdWx0UmVzcG9uc2VTY2hlbWEgPSBsYXp5U2NoZW1hKCgpID0+XG4gIHpvZFNjaGVtYShcbiAgICB6Lm9iamVjdCh7XG4gICAgICBpZDogei5zdHJpbmcoKSxcbiAgICAgIHN0YXR1czogei5lbnVtKFtcInRyYW5zY3JpYmluZ1wiLCBcImNvbXBsZXRlZFwiLCBcImZhaWxlZFwiXSksXG4gICAgICBlcnJvcjogelxuICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICBjb2RlOiB6LnVuaW9uKFt6LnN0cmluZygpLCB6Lm51bWJlcigpXSkubnVsbGlzaCgpLFxuICAgICAgICAgIG1lc3NhZ2U6IHouc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgICAgICB9KVxuICAgICAgICAubnVsbGlzaCgpLFxuICAgICAgcmVzdWx0czogelxuICAgICAgICAub2JqZWN0KHtcbiAgICAgICAgICB1dHRlcmFuY2VzOiB6LmFycmF5KFxuICAgICAgICAgICAgei5vYmplY3Qoe1xuICAgICAgICAgICAgICBzdGFydF9hdDogei5udW1iZXIoKSxcbiAgICAgICAgICAgICAgZHVyYXRpb246IHoubnVtYmVyKCksXG4gICAgICAgICAgICAgIG1zZzogei5zdHJpbmcoKSxcbiAgICAgICAgICAgICAgc3BrOiB6Lm51bWJlcigpLFxuICAgICAgICAgICAgICBsYW5nOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICApLFxuICAgICAgICB9KVxuICAgICAgICAubnVsbGlzaCgpLFxuICAgIH0pLFxuICApLFxuKTtcbiJdLCJtYXBwaW5ncyI6Ijs7OztBQUdBLE1BQWEseUJBQXlCQSxJQUFFLE9BQU87Q0FDN0MsY0FBY0EsSUFBRSxRQUFRO0NBQ3hCLFdBQVdBLElBQUUsUUFBUTtDQUN0QixDQUFDO0FBRUYsTUFBYSxrQ0FBa0MsaUJBQzdDLFVBQ0VBLElBQUUsT0FBTyxFQUNQLElBQUlBLElBQUUsUUFBUSxFQUNmLENBQUMsQ0FDSCxDQUNGO0FBRUQsTUFBYSx3Q0FBd0MsaUJBQ25ELFVBQ0VBLElBQUUsT0FBTztDQUNQLElBQUlBLElBQUUsUUFBUTtDQUNkLFFBQVFBLElBQUUsS0FBSztFQUFDO0VBQWdCO0VBQWE7RUFBUyxDQUFDO0NBQ3ZELE9BQU9BLElBQ0osT0FBTztFQUNOLE1BQU1BLElBQUUsTUFBTSxDQUFDQSxJQUFFLFFBQVEsRUFBRUEsSUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7RUFDakQsU0FBU0EsSUFBRSxRQUFRLENBQUMsU0FBUztFQUM5QixDQUFDLENBQ0QsU0FBUztDQUNaLFNBQVNBLElBQ04sT0FBTyxFQUNOLFlBQVlBLElBQUUsTUFDWkEsSUFBRSxPQUFPO0VBQ1AsVUFBVUEsSUFBRSxRQUFRO0VBQ3BCLFVBQVVBLElBQUUsUUFBUTtFQUNwQixLQUFLQSxJQUFFLFFBQVE7RUFDZixLQUFLQSxJQUFFLFFBQVE7RUFDZixNQUFNQSxJQUFFLFFBQVEsQ0FBQyxVQUFVO0VBQzVCLENBQUMsQ0FDSCxFQUNGLENBQUMsQ0FDRCxTQUFTO0NBQ2IsQ0FBQyxDQUNILENBQ0YifQ==
|
|
@@ -1,15 +1,24 @@
|
|
|
1
|
-
import { AISDKError } from "@ai-sdk/provider";
|
|
1
|
+
import { AISDKError, APICallError } from "@ai-sdk/provider";
|
|
2
|
+
import { type ResponseHandler } from "@ai-sdk/provider-utils";
|
|
2
3
|
import { z } from "zod";
|
|
3
|
-
export declare const rtzrErrorDataSchema: z.ZodObject<{
|
|
4
|
+
export declare const rtzrErrorDataSchema: z.ZodUnion<readonly [z.ZodObject<{
|
|
5
|
+
code: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
|
|
6
|
+
msg: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
7
|
+
type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
8
|
+
param: z.ZodOptional<z.ZodNullable<z.ZodUnknown>>;
|
|
9
|
+
}, z.core.$strip>, z.ZodObject<{
|
|
4
10
|
error: z.ZodObject<{
|
|
5
|
-
msg: z.ZodString
|
|
11
|
+
msg: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
12
|
+
message: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
6
13
|
type: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
7
|
-
param: z.ZodOptional<z.ZodNullable<z.
|
|
14
|
+
param: z.ZodOptional<z.ZodNullable<z.ZodUnknown>>;
|
|
8
15
|
code: z.ZodOptional<z.ZodNullable<z.ZodUnion<readonly [z.ZodString, z.ZodNumber]>>>;
|
|
9
16
|
}, z.core.$strip>;
|
|
10
|
-
}, z.core.$strip>;
|
|
17
|
+
}, z.core.$strip>]>;
|
|
11
18
|
export type RtzrErrorData = z.infer<typeof rtzrErrorDataSchema>;
|
|
12
|
-
export declare
|
|
19
|
+
export declare function formatRtzrErrorData(data: RtzrErrorData): string;
|
|
20
|
+
export declare function formatRtzrErrorResponseBody(responseBody: string): Promise<string | undefined>;
|
|
21
|
+
export declare const rtzrFailedResponseHandler: ResponseHandler<APICallError>;
|
|
13
22
|
export declare class RtzrClientError extends AISDKError {
|
|
14
23
|
constructor(message: string, options?: {
|
|
15
24
|
cause?: Error;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/rtzr/error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/rtzr/error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAoBxB,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;mBAAgE,CAAC;AAEjG,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAsChE,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAmB/D;AAED,wBAAsB,2BAA2B,CAC/C,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAe7B;AAED,eAAO,MAAM,yBAAyB,EAAE,eAAe,CAAC,YAAY,CA4BnE,CAAC;AAEF,qBAAa,eAAgB,SAAQ,UAAU;gBAE3C,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;QACR,KAAK,CAAC,EAAE,KAAK,CAAC;KACf;CAQJ"}
|
|
@@ -1,18 +1,95 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { extractResponseHeaders, safeParseJSON, zodSchema } from "@ai-sdk/provider-utils";
|
|
2
2
|
import { z as z$1 } from "zod";
|
|
3
|
-
import { AISDKError } from "@ai-sdk/provider";
|
|
3
|
+
import { AISDKError, APICallError } from "@ai-sdk/provider";
|
|
4
4
|
|
|
5
5
|
//#region src/ai/providers/rtzr/error.ts
|
|
6
|
-
const
|
|
7
|
-
|
|
6
|
+
const rtzrFlatErrorDataSchema = z$1.object({
|
|
7
|
+
code: z$1.union([z$1.string(), z$1.number()]).nullish(),
|
|
8
|
+
msg: z$1.string().nullish(),
|
|
8
9
|
type: z$1.string().nullish(),
|
|
9
|
-
param: z$1.
|
|
10
|
+
param: z$1.unknown().nullish()
|
|
11
|
+
});
|
|
12
|
+
const rtzrNestedErrorDataSchema = z$1.object({ error: z$1.object({
|
|
13
|
+
msg: z$1.string().nullish(),
|
|
14
|
+
message: z$1.string().nullish(),
|
|
15
|
+
type: z$1.string().nullish(),
|
|
16
|
+
param: z$1.unknown().nullish(),
|
|
10
17
|
code: z$1.union([z$1.string(), z$1.number()]).nullish()
|
|
11
18
|
}) });
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
19
|
+
const rtzrErrorDataSchema = z$1.union([rtzrFlatErrorDataSchema, rtzrNestedErrorDataSchema]);
|
|
20
|
+
function isNullish(value) {
|
|
21
|
+
return value === null || value === undefined;
|
|
22
|
+
}
|
|
23
|
+
function normalizeRtzrErrorData(data) {
|
|
24
|
+
if ("error" in data) {
|
|
25
|
+
return data.error;
|
|
26
|
+
}
|
|
27
|
+
return data;
|
|
28
|
+
}
|
|
29
|
+
function formatParam(param) {
|
|
30
|
+
if (isNullish(param)) {
|
|
31
|
+
return undefined;
|
|
32
|
+
}
|
|
33
|
+
if (typeof param === "string") {
|
|
34
|
+
return param;
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
return JSON.stringify(param);
|
|
38
|
+
} catch {
|
|
39
|
+
return String(param);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function formatRtzrErrorData(data) {
|
|
43
|
+
const error = normalizeRtzrErrorData(data);
|
|
44
|
+
const param = formatParam(error.param);
|
|
45
|
+
const parts = [
|
|
46
|
+
isNullish(error.code) ? undefined : `code ${error.code}`,
|
|
47
|
+
isNullish(error.type) ? undefined : `type ${error.type}`,
|
|
48
|
+
isNullish(param) ? undefined : `param ${param}`
|
|
49
|
+
].filter((item) => !isNullish(item) && item.length > 0);
|
|
50
|
+
const message = error.msg ?? error.message;
|
|
51
|
+
if (!isNullish(message) && message.length > 0) {
|
|
52
|
+
return [...parts, message].join(": ");
|
|
53
|
+
}
|
|
54
|
+
if (parts.length > 0) {
|
|
55
|
+
return parts.join(": ");
|
|
56
|
+
}
|
|
57
|
+
return "unknown RTZR error";
|
|
58
|
+
}
|
|
59
|
+
async function formatRtzrErrorResponseBody(responseBody) {
|
|
60
|
+
if (responseBody.trim().length === 0) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
const parsedError = await safeParseJSON({
|
|
64
|
+
text: responseBody,
|
|
65
|
+
schema: zodSchema(rtzrErrorDataSchema)
|
|
66
|
+
});
|
|
67
|
+
if (!parsedError.success) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
return formatRtzrErrorData(parsedError.value);
|
|
71
|
+
}
|
|
72
|
+
const rtzrFailedResponseHandler = async ({ response, url, requestBodyValues }) => {
|
|
73
|
+
const responseBody = await response.text();
|
|
74
|
+
const responseHeaders = extractResponseHeaders(response);
|
|
75
|
+
const detail = await formatRtzrErrorResponseBody(responseBody) ?? response.statusText ?? "unparseable RTZR error response";
|
|
76
|
+
const parsedError = await safeParseJSON({
|
|
77
|
+
text: responseBody,
|
|
78
|
+
schema: zodSchema(rtzrErrorDataSchema)
|
|
79
|
+
});
|
|
80
|
+
return {
|
|
81
|
+
responseHeaders,
|
|
82
|
+
value: new APICallError({
|
|
83
|
+
message: `HTTP ${response.status}: ${detail}`,
|
|
84
|
+
url,
|
|
85
|
+
requestBodyValues,
|
|
86
|
+
statusCode: response.status,
|
|
87
|
+
responseHeaders,
|
|
88
|
+
responseBody,
|
|
89
|
+
data: parsedError.success ? parsedError.value : undefined
|
|
90
|
+
})
|
|
91
|
+
};
|
|
92
|
+
};
|
|
16
93
|
var RtzrClientError = class extends AISDKError {
|
|
17
94
|
constructor(message, options) {
|
|
18
95
|
super({
|
|
@@ -24,5 +101,5 @@ var RtzrClientError = class extends AISDKError {
|
|
|
24
101
|
};
|
|
25
102
|
|
|
26
103
|
//#endregion
|
|
27
|
-
export { RtzrClientError, rtzrErrorDataSchema, rtzrFailedResponseHandler };
|
|
28
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
104
|
+
export { RtzrClientError, formatRtzrErrorData, formatRtzrErrorResponseBody, rtzrErrorDataSchema, rtzrFailedResponseHandler };
|
|
105
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuanMiLCJuYW1lcyI6WyJ6IiwicnR6ckZhaWxlZFJlc3BvbnNlSGFuZGxlcjogUmVzcG9uc2VIYW5kbGVyPEFQSUNhbGxFcnJvcj4iXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWkvcHJvdmlkZXJzL3J0enIvZXJyb3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQUlTREtFcnJvciwgQVBJQ2FsbEVycm9yIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbmltcG9ydCB7IGV4dHJhY3RSZXNwb25zZUhlYWRlcnMsIHNhZmVQYXJzZUpTT04sIHpvZFNjaGVtYSB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIFJlc3BvbnNlSGFuZGxlciB9IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG5jb25zdCBydHpyRmxhdEVycm9yRGF0YVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgY29kZTogei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pLm51bGxpc2goKSxcbiAgbXNnOiB6LnN0cmluZygpLm51bGxpc2goKSxcbiAgdHlwZTogei5zdHJpbmcoKS5udWxsaXNoKCksXG4gIHBhcmFtOiB6LnVua25vd24oKS5udWxsaXNoKCksXG59KTtcblxuY29uc3QgcnR6ck5lc3RlZEVycm9yRGF0YVNjaGVtYSA9IHoub2JqZWN0KHtcbiAgZXJyb3I6IHoub2JqZWN0KHtcbiAgICBtc2c6IHouc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgIG1lc3NhZ2U6IHouc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgIHR5cGU6IHouc3RyaW5nKCkubnVsbGlzaCgpLFxuICAgIHBhcmFtOiB6LnVua25vd24oKS5udWxsaXNoKCksXG4gICAgY29kZTogei51bmlvbihbei5zdHJpbmcoKSwgei5udW1iZXIoKV0pLm51bGxpc2goKSxcbiAgfSksXG59KTtcblxuLy8gUlRaUiByZXR1cm5zIGZsYXQgSFRUUCBlcnJvcnMsIGJ1dCBhc3luYyB0cmFuc2NyaXB0aW9uIGZhaWx1cmVzIHdyYXAgZGV0YWlscyBpbiBlcnJvci5cbmV4cG9ydCBjb25zdCBydHpyRXJyb3JEYXRhU2NoZW1hID0gei51bmlvbihbcnR6ckZsYXRFcnJvckRhdGFTY2hlbWEsIHJ0enJOZXN0ZWRFcnJvckRhdGFTY2hlbWFdKTtcblxuZXhwb3J0IHR5cGUgUnR6ckVycm9yRGF0YSA9IHouaW5mZXI8dHlwZW9mIHJ0enJFcnJvckRhdGFTY2hlbWE+O1xuXG50eXBlIE5vcm1hbGl6ZWRSdHpyRXJyb3IgPSB7XG4gIGNvZGU/OiBzdHJpbmcgfCBudW1iZXIgfCBudWxsO1xuICBtZXNzYWdlPzogc3RyaW5nIHwgbnVsbDtcbiAgbXNnPzogc3RyaW5nIHwgbnVsbDtcbiAgdHlwZT86IHN0cmluZyB8IG51bGw7XG4gIHBhcmFtPzogdW5rbm93bjtcbn07XG5cbmZ1bmN0aW9uIGlzTnVsbGlzaCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIG51bGwgfCB1bmRlZmluZWQge1xuICByZXR1cm4gdmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUnR6ckVycm9yRGF0YShkYXRhOiBSdHpyRXJyb3JEYXRhKTogTm9ybWFsaXplZFJ0enJFcnJvciB7XG4gIGlmIChcImVycm9yXCIgaW4gZGF0YSkge1xuICAgIHJldHVybiBkYXRhLmVycm9yO1xuICB9XG5cbiAgcmV0dXJuIGRhdGE7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdFBhcmFtKHBhcmFtOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlzTnVsbGlzaChwYXJhbSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gXCJzdHJpbmdcIikge1xuICAgIHJldHVybiBwYXJhbTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHBhcmFtKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFN0cmluZyhwYXJhbSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdFJ0enJFcnJvckRhdGEoZGF0YTogUnR6ckVycm9yRGF0YSk6IHN0cmluZyB7XG4gIGNvbnN0IGVycm9yID0gbm9ybWFsaXplUnR6ckVycm9yRGF0YShkYXRhKTtcbiAgY29uc3QgcGFyYW0gPSBmb3JtYXRQYXJhbShlcnJvci5wYXJhbSk7XG4gIGNvbnN0IHBhcnRzID0gW1xuICAgIGlzTnVsbGlzaChlcnJvci5jb2RlKSA/IHVuZGVmaW5lZCA6IGBjb2RlICR7ZXJyb3IuY29kZX1gLFxuICAgIGlzTnVsbGlzaChlcnJvci50eXBlKSA/IHVuZGVmaW5lZCA6IGB0eXBlICR7ZXJyb3IudHlwZX1gLFxuICAgIGlzTnVsbGlzaChwYXJhbSkgPyB1bmRlZmluZWQgOiBgcGFyYW0gJHtwYXJhbX1gLFxuICBdLmZpbHRlcigoaXRlbSk6IGl0ZW0gaXMgc3RyaW5nID0+ICFpc051bGxpc2goaXRlbSkgJiYgaXRlbS5sZW5ndGggPiAwKTtcbiAgY29uc3QgbWVzc2FnZSA9IGVycm9yLm1zZyA/PyBlcnJvci5tZXNzYWdlO1xuXG4gIGlmICghaXNOdWxsaXNoKG1lc3NhZ2UpICYmIG1lc3NhZ2UubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBbLi4ucGFydHMsIG1lc3NhZ2VdLmpvaW4oXCI6IFwiKTtcbiAgfVxuXG4gIGlmIChwYXJ0cy5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIHBhcnRzLmpvaW4oXCI6IFwiKTtcbiAgfVxuXG4gIHJldHVybiBcInVua25vd24gUlRaUiBlcnJvclwiO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZm9ybWF0UnR6ckVycm9yUmVzcG9uc2VCb2R5KFxuICByZXNwb25zZUJvZHk6IHN0cmluZyxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmIChyZXNwb25zZUJvZHkudHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBjb25zdCBwYXJzZWRFcnJvciA9IGF3YWl0IHNhZmVQYXJzZUpTT04oe1xuICAgIHRleHQ6IHJlc3BvbnNlQm9keSxcbiAgICBzY2hlbWE6IHpvZFNjaGVtYShydHpyRXJyb3JEYXRhU2NoZW1hKSxcbiAgfSk7XG5cbiAgaWYgKCFwYXJzZWRFcnJvci5zdWNjZXNzKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiBmb3JtYXRSdHpyRXJyb3JEYXRhKHBhcnNlZEVycm9yLnZhbHVlKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJ0enJGYWlsZWRSZXNwb25zZUhhbmRsZXI6IFJlc3BvbnNlSGFuZGxlcjxBUElDYWxsRXJyb3I+ID0gYXN5bmMgKHtcbiAgcmVzcG9uc2UsXG4gIHVybCxcbiAgcmVxdWVzdEJvZHlWYWx1ZXMsXG59KSA9PiB7XG4gIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgY29uc3QgcmVzcG9uc2VIZWFkZXJzID0gZXh0cmFjdFJlc3BvbnNlSGVhZGVycyhyZXNwb25zZSk7XG4gIGNvbnN0IGRldGFpbCA9XG4gICAgKGF3YWl0IGZvcm1hdFJ0enJFcnJvclJlc3BvbnNlQm9keShyZXNwb25zZUJvZHkpKSA/P1xuICAgIHJlc3BvbnNlLnN0YXR1c1RleHQgPz9cbiAgICBcInVucGFyc2VhYmxlIFJUWlIgZXJyb3IgcmVzcG9uc2VcIjtcbiAgY29uc3QgcGFyc2VkRXJyb3IgPSBhd2FpdCBzYWZlUGFyc2VKU09OKHtcbiAgICB0ZXh0OiByZXNwb25zZUJvZHksXG4gICAgc2NoZW1hOiB6b2RTY2hlbWEocnR6ckVycm9yRGF0YVNjaGVtYSksXG4gIH0pO1xuXG4gIHJldHVybiB7XG4gICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgIHZhbHVlOiBuZXcgQVBJQ2FsbEVycm9yKHtcbiAgICAgIG1lc3NhZ2U6IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtkZXRhaWx9YCxcbiAgICAgIHVybCxcbiAgICAgIHJlcXVlc3RCb2R5VmFsdWVzLFxuICAgICAgc3RhdHVzQ29kZTogcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgcmVzcG9uc2VCb2R5LFxuICAgICAgZGF0YTogcGFyc2VkRXJyb3Iuc3VjY2VzcyA/IHBhcnNlZEVycm9yLnZhbHVlIDogdW5kZWZpbmVkLFxuICAgIH0pLFxuICB9O1xufTtcblxuZXhwb3J0IGNsYXNzIFJ0enJDbGllbnRFcnJvciBleHRlbmRzIEFJU0RLRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHtcbiAgICAgIGNhdXNlPzogRXJyb3I7XG4gICAgfSxcbiAgKSB7XG4gICAgc3VwZXIoe1xuICAgICAgbmFtZTogXCJSdHpyQ2xpZW50RXJyb3JcIixcbiAgICAgIG1lc3NhZ2UsXG4gICAgICBjYXVzZTogb3B0aW9ucz8uY2F1c2UsXG4gICAgfSk7XG4gIH1cbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFLQSxNQUFNLDBCQUEwQkEsSUFBRSxPQUFPO0NBQ3ZDLE1BQU1BLElBQUUsTUFBTSxDQUFDQSxJQUFFLFFBQVEsRUFBRUEsSUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDLFNBQVM7Q0FDakQsS0FBS0EsSUFBRSxRQUFRLENBQUMsU0FBUztDQUN6QixNQUFNQSxJQUFFLFFBQVEsQ0FBQyxTQUFTO0NBQzFCLE9BQU9BLElBQUUsU0FBUyxDQUFDLFNBQVM7Q0FDN0IsQ0FBQztBQUVGLE1BQU0sNEJBQTRCQSxJQUFFLE9BQU8sRUFDekMsT0FBT0EsSUFBRSxPQUFPO0NBQ2QsS0FBS0EsSUFBRSxRQUFRLENBQUMsU0FBUztDQUN6QixTQUFTQSxJQUFFLFFBQVEsQ0FBQyxTQUFTO0NBQzdCLE1BQU1BLElBQUUsUUFBUSxDQUFDLFNBQVM7Q0FDMUIsT0FBT0EsSUFBRSxTQUFTLENBQUMsU0FBUztDQUM1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
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { RtzrClientError, rtzrErrorDataSchema, rtzrFailedResponseHandler } from "./error.js";
|
|
1
|
+
import { RtzrClientError, formatRtzrErrorData, formatRtzrErrorResponseBody, rtzrErrorDataSchema, rtzrFailedResponseHandler } from "./error.js";
|
|
2
2
|
import { rtzrTranscriptionProviderOptions } from "./options.js";
|
|
3
3
|
import { RtzrTranscriptionModel } from "./model.js";
|
|
4
4
|
import { createRtzr, rtzr } from "./provider.js";
|
|
5
5
|
|
|
6
|
-
export { RtzrClientError, RtzrTranscriptionModel, createRtzr, rtzr, rtzrErrorDataSchema, rtzrFailedResponseHandler, rtzrTranscriptionProviderOptions };
|
|
6
|
+
export { RtzrClientError, RtzrTranscriptionModel, createRtzr, formatRtzrErrorData, formatRtzrErrorResponseBody, rtzr, rtzrErrorDataSchema, rtzrFailedResponseHandler, rtzrTranscriptionProviderOptions };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/rtzr/model.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,+BAA+B,EACrC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../../src/ai/providers/rtzr/model.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,eAAe,EACpB,KAAK,oBAAoB,EACzB,KAAK,+BAA+B,EACrC,MAAM,kBAAkB,CAAC;AAY1B,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAe5D,OAAO,EAAE,KAAK,wBAAwB,EAAE,KAAK,gCAAgC,EAAE,MAAM,WAAW,CAAC;AAMjG,MAAM,MAAM,4BAA4B,GAAG,IAAI,CAC7C,+BAA+B,EAC/B,iBAAiB,CAClB,GAAG;IACF,eAAe,CAAC,EAAE;QAChB,IAAI,CAAC,EAAE,gCAAgC,CAAC;KACzC,CAAC;CACH,CAAC;AAEF,UAAU,4BAA4B;IACpC,SAAS,CAAC,EAAE;QACV,WAAW,CAAC,EAAE,MAAM,IAAI,CAAC;KAC1B,CAAC;IACF,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,GAAG,EAAE,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,KAAK,MAAM,CAAC;IAC3C,OAAO,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IAClD,KAAK,CAAC,EAAE,aAAa,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,MAAM,CAAC;CAC3B;AAED,qBAAa,sBAAuB,YAAW,oBAAoB;IAQ/D,QAAQ,CAAC,OAAO,EAAE,wBAAwB;IAC1C,OAAO,CAAC,QAAQ,CAAC,MAAM;IARzB,QAAQ,CAAC,oBAAoB,QAAQ;IAErC,IAAI,QAAQ,IAAI,MAAM,CAErB;gBAGU,OAAO,EAAE,wBAAwB,EACzB,MAAM,EAAE,4BAA4B;YAGzC,SAAS;YAuCT,OAAO;IA2Bf,UAAU,CAAC,OAAO,EAAE,4BAA4B;;;;;;;;;;;;;;;;;CA0FvD"}
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import { rtzrAuthResponseSchema, rtzrTranscriptionResponseSchema, rtzrTranscriptionResultResponseSchema } from "./api.js";
|
|
2
|
-
import { RtzrClientError, rtzrFailedResponseHandler } from "./error.js";
|
|
2
|
+
import { RtzrClientError, formatRtzrErrorData, formatRtzrErrorResponseBody, rtzrFailedResponseHandler } from "./error.js";
|
|
3
3
|
import { rtzrTranscriptionProviderOptions } from "./options.js";
|
|
4
|
-
import { combineHeaders, convertBase64ToUint8Array, createJsonResponseHandler, getFromApi, mediaTypeToExtension, parseProviderOptions, postFormDataToApi } from "@ai-sdk/provider-utils";
|
|
4
|
+
import { combineHeaders, convertBase64ToUint8Array, createJsonResponseHandler, getFromApi, mediaTypeToExtension, parseProviderOptions, postFormDataToApi, safeParseJSON, zodSchema } from "@ai-sdk/provider-utils";
|
|
5
5
|
import { isEmpty } from "radashi";
|
|
6
6
|
|
|
7
7
|
//#region src/ai/providers/rtzr/model.ts
|
|
8
|
+
function isNullish(value) {
|
|
9
|
+
return value === null || value === undefined;
|
|
10
|
+
}
|
|
8
11
|
var RtzrTranscriptionModel = class {
|
|
9
12
|
specificationVersion = "v3";
|
|
10
13
|
get provider() {
|
|
@@ -24,15 +27,19 @@ var RtzrTranscriptionModel = class {
|
|
|
24
27
|
client_secret: this.config.auth.clientSecret
|
|
25
28
|
})
|
|
26
29
|
});
|
|
30
|
+
const responseBody = await response.text();
|
|
27
31
|
if (!response.ok) {
|
|
28
|
-
|
|
32
|
+
const detail = await formatRtzrErrorResponseBody(responseBody);
|
|
33
|
+
throw new RtzrClientError(`Failed to authorize RTZR: HTTP ${response.status}${isNullish(detail) ? "" : `: ${detail}`}`);
|
|
29
34
|
}
|
|
30
|
-
const
|
|
31
|
-
|
|
35
|
+
const parsedData = await safeParseJSON({
|
|
36
|
+
text: responseBody,
|
|
37
|
+
schema: zodSchema(rtzrAuthResponseSchema)
|
|
38
|
+
});
|
|
32
39
|
if (!parsedData.success) {
|
|
33
|
-
throw new RtzrClientError(`
|
|
40
|
+
throw new RtzrClientError(`Invalid RTZR auth response: ${parsedData.error.message}`);
|
|
34
41
|
}
|
|
35
|
-
return parsedData.
|
|
42
|
+
return parsedData.value.access_token;
|
|
36
43
|
}
|
|
37
44
|
async getArgs({ audio, mediaType, providerOptions }) {
|
|
38
45
|
const warnings = [];
|
|
@@ -74,7 +81,7 @@ var RtzrTranscriptionModel = class {
|
|
|
74
81
|
});
|
|
75
82
|
const { value: response, rawValue } = await (async () => {
|
|
76
83
|
while (true) {
|
|
77
|
-
await new Promise((resolve) => setTimeout(resolve,
|
|
84
|
+
await new Promise((resolve) => setTimeout(resolve, 5e3));
|
|
78
85
|
const data = await getFromApi({
|
|
79
86
|
url: this.config.url({ path: `/transcribe/${transcriptionId}` }),
|
|
80
87
|
headers: combineHeaders(this.config.headers(), headers),
|
|
@@ -88,6 +95,10 @@ var RtzrTranscriptionModel = class {
|
|
|
88
95
|
}
|
|
89
96
|
}
|
|
90
97
|
})();
|
|
98
|
+
if (response.status === "failed") {
|
|
99
|
+
const detail = isNullish(response.error) ? "unknown RTZR transcription error" : formatRtzrErrorData({ error: response.error });
|
|
100
|
+
throw new RtzrClientError(`RTZR transcription failed for id ${response.id}: status ${response.status}: ` + `provider ${this.provider}: model ${this.modelId}: ${detail}`);
|
|
101
|
+
}
|
|
91
102
|
const segments = response.results?.utterances ?? [];
|
|
92
103
|
const languages = new Set(segments.map((item) => item.lang).filter((item) => !isEmpty(item)));
|
|
93
104
|
const language = (() => {
|
|
@@ -118,4 +129,4 @@ var RtzrTranscriptionModel = class {
|
|
|
118
129
|
|
|
119
130
|
//#endregion
|
|
120
131
|
export { RtzrTranscriptionModel };
|
|
121
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJuYW1lcyI6WyJtb2RlbElkOiBSdHpyVHJhbnNjcmlwdGlvbk1vZGVsSWQiLCJjb25maWc6IFJ0enJUcmFuc2NyaXB0aW9uTW9kZWxDb25maWciLCJ3YXJuaW5nczogU2hhcmVkVjNXYXJuaW5nW10iXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWkvcHJvdmlkZXJzL3J0enIvbW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBTaGFyZWRWM1dhcm5pbmcsXG4gIHR5cGUgVHJhbnNjcmlwdGlvbk1vZGVsVjMsXG4gIHR5cGUgVHJhbnNjcmlwdGlvbk1vZGVsVjNDYWxsT3B0aW9ucyxcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbmltcG9ydCB7XG4gIGNvbWJpbmVIZWFkZXJzLFxuICBjb252ZXJ0QmFzZTY0VG9VaW50OEFycmF5LFxuICBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyLFxuICBnZXRGcm9tQXBpLFxuICBtZWRpYVR5cGVUb0V4dGVuc2lvbixcbiAgcGFyc2VQcm92aWRlck9wdGlvbnMsXG4gIHBvc3RGb3JtRGF0YVRvQXBpLFxufSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHsgdHlwZSBGZXRjaEZ1bmN0aW9uIH0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXItdXRpbHNcIjtcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwicmFkYXNoaVwiO1xuXG5pbXBvcnQge1xuICBydHpyQXV0aFJlc3BvbnNlU2NoZW1hLFxuICBydHpyVHJhbnNjcmlwdGlvblJlc3BvbnNlU2NoZW1hLFxuICBydHpyVHJhbnNjcmlwdGlvblJlc3VsdFJlc3BvbnNlU2NoZW1hLFxufSBmcm9tIFwiLi9hcGlcIjtcbmltcG9ydCB7IFJ0enJDbGllbnRFcnJvciwgcnR6ckZhaWxlZFJlc3BvbnNlSGFuZGxlciB9IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBydHpyVHJhbnNjcmlwdGlvblByb3ZpZGVyT3B0aW9ucyB9IGZyb20gXCIuL29wdGlvbnNcIjtcbmltcG9ydCB7IHR5cGUgUnR6clRyYW5zY3JpcHRpb25Nb2RlbElkLCB0eXBlIFJ0enJUcmFuc2NyaXB0aW9uUHJvdmlkZXJPcHRpb25zIH0gZnJvbSBcIi4vb3B0aW9uc1wiO1xuXG5leHBvcnQgdHlwZSBSdHpyVHJhbnNjcmlwdGlvbkNhbGxPcHRpb25zID0gT21pdDxcbiAgVHJhbnNjcmlwdGlvbk1vZGVsVjNDYWxsT3B0aW9ucyxcbiAgXCJwcm92aWRlck9wdGlvbnNcIlxuPiAmIHtcbiAgcHJvdmlkZXJPcHRpb25zPzoge1xuICAgIHJ0enI/OiBSdHpyVHJhbnNjcmlwdGlvblByb3ZpZGVyT3B0aW9ucztcbiAgfTtcbn07XG5cbmludGVyZmFjZSBSdHpyVHJhbnNjcmlwdGlvbk1vZGVsQ29uZmlnIHtcbiAgX2ludGVybmFsPzoge1xuICAgIGN1cnJlbnREYXRlPzogKCkgPT4gRGF0ZTtcbiAgfTtcbiAgcHJvdmlkZXI6IHN0cmluZztcbiAgYXV0aDoge1xuICAgIGNsaWVudElkOiBzdHJpbmc7XG4gICAgY2xpZW50U2VjcmV0OiBzdHJpbmc7XG4gIH07XG4gIHVybDogKG9wdGlvbnM6IHsgcGF0aDogc3RyaW5nIH0pID0+IHN0cmluZztcbiAgaGVhZGVyczogKCkgPT4gUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPjtcbiAgZmV0Y2g/OiBGZXRjaEZ1bmN0aW9uO1xuICBnZW5lcmF0ZUlkPzogKCkgPT4gc3RyaW5nO1xufVxuXG5leHBvcnQgY2xhc3MgUnR6clRyYW5zY3JpcHRpb25Nb2RlbCBpbXBsZW1lbnRzIFRyYW5zY3JpcHRpb25Nb2RlbFYzIHtcbiAgcmVhZG9ubHkgc3BlY2lmaWNhdGlvblZlcnNpb24gPSBcInYzXCI7XG5cbiAgZ2V0IHByb3ZpZGVyKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuY29uZmlnLnByb3ZpZGVyO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcmVhZG9ubHkgbW9kZWxJZDogUnR6clRyYW5zY3JpcHRpb25Nb2RlbElkLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBSdHpyVHJhbnNjcmlwdGlvbk1vZGVsQ29uZmlnLFxuICApIHt9XG5cbiAgcHJpdmF0ZSBhc3luYyBhdXRob3JpemUoKSB7XG4gICAgY29uc3QgZmV0Y2hBcGkgPSB0aGlzLmNvbmZpZy5mZXRjaCA/PyBmZXRjaDtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoQXBpKFxuICAgICAgdGhpcy5jb25maWcudXJsKHtcbiAgICAgICAgcGF0aDogXCIvYXV0aGVudGljYXRlXCIsXG4gICAgICB9KSxcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiBcIlBPU1RcIixcbiAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCIsXG4gICAgICAgIH0sXG4gICAgICAgIGJvZHk6IG5ldyBVUkxTZWFyY2hQYXJhbXMoe1xuICAgICAgICAgIGNsaWVudF9pZDogdGhpcy5jb25maWcuYXV0aC5jbGllbnRJZCxcbiAgICAgICAgICBjbGllbnRfc2VjcmV0OiB0aGlzLmNvbmZpZy5hdXRoLmNsaWVudFNlY3JldCxcbiAgICAgICAgfSksXG4gICAgICB9LFxuICAgICk7XG5cbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICB0aHJvdyBuZXcgUnR6ckNsaWVudEVycm9yKGBGYWlsZWQgdG8gYXV0aG9yaXplOiAke3Jlc3BvbnNlLnN0YXR1c31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgIGNvbnN0IHBhcnNlZERhdGEgPSBydHpyQXV0aFJlc3BvbnNlU2NoZW1hLnNhZmVQYXJzZShkYXRhKTtcbiAgICBpZiAoIXBhcnNlZERhdGEuc3VjY2Vzcykge1xuICAgICAgdGhyb3cgbmV3IFJ0enJDbGllbnRFcnJvcihgVmFsaWRhdGlvbiBmYWlsZWQ6ICR7cGFyc2VkRGF0YS5lcnJvci5tZXNzYWdlfWApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJzZWREYXRhLmRhdGEuYWNjZXNzX3Rva2VuO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBnZXRBcmdzKHsgYXVkaW8sIG1lZGlhVHlwZSwgcHJvdmlkZXJPcHRpb25zIH06IFJ0enJUcmFuc2NyaXB0aW9uQ2FsbE9wdGlvbnMpIHtcbiAgICBjb25zdCB3YXJuaW5nczogU2hhcmVkVjNXYXJuaW5nW10gPSBbXTtcbiAgICBjb25zdCBydHpyT3B0aW9ucyA9IGF3YWl0IHBhcnNlUHJvdmlkZXJPcHRpb25zKHtcbiAgICAgIHByb3ZpZGVyOiBcInJ0enJcIixcbiAgICAgIHByb3ZpZGVyT3B0aW9ucyxcbiAgICAgIHNjaGVtYTogcnR6clRyYW5zY3JpcHRpb25Qcm92aWRlck9wdGlvbnMsXG4gICAgfSk7XG5cbiAgICBjb25zdCBibG9iID1cbiAgICAgIGF1ZGlvIGluc3RhbmNlb2YgVWludDhBcnJheVxuICAgICAgICA/IG5ldyBCbG9iKFtuZXcgVWludDhBcnJheShhdWRpbyldKVxuICAgICAgICA6IG5ldyBCbG9iKFtjb252ZXJ0QmFzZTY0VG9VaW50OEFycmF5KGF1ZGlvKV0pO1xuXG4gICAgY29uc3QgZm9ybURhdGEgPSBuZXcgRm9ybURhdGEoKTtcbiAgICBjb25zdCBmaWxlRXh0ZW5zaW9uID0gbWVkaWFUeXBlVG9FeHRlbnNpb24obWVkaWFUeXBlKTtcbiAgICBmb3JtRGF0YS5hcHBlbmQoXG4gICAgICBcImZpbGVcIixcbiAgICAgIG5ldyBGaWxlKFtibG9iXSwgXCJhdWRpb1wiLCB7IHR5cGU6IG1lZGlhVHlwZSB9KSxcbiAgICAgIGBhdWRpby4ke2ZpbGVFeHRlbnNpb259YCxcbiAgICApO1xuXG4gICAgY29uc3QgY29uZmlnID0geyBtb2RlbF9uYW1lOiB0aGlzLm1vZGVsSWQsIC4uLnJ0enJPcHRpb25zIH07XG4gICAgZm9ybURhdGEuYXBwZW5kKFwiY29uZmlnXCIsIEpTT04uc3RyaW5naWZ5KGNvbmZpZykpO1xuXG4gICAgcmV0dXJuIHsgZm9ybURhdGEsIHdhcm5pbmdzIH07XG4gIH1cblxuICBhc3luYyBkb0dlbmVyYXRlKG9wdGlvbnM6IFJ0enJUcmFuc2NyaXB0aW9uQ2FsbE9wdGlvbnMpIHtcbiAgICBjb25zdCBjdXJyZW50RGF0ZSA9IHRoaXMuY29uZmlnLl9pbnRlcm5hbD8uY3VycmVudERhdGU/LigpID8/IG5ldyBEYXRlKCk7XG5cbiAgICBjb25zdCBhY2Nlc3NUb2tlbiA9IGF3YWl0IHRoaXMuYXV0aG9yaXplKCk7XG4gICAgY29uc3QgaGVhZGVycyA9IHtcbiAgICAgIEF1dGhvcml6YXRpb246IGBCZWFyZXIgJHthY2Nlc3NUb2tlbn1gLFxuICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzLFxuICAgIH07XG5cbiAgICBjb25zdCB7IGZvcm1EYXRhLCB3YXJuaW5ncyB9ID0gYXdhaXQgdGhpcy5nZXRBcmdzKG9wdGlvbnMpO1xuICAgIGNvbnN0IHtcbiAgICAgIHZhbHVlOiB7IGlkOiB0cmFuc2NyaXB0aW9uSWQgfSxcbiAgICAgIHJlc3BvbnNlSGVhZGVycyxcbiAgICB9ID0gYXdhaXQgcG9zdEZvcm1EYXRhVG9BcGkoe1xuICAgICAgdXJsOiB0aGlzLmNvbmZpZy51cmwoe1xuICAgICAgICBwYXRoOiBcIi90cmFuc2NyaWJlXCIsXG4gICAgICB9KSxcbiAgICAgIGhlYWRlcnM6IGNvbWJpbmVIZWFkZXJzKHRoaXMuY29uZmlnLmhlYWRlcnMoKSwgaGVhZGVycyksXG4gICAgICBmb3JtRGF0YSxcbiAgICAgIGZhaWxlZFJlc3BvbnNlSGFuZGxlcjogcnR6ckZhaWxlZFJlc3BvbnNlSGFuZGxlcixcbiAgICAgIHN1Y2Nlc3NmdWxSZXNwb25zZUhhbmRsZXI6IGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXIocnR6clRyYW5zY3JpcHRpb25SZXNwb25zZVNjaGVtYSksXG4gICAgICBhYm9ydFNpZ25hbDogb3B0aW9ucy5hYm9ydFNpZ25hbCxcbiAgICAgIGZldGNoOiB0aGlzLmNvbmZpZy5mZXRjaCxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgdmFsdWU6IHJlc3BvbnNlLCByYXdWYWx1ZSB9ID0gYXdhaXQgKGFzeW5jICgpID0+IHtcbiAgICAgIC8vIHRyYW5zY3JpcHRpb27snbQg64Gd64KgIOuWhOq5jOyngCAwLjXstIjrp4jri6Qg7LK07YGsLlxuICAgICAgLy8gdGltZW91dOydhCDrlLDroZwg7KeA7KCV7ZWY7KeAIOyViuuKlCDsnbTsnKDripQg7JWg7LSI7JeQIEFib3J0U2lnbmFs7J2EIOyCrOyaqe2VmOqzoCDsnojsnYwuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MDApKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGdldEZyb21BcGkoe1xuICAgICAgICAgIHVybDogdGhpcy5jb25maWcudXJsKHtcbiAgICAgICAgICAgIHBhdGg6IGAvdHJhbnNjcmliZS8ke3RyYW5zY3JpcHRpb25JZH1gLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIGhlYWRlcnM6IGNvbWJpbmVIZWFkZXJzKHRoaXMuY29uZmlnLmhlYWRlcnMoKSwgaGVhZGVycyksXG4gICAgICAgICAgZmFpbGVkUmVzcG9uc2VIYW5kbGVyOiBydHpyRmFpbGVkUmVzcG9uc2VIYW5kbGVyLFxuICAgICAgICAgIHN1Y2Nlc3NmdWxSZXNwb25zZUhhbmRsZXI6IGNyZWF0ZUpzb25SZXNwb25zZUhhbmRsZXIoXG4gICAgICAgICAgICBydHpyVHJhbnNjcmlwdGlvblJlc3VsdFJlc3BvbnNlU2NoZW1hLFxuICAgICAgICAgICksXG4gICAgICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICAgICAgZmV0Y2g6IHRoaXMuY29uZmlnLmZldGNoLFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoZGF0YS52YWx1ZS5zdGF0dXMgIT09IFwidHJhbnNjcmliaW5nXCIpIHtcbiAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pKCk7XG5cbiAgICBjb25zdCBzZWdtZW50cyA9IHJlc3BvbnNlLnJlc3VsdHM/LnV0dGVyYW5jZXMgPz8gW107XG5cbiAgICBjb25zdCBsYW5ndWFnZXMgPSBuZXcgU2V0KHNlZ21lbnRzLm1hcCgoaXRlbSkgPT4gaXRlbS5sYW5nKS5maWx0ZXIoKGl0ZW0pID0+ICFpc0VtcHR5KGl0ZW0pKSk7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSAoKCkgPT4ge1xuICAgICAgaWYgKGxhbmd1YWdlcy5zaXplID4gMSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGFuZ3VhZ2VzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICB9KSgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHQ6IHNlZ21lbnRzLm1hcCgoaXRlbSkgPT4gaXRlbS5tc2cpLmpvaW4oXCJcXG5cIiksXG4gICAgICBzZWdtZW50czogc2VnbWVudHMubWFwKChzZWdtZW50KSA9PiAoe1xuICAgICAgICB0ZXh0OiBzZWdtZW50Lm1zZyxcbiAgICAgICAgc3RhcnRTZWNvbmQ6IE1hdGgudHJ1bmMoc2VnbWVudC5zdGFydF9hdCAvIDEwMDApLFxuICAgICAgICBlbmRTZWNvbmQ6IE1hdGgudHJ1bmMoKHNlZ21lbnQuc3RhcnRfYXQgKyBzZWdtZW50LmR1cmF0aW9uKSAvIDEwMDApLFxuICAgICAgfSkpLFxuICAgICAgbGFuZ3VhZ2UsXG4gICAgICB3YXJuaW5ncyxcbiAgICAgIGR1cmF0aW9uSW5TZWNvbmRzOiBzZWdtZW50cy5yZWR1Y2UoKGFjYywgc2VnbWVudCkgPT4gYWNjICsgc2VnbWVudC5kdXJhdGlvbiwgMCkgPz8gdW5kZWZpbmVkLFxuICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgdGltZXN0YW1wOiBjdXJyZW50RGF0ZSxcbiAgICAgICAgbW9kZWxJZDogdGhpcy5tb2RlbElkLFxuICAgICAgICBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIGJvZHk6IHJhd1ZhbHVlLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFrREEsSUFBYSx5QkFBYixNQUFvRTtDQUNsRSxBQUFTLHVCQUF1QjtDQUVoQyxJQUFJLFdBQW1CO0FBQ3JCLFNBQU8sS0FBSyxPQUFPOztDQUdyQixZQUNFLEFBQVNBLFNBQ1QsQUFBaUJDLFFBQ2pCO0VBRlM7RUFDUTs7Q0FHbkIsTUFBYyxZQUFZO0VBQ3hCLE1BQU0sV0FBVyxLQUFLLE9BQU8sU0FBUztFQUN0QyxNQUFNLFdBQVcsTUFBTSxTQUNyQixLQUFLLE9BQU8sSUFBSSxFQUNkLE1BQU0saUJBQ1AsQ0FBQyxFQUNGO0dBQ0UsUUFBUTtHQUNSLFNBQVMsRUFDUCxnQkFBZ0IscUNBQ2pCO0dBQ0QsTUFBTSxJQUFJLGdCQUFnQjtJQUN4QixXQUFXLEtBQUssT0FBTyxLQUFLO0lBQzVCLGVBQWUsS0FBSyxPQUFPLEtBQUs7SUFDakMsQ0FBQztHQUNILENBQ0Y7QUFFRCxNQUFJLENBQUMsU0FBUyxJQUFJO0FBQ2hCLFNBQU0sSUFBSSxnQkFBZ0Isd0JBQXdCLFNBQVMsU0FBUzs7RUFHdEUsTUFBTSxPQUFPLE1BQU0sU0FBUyxNQUFNO0VBQ2xDLE1BQU0sYUFBYSx1QkFBdUIsVUFBVSxLQUFLO0FBQ3pELE1BQUksQ0FBQyxXQUFXLFNBQVM7QUFDdkIsU0FBTSxJQUFJLGdCQUFnQixzQkFBc0IsV0FBVyxNQUFNLFVBQVU7O0FBRzdFLFNBQU8sV0FBVyxLQUFLOztDQUd6QixNQUFjLFFBQVEsRUFBRSxPQUFPLFdBQVcsbUJBQWlEO0VBQ3pGLE1BQU1DLFdBQThCLEVBQUU7RUFDdEMsTUFBTSxjQUFjLE1BQU0scUJBQXFCO0dBQzdDLFVBQVU7R0FDVjtHQUNBLFFBQVE7R0FDVCxDQUFDO0VBRUYsTUFBTSxPQUNKLGlCQUFpQixhQUNiLElBQUksS0FBSyxDQUFDLElBQUksV0FBVyxNQUFNLENB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
|
|
132
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWwuanMiLCJuYW1lcyI6WyJtb2RlbElkOiBSdHpyVHJhbnNjcmlwdGlvbk1vZGVsSWQiLCJjb25maWc6IFJ0enJUcmFuc2NyaXB0aW9uTW9kZWxDb25maWciLCJ3YXJuaW5nczogU2hhcmVkVjNXYXJuaW5nW10iXSwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWkvcHJvdmlkZXJzL3J0enIvbW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgdHlwZSBTaGFyZWRWM1dhcm5pbmcsXG4gIHR5cGUgVHJhbnNjcmlwdGlvbk1vZGVsVjMsXG4gIHR5cGUgVHJhbnNjcmlwdGlvbk1vZGVsVjNDYWxsT3B0aW9ucyxcbn0gZnJvbSBcIkBhaS1zZGsvcHJvdmlkZXJcIjtcbmltcG9ydCB7XG4gIGNvbWJpbmVIZWFkZXJzLFxuICBjb252ZXJ0QmFzZTY0VG9VaW50OEFycmF5LFxuICBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyLFxuICBnZXRGcm9tQXBpLFxuICBtZWRpYVR5cGVUb0V4dGVuc2lvbixcbiAgcGFyc2VQcm92aWRlck9wdGlvbnMsXG4gIHBvc3RGb3JtRGF0YVRvQXBpLFxuICBzYWZlUGFyc2VKU09OLFxuICB6b2RTY2hlbWEsXG59IGZyb20gXCJAYWktc2RrL3Byb3ZpZGVyLXV0aWxzXCI7XG5pbXBvcnQgeyB0eXBlIEZldGNoRnVuY3Rpb24gfSBmcm9tIFwiQGFpLXNkay9wcm92aWRlci11dGlsc1wiO1xuaW1wb3J0IHsgaXNFbXB0eSB9IGZyb20gXCJyYWRhc2hpXCI7XG5cbmltcG9ydCB7XG4gIHJ0enJBdXRoUmVzcG9uc2VTY2hlbWEsXG4gIHJ0enJUcmFuc2NyaXB0aW9uUmVzcG9uc2VTY2hlbWEsXG4gIHJ0enJUcmFuc2NyaXB0aW9uUmVzdWx0UmVzcG9uc2VTY2hlbWEsXG59IGZyb20gXCIuL2FwaVwiO1xuaW1wb3J0IHtcbiAgZm9ybWF0UnR6ckVycm9yRGF0YSxcbiAgZm9ybWF0UnR6ckVycm9yUmVzcG9uc2VCb2R5LFxuICBSdHpyQ2xpZW50RXJyb3IsXG4gIHJ0enJGYWlsZWRSZXNwb25zZUhhbmRsZXIsXG59IGZyb20gXCIuL2Vycm9yXCI7XG5pbXBvcnQgeyBydHpyVHJhbnNjcmlwdGlvblByb3ZpZGVyT3B0aW9ucyB9IGZyb20gXCIuL29wdGlvbnNcIjtcbmltcG9ydCB7IHR5cGUgUnR6clRyYW5zY3JpcHRpb25Nb2RlbElkLCB0eXBlIFJ0enJUcmFuc2NyaXB0aW9uUHJvdmlkZXJPcHRpb25zIH0gZnJvbSBcIi4vb3B0aW9uc1wiO1xuXG5mdW5jdGlvbiBpc051bGxpc2godmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBudWxsIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCB0eXBlIFJ0enJUcmFuc2NyaXB0aW9uQ2FsbE9wdGlvbnMgPSBPbWl0PFxuICBUcmFuc2NyaXB0aW9uTW9kZWxWM0NhbGxPcHRpb25zLFxuICBcInByb3ZpZGVyT3B0aW9uc1wiXG4+ICYge1xuICBwcm92aWRlck9wdGlvbnM/OiB7XG4gICAgcnR6cj86IFJ0enJUcmFuc2NyaXB0aW9uUHJvdmlkZXJPcHRpb25zO1xuICB9O1xufTtcblxuaW50ZXJmYWNlIFJ0enJUcmFuc2NyaXB0aW9uTW9kZWxDb25maWcge1xuICBfaW50ZXJuYWw/OiB7XG4gICAgY3VycmVudERhdGU/OiAoKSA9PiBEYXRlO1xuICB9O1xuICBwcm92aWRlcjogc3RyaW5nO1xuICBhdXRoOiB7XG4gICAgY2xpZW50SWQ6IHN0cmluZztcbiAgICBjbGllbnRTZWNyZXQ6IHN0cmluZztcbiAgfTtcbiAgdXJsOiAob3B0aW9uczogeyBwYXRoOiBzdHJpbmcgfSkgPT4gc3RyaW5nO1xuICBoZWFkZXJzOiAoKSA9PiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+O1xuICBmZXRjaD86IEZldGNoRnVuY3Rpb247XG4gIGdlbmVyYXRlSWQ/OiAoKSA9PiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBSdHpyVHJhbnNjcmlwdGlvbk1vZGVsIGltcGxlbWVudHMgVHJhbnNjcmlwdGlvbk1vZGVsVjMge1xuICByZWFkb25seSBzcGVjaWZpY2F0aW9uVmVyc2lvbiA9IFwidjNcIjtcblxuICBnZXQgcHJvdmlkZXIoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWcucHJvdmlkZXI7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICByZWFkb25seSBtb2RlbElkOiBSdHpyVHJhbnNjcmlwdGlvbk1vZGVsSWQsXG4gICAgcHJpdmF0ZSByZWFkb25seSBjb25maWc6IFJ0enJUcmFuc2NyaXB0aW9uTW9kZWxDb25maWcsXG4gICkge31cblxuICBwcml2YXRlIGFzeW5jIGF1dGhvcml6ZSgpIHtcbiAgICBjb25zdCBmZXRjaEFwaSA9IHRoaXMuY29uZmlnLmZldGNoID8/IGZldGNoO1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2hBcGkoXG4gICAgICB0aGlzLmNvbmZpZy51cmwoe1xuICAgICAgICBwYXRoOiBcIi9hdXRoZW50aWNhdGVcIixcbiAgICAgIH0pLFxuICAgICAge1xuICAgICAgICBtZXRob2Q6IFwiUE9TVFwiLFxuICAgICAgICBoZWFkZXJzOiB7XG4gICAgICAgICAgXCJDb250ZW50LVR5cGVcIjogXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIixcbiAgICAgICAgfSxcbiAgICAgICAgYm9keTogbmV3IFVSTFNlYXJjaFBhcmFtcyh7XG4gICAgICAgICAgY2xpZW50X2lkOiB0aGlzLmNvbmZpZy5hdXRoLmNsaWVudElkLFxuICAgICAgICAgIGNsaWVudF9zZWNyZXQ6IHRoaXMuY29uZmlnLmF1dGguY2xpZW50U2VjcmV0LFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICBjb25zdCBkZXRhaWwgPSBhd2FpdCBmb3JtYXRSdHpyRXJyb3JSZXNwb25zZUJvZHkocmVzcG9uc2VCb2R5KTtcbiAgICAgIHRocm93IG5ldyBSdHpyQ2xpZW50RXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gYXV0aG9yaXplIFJUWlI6IEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9JHtcbiAgICAgICAgICBpc051bGxpc2goZGV0YWlsKSA/IFwiXCIgOiBgOiAke2RldGFpbH1gXG4gICAgICAgIH1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJzZWREYXRhID0gYXdhaXQgc2FmZVBhcnNlSlNPTih7XG4gICAgICB0ZXh0OiByZXNwb25zZUJvZHksXG4gICAgICBzY2hlbWE6IHpvZFNjaGVtYShydHpyQXV0aFJlc3BvbnNlU2NoZW1hKSxcbiAgICB9KTtcbiAgICBpZiAoIXBhcnNlZERhdGEuc3VjY2Vzcykge1xuICAgICAgdGhyb3cgbmV3IFJ0enJDbGllbnRFcnJvcihgSW52YWxpZCBSVFpSIGF1dGggcmVzcG9uc2U6ICR7cGFyc2VkRGF0YS5lcnJvci5tZXNzYWdlfWApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJzZWREYXRhLnZhbHVlLmFjY2Vzc190b2tlbjtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0QXJncyh7IGF1ZGlvLCBtZWRpYVR5cGUsIHByb3ZpZGVyT3B0aW9ucyB9OiBSdHpyVHJhbnNjcmlwdGlvbkNhbGxPcHRpb25zKSB7XG4gICAgY29uc3Qgd2FybmluZ3M6IFNoYXJlZFYzV2FybmluZ1tdID0gW107XG4gICAgY29uc3QgcnR6ck9wdGlvbnMgPSBhd2FpdCBwYXJzZVByb3ZpZGVyT3B0aW9ucyh7XG4gICAgICBwcm92aWRlcjogXCJydHpyXCIsXG4gICAgICBwcm92aWRlck9wdGlvbnMsXG4gICAgICBzY2hlbWE6IHJ0enJUcmFuc2NyaXB0aW9uUHJvdmlkZXJPcHRpb25zLFxuICAgIH0pO1xuXG4gICAgY29uc3QgYmxvYiA9XG4gICAgICBhdWRpbyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXlcbiAgICAgICAgPyBuZXcgQmxvYihbbmV3IFVpbnQ4QXJyYXkoYXVkaW8pXSlcbiAgICAgICAgOiBuZXcgQmxvYihbY29udmVydEJhc2U2NFRvVWludDhBcnJheShhdWRpbyldKTtcblxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKCk7XG4gICAgY29uc3QgZmlsZUV4dGVuc2lvbiA9IG1lZGlhVHlwZVRvRXh0ZW5zaW9uKG1lZGlhVHlwZSk7XG4gICAgZm9ybURhdGEuYXBwZW5kKFxuICAgICAgXCJmaWxlXCIsXG4gICAgICBuZXcgRmlsZShbYmxvYl0sIFwiYXVkaW9cIiwgeyB0eXBlOiBtZWRpYVR5cGUgfSksXG4gICAgICBgYXVkaW8uJHtmaWxlRXh0ZW5zaW9ufWAsXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHsgbW9kZWxfbmFtZTogdGhpcy5tb2RlbElkLCAuLi5ydHpyT3B0aW9ucyB9O1xuICAgIGZvcm1EYXRhLmFwcGVuZChcImNvbmZpZ1wiLCBKU09OLnN0cmluZ2lmeShjb25maWcpKTtcblxuICAgIHJldHVybiB7IGZvcm1EYXRhLCB3YXJuaW5ncyB9O1xuICB9XG5cbiAgYXN5bmMgZG9HZW5lcmF0ZShvcHRpb25zOiBSdHpyVHJhbnNjcmlwdGlvbkNhbGxPcHRpb25zKSB7XG4gICAgY29uc3QgY3VycmVudERhdGUgPSB0aGlzLmNvbmZpZy5faW50ZXJuYWw/LmN1cnJlbnREYXRlPy4oKSA/PyBuZXcgRGF0ZSgpO1xuXG4gICAgY29uc3QgYWNjZXNzVG9rZW4gPSBhd2FpdCB0aGlzLmF1dGhvcml6ZSgpO1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICBBdXRob3JpemF0aW9uOiBgQmVhcmVyICR7YWNjZXNzVG9rZW59YCxcbiAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICB9O1xuXG4gICAgY29uc3QgeyBmb3JtRGF0YSwgd2FybmluZ3MgfSA9IGF3YWl0IHRoaXMuZ2V0QXJncyhvcHRpb25zKTtcbiAgICBjb25zdCB7XG4gICAgICB2YWx1ZTogeyBpZDogdHJhbnNjcmlwdGlvbklkIH0sXG4gICAgICByZXNwb25zZUhlYWRlcnMsXG4gICAgfSA9IGF3YWl0IHBvc3RGb3JtRGF0YVRvQXBpKHtcbiAgICAgIHVybDogdGhpcy5jb25maWcudXJsKHtcbiAgICAgICAgcGF0aDogXCIvdHJhbnNjcmliZVwiLFxuICAgICAgfSksXG4gICAgICBoZWFkZXJzOiBjb21iaW5lSGVhZGVycyh0aGlzLmNvbmZpZy5oZWFkZXJzKCksIGhlYWRlcnMpLFxuICAgICAgZm9ybURhdGEsXG4gICAgICBmYWlsZWRSZXNwb25zZUhhbmRsZXI6IHJ0enJGYWlsZWRSZXNwb25zZUhhbmRsZXIsXG4gICAgICBzdWNjZXNzZnVsUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyKHJ0enJUcmFuc2NyaXB0aW9uUmVzcG9uc2VTY2hlbWEpLFxuICAgICAgYWJvcnRTaWduYWw6IG9wdGlvbnMuYWJvcnRTaWduYWwsXG4gICAgICBmZXRjaDogdGhpcy5jb25maWcuZmV0Y2gsXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHZhbHVlOiByZXNwb25zZSwgcmF3VmFsdWUgfSA9IGF3YWl0IChhc3luYyAoKSA9PiB7XG4gICAgICAvLyB0cmFuc2NyaXB0aW9u7J20IOuBneuCoCDrlYzquYzsp4AgUlRaUiDqtozsnqUg6rCE6rKp7J24IDXstIjrp4jri6Qg7LK07YGsLlxuICAgICAgLy8gdGltZW91dOydhCDrlLDroZwg7KeA7KCV7ZWY7KeAIOyViuuKlCDsnbTsnKDripQg7JWg7LSI7JeQIEFib3J0U2lnbmFs7J2EIOyCrOyaqe2VmOqzoCDsnojsnYwuXG4gICAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgICBhd2FpdCBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCA1MDAwKSk7XG4gICAgICAgIGNvbnN0IGRhdGEgPSBhd2FpdCBnZXRGcm9tQXBpKHtcbiAgICAgICAgICB1cmw6IHRoaXMuY29uZmlnLnVybCh7XG4gICAgICAgICAgICBwYXRoOiBgL3RyYW5zY3JpYmUvJHt0cmFuc2NyaXB0aW9uSWR9YCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBoZWFkZXJzOiBjb21iaW5lSGVhZGVycyh0aGlzLmNvbmZpZy5oZWFkZXJzKCksIGhlYWRlcnMpLFxuICAgICAgICAgIGZhaWxlZFJlc3BvbnNlSGFuZGxlcjogcnR6ckZhaWxlZFJlc3BvbnNlSGFuZGxlcixcbiAgICAgICAgICBzdWNjZXNzZnVsUmVzcG9uc2VIYW5kbGVyOiBjcmVhdGVKc29uUmVzcG9uc2VIYW5kbGVyKFxuICAgICAgICAgICAgcnR6clRyYW5zY3JpcHRpb25SZXN1bHRSZXNwb25zZVNjaGVtYSxcbiAgICAgICAgICApLFxuICAgICAgICAgIGFib3J0U2lnbmFsOiBvcHRpb25zLmFib3J0U2lnbmFsLFxuICAgICAgICAgIGZldGNoOiB0aGlzLmNvbmZpZy5mZXRjaCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKGRhdGEudmFsdWUuc3RhdHVzICE9PSBcInRyYW5zY3JpYmluZ1wiKSB7XG4gICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KSgpO1xuXG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA9PT0gXCJmYWlsZWRcIikge1xuICAgICAgY29uc3QgZGV0YWlsID0gaXNOdWxsaXNoKHJlc3BvbnNlLmVycm9yKVxuICAgICAgICA/IFwidW5rbm93biBSVFpSIHRyYW5zY3JpcHRpb24gZXJyb3JcIlxuICAgICAgICA6IGZvcm1hdFJ0enJFcnJvckRhdGEoe1xuICAgICAgICAgICAgZXJyb3I6IHJlc3BvbnNlLmVycm9yLFxuICAgICAgICAgIH0pO1xuICAgICAgdGhyb3cgbmV3IFJ0enJDbGllbnRFcnJvcihcbiAgICAgICAgYFJUWlIgdHJhbnNjcmlwdGlvbiBmYWlsZWQgZm9yIGlkICR7cmVzcG9uc2UuaWR9OiBzdGF0dXMgJHtyZXNwb25zZS5zdGF0dXN9OiBgICtcbiAgICAgICAgICBgcHJvdmlkZXIgJHt0aGlzLnByb3ZpZGVyfTogbW9kZWwgJHt0aGlzLm1vZGVsSWR9OiAke2RldGFpbH1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWdtZW50cyA9IHJlc3BvbnNlLnJlc3VsdHM/LnV0dGVyYW5jZXMgPz8gW107XG5cbiAgICBjb25zdCBsYW5ndWFnZXMgPSBuZXcgU2V0KHNlZ21lbnRzLm1hcCgoaXRlbSkgPT4gaXRlbS5sYW5nKS5maWx0ZXIoKGl0ZW0pID0+ICFpc0VtcHR5KGl0ZW0pKSk7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSAoKCkgPT4ge1xuICAgICAgaWYgKGxhbmd1YWdlcy5zaXplID4gMSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbGFuZ3VhZ2VzLnZhbHVlcygpLm5leHQoKS52YWx1ZTtcbiAgICB9KSgpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHQ6IHNlZ21lbnRzLm1hcCgoaXRlbSkgPT4gaXRlbS5tc2cpLmpvaW4oXCJcXG5cIiksXG4gICAgICBzZWdtZW50czogc2VnbWVudHMubWFwKChzZWdtZW50KSA9PiAoe1xuICAgICAgICB0ZXh0OiBzZWdtZW50Lm1zZyxcbiAgICAgICAgc3RhcnRTZWNvbmQ6IE1hdGgudHJ1bmMoc2VnbWVudC5zdGFydF9hdCAvIDEwMDApLFxuICAgICAgICBlbmRTZWNvbmQ6IE1hdGgudHJ1bmMoKHNlZ21lbnQuc3RhcnRfYXQgKyBzZWdtZW50LmR1cmF0aW9uKSAvIDEwMDApLFxuICAgICAgfSkpLFxuICAgICAgbGFuZ3VhZ2UsXG4gICAgICB3YXJuaW5ncyxcbiAgICAgIGR1cmF0aW9uSW5TZWNvbmRzOiBzZWdtZW50cy5yZWR1Y2UoKGFjYywgc2VnbWVudCkgPT4gYWNjICsgc2VnbWVudC5kdXJhdGlvbiwgMCkgPz8gdW5kZWZpbmVkLFxuICAgICAgcmVzcG9uc2U6IHtcbiAgICAgICAgdGltZXN0YW1wOiBjdXJyZW50RGF0ZSxcbiAgICAgICAgbW9kZWxJZDogdGhpcy5tb2RlbElkLFxuICAgICAgICBoZWFkZXJzOiByZXNwb25zZUhlYWRlcnMsXG4gICAgICAgIGJvZHk6IHJhd1ZhbHVlLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7QUFpQ0EsU0FBUyxVQUFVLE9BQTJDO0FBQzVELFFBQU8sVUFBVSxRQUFRLFVBQVU7O0FBMkJyQyxJQUFhLHlCQUFiLE1BQW9FO0NBQ2xFLEFBQVMsdUJBQXVCO0NBRWhDLElBQUksV0FBbUI7QUFDckIsU0FBTyxLQUFLLE9BQU87O0NBR3JCLFlBQ0UsQUFBU0EsU0FDVCxBQUFpQkMsUUFDakI7RUFGUztFQUNROztDQUduQixNQUFjLFlBQVk7RUFDeEIsTUFBTSxXQUFXLEtBQUssT0FBTyxTQUFTO0VBQ3RDLE1BQU0sV0FBVyxNQUFNLFNBQ3JCLEtBQUssT0FBTyxJQUFJLEVBQ2QsTUFBTSxpQkFDUCxDQUFDLEVBQ0Y7R0FDRSxRQUFRO0dBQ1IsU0FBUyxFQUNQLGdCQUFnQixxQ0FDakI7R0FDRCxNQUFNLElBQUksZ0JBQWdCO0lBQ3hCLFdBQVcsS0FBSyxPQUFPLEtBQUs7SUFDNUIsZUFBZSxLQUFLLE9BQU8sS0FBSztJQUNqQyxDQUFDO0dBQ0gsQ0FDRjtFQUVELE1BQU0sZUFBZSxNQUFNLFNBQVMsTUFBTTtBQUMxQyxNQUFJLENBQUMsU0FBUyxJQUFJO0dBQ2hCLE1BQU0sU0FBUyxNQUFNLDRCQUE0QixhQUFhO0FBQzlELFNBQU0sSUFBSSxnQkFDUixrQ0FBa0MsU0FBUyxTQUN6QyxVQUFVLE9BQU8sR0FBRyxLQUFLLEtBQUssV0FFakM7O0VBR0gsTUFBTSxhQUFhLE1BQU0sY0FBYztHQUNyQyxNQUFNO0dBQ04sUUFBUSxVQUFVLHVCQUF1QjtHQUMxQyxDQUFDO0FBQ0YsTUFBSSxDQUFDLFdBQVcsU0FBUztBQUN2QixTQUFNLElBQUksZ0JBQWdCLCtCQUErQixXQUFXLE1BQU0sVUFBVTs7QUFHdEYsU0FBTyxXQUFXLE1BQU07O0NBRzFCLE1B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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sonamu",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.20",
|
|
4
4
|
"description": "Sonamu — TypeScript Fullstack API Framework",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"framework",
|
|
@@ -130,9 +130,9 @@
|
|
|
130
130
|
"vite": "8.0.5",
|
|
131
131
|
"vitest": "^4.1.2",
|
|
132
132
|
"@sonamu-kit/hmr-runner": "^0.2.0",
|
|
133
|
+
"@sonamu-kit/tasks": "^0.3.1",
|
|
133
134
|
"@sonamu-kit/ts-loader": "^2.2.0",
|
|
134
|
-
"@sonamu-kit/hmr-hook": "^0.5.1"
|
|
135
|
-
"@sonamu-kit/tasks": "^0.3.0"
|
|
135
|
+
"@sonamu-kit/hmr-hook": "^0.5.1"
|
|
136
136
|
},
|
|
137
137
|
"devDependencies": {
|
|
138
138
|
"@types/bcrypt": "^6",
|
|
@@ -0,0 +1,284 @@
|
|
|
1
|
+
import { APICallError } from "@ai-sdk/provider";
|
|
2
|
+
import { type FetchFunction } from "@ai-sdk/provider-utils";
|
|
3
|
+
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
4
|
+
|
|
5
|
+
import { RtzrClientError } from "../error";
|
|
6
|
+
import { RtzrTranscriptionModel } from "../model";
|
|
7
|
+
|
|
8
|
+
type JsonValue = null | boolean | number | string | JsonValue[] | { [key: string]: JsonValue };
|
|
9
|
+
|
|
10
|
+
type MockResponse = {
|
|
11
|
+
body: JsonValue;
|
|
12
|
+
status?: number;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
const audio = new Uint8Array([1, 2, 3]);
|
|
16
|
+
|
|
17
|
+
function jsonResponse({ body, status = 200 }: MockResponse): Response {
|
|
18
|
+
return new Response(JSON.stringify(body), {
|
|
19
|
+
status,
|
|
20
|
+
headers: {
|
|
21
|
+
"Content-Type": "application/json",
|
|
22
|
+
},
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function createFetchMock(responses: MockResponse[]): FetchFunction {
|
|
27
|
+
return async () => {
|
|
28
|
+
const response = responses.shift();
|
|
29
|
+
if (response === undefined) {
|
|
30
|
+
throw new Error("Unexpected RTZR request");
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
return jsonResponse(response);
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function createModel(fetchMock: FetchFunction) {
|
|
38
|
+
return new RtzrTranscriptionModel("sommers", {
|
|
39
|
+
_internal: {
|
|
40
|
+
currentDate: () => new Date("2026-06-17T00:00:00.000Z"),
|
|
41
|
+
},
|
|
42
|
+
provider: "rtzr.transcription",
|
|
43
|
+
auth: {
|
|
44
|
+
clientId: "client-id",
|
|
45
|
+
clientSecret: "client-secret",
|
|
46
|
+
},
|
|
47
|
+
url: ({ path }) => `https://rtzr.test/v1${path}`,
|
|
48
|
+
headers: () => ({
|
|
49
|
+
"x-test": "1",
|
|
50
|
+
}),
|
|
51
|
+
fetch: fetchMock,
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
describe("RtzrTranscriptionModel", () => {
|
|
56
|
+
afterEach(() => {
|
|
57
|
+
vi.useRealTimers();
|
|
58
|
+
});
|
|
59
|
+
|
|
60
|
+
it("returns completed transcription text, segments, and language", async () => {
|
|
61
|
+
vi.useFakeTimers();
|
|
62
|
+
const model = createModel(
|
|
63
|
+
createFetchMock([
|
|
64
|
+
{
|
|
65
|
+
body: {
|
|
66
|
+
access_token: "token",
|
|
67
|
+
expire_at: 1_797_000_000,
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
body: {
|
|
72
|
+
id: "transcribe-1",
|
|
73
|
+
},
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
body: {
|
|
77
|
+
id: "transcribe-1",
|
|
78
|
+
status: "completed",
|
|
79
|
+
results: {
|
|
80
|
+
utterances: [
|
|
81
|
+
{
|
|
82
|
+
start_at: 1000,
|
|
83
|
+
duration: 2500,
|
|
84
|
+
msg: "hello",
|
|
85
|
+
spk: 0,
|
|
86
|
+
lang: "en",
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
start_at: 3500,
|
|
90
|
+
duration: 1200,
|
|
91
|
+
msg: "world",
|
|
92
|
+
spk: 0,
|
|
93
|
+
lang: "en",
|
|
94
|
+
},
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
]),
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
const resultPromise = model.doGenerate({
|
|
103
|
+
audio,
|
|
104
|
+
mediaType: "audio/wav",
|
|
105
|
+
headers: {},
|
|
106
|
+
});
|
|
107
|
+
await vi.advanceTimersByTimeAsync(5000);
|
|
108
|
+
const result = await resultPromise;
|
|
109
|
+
|
|
110
|
+
expect(result.text).toBe("hello\nworld");
|
|
111
|
+
expect(result.language).toBe("en");
|
|
112
|
+
expect(result.segments).toEqual([
|
|
113
|
+
{
|
|
114
|
+
text: "hello",
|
|
115
|
+
startSecond: 1,
|
|
116
|
+
endSecond: 3,
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
text: "world",
|
|
120
|
+
startSecond: 3,
|
|
121
|
+
endSecond: 4,
|
|
122
|
+
},
|
|
123
|
+
]);
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it("throws a detailed RTZR error when polling returns failed", async () => {
|
|
127
|
+
vi.useFakeTimers();
|
|
128
|
+
const model = createModel(
|
|
129
|
+
createFetchMock([
|
|
130
|
+
{
|
|
131
|
+
body: {
|
|
132
|
+
access_token: "token",
|
|
133
|
+
expire_at: 1_797_000_000,
|
|
134
|
+
},
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
body: {
|
|
138
|
+
id: "transcribe-2",
|
|
139
|
+
},
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
body: {
|
|
143
|
+
id: "transcribe-2",
|
|
144
|
+
status: "failed",
|
|
145
|
+
error: {
|
|
146
|
+
code: "E500",
|
|
147
|
+
message: "internal server error",
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
]),
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
const resultPromise = model.doGenerate({
|
|
155
|
+
audio,
|
|
156
|
+
mediaType: "audio/wav",
|
|
157
|
+
headers: {},
|
|
158
|
+
});
|
|
159
|
+
const errorPromise = resultPromise.catch((error: unknown) => error);
|
|
160
|
+
await vi.advanceTimersByTimeAsync(5000);
|
|
161
|
+
const error = await errorPromise;
|
|
162
|
+
|
|
163
|
+
expect(error).toBeInstanceOf(RtzrClientError);
|
|
164
|
+
expect(error).toMatchObject({
|
|
165
|
+
message: expect.stringContaining("RTZR transcription failed for id transcribe-2"),
|
|
166
|
+
});
|
|
167
|
+
expect(error).toMatchObject({
|
|
168
|
+
message: expect.stringContaining("code E500"),
|
|
169
|
+
});
|
|
170
|
+
expect(error).toMatchObject({
|
|
171
|
+
message: expect.stringContaining("internal server error"),
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
it("converts flat RTZR HTTP errors to useful API messages", async () => {
|
|
176
|
+
const model = createModel(
|
|
177
|
+
createFetchMock([
|
|
178
|
+
{
|
|
179
|
+
body: {
|
|
180
|
+
access_token: "token",
|
|
181
|
+
expire_at: 1_797_000_000,
|
|
182
|
+
},
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
status: 400,
|
|
186
|
+
body: {
|
|
187
|
+
code: "H0001",
|
|
188
|
+
msg: "unexpected end of JSON input",
|
|
189
|
+
},
|
|
190
|
+
},
|
|
191
|
+
]),
|
|
192
|
+
);
|
|
193
|
+
|
|
194
|
+
await expect(
|
|
195
|
+
model.doGenerate({
|
|
196
|
+
audio,
|
|
197
|
+
mediaType: "audio/wav",
|
|
198
|
+
headers: {},
|
|
199
|
+
}),
|
|
200
|
+
).rejects.toMatchObject({
|
|
201
|
+
name: "AI_APICallError",
|
|
202
|
+
message: expect.stringContaining("HTTP 400: code H0001: unexpected end of JSON input"),
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
it("includes auth response details without secrets", async () => {
|
|
207
|
+
const model = createModel(
|
|
208
|
+
createFetchMock([
|
|
209
|
+
{
|
|
210
|
+
status: 401,
|
|
211
|
+
body: {
|
|
212
|
+
code: "H401",
|
|
213
|
+
msg: "invalid client credentials",
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
]),
|
|
217
|
+
);
|
|
218
|
+
|
|
219
|
+
const resultPromise = model.doGenerate({
|
|
220
|
+
audio,
|
|
221
|
+
mediaType: "audio/wav",
|
|
222
|
+
headers: {},
|
|
223
|
+
});
|
|
224
|
+
const error = await resultPromise.catch((caughtError: unknown) => caughtError);
|
|
225
|
+
|
|
226
|
+
expect(error).toBeInstanceOf(RtzrClientError);
|
|
227
|
+
expect(error).toMatchObject({
|
|
228
|
+
message: expect.stringContaining(
|
|
229
|
+
"Failed to authorize RTZR: HTTP 401: code H401: invalid client credentials",
|
|
230
|
+
),
|
|
231
|
+
});
|
|
232
|
+
expect(error).toMatchObject({
|
|
233
|
+
message: expect.not.stringContaining("client-secret"),
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
it("includes auth schema details for invalid auth payloads", async () => {
|
|
238
|
+
const model = createModel(
|
|
239
|
+
createFetchMock([
|
|
240
|
+
{
|
|
241
|
+
body: {
|
|
242
|
+
token: "wrong-field",
|
|
243
|
+
},
|
|
244
|
+
},
|
|
245
|
+
]),
|
|
246
|
+
);
|
|
247
|
+
|
|
248
|
+
await expect(
|
|
249
|
+
model.doGenerate({
|
|
250
|
+
audio,
|
|
251
|
+
mediaType: "audio/wav",
|
|
252
|
+
headers: {},
|
|
253
|
+
}),
|
|
254
|
+
).rejects.toThrow("Invalid RTZR auth response");
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
it("keeps RTZR HTTP errors as API call errors", async () => {
|
|
258
|
+
const model = createModel(
|
|
259
|
+
createFetchMock([
|
|
260
|
+
{
|
|
261
|
+
body: {
|
|
262
|
+
access_token: "token",
|
|
263
|
+
expire_at: 1_797_000_000,
|
|
264
|
+
},
|
|
265
|
+
},
|
|
266
|
+
{
|
|
267
|
+
status: 404,
|
|
268
|
+
body: {
|
|
269
|
+
code: "H0004",
|
|
270
|
+
msg: "not found",
|
|
271
|
+
},
|
|
272
|
+
},
|
|
273
|
+
]),
|
|
274
|
+
);
|
|
275
|
+
|
|
276
|
+
await expect(
|
|
277
|
+
model.doGenerate({
|
|
278
|
+
audio,
|
|
279
|
+
mediaType: "audio/wav",
|
|
280
|
+
headers: {},
|
|
281
|
+
}),
|
|
282
|
+
).rejects.toThrow(APICallError);
|
|
283
|
+
});
|
|
284
|
+
});
|
|
@@ -19,6 +19,12 @@ export const rtzrTranscriptionResultResponseSchema = lazySchema(() =>
|
|
|
19
19
|
z.object({
|
|
20
20
|
id: z.string(),
|
|
21
21
|
status: z.enum(["transcribing", "completed", "failed"]),
|
|
22
|
+
error: z
|
|
23
|
+
.object({
|
|
24
|
+
code: z.union([z.string(), z.number()]).nullish(),
|
|
25
|
+
message: z.string().nullish(),
|
|
26
|
+
})
|
|
27
|
+
.nullish(),
|
|
22
28
|
results: z
|
|
23
29
|
.object({
|
|
24
30
|
utterances: z.array(
|
|
@@ -1,22 +1,135 @@
|
|
|
1
|
-
import { AISDKError } from "@ai-sdk/provider";
|
|
2
|
-
import {
|
|
1
|
+
import { AISDKError, APICallError } from "@ai-sdk/provider";
|
|
2
|
+
import { extractResponseHeaders, safeParseJSON, zodSchema } from "@ai-sdk/provider-utils";
|
|
3
|
+
import { type ResponseHandler } from "@ai-sdk/provider-utils";
|
|
3
4
|
import { z } from "zod";
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
const rtzrFlatErrorDataSchema = z.object({
|
|
7
|
+
code: z.union([z.string(), z.number()]).nullish(),
|
|
8
|
+
msg: z.string().nullish(),
|
|
9
|
+
type: z.string().nullish(),
|
|
10
|
+
param: z.unknown().nullish(),
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
const rtzrNestedErrorDataSchema = z.object({
|
|
6
14
|
error: z.object({
|
|
7
|
-
msg: z.string(),
|
|
15
|
+
msg: z.string().nullish(),
|
|
16
|
+
message: z.string().nullish(),
|
|
8
17
|
type: z.string().nullish(),
|
|
9
|
-
param: z.
|
|
18
|
+
param: z.unknown().nullish(),
|
|
10
19
|
code: z.union([z.string(), z.number()]).nullish(),
|
|
11
20
|
}),
|
|
12
21
|
});
|
|
13
22
|
|
|
23
|
+
// RTZR returns flat HTTP errors, but async transcription failures wrap details in error.
|
|
24
|
+
export const rtzrErrorDataSchema = z.union([rtzrFlatErrorDataSchema, rtzrNestedErrorDataSchema]);
|
|
25
|
+
|
|
14
26
|
export type RtzrErrorData = z.infer<typeof rtzrErrorDataSchema>;
|
|
15
27
|
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
28
|
+
type NormalizedRtzrError = {
|
|
29
|
+
code?: string | number | null;
|
|
30
|
+
message?: string | null;
|
|
31
|
+
msg?: string | null;
|
|
32
|
+
type?: string | null;
|
|
33
|
+
param?: unknown;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
function isNullish(value: unknown): value is null | undefined {
|
|
37
|
+
return value === null || value === undefined;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function normalizeRtzrErrorData(data: RtzrErrorData): NormalizedRtzrError {
|
|
41
|
+
if ("error" in data) {
|
|
42
|
+
return data.error;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return data;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function formatParam(param: unknown): string | undefined {
|
|
49
|
+
if (isNullish(param)) {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (typeof param === "string") {
|
|
54
|
+
return param;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
try {
|
|
58
|
+
return JSON.stringify(param);
|
|
59
|
+
} catch {
|
|
60
|
+
return String(param);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function formatRtzrErrorData(data: RtzrErrorData): string {
|
|
65
|
+
const error = normalizeRtzrErrorData(data);
|
|
66
|
+
const param = formatParam(error.param);
|
|
67
|
+
const parts = [
|
|
68
|
+
isNullish(error.code) ? undefined : `code ${error.code}`,
|
|
69
|
+
isNullish(error.type) ? undefined : `type ${error.type}`,
|
|
70
|
+
isNullish(param) ? undefined : `param ${param}`,
|
|
71
|
+
].filter((item): item is string => !isNullish(item) && item.length > 0);
|
|
72
|
+
const message = error.msg ?? error.message;
|
|
73
|
+
|
|
74
|
+
if (!isNullish(message) && message.length > 0) {
|
|
75
|
+
return [...parts, message].join(": ");
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (parts.length > 0) {
|
|
79
|
+
return parts.join(": ");
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
return "unknown RTZR error";
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export async function formatRtzrErrorResponseBody(
|
|
86
|
+
responseBody: string,
|
|
87
|
+
): Promise<string | undefined> {
|
|
88
|
+
if (responseBody.trim().length === 0) {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const parsedError = await safeParseJSON({
|
|
93
|
+
text: responseBody,
|
|
94
|
+
schema: zodSchema(rtzrErrorDataSchema),
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
if (!parsedError.success) {
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return formatRtzrErrorData(parsedError.value);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export const rtzrFailedResponseHandler: ResponseHandler<APICallError> = async ({
|
|
105
|
+
response,
|
|
106
|
+
url,
|
|
107
|
+
requestBodyValues,
|
|
108
|
+
}) => {
|
|
109
|
+
const responseBody = await response.text();
|
|
110
|
+
const responseHeaders = extractResponseHeaders(response);
|
|
111
|
+
const detail =
|
|
112
|
+
(await formatRtzrErrorResponseBody(responseBody)) ??
|
|
113
|
+
response.statusText ??
|
|
114
|
+
"unparseable RTZR error response";
|
|
115
|
+
const parsedError = await safeParseJSON({
|
|
116
|
+
text: responseBody,
|
|
117
|
+
schema: zodSchema(rtzrErrorDataSchema),
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
return {
|
|
121
|
+
responseHeaders,
|
|
122
|
+
value: new APICallError({
|
|
123
|
+
message: `HTTP ${response.status}: ${detail}`,
|
|
124
|
+
url,
|
|
125
|
+
requestBodyValues,
|
|
126
|
+
statusCode: response.status,
|
|
127
|
+
responseHeaders,
|
|
128
|
+
responseBody,
|
|
129
|
+
data: parsedError.success ? parsedError.value : undefined,
|
|
130
|
+
}),
|
|
131
|
+
};
|
|
132
|
+
};
|
|
20
133
|
|
|
21
134
|
export class RtzrClientError extends AISDKError {
|
|
22
135
|
constructor(
|
|
@@ -11,6 +11,8 @@ import {
|
|
|
11
11
|
mediaTypeToExtension,
|
|
12
12
|
parseProviderOptions,
|
|
13
13
|
postFormDataToApi,
|
|
14
|
+
safeParseJSON,
|
|
15
|
+
zodSchema,
|
|
14
16
|
} from "@ai-sdk/provider-utils";
|
|
15
17
|
import { type FetchFunction } from "@ai-sdk/provider-utils";
|
|
16
18
|
import { isEmpty } from "radashi";
|
|
@@ -20,10 +22,19 @@ import {
|
|
|
20
22
|
rtzrTranscriptionResponseSchema,
|
|
21
23
|
rtzrTranscriptionResultResponseSchema,
|
|
22
24
|
} from "./api";
|
|
23
|
-
import {
|
|
25
|
+
import {
|
|
26
|
+
formatRtzrErrorData,
|
|
27
|
+
formatRtzrErrorResponseBody,
|
|
28
|
+
RtzrClientError,
|
|
29
|
+
rtzrFailedResponseHandler,
|
|
30
|
+
} from "./error";
|
|
24
31
|
import { rtzrTranscriptionProviderOptions } from "./options";
|
|
25
32
|
import { type RtzrTranscriptionModelId, type RtzrTranscriptionProviderOptions } from "./options";
|
|
26
33
|
|
|
34
|
+
function isNullish(value: unknown): value is null | undefined {
|
|
35
|
+
return value === null || value === undefined;
|
|
36
|
+
}
|
|
37
|
+
|
|
27
38
|
export type RtzrTranscriptionCallOptions = Omit<
|
|
28
39
|
TranscriptionModelV3CallOptions,
|
|
29
40
|
"providerOptions"
|
|
@@ -78,17 +89,25 @@ export class RtzrTranscriptionModel implements TranscriptionModelV3 {
|
|
|
78
89
|
},
|
|
79
90
|
);
|
|
80
91
|
|
|
92
|
+
const responseBody = await response.text();
|
|
81
93
|
if (!response.ok) {
|
|
82
|
-
|
|
94
|
+
const detail = await formatRtzrErrorResponseBody(responseBody);
|
|
95
|
+
throw new RtzrClientError(
|
|
96
|
+
`Failed to authorize RTZR: HTTP ${response.status}${
|
|
97
|
+
isNullish(detail) ? "" : `: ${detail}`
|
|
98
|
+
}`,
|
|
99
|
+
);
|
|
83
100
|
}
|
|
84
101
|
|
|
85
|
-
const
|
|
86
|
-
|
|
102
|
+
const parsedData = await safeParseJSON({
|
|
103
|
+
text: responseBody,
|
|
104
|
+
schema: zodSchema(rtzrAuthResponseSchema),
|
|
105
|
+
});
|
|
87
106
|
if (!parsedData.success) {
|
|
88
|
-
throw new RtzrClientError(`
|
|
107
|
+
throw new RtzrClientError(`Invalid RTZR auth response: ${parsedData.error.message}`);
|
|
89
108
|
}
|
|
90
109
|
|
|
91
|
-
return parsedData.
|
|
110
|
+
return parsedData.value.access_token;
|
|
92
111
|
}
|
|
93
112
|
|
|
94
113
|
private async getArgs({ audio, mediaType, providerOptions }: RtzrTranscriptionCallOptions) {
|
|
@@ -144,10 +163,10 @@ export class RtzrTranscriptionModel implements TranscriptionModelV3 {
|
|
|
144
163
|
});
|
|
145
164
|
|
|
146
165
|
const { value: response, rawValue } = await (async () => {
|
|
147
|
-
// transcription이 끝날
|
|
166
|
+
// transcription이 끝날 때까지 RTZR 권장 간격인 5초마다 체크.
|
|
148
167
|
// timeout을 따로 지정하지 않는 이유는 애초에 AbortSignal을 사용하고 있음.
|
|
149
168
|
while (true) {
|
|
150
|
-
await new Promise((resolve) => setTimeout(resolve,
|
|
169
|
+
await new Promise((resolve) => setTimeout(resolve, 5000));
|
|
151
170
|
const data = await getFromApi({
|
|
152
171
|
url: this.config.url({
|
|
153
172
|
path: `/transcribe/${transcriptionId}`,
|
|
@@ -167,6 +186,18 @@ export class RtzrTranscriptionModel implements TranscriptionModelV3 {
|
|
|
167
186
|
}
|
|
168
187
|
})();
|
|
169
188
|
|
|
189
|
+
if (response.status === "failed") {
|
|
190
|
+
const detail = isNullish(response.error)
|
|
191
|
+
? "unknown RTZR transcription error"
|
|
192
|
+
: formatRtzrErrorData({
|
|
193
|
+
error: response.error,
|
|
194
|
+
});
|
|
195
|
+
throw new RtzrClientError(
|
|
196
|
+
`RTZR transcription failed for id ${response.id}: status ${response.status}: ` +
|
|
197
|
+
`provider ${this.provider}: model ${this.modelId}: ${detail}`,
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
|
|
170
201
|
const segments = response.results?.utterances ?? [];
|
|
171
202
|
|
|
172
203
|
const languages = new Set(segments.map((item) => item.lang).filter((item) => !isEmpty(item)));
|
|
@@ -436,6 +436,37 @@ SQL expressions per source column type:
|
|
|
436
436
|
}
|
|
437
437
|
```
|
|
438
438
|
|
|
439
|
+
### Partial index (`where`)
|
|
440
|
+
|
|
441
|
+
`where` declares a PostgreSQL partial index predicate. Provide a raw SQL condition **without** the `WHERE` keyword; it is appended to the generated `CREATE INDEX`. Works for every index type (`index`, `unique`, `hnsw`, `ivfflat`, pgroonga).
|
|
442
|
+
|
|
443
|
+
```json
|
|
444
|
+
{
|
|
445
|
+
"name": "uniq_users_email_active",
|
|
446
|
+
"type": "unique",
|
|
447
|
+
"columns": [{ "name": "email" }],
|
|
448
|
+
"where": "deleted_at IS NULL"
|
|
449
|
+
}
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
→ `CREATE UNIQUE INDEX uniq_users_email_active ON users (email) WHERE deleted_at IS NULL;`
|
|
453
|
+
(Enforces email uniqueness only among non-deleted rows.)
|
|
454
|
+
|
|
455
|
+
### `nullsNotDistinct` (unique only)
|
|
456
|
+
|
|
457
|
+
By default PostgreSQL treats `NULL`s as distinct, so a unique index allows multiple `NULL` rows. Set `nullsNotDistinct: true` to emit `NULLS NOT DISTINCT`, treating `NULL`s as equal (at most one `NULL` allowed).
|
|
458
|
+
|
|
459
|
+
```json
|
|
460
|
+
{
|
|
461
|
+
"name": "uniq_accounts_external_id",
|
|
462
|
+
"type": "unique",
|
|
463
|
+
"columns": [{ "name": "external_id" }],
|
|
464
|
+
"nullsNotDistinct": true
|
|
465
|
+
}
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
→ `CREATE UNIQUE INDEX uniq_accounts_external_id ON accounts (external_id) NULLS NOT DISTINCT;`
|
|
469
|
+
|
|
439
470
|
### IMPORTANT: Use the actual DB column name in indexes
|
|
440
471
|
|
|
441
472
|
**The way FK columns are referenced differs between indexes and subsets. Do not confuse them.**
|
|
@@ -180,6 +180,28 @@ db.table("orders")
|
|
|
180
180
|
db.orderBy("created_at", "desc").limit(20).offset(40); // Page 3
|
|
181
181
|
```
|
|
182
182
|
|
|
183
|
+
### NULLS position & array form
|
|
184
|
+
|
|
185
|
+
`orderBy` has two overloads:
|
|
186
|
+
|
|
187
|
+
1. Single column: `orderBy(column, direction?, nulls?)` — `nulls` is `"first" | "last"`
|
|
188
|
+
2. Array: `orderBy(entries[])` — each entry is a column string, a `Puri.raw*` SQL expression, or an object `{ column, order?, nulls? }`
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
// Single column with NULLS position
|
|
192
|
+
db.orderBy("published_at", "desc", "last");
|
|
193
|
+
|
|
194
|
+
// Array form: multiple sort keys, per-key direction and NULLS
|
|
195
|
+
db.orderBy([
|
|
196
|
+
{ column: "is_pinned", order: "desc" },
|
|
197
|
+
{ column: "published_at", order: "desc", nulls: "last" },
|
|
198
|
+
"title", // bare string defaults to asc
|
|
199
|
+
]);
|
|
200
|
+
|
|
201
|
+
// Sort by a SQL expression
|
|
202
|
+
db.orderBy([Puri.rawNumber("view_count * 2"), { column: "id", order: "desc" }]);
|
|
203
|
+
```
|
|
204
|
+
|
|
183
205
|
## GROUP BY & HAVING
|
|
184
206
|
|
|
185
207
|
```typescript
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: sonamu-upsert
|
|
3
|
-
description: Saving complex relational data with Sonamu UpsertBuilder. ubRegister, ubUpsert,
|
|
3
|
+
description: Saving complex relational data with Sonamu UpsertBuilder. ubRegister, ubUpsert, ubInsertOnly, ubUpdateBatch, bulk insert/upsert patterns, FK ordering, cleanOrphans. Use when saving related data with foreign key dependencies.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# UpsertBuilder
|
|
@@ -178,15 +178,62 @@ await wdb.transaction(async (trx) => {
|
|
|
178
178
|
});
|
|
179
179
|
```
|
|
180
180
|
|
|
181
|
-
##
|
|
181
|
+
## Bulk Insert / Bulk Upsert (Large Datasets)
|
|
182
|
+
|
|
183
|
+
**Principle (same as regular saves):** call `ubRegister` for every row **outside** the transaction, then call only `ubUpsert` / `ubInsertOnly` **inside** the transaction. Split large datasets with `chunkSize`. Calling `ubRegister` inside the transaction is reserved for the special case where a row depends on the real id produced by a preceding `ubUpsert`.
|
|
184
|
+
|
|
185
|
+
### (a) Bulk insert inside a Model
|
|
186
|
+
|
|
187
|
+
```typescript
|
|
188
|
+
async createMany(params: PostCreateParams[]): Promise<number[]> {
|
|
189
|
+
const wdb = this.getPuri("w");
|
|
190
|
+
params.forEach((p) => wdb.ubRegister("posts", p));
|
|
191
|
+
|
|
192
|
+
return wdb.transaction(async (trx) => {
|
|
193
|
+
return trx.ubInsertOnly("posts", { chunkSize: 5000 });
|
|
194
|
+
});
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### (b) Standalone Puri (seed / batch scripts outside a Model)
|
|
199
|
+
|
|
200
|
+
Outside a Model there is no `this.getPuri("w")`, so build a `PuriWrapper` directly. Use `DB.getDB("w")` only in this script context — inside Models always use `getPuri("w")`.
|
|
201
|
+
|
|
202
|
+
```typescript
|
|
203
|
+
import { DB, PuriWrapper, UpsertBuilder } from "sonamu";
|
|
204
|
+
|
|
205
|
+
const puri = new PuriWrapper(DB.getDB("w"), new UpsertBuilder());
|
|
206
|
+
for (const row of rows) puri.ubRegister("audit_logs", row);
|
|
207
|
+
|
|
208
|
+
await puri.transaction(async (trx) => {
|
|
209
|
+
await trx.ubInsertOnly("audit_logs", { chunkSize: 5000 }); // or ubUpsert
|
|
210
|
+
});
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### (c) Multiple tables in one transaction (FK order)
|
|
214
|
+
|
|
215
|
+
Register every table outside the transaction, then upsert parents before children.
|
|
216
|
+
|
|
217
|
+
```typescript
|
|
218
|
+
const puri = new PuriWrapper(DB.getDB("w"), new UpsertBuilder());
|
|
219
|
+
for (const row of postRows) puri.ubRegister("posts", row);
|
|
220
|
+
for (const row of tagRows) puri.ubRegister("post_tags", row);
|
|
221
|
+
|
|
222
|
+
await puri.transaction(async (trx) => {
|
|
223
|
+
await trx.ubInsertOnly("posts", { chunkSize: 5000 }); // parent first
|
|
224
|
+
await trx.ubInsertOnly("post_tags", { chunkSize: 5000 }); // child next
|
|
225
|
+
});
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
## ubInsertOnly (INSERT Only)
|
|
182
229
|
|
|
183
230
|
Perform INSERT without UPDATE:
|
|
184
231
|
|
|
185
232
|
```typescript
|
|
186
|
-
await trx.
|
|
233
|
+
await trx.ubInsertOnly("logs", { chunkSize: 1000 });
|
|
187
234
|
```
|
|
188
235
|
|
|
189
|
-
##
|
|
236
|
+
## ubUpdateBatch (Batch Update)
|
|
190
237
|
|
|
191
238
|
Bulk UPDATE operations:
|
|
192
239
|
|
|
@@ -197,14 +244,14 @@ wdb.ubRegister("users", { id: 2, status: "active" });
|
|
|
197
244
|
wdb.ubRegister("users", { id: 3, status: "inactive" });
|
|
198
245
|
|
|
199
246
|
await wdb.transaction(async (trx) => {
|
|
200
|
-
await trx.
|
|
247
|
+
await trx.ubUpdateBatch("users", {
|
|
201
248
|
chunkSize: 500, // batch size (default: 500)
|
|
202
249
|
where: "id", // WHERE condition column (default: "id")
|
|
203
250
|
});
|
|
204
251
|
});
|
|
205
252
|
|
|
206
253
|
// Composite key for WHERE condition
|
|
207
|
-
await trx.
|
|
254
|
+
await trx.ubUpdateBatch("user_settings", {
|
|
208
255
|
where: ["user_id", "setting_key"],
|
|
209
256
|
});
|
|
210
257
|
```
|