agents
Version:
A home for your AI agents
108 lines (107 loc) • 2.75 kB
TypeScript
//#region src/serializable.d.ts
type SerializablePrimitive = undefined | null | string | number | boolean;
type NonSerializable =
| Function
| symbol
| bigint
| Date
| RegExp
| Map<unknown, unknown>
| Set<unknown>
| WeakMap<object, unknown>
| WeakSet<object>
| Error
| ArrayBuffer
| SharedArrayBuffer
| DataView
| Int8Array
| Uint8Array
| Uint8ClampedArray
| Int16Array
| Uint16Array
| Int32Array
| Uint32Array
| Float32Array
| Float64Array
| BigInt64Array
| BigUint64Array;
type SerializableValue =
| undefined
| null
| string
| number
| boolean
| {
[key: string]: SerializableValue;
}
| SerializableValue[];
type CanSerialize<T, Seen = never> = T extends Seen
? true
: T extends SerializablePrimitive
? true
: T extends NonSerializable
? false
: T extends readonly (infer U)[]
? CanSerialize<U, Seen | T>
: T extends object
? unknown extends T
? true
: { [K in keyof T]: CanSerialize<T[K], Seen | T> } extends {
[K in keyof T]: true;
}
? true
: false
: true;
type CanSerializeReturn<T> = T extends void
? true
: T extends Promise<infer U>
? CanSerialize<U>
: CanSerialize<T>;
type SerializableReturnValue =
| SerializableValue
| void
| Promise<SerializableValue>
| Promise<void>;
type IsSerializableParam<T, Seen = never> = T extends Seen
? true
: T extends SerializablePrimitive
? true
: T extends NonSerializable
? false
: T extends readonly (infer U)[]
? IsSerializableParam<U, Seen | T>
: T extends object
? unknown extends T
? true
: { [K in keyof T]: IsSerializableParam<T[K], Seen | T> } extends {
[K in keyof T]: true;
}
? true
: false
: true;
type AllSerializableValues<A> = A extends [infer First, ...infer Rest]
? IsSerializableParam<First> extends true
? AllSerializableValues<Rest>
: false
: true;
type Method = (...args: any[]) => any;
type IsUnknown<T> = [unknown] extends [T]
? [T] extends [unknown]
? true
: false
: false;
type UnwrapPromise<T> = T extends Promise<infer U> ? U : T;
type RPCMethod<T = Method> = T extends Method
? T extends (...arg: infer A) => infer R
? AllSerializableValues<A> extends true
? CanSerializeReturn<R> extends true
? T
: IsUnknown<UnwrapPromise<R>> extends true
? T
: never
: never
: never
: never;
//#endregion
export { Method, RPCMethod, SerializableReturnValue, SerializableValue };
//# sourceMappingURL=serializable.d.ts.map