import { performOp } from "udf-syscall-ffi";
/**
* Throw an uncatchable error for unimplemented portions of JS builtins.
*
* We want to avoid obscure error messages due to code (i.e. external node modules)
* try / catch-ing errors around JS builtins.
* @param operation
* @param className
*/
export const throwNotImplementedMethodError = (
operation: string,
className: string,
extraMessage?: string,
): never => {
const baseMessage = `Not implemented: ${operation} for ${className}`;
const useNodeSuggestion =
"Consider calling an action defined in Node.js instead (https://docs.convex.dev/functions/actions).";
const message = extraMessage
? `${baseMessage}: ${extraMessage}. ${useNodeSuggestion}`
: `${baseMessage}. ${useNodeSuggestion}`;
return throwUncatchableDeveloperError(message);
};
/**
* Throw an uncatchable error for unimplemented JS builtins.
*
* We want to avoid obscure error messages due to code (i.e. external node modules)
* try / catch-ing errors around JS builtins.
* @param operation
* @param className
*/
export const throwNotImplementedError = (
operation: string,
extraMessage?: string,
): never => {
const baseMessage = `Not implemented ${operation}`;
const useNodeSuggestion =
"Consider calling an action defined in Node.js instead (https://docs.convex.dev/functions/actions).";
const message = extraMessage
? `${baseMessage}: ${extraMessage}. ${useNodeSuggestion}`
: `${baseMessage}. ${useNodeSuggestion}`;
return throwUncatchableDeveloperError(message);
};
export const throwUncatchableDeveloperError = (message: string): never => {
return performOp("throwUncatchableDeveloperError", message) as never;
};
export function requiredArguments(
length: number,
required: number,
prefix: string,
): void {
if (length < required) {
const errMsg = `${prefix ? prefix + ": " : ""}${required} argument${
required === 1 ? "" : "s"
} required, but only ${length} present.`;
throw new TypeError(errMsg);
}
}
export function copyBuffer(input: ArrayBufferView | ArrayBuffer): Uint8Array {
if (ArrayBuffer.isView(input)) {
return new Uint8Array(
input.buffer,
input.byteOffset,
input.byteLength,
).slice();
}
// ArrayBuffer
return new Uint8Array(input, 0, input.byteLength).slice();
}