@juspay/neurolink 12.48.1 → 12.49.0
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/CHANGELOG.md +3 -3
- package/dist/browser/neurolink.min.js +616 -595
- package/dist/cli/commands/serve.d.ts +5 -3
- package/dist/cli/commands/serve.js +113 -20
- package/dist/cli/commands/server.js +13 -6
- package/dist/cli/commands/transcribe.d.ts +24 -0
- package/dist/cli/commands/transcribe.js +718 -0
- package/dist/cli/factories/commandFactory.d.ts +10 -0
- package/dist/cli/factories/commandFactory.js +13 -0
- package/dist/cli/parser.js +3 -0
- package/dist/cli/utils/serverUtils.d.ts +28 -0
- package/dist/cli/utils/serverUtils.js +71 -0
- package/dist/factories/mediaHandlerCatalog.js +11 -9
- package/dist/factories/sttDescriptors.d.ts +63 -0
- package/dist/factories/sttDescriptors.js +286 -0
- package/dist/index.d.ts +4 -1
- package/dist/index.js +7 -1
- package/dist/neurolink.d.ts +68 -1
- package/dist/neurolink.js +202 -4
- package/dist/processors/media/AudioProcessor.d.ts +15 -56
- package/dist/processors/media/AudioProcessor.js +105 -276
- package/dist/processors/media/VideoProcessor.d.ts +3 -5
- package/dist/processors/media/VideoProcessor.js +52 -51
- package/dist/server/abstract/baseServerAdapter.d.ts +28 -1
- package/dist/server/abstract/baseServerAdapter.js +84 -4
- package/dist/server/adapters/expressAdapter.d.ts +1 -0
- package/dist/server/adapters/expressAdapter.js +50 -10
- package/dist/server/adapters/fastifyAdapter.d.ts +1 -0
- package/dist/server/adapters/fastifyAdapter.js +51 -8
- package/dist/server/adapters/honoAdapter.d.ts +1 -4
- package/dist/server/adapters/honoAdapter.js +95 -8
- package/dist/server/adapters/koaAdapter.d.ts +7 -0
- package/dist/server/adapters/koaAdapter.js +71 -10
- package/dist/server/index.d.ts +3 -2
- package/dist/server/index.js +3 -2
- package/dist/server/routes/index.d.ts +1 -0
- package/dist/server/routes/index.js +3 -0
- package/dist/server/routes/transcribeRoutes.d.ts +23 -0
- package/dist/server/routes/transcribeRoutes.js +506 -0
- package/dist/server/utils/rawBody.d.ts +32 -0
- package/dist/server/utils/rawBody.js +76 -0
- package/dist/server/utils/validation.d.ts +192 -0
- package/dist/server/utils/validation.js +100 -0
- package/dist/server/websocket/transcribeWebSocket.d.ts +42 -0
- package/dist/server/websocket/transcribeWebSocket.js +264 -0
- package/dist/types/cli.d.ts +47 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.js +1 -0
- package/dist/types/providers.d.ts +7 -1
- package/dist/types/server.d.ts +117 -1
- package/dist/types/stt.d.ts +160 -7
- package/dist/types/transcribe.d.ts +506 -0
- package/dist/types/transcribe.js +29 -0
- package/dist/utils/speakerTurns.d.ts +28 -0
- package/dist/utils/speakerTurns.js +93 -0
- package/dist/utils/sttProcessor.d.ts +20 -2
- package/dist/utils/sttProcessor.js +73 -5
- package/dist/voice/correction/dictionary.d.ts +49 -0
- package/dist/voice/correction/dictionary.js +134 -0
- package/dist/voice/correction/guard.d.ts +35 -0
- package/dist/voice/correction/guard.js +161 -0
- package/dist/voice/correction/index.d.ts +47 -0
- package/dist/voice/correction/index.js +211 -0
- package/dist/voice/correction/rewrite.d.ts +92 -0
- package/dist/voice/correction/rewrite.js +322 -0
- package/dist/voice/errors.d.ts +15 -0
- package/dist/voice/errors.js +45 -0
- package/dist/voice/index.d.ts +20 -2
- package/dist/voice/index.js +75 -9
- package/dist/voice/providers/AzureSTT.d.ts +10 -7
- package/dist/voice/providers/AzureSTT.js +23 -75
- package/dist/voice/providers/DeepgramSTT.d.ts +17 -2
- package/dist/voice/providers/DeepgramSTT.js +109 -13
- package/dist/voice/providers/ElevenLabsSTT.d.ts +12 -2
- package/dist/voice/providers/ElevenLabsSTT.js +34 -8
- package/dist/voice/providers/GoogleSTT.d.ts +10 -8
- package/dist/voice/providers/GoogleSTT.js +21 -75
- package/dist/voice/providers/OpenAISTT.d.ts +30 -9
- package/dist/voice/providers/OpenAISTT.js +196 -21
- package/dist/voice/providers/WhistleSTT.d.ts +87 -0
- package/dist/voice/providers/WhistleSTT.js +313 -0
- package/dist/voice/streaming/chunkedStreamAdapter.d.ts +19 -0
- package/dist/voice/streaming/chunkedStreamAdapter.js +519 -0
- package/dist/voice/streaming/endpointer.d.ts +81 -0
- package/dist/voice/streaming/endpointer.js +247 -0
- package/dist/voice/streaming/localAgreement.d.ts +30 -0
- package/dist/voice/streaming/localAgreement.js +44 -0
- package/dist/voice/sttEnvCredentials.d.ts +12 -0
- package/dist/voice/sttEnvCredentials.js +12 -0
- package/dist/voice/transcribe.d.ts +47 -0
- package/dist/voice/transcribe.js +519 -0
- package/dist/voice/transcribeStream.d.ts +4 -0
- package/dist/voice/transcribeStream.js +584 -0
- package/dist/voice/whistle/assets.d.ts +47 -0
- package/dist/voice/whistle/assets.js +270 -0
- package/dist/voice/whistle/audio.d.ts +32 -0
- package/dist/voice/whistle/audio.js +267 -0
- package/dist/voice/whistle/engine.d.ts +32 -0
- package/dist/voice/whistle/engine.js +193 -0
- package/dist/voice/whistle/worker.d.ts +18 -0
- package/dist/voice/whistle/worker.js +294 -0
- package/docs-site/static/search-index.json +69 -10
- package/models/whistle/README.md +18 -0
- package/models/whistle/needle.js +2 -0
- package/models/whistle/needle.wasm +0 -0
- package/models/whistle/whistle.cact +0 -0
- package/package.json +7 -3
|
@@ -4,13 +4,34 @@
|
|
|
4
4
|
* Hono is chosen for its performance, TypeScript-first design, and edge compatibility
|
|
5
5
|
*/
|
|
6
6
|
import { logger } from "../../utils/logger.js";
|
|
7
|
-
import { AlreadyRunningError, ServerStopError, wrapError } from "../errors.js";
|
|
7
|
+
import { AlreadyRunningError, ServerAdapterError, ServerStopError, wrapError, } from "../errors.js";
|
|
8
8
|
import { BaseServerAdapter } from "../abstract/baseServerAdapter.js";
|
|
9
9
|
import { isErrorResponse } from "../utils/validation.js";
|
|
10
|
+
import { isRawBodyContentType, isWebResponse, parseByteLimit, RawBodyTooLargeError, readRawBody, } from "../utils/rawBody.js";
|
|
10
11
|
/**
|
|
11
12
|
* Hono-specific server adapter
|
|
12
13
|
* Supports multiple runtimes: Bun, Deno, Node.js
|
|
13
14
|
*/
|
|
15
|
+
/** Raw bodies already read for a request, so a second extraction never hits a consumed stream. */
|
|
16
|
+
const rawBodies = new WeakMap();
|
|
17
|
+
/** A web `ReadableStream` of bytes as an async iterable of Buffers, releasing the reader on exit. */
|
|
18
|
+
async function* webStreamChunks(stream) {
|
|
19
|
+
const reader = stream.getReader();
|
|
20
|
+
try {
|
|
21
|
+
for (;;) {
|
|
22
|
+
const { value, done } = await reader.read();
|
|
23
|
+
if (done) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
if (value) {
|
|
27
|
+
yield Buffer.from(value.buffer, value.byteOffset, value.byteLength);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
reader.releaseLock();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
14
35
|
export class HonoServerAdapter extends BaseServerAdapter {
|
|
15
36
|
app;
|
|
16
37
|
server;
|
|
@@ -132,7 +153,12 @@ export class HonoServerAdapter extends BaseServerAdapter {
|
|
|
132
153
|
// Add CORS if enabled
|
|
133
154
|
if (this.config.cors.enabled) {
|
|
134
155
|
this.app.use("*", cors({
|
|
135
|
-
|
|
156
|
+
// Hono matches a list of origins literally, so `["*"]` (the default)
|
|
157
|
+
// matches nothing and no CORS header is sent; the string "*" is the
|
|
158
|
+
// wildcard. Pass it as such when the list contains it.
|
|
159
|
+
origin: this.config.cors.origins.includes("*")
|
|
160
|
+
? "*"
|
|
161
|
+
: this.config.cors.origins,
|
|
136
162
|
allowMethods: this.config.cors.methods,
|
|
137
163
|
allowHeaders: this.config.cors.headers,
|
|
138
164
|
credentials: this.config.cors.credentials,
|
|
@@ -154,16 +180,21 @@ export class HonoServerAdapter extends BaseServerAdapter {
|
|
|
154
180
|
// Global error handler
|
|
155
181
|
this.app.onError((error, c) => {
|
|
156
182
|
const requestId = c.req.header("X-Request-ID") || this.generateRequestId();
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
error: error.message,
|
|
160
|
-
stack: error.stack,
|
|
161
|
-
});
|
|
162
|
-
this.emit("error", {
|
|
183
|
+
this.logRequestError("HonoAdapter", requestId, error);
|
|
184
|
+
this.emitRequestError({
|
|
163
185
|
requestId,
|
|
164
186
|
error,
|
|
165
187
|
timestamp: new Date(),
|
|
166
188
|
});
|
|
189
|
+
if (error instanceof ServerAdapterError) {
|
|
190
|
+
return c.json({
|
|
191
|
+
error: { code: error.code, message: error.message },
|
|
192
|
+
metadata: {
|
|
193
|
+
requestId,
|
|
194
|
+
timestamp: new Date().toISOString(),
|
|
195
|
+
},
|
|
196
|
+
}, error.getHttpStatus());
|
|
197
|
+
}
|
|
167
198
|
if (error instanceof HTTPException) {
|
|
168
199
|
return c.json({
|
|
169
200
|
error: {
|
|
@@ -237,6 +268,21 @@ export class HonoServerAdapter extends BaseServerAdapter {
|
|
|
237
268
|
// Execute handler
|
|
238
269
|
const result = await route.handler(ctx);
|
|
239
270
|
const duration = Date.now() - startTime;
|
|
271
|
+
// A route that answers in its own wire format returns a web Response.
|
|
272
|
+
if (isWebResponse(result)) {
|
|
273
|
+
this.emit("response", {
|
|
274
|
+
requestId,
|
|
275
|
+
statusCode: result.status,
|
|
276
|
+
duration,
|
|
277
|
+
timestamp: new Date(),
|
|
278
|
+
});
|
|
279
|
+
for (const [key, value] of Object.entries(ctx.responseHeaders ?? {})) {
|
|
280
|
+
if (!result.headers.has(key)) {
|
|
281
|
+
result.headers.set(key, value);
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
return result;
|
|
285
|
+
}
|
|
240
286
|
// Check if result is an error response
|
|
241
287
|
if (isErrorResponse(result)) {
|
|
242
288
|
const statusCode = result.httpStatus ?? 500;
|
|
@@ -599,6 +645,10 @@ export class HonoServerAdapter extends BaseServerAdapter {
|
|
|
599
645
|
getFrameworkInstance() {
|
|
600
646
|
return this.app;
|
|
601
647
|
}
|
|
648
|
+
getNativeServer() {
|
|
649
|
+
// @hono/node-server's serve() returns the http.Server; Bun/Deno do not.
|
|
650
|
+
return this.server;
|
|
651
|
+
}
|
|
602
652
|
// ============================================
|
|
603
653
|
// Helper Methods
|
|
604
654
|
// ============================================
|
|
@@ -638,6 +688,43 @@ export class HonoServerAdapter extends BaseServerAdapter {
|
|
|
638
688
|
return undefined;
|
|
639
689
|
}
|
|
640
690
|
}
|
|
691
|
+
// Uploads (multipart, octet-stream, audio/*) reach the route as bytes.
|
|
692
|
+
// Over the size limit the body is the error itself rather than a throw:
|
|
693
|
+
// a throw from the middleware path would land in onError, which answers
|
|
694
|
+
// 500. The route answers 413 (or a validation error) from it.
|
|
695
|
+
if (isRawBodyContentType(contentType)) {
|
|
696
|
+
const limit = parseByteLimit(this.config.bodyParser.maxSize);
|
|
697
|
+
if (Number(c.req.header("Content-Length") ?? 0) > limit) {
|
|
698
|
+
return new RawBodyTooLargeError(limit);
|
|
699
|
+
}
|
|
700
|
+
// Read the web stream chunk by chunk and stop at the limit, so a
|
|
701
|
+
// chunked upload without a Content-Length cannot be buffered whole
|
|
702
|
+
// (and that before any route logic, including the API-key check, runs).
|
|
703
|
+
// The body is extracted more than once per request (middleware and
|
|
704
|
+
// route); a web stream can only be read once, so the outcome is kept
|
|
705
|
+
// per request the way Hono caches `arrayBuffer()`.
|
|
706
|
+
const cached = rawBodies.get(c.req.raw);
|
|
707
|
+
if (cached !== undefined) {
|
|
708
|
+
return cached;
|
|
709
|
+
}
|
|
710
|
+
const stream = c.req.raw.body;
|
|
711
|
+
if (!stream) {
|
|
712
|
+
return Buffer.alloc(0);
|
|
713
|
+
}
|
|
714
|
+
let outcome;
|
|
715
|
+
try {
|
|
716
|
+
outcome = await readRawBody(webStreamChunks(stream), limit);
|
|
717
|
+
}
|
|
718
|
+
catch (error) {
|
|
719
|
+
if (!(error instanceof RawBodyTooLargeError)) {
|
|
720
|
+
throw error;
|
|
721
|
+
}
|
|
722
|
+
await stream.cancel().catch(() => undefined);
|
|
723
|
+
outcome = error;
|
|
724
|
+
}
|
|
725
|
+
rawBodies.set(c.req.raw, outcome);
|
|
726
|
+
return outcome;
|
|
727
|
+
}
|
|
641
728
|
return undefined;
|
|
642
729
|
}
|
|
643
730
|
}
|
|
@@ -18,6 +18,7 @@ export declare class KoaServerAdapter extends BaseServerAdapter {
|
|
|
18
18
|
private rateLimitStore;
|
|
19
19
|
private rateLimitCleanupInterval?;
|
|
20
20
|
private sockets;
|
|
21
|
+
private registeredMiddleware;
|
|
21
22
|
constructor(neurolink: NeuroLink, config?: ServerAdapterConfig);
|
|
22
23
|
/**
|
|
23
24
|
* Initialize Koa framework
|
|
@@ -52,6 +53,11 @@ export declare class KoaServerAdapter extends BaseServerAdapter {
|
|
|
52
53
|
* Register middleware with Koa
|
|
53
54
|
*/
|
|
54
55
|
protected registerFrameworkMiddleware(middleware: MiddlewareDefinition): void;
|
|
56
|
+
/**
|
|
57
|
+
* Run registered middleware in registration order, then continue to the
|
|
58
|
+
* router. Reads the list per request, so later registrations apply too.
|
|
59
|
+
*/
|
|
60
|
+
private runRegisteredMiddleware;
|
|
55
61
|
/**
|
|
56
62
|
* Start the Koa server
|
|
57
63
|
*/
|
|
@@ -76,4 +82,5 @@ export declare class KoaServerAdapter extends BaseServerAdapter {
|
|
|
76
82
|
* Get the Koa app instance
|
|
77
83
|
*/
|
|
78
84
|
getFrameworkInstance(): unknown;
|
|
85
|
+
getNativeServer(): unknown;
|
|
79
86
|
}
|
|
@@ -4,9 +4,10 @@
|
|
|
4
4
|
* Koa is known for its elegant middleware composition using async/await
|
|
5
5
|
*/
|
|
6
6
|
import { logger } from "../../utils/logger.js";
|
|
7
|
-
import { AlreadyRunningError, ServerStopError, wrapError } from "../errors.js";
|
|
7
|
+
import { AlreadyRunningError, ServerAdapterError, ServerStopError, wrapError, } from "../errors.js";
|
|
8
8
|
import { BaseServerAdapter } from "../abstract/baseServerAdapter.js";
|
|
9
9
|
import { isErrorResponse } from "../utils/validation.js";
|
|
10
|
+
import { isRawBodyContentType, isWebResponse, parseByteLimit, RawBodyTooLargeError, readRawBody, readWebResponse, } from "../utils/rawBody.js";
|
|
10
11
|
/**
|
|
11
12
|
* Koa-specific server adapter
|
|
12
13
|
* Leverages Koa's middleware composition for clean request handling
|
|
@@ -19,6 +20,10 @@ export class KoaServerAdapter extends BaseServerAdapter {
|
|
|
19
20
|
rateLimitStore = new Map();
|
|
20
21
|
rateLimitCleanupInterval;
|
|
21
22
|
sockets = new Set();
|
|
23
|
+
// Middleware from registerMiddleware(). It runs through one dispatcher that
|
|
24
|
+
// is mounted ahead of the router: app.use() after the router is mounted
|
|
25
|
+
// would only ever see requests no route matched.
|
|
26
|
+
registeredMiddleware = [];
|
|
22
27
|
constructor(neurolink, config = {}) {
|
|
23
28
|
super(neurolink, config);
|
|
24
29
|
}
|
|
@@ -59,21 +64,19 @@ export class KoaServerAdapter extends BaseServerAdapter {
|
|
|
59
64
|
catch (error) {
|
|
60
65
|
const err = error;
|
|
61
66
|
const requestId = ctx.state.requestId;
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
error: err.message,
|
|
65
|
-
stack: err.stack,
|
|
66
|
-
});
|
|
67
|
-
this.emit("error", {
|
|
67
|
+
this.logRequestError("KoaAdapter", requestId, err);
|
|
68
|
+
this.emitRequestError({
|
|
68
69
|
requestId,
|
|
69
70
|
error: err,
|
|
70
71
|
timestamp: new Date(),
|
|
71
72
|
});
|
|
72
|
-
const
|
|
73
|
+
const adapterError = error instanceof ServerAdapterError ? error : undefined;
|
|
74
|
+
const statusCode = adapterError?.getHttpStatus() || err.status || err.statusCode || 500;
|
|
73
75
|
ctx.status = statusCode;
|
|
74
76
|
ctx.body = {
|
|
75
77
|
error: {
|
|
76
|
-
code:
|
|
78
|
+
code: adapterError?.code ??
|
|
79
|
+
(statusCode === 500 ? "INTERNAL_ERROR" : `HTTP_${statusCode}`),
|
|
77
80
|
message: statusCode === 500 ? "An internal error occurred" : err.message,
|
|
78
81
|
},
|
|
79
82
|
metadata: {
|
|
@@ -109,6 +112,26 @@ export class KoaServerAdapter extends BaseServerAdapter {
|
|
|
109
112
|
jsonLimit: this.config.bodyParser.jsonLimit,
|
|
110
113
|
enableTypes: ["json", "form", "text"],
|
|
111
114
|
}));
|
|
115
|
+
// Uploads (multipart, octet-stream, audio/*) reach the route as bytes.
|
|
116
|
+
const rawLimit = parseByteLimit(this.config.bodyParser.maxSize);
|
|
117
|
+
this.app.use(async (ctx, next) => {
|
|
118
|
+
if (isRawBodyContentType(ctx.get("content-type"))) {
|
|
119
|
+
try {
|
|
120
|
+
ctx.request.body = await readRawBody(ctx.req, rawLimit);
|
|
121
|
+
}
|
|
122
|
+
catch (error) {
|
|
123
|
+
if (error instanceof RawBodyTooLargeError) {
|
|
124
|
+
ctx.status = 413;
|
|
125
|
+
ctx.body = {
|
|
126
|
+
error: { code: "PAYLOAD_TOO_LARGE", message: error.message },
|
|
127
|
+
};
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
throw error;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
await next();
|
|
134
|
+
});
|
|
112
135
|
}
|
|
113
136
|
// Rate limiting middleware
|
|
114
137
|
if (this.config.rateLimit.enabled) {
|
|
@@ -130,6 +153,7 @@ export class KoaServerAdapter extends BaseServerAdapter {
|
|
|
130
153
|
});
|
|
131
154
|
});
|
|
132
155
|
}
|
|
156
|
+
this.app.use((ctx, next) => this.runRegisteredMiddleware(ctx, next));
|
|
133
157
|
// Mount router
|
|
134
158
|
this.app.use(this.router.routes());
|
|
135
159
|
this.app.use(this.router.allowedMethods());
|
|
@@ -251,6 +275,25 @@ export class KoaServerAdapter extends BaseServerAdapter {
|
|
|
251
275
|
// Execute handler
|
|
252
276
|
const result = await route.handler(serverCtx);
|
|
253
277
|
const duration = Date.now() - startTime;
|
|
278
|
+
// A route that answers in its own wire format returns a web Response.
|
|
279
|
+
if (isWebResponse(result)) {
|
|
280
|
+
const raw = await readWebResponse(result);
|
|
281
|
+
this.emit("response", {
|
|
282
|
+
requestId,
|
|
283
|
+
statusCode: raw.status,
|
|
284
|
+
duration,
|
|
285
|
+
timestamp: new Date(),
|
|
286
|
+
});
|
|
287
|
+
for (const [key, value] of Object.entries({
|
|
288
|
+
...serverCtx.responseHeaders,
|
|
289
|
+
...raw.headers,
|
|
290
|
+
})) {
|
|
291
|
+
ctx.set(key, value);
|
|
292
|
+
}
|
|
293
|
+
ctx.status = raw.status;
|
|
294
|
+
ctx.body = raw.body;
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
254
297
|
// Check if result is an error response
|
|
255
298
|
if (isErrorResponse(result)) {
|
|
256
299
|
const statusCode = result.httpStatus ?? 500;
|
|
@@ -349,7 +392,7 @@ export class KoaServerAdapter extends BaseServerAdapter {
|
|
|
349
392
|
* Register middleware with Koa
|
|
350
393
|
*/
|
|
351
394
|
registerFrameworkMiddleware(middleware) {
|
|
352
|
-
this.
|
|
395
|
+
this.registeredMiddleware.push(async (ctx, next) => {
|
|
353
396
|
// Skip excluded paths
|
|
354
397
|
if (middleware.excludePaths?.some((p) => ctx.path.startsWith(p))) {
|
|
355
398
|
return next();
|
|
@@ -390,6 +433,21 @@ export class KoaServerAdapter extends BaseServerAdapter {
|
|
|
390
433
|
}
|
|
391
434
|
});
|
|
392
435
|
}
|
|
436
|
+
/**
|
|
437
|
+
* Run registered middleware in registration order, then continue to the
|
|
438
|
+
* router. Reads the list per request, so later registrations apply too.
|
|
439
|
+
*/
|
|
440
|
+
runRegisteredMiddleware(ctx, next) {
|
|
441
|
+
const dispatch = async (index) => {
|
|
442
|
+
const middleware = this.registeredMiddleware[index];
|
|
443
|
+
if (!middleware) {
|
|
444
|
+
await next();
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
await middleware(ctx, () => dispatch(index + 1));
|
|
448
|
+
};
|
|
449
|
+
return dispatch(0);
|
|
450
|
+
}
|
|
393
451
|
/**
|
|
394
452
|
* Start the Koa server
|
|
395
453
|
*/
|
|
@@ -517,4 +575,7 @@ export class KoaServerAdapter extends BaseServerAdapter {
|
|
|
517
575
|
getFrameworkInstance() {
|
|
518
576
|
return this.app;
|
|
519
577
|
}
|
|
578
|
+
getNativeServer() {
|
|
579
|
+
return this.server;
|
|
580
|
+
}
|
|
520
581
|
}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -38,9 +38,10 @@ export { createMCPBodyAttachmentMiddleware, fastifyMCPBodyHook, } from "./middle
|
|
|
38
38
|
export { createRateLimitMiddleware, createSlidingWindowRateLimitMiddleware, InMemoryRateLimitStore, } from "./middleware/rateLimit.js";
|
|
39
39
|
export { CommonSchemas, createFieldValidator, createRequestValidationMiddleware, ValidationError, } from "./middleware/validation.js";
|
|
40
40
|
export { AgentExecuteRequestSchema as OpenAPIAgentExecuteRequestSchema, AgentExecuteResponseSchema, AgentInputSchema, ApiKeySecurityScheme, BasicSecurityScheme, BearerSecurityScheme, CommonParameters, ConversationMessageSchema, createApiInfo, createDeleteOperation, createErrorResponse as createOpenAPIErrorResponse, createGetOperation, createHeaderParameter, createOpenAPIGenerator, createPathParameter, createPostOperation, createQueryParameter, createServer as createOpenAPIServer, createStreamingPostOperation, createStreamingResponse, createSuccessResponse, DefaultServers, ErrorResponseSchema, generateOpenAPIFromConfig, generateOpenAPISpec, HealthResponseSchema, MCPServerStatusSchema, MCPServersListResponseSchema, MCPServerToolSchema, MetricsResponseSchema, NeuroLinkApiInfo, OpenAPIGenerator, OpenAPISchemas, ProviderInfoSchema, ReadyResponseSchema, SessionSchema, SessionsListResponseSchema, StandardErrorResponses, StandardTags, TokenUsageSchema, ToolCallSchema, ToolDefinitionSchema, ToolExecuteRequestSchema as OpenAPIToolExecuteRequestSchema, ToolExecuteResponseSchema, ToolListResponseSchema, ToolParameterSchema, } from "./openapi/index.js";
|
|
41
|
-
export { createAgentRoutes, createAllRoutes, createHealthRoutes, createMCPRoutes, createMemoryRoutes, createOpenApiRoutes, createToolRoutes, registerAllRoutes, createClaudeProxyRoutes, createOpenAIProxyRoutes, createCodexProxyRoutes, createGeminiProxyRoutes, } from "./routes/index.js";
|
|
41
|
+
export { createAgentRoutes, createAllRoutes, createHealthRoutes, createMCPRoutes, createMemoryRoutes, createOpenApiRoutes, createToolRoutes, createTranscribeRoutes, registerAllRoutes, createClaudeProxyRoutes, createOpenAIProxyRoutes, createCodexProxyRoutes, createGeminiProxyRoutes, } from "./routes/index.js";
|
|
42
42
|
export { BaseDataStreamWriter, createDataStreamResponse, createDataStreamWriter, createNDJSONHeaders, createSSEHeaders, DataStreamResponse, formatSSEEvent, pipeAsyncIterableToDataStream, WebStreamWriter, } from "./streaming/index.js";
|
|
43
43
|
export { ErrorCategory, ErrorSeverity, ServerAdapterErrorCode, } from "../types/index.js";
|
|
44
44
|
export { createStreamRedactor, redactStreamChunk } from "./utils/redaction.js";
|
|
45
|
-
export { AgentExecuteRequestSchema, createErrorResponse, ServerNameParamSchema, SessionIdParamSchema, ToolArgumentsSchema, ToolExecuteRequestSchema, ToolNameParamSchema, ToolSearchQuerySchema, validateParams, validateQuery, validateRequest, } from "./utils/validation.js";
|
|
45
|
+
export { AgentExecuteRequestSchema, createErrorResponse, ServerNameParamSchema, SessionIdParamSchema, ToolArgumentsSchema, ToolExecuteRequestSchema, ToolNameParamSchema, ToolSearchQuerySchema, TranscribeConfigSchema, TranscribeRequestSchema, TranscribeStreamConfigSchema, validateParams, validateQuery, validateRequest, } from "./utils/validation.js";
|
|
46
46
|
export { createAgentWebSocketHandler, WebSocketConnectionManager, WebSocketMessageRouter, } from "./websocket/index.js";
|
|
47
|
+
export { attachTranscribeWebSocket } from "./websocket/transcribeWebSocket.js";
|
package/dist/server/index.js
CHANGED
|
@@ -93,7 +93,7 @@ OpenAPIGenerator, OpenAPISchemas, ProviderInfoSchema, ReadyResponseSchema, Sessi
|
|
|
93
93
|
// ============================================
|
|
94
94
|
// Routes
|
|
95
95
|
// ============================================
|
|
96
|
-
export { createAgentRoutes, createAllRoutes, createHealthRoutes, createMCPRoutes, createMemoryRoutes, createOpenApiRoutes, createToolRoutes, registerAllRoutes,
|
|
96
|
+
export { createAgentRoutes, createAllRoutes, createHealthRoutes, createMCPRoutes, createMemoryRoutes, createOpenApiRoutes, createToolRoutes, createTranscribeRoutes, registerAllRoutes,
|
|
97
97
|
// The proxy doors. All were reachable only from the deep path
|
|
98
98
|
// ./routes/index.js, which is not a package export — so a consumer of
|
|
99
99
|
// "@juspay/neurolink/server" could reach them only indirectly through
|
|
@@ -120,8 +120,9 @@ export { createStreamRedactor, redactStreamChunk } from "./utils/redaction.js";
|
|
|
120
120
|
// ============================================
|
|
121
121
|
// Validation Utilities
|
|
122
122
|
// ============================================
|
|
123
|
-
export { AgentExecuteRequestSchema, createErrorResponse, ServerNameParamSchema, SessionIdParamSchema, ToolArgumentsSchema, ToolExecuteRequestSchema, ToolNameParamSchema, ToolSearchQuerySchema, validateParams, validateQuery, validateRequest, } from "./utils/validation.js";
|
|
123
|
+
export { AgentExecuteRequestSchema, createErrorResponse, ServerNameParamSchema, SessionIdParamSchema, ToolArgumentsSchema, ToolExecuteRequestSchema, ToolNameParamSchema, ToolSearchQuerySchema, TranscribeConfigSchema, TranscribeRequestSchema, TranscribeStreamConfigSchema, validateParams, validateQuery, validateRequest, } from "./utils/validation.js";
|
|
124
124
|
// ============================================
|
|
125
125
|
// WebSocket
|
|
126
126
|
// ============================================
|
|
127
127
|
export { createAgentWebSocketHandler, WebSocketConnectionManager, WebSocketMessageRouter, } from "./websocket/index.js";
|
|
128
|
+
export { attachTranscribeWebSocket } from "./websocket/transcribeWebSocket.js";
|
|
@@ -13,6 +13,7 @@ export { createMCPRoutes } from "./mcpRoutes.js";
|
|
|
13
13
|
export { createMemoryRoutes } from "./memoryRoutes.js";
|
|
14
14
|
export { createOpenApiRoutes } from "./openApiRoutes.js";
|
|
15
15
|
export { createToolRoutes } from "./toolRoutes.js";
|
|
16
|
+
export { createTranscribeRoutes } from "./transcribeRoutes.js";
|
|
16
17
|
/**
|
|
17
18
|
* Create all standard routes
|
|
18
19
|
* Convenience method that combines all route groups
|
|
@@ -13,6 +13,7 @@ import { createMCPRoutes } from "./mcpRoutes.js";
|
|
|
13
13
|
import { createMemoryRoutes } from "./memoryRoutes.js";
|
|
14
14
|
import { createOpenApiRoutes } from "./openApiRoutes.js";
|
|
15
15
|
import { createToolRoutes } from "./toolRoutes.js";
|
|
16
|
+
import { createTranscribeRoutes } from "./transcribeRoutes.js";
|
|
16
17
|
// Re-export route builders from individual files
|
|
17
18
|
export { createAgentRoutes } from "./agentRoutes.js";
|
|
18
19
|
export { createClaudeProxyRoutes } from "./claudeProxyRoutes.js";
|
|
@@ -25,6 +26,7 @@ export { createMCPRoutes } from "./mcpRoutes.js";
|
|
|
25
26
|
export { createMemoryRoutes } from "./memoryRoutes.js";
|
|
26
27
|
export { createOpenApiRoutes } from "./openApiRoutes.js";
|
|
27
28
|
export { createToolRoutes } from "./toolRoutes.js";
|
|
29
|
+
export { createTranscribeRoutes } from "./transcribeRoutes.js";
|
|
28
30
|
/**
|
|
29
31
|
* Create all standard routes
|
|
30
32
|
* Convenience method that combines all route groups
|
|
@@ -44,6 +46,7 @@ export function createAllRoutes(basePath = "/api", options) {
|
|
|
44
46
|
createMCPRoutes(basePath),
|
|
45
47
|
createMemoryRoutes(basePath),
|
|
46
48
|
createHealthRoutes(basePath),
|
|
49
|
+
createTranscribeRoutes(basePath, options?.transcribe),
|
|
47
50
|
];
|
|
48
51
|
// Conditionally add OpenAPI/Swagger routes
|
|
49
52
|
if (options?.enableSwagger) {
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Transcribe Routes
|
|
3
|
+
*
|
|
4
|
+
* - `POST <basePath>/agent/transcribe` — JSON in (`audio` base64, `audioUrl`
|
|
5
|
+
* or an allow-listed `audioPath`), `TranscribeResult` out, in the adapters'
|
|
6
|
+
* usual `{ data, metadata }` envelope.
|
|
7
|
+
* - `POST /v1/audio/transcriptions` — OpenAI-compatible: `multipart/form-data`
|
|
8
|
+
* in, OpenAI's `json` / `verbose_json` / `text` out (no envelope), with
|
|
9
|
+
* NeuroLink's extras on `verbose_json`.
|
|
10
|
+
*
|
|
11
|
+
* Both call `neurolink.transcribe()`. Neither accepts credentials: engines use
|
|
12
|
+
* the server's own configuration.
|
|
13
|
+
*/
|
|
14
|
+
import type { RouteGroup, ServerTranscribeRouteOptions } from "../../types/index.js";
|
|
15
|
+
/**
|
|
16
|
+
* Create the transcription routes.
|
|
17
|
+
*
|
|
18
|
+
* @param basePath - Prefix of the NeuroLink route (default `/api`).
|
|
19
|
+
* @param options - `allowedAudioRoots` (default: `audioPath` refused),
|
|
20
|
+
* `maxAudioBytes` (default 50 MB) and `openaiBasePath` (default `""`, so the
|
|
21
|
+
* OpenAI-compatible route is `/v1/audio/transcriptions`).
|
|
22
|
+
*/
|
|
23
|
+
export declare function createTranscribeRoutes(basePath?: string, options?: ServerTranscribeRouteOptions): RouteGroup;
|