@shahwali/archangel 0.0.2 → 0.0.3
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/README.md +1 -1
- package/dist/index.cjs.map +2 -2
- package/dist/index.d.ts +5 -4
- package/dist/index.js.map +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
package/dist/index.cjs.map
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
"sources": ["..\\src\\internal\\binding.ts", "..\\src\\index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"export interface BindingError {\n __archangel_error: string;\n __archangel_error_trace?: string;\n}\n\nexport function isBindingError(result: any): result is BindingError {\n if (result === null || typeof result !== \"object\") {\n return false;\n }\n\n return \"__archangel_error\" in result && typeof result.__archangel_error === \"string\";\n}\n\nexport function throwBindingError(error: BindingError): never {\n throw new Error(error.__archangel_error, {\n cause:\n error.__archangel_error_trace ?? new Error(\"Error trace only available in debug builds.\"),\n });\n}\n\nexport function handleBindingResult<T>(result: any): T {\n if (isBindingError(result)) {\n throwBindingError(result);\n }\n return result as T;\n}\n\ntype BindingFn<TArgs = any, TResult = any> = (args: TArgs) => Promise<TResult>;\n\nexport function createBinding<TArgs, TResult>(windowKey: string): BindingFn<TArgs, TResult> {\n const fn = (window as any)[windowKey];\n\n if (!fn) {\n console.warn(`Backend binding not available: ${windowKey}`);\n }\n\n return async (args: TArgs) => {\n if (!fn) {\n throw new Error(`Backend binding not available: ${windowKey}`);\n }\n\n const result = await fn(args);\n return handleBindingResult(result);\n };\n}\n",
|
|
6
|
-
"import { createBinding } from \"./internal/binding\";\n\ntype InvokeRequest = {\n function: string;\n args: string;\n};\n\nexport type InvokeArgs = Record<string, any>;\n\nconst _invoke = createBinding<InvokeRequest, any>(\"__invoke__\");\n\n/**\n *
|
|
6
|
+
"import { createBinding } from \"./internal/binding\";\n\ntype InvokeRequest = {\n function: string;\n args: string;\n};\n\nexport type InvokeArgs = Record<string, any>;\n\nconst _invoke = createBinding<InvokeRequest, any>(\"__invoke__\");\n\nexport interface InvokeHandlers {}\n\n// Helper type to check if args is empty object, null, undefined, or void\ntype IsEmptyArgs<T> =\n T extends Record<string, never> ? true : T extends null | undefined | void ? true : false;\n\n/**\n * Type-safe invoke method for calling backend functions\n */\nexport async function invoke<K extends keyof InvokeHandlers>(\n functionName: K,\n ...args: IsEmptyArgs<InvokeHandlers[K][\"args\"]> extends true\n ? [args?: InvokeHandlers[K][\"args\"]]\n : [args: InvokeHandlers[K][\"args\"]]\n): Promise<InvokeHandlers[K][\"result\"]>;\n\n// Fallback overload for when InvokeHandlers is empty or for dynamic usage\nexport async function invoke<T = any>(functionName: string, args?: any): Promise<T>;\n\nexport async function invoke(functionName: string, args: any = {}): Promise<any> {\n return _invoke({\n function: functionName,\n args: JSON.stringify(args),\n });\n}\n\ntype Listener<T = any> = (payload: T) => void;\n\nconst listeners = new Map<string, Set<Listener>>();\n\n/**\n * Subscribe to events emitted from the backend\n * @param event - Name of the event to listen for\n * @param cb - Callback function to execute when the event is emitted\n * @returns Unsubscribe function to stop listening to the event\n */\nexport function on<T = any>(event: string, cb: Listener<T>) {\n let set = listeners.get(event);\n if (!set) {\n set = new Set();\n listeners.set(event, set);\n }\n\n set.add(cb);\n\n return () => {\n set!.delete(cb);\n if (set!.size === 0) listeners.delete(event);\n };\n}\n\n/**\n * Subscribe to events emitted from the backend (fires only once)\n * @param event - Name of the event to listen for\n * @param cb - Callback function to execute when the event is emitted\n * @returns Unsubscribe function to stop listening to the event\n */\nexport function once<T = any>(event: string, cb: Listener<T>) {\n const wrappedCallback: Listener<T> = (payload) => {\n cb(payload);\n unsubscribe();\n };\n\n const unsubscribe = on(event, wrappedCallback);\n\n return unsubscribe;\n}\n\nfunction emit<T = any>(event: string, payload: T) {\n const set = listeners.get(event);\n if (!set) return;\n for (const cb of set) cb(payload);\n}\n\nObject.defineProperty(window, \"__emit__\", {\n value: emit,\n writable: false,\n configurable: false,\n});\n\nexport type { InvokeRequest, Listener };\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": ";0kBAKO,SAAS,CAAc,CAAC,EAAqC,CAClE,GAAI,IAAW,MAAQ,OAAO,IAAW,SACvC,MAAO,GAGT,MAAO,sBAAuB,GAAU,OAAO,EAAO,oBAAsB,SAGvE,SAAS,CAAiB,CAAC,EAA4B,CAC5D,MAAU,MAAM,EAAM,kBAAmB,CACvC,MACE,EAAM,yBAA+B,MAAM,6CAA6C,CAC5F,CAAC,EAGI,SAAS,CAAsB,CAAC,EAAgB,CACrD,GAAI,EAAe,CAAM,EACvB,EAAkB,CAAM,EAE1B,OAAO,EAKF,SAAS,CAA6B,CAAC,EAA8C,CAC1F,IAAM,EAAM,OAAe,GAE3B,GAAI,CAAC,EACH,QAAQ,KAAK,kCAAkC,GAAW,EAG5D,MAAO,OAAO,IAAgB,CAC5B,GAAI,CAAC,EACH,MAAU,MAAM,kCAAkC,GAAW,EAG/D,IAAM,EAAS,MAAM,EAAG,CAAI,EAC5B,OAAO,EAAoB,CAAM,GCjCrC,IAAM,EAAU,EAAkC,YAAY,
|
|
8
|
+
"mappings": ";0kBAKO,SAAS,CAAc,CAAC,EAAqC,CAClE,GAAI,IAAW,MAAQ,OAAO,IAAW,SACvC,MAAO,GAGT,MAAO,sBAAuB,GAAU,OAAO,EAAO,oBAAsB,SAGvE,SAAS,CAAiB,CAAC,EAA4B,CAC5D,MAAU,MAAM,EAAM,kBAAmB,CACvC,MACE,EAAM,yBAA+B,MAAM,6CAA6C,CAC5F,CAAC,EAGI,SAAS,CAAsB,CAAC,EAAgB,CACrD,GAAI,EAAe,CAAM,EACvB,EAAkB,CAAM,EAE1B,OAAO,EAKF,SAAS,CAA6B,CAAC,EAA8C,CAC1F,IAAM,EAAM,OAAe,GAE3B,GAAI,CAAC,EACH,QAAQ,KAAK,kCAAkC,GAAW,EAG5D,MAAO,OAAO,IAAgB,CAC5B,GAAI,CAAC,EACH,MAAU,MAAM,kCAAkC,GAAW,EAG/D,IAAM,EAAS,MAAM,EAAG,CAAI,EAC5B,OAAO,EAAoB,CAAM,GCjCrC,IAAM,EAAU,EAAkC,YAAY,EAqB9D,eAAsB,CAAM,CAAC,EAAsB,EAAY,CAAC,EAAiB,CAC/E,OAAO,EAAQ,CACb,SAAU,EACV,KAAM,KAAK,UAAU,CAAI,CAC3B,CAAC,EAKH,IAAM,EAAY,IAAI,IAQf,SAAS,CAAW,CAAC,EAAe,EAAiB,CAC1D,IAAI,EAAM,EAAU,IAAI,CAAK,EAC7B,GAAI,CAAC,EACH,EAAM,IAAI,IACV,EAAU,IAAI,EAAO,CAAG,EAK1B,OAFA,EAAI,IAAI,CAAE,EAEH,IAAM,CAEX,GADA,EAAK,OAAO,CAAE,EACV,EAAK,OAAS,EAAG,EAAU,OAAO,CAAK,GAUxC,SAAS,CAAa,CAAC,EAAe,EAAiB,CAM5D,IAAM,EAAc,EAAG,EALc,CAAC,IAAY,CAChD,EAAG,CAAO,EACV,EAAY,EAG+B,EAE7C,OAAO,EAGT,SAAS,CAAa,CAAC,EAAe,EAAY,CAChD,IAAM,EAAM,EAAU,IAAI,CAAK,EAC/B,GAAI,CAAC,EAAK,OACV,QAAW,KAAM,EAAK,EAAG,CAAO,EAGlC,OAAO,eAAe,OAAQ,WAAY,CACxC,MAAO,EACP,SAAU,GACV,aAAc,EAChB,CAAC",
|
|
9
9
|
"debugId": "A5594DDE138E4E6D64756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -3,12 +3,13 @@ type InvokeRequest = {
|
|
|
3
3
|
args: string;
|
|
4
4
|
};
|
|
5
5
|
export type InvokeArgs = Record<string, any>;
|
|
6
|
+
export interface InvokeHandlers {
|
|
7
|
+
}
|
|
8
|
+
type IsEmptyArgs<T> = T extends Record<string, never> ? true : T extends null | undefined | void ? true : false;
|
|
6
9
|
/**
|
|
7
|
-
*
|
|
8
|
-
* @param functionName - Name of the backend function to call
|
|
9
|
-
* @param args - Arguments to pass to the function
|
|
10
|
-
* @returns Promise resolving to the result
|
|
10
|
+
* Type-safe invoke method for calling backend functions
|
|
11
11
|
*/
|
|
12
|
+
export declare function invoke<K extends keyof InvokeHandlers>(functionName: K, ...args: IsEmptyArgs<InvokeHandlers[K]["args"]> extends true ? [args?: InvokeHandlers[K]["args"]] : [args: InvokeHandlers[K]["args"]]): Promise<InvokeHandlers[K]["result"]>;
|
|
12
13
|
export declare function invoke<T = any>(functionName: string, args?: any): Promise<T>;
|
|
13
14
|
type Listener<T = any> = (payload: T) => void;
|
|
14
15
|
/**
|
package/dist/index.js.map
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
"sources": ["..\\src\\internal\\binding.ts", "..\\src\\index.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
5
|
"export interface BindingError {\n __archangel_error: string;\n __archangel_error_trace?: string;\n}\n\nexport function isBindingError(result: any): result is BindingError {\n if (result === null || typeof result !== \"object\") {\n return false;\n }\n\n return \"__archangel_error\" in result && typeof result.__archangel_error === \"string\";\n}\n\nexport function throwBindingError(error: BindingError): never {\n throw new Error(error.__archangel_error, {\n cause:\n error.__archangel_error_trace ?? new Error(\"Error trace only available in debug builds.\"),\n });\n}\n\nexport function handleBindingResult<T>(result: any): T {\n if (isBindingError(result)) {\n throwBindingError(result);\n }\n return result as T;\n}\n\ntype BindingFn<TArgs = any, TResult = any> = (args: TArgs) => Promise<TResult>;\n\nexport function createBinding<TArgs, TResult>(windowKey: string): BindingFn<TArgs, TResult> {\n const fn = (window as any)[windowKey];\n\n if (!fn) {\n console.warn(`Backend binding not available: ${windowKey}`);\n }\n\n return async (args: TArgs) => {\n if (!fn) {\n throw new Error(`Backend binding not available: ${windowKey}`);\n }\n\n const result = await fn(args);\n return handleBindingResult(result);\n };\n}\n",
|
|
6
|
-
"import { createBinding } from \"./internal/binding\";\n\ntype InvokeRequest = {\n function: string;\n args: string;\n};\n\nexport type InvokeArgs = Record<string, any>;\n\nconst _invoke = createBinding<InvokeRequest, any>(\"__invoke__\");\n\n/**\n *
|
|
6
|
+
"import { createBinding } from \"./internal/binding\";\n\ntype InvokeRequest = {\n function: string;\n args: string;\n};\n\nexport type InvokeArgs = Record<string, any>;\n\nconst _invoke = createBinding<InvokeRequest, any>(\"__invoke__\");\n\nexport interface InvokeHandlers {}\n\n// Helper type to check if args is empty object, null, undefined, or void\ntype IsEmptyArgs<T> =\n T extends Record<string, never> ? true : T extends null | undefined | void ? true : false;\n\n/**\n * Type-safe invoke method for calling backend functions\n */\nexport async function invoke<K extends keyof InvokeHandlers>(\n functionName: K,\n ...args: IsEmptyArgs<InvokeHandlers[K][\"args\"]> extends true\n ? [args?: InvokeHandlers[K][\"args\"]]\n : [args: InvokeHandlers[K][\"args\"]]\n): Promise<InvokeHandlers[K][\"result\"]>;\n\n// Fallback overload for when InvokeHandlers is empty or for dynamic usage\nexport async function invoke<T = any>(functionName: string, args?: any): Promise<T>;\n\nexport async function invoke(functionName: string, args: any = {}): Promise<any> {\n return _invoke({\n function: functionName,\n args: JSON.stringify(args),\n });\n}\n\ntype Listener<T = any> = (payload: T) => void;\n\nconst listeners = new Map<string, Set<Listener>>();\n\n/**\n * Subscribe to events emitted from the backend\n * @param event - Name of the event to listen for\n * @param cb - Callback function to execute when the event is emitted\n * @returns Unsubscribe function to stop listening to the event\n */\nexport function on<T = any>(event: string, cb: Listener<T>) {\n let set = listeners.get(event);\n if (!set) {\n set = new Set();\n listeners.set(event, set);\n }\n\n set.add(cb);\n\n return () => {\n set!.delete(cb);\n if (set!.size === 0) listeners.delete(event);\n };\n}\n\n/**\n * Subscribe to events emitted from the backend (fires only once)\n * @param event - Name of the event to listen for\n * @param cb - Callback function to execute when the event is emitted\n * @returns Unsubscribe function to stop listening to the event\n */\nexport function once<T = any>(event: string, cb: Listener<T>) {\n const wrappedCallback: Listener<T> = (payload) => {\n cb(payload);\n unsubscribe();\n };\n\n const unsubscribe = on(event, wrappedCallback);\n\n return unsubscribe;\n}\n\nfunction emit<T = any>(event: string, payload: T) {\n const set = listeners.get(event);\n if (!set) return;\n for (const cb of set) cb(payload);\n}\n\nObject.defineProperty(window, \"__emit__\", {\n value: emit,\n writable: false,\n configurable: false,\n});\n\nexport type { InvokeRequest, Listener };\n"
|
|
7
7
|
],
|
|
8
|
-
"mappings": ";AAKO,SAAS,CAAc,CAAC,EAAqC,CAClE,GAAI,IAAW,MAAQ,OAAO,IAAW,SACvC,MAAO,GAGT,MAAO,sBAAuB,GAAU,OAAO,EAAO,oBAAsB,SAGvE,SAAS,CAAiB,CAAC,EAA4B,CAC5D,MAAU,MAAM,EAAM,kBAAmB,CACvC,MACE,EAAM,yBAA+B,MAAM,6CAA6C,CAC5F,CAAC,EAGI,SAAS,CAAsB,CAAC,EAAgB,CACrD,GAAI,EAAe,CAAM,EACvB,EAAkB,CAAM,EAE1B,OAAO,EAKF,SAAS,CAA6B,CAAC,EAA8C,CAC1F,IAAM,EAAM,OAAe,GAE3B,GAAI,CAAC,EACH,QAAQ,KAAK,kCAAkC,GAAW,EAG5D,MAAO,OAAO,IAAgB,CAC5B,GAAI,CAAC,EACH,MAAU,MAAM,kCAAkC,GAAW,EAG/D,IAAM,EAAS,MAAM,EAAG,CAAI,EAC5B,OAAO,EAAoB,CAAM,GCjCrC,IAAM,EAAU,EAAkC,YAAY,
|
|
8
|
+
"mappings": ";AAKO,SAAS,CAAc,CAAC,EAAqC,CAClE,GAAI,IAAW,MAAQ,OAAO,IAAW,SACvC,MAAO,GAGT,MAAO,sBAAuB,GAAU,OAAO,EAAO,oBAAsB,SAGvE,SAAS,CAAiB,CAAC,EAA4B,CAC5D,MAAU,MAAM,EAAM,kBAAmB,CACvC,MACE,EAAM,yBAA+B,MAAM,6CAA6C,CAC5F,CAAC,EAGI,SAAS,CAAsB,CAAC,EAAgB,CACrD,GAAI,EAAe,CAAM,EACvB,EAAkB,CAAM,EAE1B,OAAO,EAKF,SAAS,CAA6B,CAAC,EAA8C,CAC1F,IAAM,EAAM,OAAe,GAE3B,GAAI,CAAC,EACH,QAAQ,KAAK,kCAAkC,GAAW,EAG5D,MAAO,OAAO,IAAgB,CAC5B,GAAI,CAAC,EACH,MAAU,MAAM,kCAAkC,GAAW,EAG/D,IAAM,EAAS,MAAM,EAAG,CAAI,EAC5B,OAAO,EAAoB,CAAM,GCjCrC,IAAM,EAAU,EAAkC,YAAY,EAqB9D,eAAsB,CAAM,CAAC,EAAsB,EAAY,CAAC,EAAiB,CAC/E,OAAO,EAAQ,CACb,SAAU,EACV,KAAM,KAAK,UAAU,CAAI,CAC3B,CAAC,EAKH,IAAM,EAAY,IAAI,IAQf,SAAS,CAAW,CAAC,EAAe,EAAiB,CAC1D,IAAI,EAAM,EAAU,IAAI,CAAK,EAC7B,GAAI,CAAC,EACH,EAAM,IAAI,IACV,EAAU,IAAI,EAAO,CAAG,EAK1B,OAFA,EAAI,IAAI,CAAE,EAEH,IAAM,CAEX,GADA,EAAK,OAAO,CAAE,EACV,EAAK,OAAS,EAAG,EAAU,OAAO,CAAK,GAUxC,SAAS,CAAa,CAAC,EAAe,EAAiB,CAM5D,IAAM,EAAc,EAAG,EALc,CAAC,IAAY,CAChD,EAAG,CAAO,EACV,EAAY,EAG+B,EAE7C,OAAO,EAGT,SAAS,CAAa,CAAC,EAAe,EAAY,CAChD,IAAM,EAAM,EAAU,IAAI,CAAK,EAC/B,GAAI,CAAC,EAAK,OACV,QAAW,KAAM,EAAK,EAAG,CAAO,EAGlC,OAAO,eAAe,OAAQ,WAAY,CACxC,MAAO,EACP,SAAU,GACV,aAAc,EAChB,CAAC",
|
|
9
9
|
"debugId": "4D4982FD20E292DC64756E2164756E21",
|
|
10
10
|
"names": []
|
|
11
11
|
}
|