@nilejs/client 0.0.1 → 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/dist/index.cjs +87 -16
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +47 -12
- package/dist/index.d.ts +47 -12
- package/dist/index.js +84 -15
- package/dist/index.js.map +1 -1
- package/package.json +7 -3
package/dist/index.cjs
CHANGED
|
@@ -20,7 +20,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
20
20
|
// src/index.ts
|
|
21
21
|
var index_exports = {};
|
|
22
22
|
__export(index_exports, {
|
|
23
|
-
|
|
23
|
+
buildFormData: () => buildFormData,
|
|
24
|
+
createNileClient: () => createNileClient,
|
|
25
|
+
sendUploadRequest: () => sendUploadRequest
|
|
24
26
|
});
|
|
25
27
|
module.exports = __toCommonJS(index_exports);
|
|
26
28
|
|
|
@@ -79,14 +81,7 @@ async function sendNileRequest(config, intent, service, action, payload, options
|
|
|
79
81
|
return json;
|
|
80
82
|
});
|
|
81
83
|
if (requestResult.isErr) {
|
|
82
|
-
|
|
83
|
-
let errorMsg = "An unknown error occurred";
|
|
84
|
-
if (error instanceof Error) {
|
|
85
|
-
errorMsg = error.name === "AbortError" ? "Request timed out" : error.message;
|
|
86
|
-
} else {
|
|
87
|
-
errorMsg = String(error);
|
|
88
|
-
}
|
|
89
|
-
return { error: errorMsg, data: null };
|
|
84
|
+
return resolveError(requestResult.error);
|
|
90
85
|
}
|
|
91
86
|
const result = requestResult.value;
|
|
92
87
|
if (!result.status) {
|
|
@@ -94,51 +89,127 @@ async function sendNileRequest(config, intent, service, action, payload, options
|
|
|
94
89
|
}
|
|
95
90
|
return { error: null, data: result.data };
|
|
96
91
|
}
|
|
92
|
+
async function sendUploadRequest(config, service, action, files, fields, options = {}) {
|
|
93
|
+
const { timeout = config.timeout ?? 3e4, ...fetchOptions } = options;
|
|
94
|
+
const controller = new AbortController();
|
|
95
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
96
|
+
const formData = buildFormData(service, action, files, fields);
|
|
97
|
+
const requestResult = await safeTry(async () => {
|
|
98
|
+
const { "Content-Type": _ct, ...safeHeaders } = config.headers ?? {};
|
|
99
|
+
const { "Content-Type": _ct2, ...safeFetchHeaders } = fetchOptions.headers ?? {};
|
|
100
|
+
const response = await fetch(`${config.baseUrl}/services`, {
|
|
101
|
+
method: "POST",
|
|
102
|
+
headers: {
|
|
103
|
+
...safeHeaders,
|
|
104
|
+
...safeFetchHeaders
|
|
105
|
+
},
|
|
106
|
+
credentials: config.credentials,
|
|
107
|
+
body: formData,
|
|
108
|
+
signal: controller.signal,
|
|
109
|
+
...fetchOptions
|
|
110
|
+
});
|
|
111
|
+
clearTimeout(timeoutId);
|
|
112
|
+
const json = await response.json();
|
|
113
|
+
return json;
|
|
114
|
+
});
|
|
115
|
+
if (requestResult.isErr) {
|
|
116
|
+
return resolveError(requestResult.error);
|
|
117
|
+
}
|
|
118
|
+
const result = requestResult.value;
|
|
119
|
+
if (!result.status) {
|
|
120
|
+
return { error: result.message, data: result.data };
|
|
121
|
+
}
|
|
122
|
+
return { error: null, data: result.data };
|
|
123
|
+
}
|
|
124
|
+
function buildFormData(service, action, files, fields) {
|
|
125
|
+
const formData = new FormData();
|
|
126
|
+
formData.append("intent", "execute");
|
|
127
|
+
formData.append("service", service);
|
|
128
|
+
formData.append("action", action);
|
|
129
|
+
if (fields) {
|
|
130
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
131
|
+
formData.append(key, value);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
for (const [key, value] of Object.entries(files)) {
|
|
135
|
+
if (Array.isArray(value)) {
|
|
136
|
+
for (const file of value) {
|
|
137
|
+
formData.append(key, file);
|
|
138
|
+
}
|
|
139
|
+
} else {
|
|
140
|
+
formData.append(key, value);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return formData;
|
|
144
|
+
}
|
|
145
|
+
function resolveError(error) {
|
|
146
|
+
let errorMsg = "An unknown error occurred";
|
|
147
|
+
if (error instanceof Error) {
|
|
148
|
+
errorMsg = error.name === "AbortError" ? "Request timed out" : error.message;
|
|
149
|
+
} else {
|
|
150
|
+
errorMsg = String(error);
|
|
151
|
+
}
|
|
152
|
+
return { error: errorMsg, data: null };
|
|
153
|
+
}
|
|
97
154
|
|
|
98
155
|
// src/create-client.ts
|
|
99
156
|
function createNileClient(config) {
|
|
100
157
|
return {
|
|
101
158
|
/** Invoke a service action through the backend engine pipeline */
|
|
102
159
|
invoke: async (params) => {
|
|
103
|
-
const { service, action, payload,
|
|
160
|
+
const { service, action, payload, fetchOptions } = params;
|
|
104
161
|
const result = await sendNileRequest(
|
|
105
162
|
config,
|
|
106
163
|
"execute",
|
|
107
164
|
service,
|
|
108
165
|
action,
|
|
109
166
|
payload,
|
|
110
|
-
|
|
167
|
+
fetchOptions
|
|
111
168
|
);
|
|
112
169
|
return result;
|
|
113
170
|
},
|
|
114
171
|
/** Discover available services and actions (supports "*" wildcard) */
|
|
115
172
|
explore: async (params) => {
|
|
116
|
-
const { service, action,
|
|
173
|
+
const { service, action, fetchOptions } = params;
|
|
117
174
|
return await sendNileRequest(
|
|
118
175
|
config,
|
|
119
176
|
"explore",
|
|
120
177
|
service,
|
|
121
178
|
action,
|
|
122
179
|
{},
|
|
123
|
-
|
|
180
|
+
fetchOptions
|
|
124
181
|
);
|
|
125
182
|
},
|
|
126
183
|
/** Get action schemas as JSON Schema (supports "*" wildcard) */
|
|
127
184
|
schema: async (params) => {
|
|
128
|
-
const { service, action,
|
|
185
|
+
const { service, action, fetchOptions } = params;
|
|
129
186
|
return await sendNileRequest(
|
|
130
187
|
config,
|
|
131
188
|
"schema",
|
|
132
189
|
service,
|
|
133
190
|
action,
|
|
134
191
|
{},
|
|
135
|
-
|
|
192
|
+
fetchOptions
|
|
193
|
+
);
|
|
194
|
+
},
|
|
195
|
+
/** Upload files to an action via multipart form-data */
|
|
196
|
+
upload: async (params) => {
|
|
197
|
+
const { service, action, files, fields, fetchOptions } = params;
|
|
198
|
+
return await sendUploadRequest(
|
|
199
|
+
config,
|
|
200
|
+
service,
|
|
201
|
+
action,
|
|
202
|
+
files,
|
|
203
|
+
fields,
|
|
204
|
+
fetchOptions
|
|
136
205
|
);
|
|
137
206
|
}
|
|
138
207
|
};
|
|
139
208
|
}
|
|
140
209
|
// Annotate the CommonJS export names for ESM import in node:
|
|
141
210
|
0 && (module.exports = {
|
|
142
|
-
|
|
211
|
+
buildFormData,
|
|
212
|
+
createNileClient,
|
|
213
|
+
sendUploadRequest
|
|
143
214
|
});
|
|
144
215
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/safe-try.ts","../src/request.ts","../src/create-client.ts"],"sourcesContent":["export { createNileClient } from \"./create-client.js\";\nexport type * from \"./types.js\";\n","/**\n * Internal result type for safeTry\n */\nexport type SafeResult<T, E = unknown> =\n | { isOk: true; value: T; isErr: false; error: null }\n | { isOk: false; value: null; isErr: true; error: E };\n\n/**\n * Gracefully handles both synchronous and asynchronous operations by returning a result object.\n * This replaces the need for external slang-ts dependency and avoids try/catch boilerplate.\n *\n * @param fn - The function to execute (sync or async)\n * @returns A result object containing either the value or the error\n *\n * @example\n * const { isOk, value, error } = await safeTry(() => fetch(url));\n */\nexport function safeTry<T>(\n fn: () => T | Promise<T>\n): Promise<SafeResult<T>> | SafeResult<T> {\n try {\n const result = fn();\n\n if (result instanceof Promise) {\n return result\n .then(\n (value): SafeResult<T> => ({\n isOk: true,\n value,\n isErr: false,\n error: null,\n })\n )\n .catch(\n (error): SafeResult<T> => ({\n isOk: false,\n value: null,\n isErr: true,\n error,\n })\n );\n }\n\n return { isOk: true, value: result, isErr: false, error: null };\n } catch (error) {\n return { isOk: false, value: null, isErr: true, error };\n }\n}\n","import { safeTry } from \"./safe-try.js\";\nimport type {\n ClientResult,\n ExternalResponse,\n FetchOptions,\n NileClientConfig,\n} from \"./types.js\";\n\n/**\n * Handles communication with the Nile /services endpoint.\n * Uses fetch + safeTry for crash safety and consistent { error, data } results.\n */\nexport async function sendNileRequest<T = Record<string, unknown>>(\n config: NileClientConfig,\n intent: \"explore\" | \"execute\" | \"schema\",\n service: string,\n action: string,\n payload: unknown,\n options: FetchOptions = {}\n): Promise<ClientResult<T>> {\n const { timeout = config.timeout ?? 30_000, ...fetchOptions } = options;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const requestResult = await safeTry(async () => {\n const response = await fetch(`${config.baseUrl}/services`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...config.headers,\n ...(fetchOptions.headers as Record<string, string>),\n },\n credentials: config.credentials,\n body: JSON.stringify({\n intent,\n service,\n action,\n payload: payload ?? {},\n }),\n signal: controller.signal,\n ...fetchOptions,\n });\n\n clearTimeout(timeoutId);\n\n const json = (await response.json()) as ExternalResponse<T>;\n return json;\n });\n\n if (requestResult.isErr) {\n const error: unknown = requestResult.error;\n let errorMsg = \"An unknown error occurred\";\n\n if (error instanceof Error) {\n errorMsg =\n error.name === \"AbortError\" ? \"Request timed out\" : error.message;\n } else {\n errorMsg = String(error);\n }\n\n return { error: errorMsg, data: null };\n }\n\n const result = requestResult.value;\n\n if (!result.status) {\n return { error: result.message, data: result.data };\n }\n\n return { error: null, data: result.data };\n}\n","import { sendNileRequest } from \"./request.js\";\nimport type {\n ClientResult,\n FetchOptions,\n NileClient,\n NileClientConfig,\n} from \"./types.js\";\n\n/**\n * Creates a type-safe Nile client for interacting with backend services.\n *\n * @param config - The client configuration including baseUrl\n * @returns A factory object with execute, explore, and schema methods\n *\n * @example\n * const nile = createNileClient<ServicePayloads>({ baseUrl: \"/api\" });\n * const { error, data } = await nile.invoke({\n * service: \"tasks\",\n * action: \"create\",\n * payload: { title: \"Buy milk\" }\n * });\n */\nexport function createNileClient<\n TPayloads = Record<string, Record<string, unknown>>,\n>(config: NileClientConfig): NileClient<TPayloads> {\n return {\n /** Invoke a service action through the backend engine pipeline */\n invoke: async <\n S extends keyof TPayloads & string,\n A extends keyof TPayloads[S] & string,\n >(\n params: { service: S; action: A; payload: TPayloads[S][A] } & FetchOptions\n ) => {\n const { service, action, payload, ...options } = params;\n const result = await sendNileRequest<Record<string, unknown>>(\n config,\n \"execute\",\n service,\n action,\n payload,\n options\n );\n return result as ClientResult;\n },\n\n /** Discover available services and actions (supports \"*\" wildcard) */\n explore: async (\n params: { service: string; action: string } & FetchOptions\n ) => {\n const { service, action, ...options } = params;\n return await sendNileRequest(\n config,\n \"explore\",\n service,\n action,\n {},\n options\n );\n },\n\n /** Get action schemas as JSON Schema (supports \"*\" wildcard) */\n schema: async (\n params: { service: string; action: string } & FetchOptions\n ) => {\n const { service, action, ...options } = params;\n return await sendNileRequest(\n config,\n \"schema\",\n service,\n action,\n {},\n options\n );\n },\n };\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/safe-try.ts","../src/request.ts","../src/create-client.ts"],"sourcesContent":["export { createNileClient } from \"./create-client.js\";\nexport { buildFormData, sendUploadRequest } from \"./request.js\";\nexport type * from \"./types.js\";\n","/**\n * Internal result type for safeTry\n */\nexport type SafeResult<T, E = unknown> =\n | { isOk: true; value: T; isErr: false; error: null }\n | { isOk: false; value: null; isErr: true; error: E };\n\n/**\n * Gracefully handles both synchronous and asynchronous operations by returning a result object.\n * This replaces the need for external slang-ts dependency and avoids try/catch boilerplate.\n *\n * @param fn - The function to execute (sync or async)\n * @returns A result object containing either the value or the error\n *\n * @example\n * const { isOk, value, error } = await safeTry(() => fetch(url));\n */\nexport function safeTry<T>(\n fn: () => T | Promise<T>\n): Promise<SafeResult<T>> | SafeResult<T> {\n try {\n const result = fn();\n\n if (result instanceof Promise) {\n return result\n .then(\n (value): SafeResult<T> => ({\n isOk: true,\n value,\n isErr: false,\n error: null,\n })\n )\n .catch(\n (error): SafeResult<T> => ({\n isOk: false,\n value: null,\n isErr: true,\n error,\n })\n );\n }\n\n return { isOk: true, value: result, isErr: false, error: null };\n } catch (error) {\n return { isOk: false, value: null, isErr: true, error };\n }\n}\n","import { safeTry } from \"./safe-try.js\";\nimport type {\n ClientResult,\n ExternalResponse,\n FetchOptions,\n NileClientConfig,\n} from \"./types.js\";\n\n/**\n * Handles JSON communication with the Nile /services endpoint.\n * Uses fetch + safeTry for crash safety and consistent { error, data } results.\n */\nexport async function sendNileRequest<T = Record<string, unknown>>(\n config: NileClientConfig,\n intent: \"explore\" | \"execute\" | \"schema\",\n service: string,\n action: string,\n payload: unknown,\n options: FetchOptions = {}\n): Promise<ClientResult<T>> {\n const { timeout = config.timeout ?? 30_000, ...fetchOptions } = options;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const requestResult = await safeTry(async () => {\n const response = await fetch(`${config.baseUrl}/services`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...config.headers,\n ...(fetchOptions.headers as Record<string, string>),\n },\n credentials: config.credentials,\n body: JSON.stringify({\n intent,\n service,\n action,\n payload: payload ?? {},\n }),\n signal: controller.signal,\n ...fetchOptions,\n });\n\n clearTimeout(timeoutId);\n\n const json = (await response.json()) as ExternalResponse<T>;\n return json;\n });\n\n if (requestResult.isErr) {\n return resolveError(requestResult.error);\n }\n\n const result = requestResult.value;\n\n if (!result.status) {\n return { error: result.message, data: result.data };\n }\n\n return { error: null, data: result.data };\n}\n\n/**\n * Handles multipart form-data uploads to the Nile /services endpoint.\n * Builds a FormData body with RPC routing fields (intent, service, action),\n * user-provided fields, and file attachments.\n *\n * Content-Type header is intentionally omitted so the runtime sets the\n * correct multipart boundary automatically.\n */\nexport async function sendUploadRequest<T = Record<string, unknown>>(\n config: NileClientConfig,\n service: string,\n action: string,\n files: Record<string, File | File[]>,\n fields?: Record<string, string>,\n options: FetchOptions = {}\n): Promise<ClientResult<T>> {\n const { timeout = config.timeout ?? 30_000, ...fetchOptions } = options;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const formData = buildFormData(service, action, files, fields);\n\n const requestResult = await safeTry(async () => {\n // Spread config.headers but strip Content-Type — let the runtime set multipart boundary\n const { \"Content-Type\": _ct, ...safeHeaders } = config.headers ?? {};\n const { \"Content-Type\": _ct2, ...safeFetchHeaders } =\n (fetchOptions.headers as Record<string, string>) ?? {};\n\n const response = await fetch(`${config.baseUrl}/services`, {\n method: \"POST\",\n headers: {\n ...safeHeaders,\n ...safeFetchHeaders,\n },\n credentials: config.credentials,\n body: formData,\n signal: controller.signal,\n ...fetchOptions,\n });\n\n clearTimeout(timeoutId);\n\n const json = (await response.json()) as ExternalResponse<T>;\n return json;\n });\n\n if (requestResult.isErr) {\n return resolveError(requestResult.error);\n }\n\n const result = requestResult.value;\n\n if (!result.status) {\n return { error: result.message, data: result.data };\n }\n\n return { error: null, data: result.data };\n}\n\n/**\n * Builds a FormData instance with RPC routing fields and file/field entries.\n * The server expects 'intent', 'service', 'action' as string fields.\n */\nexport function buildFormData(\n service: string,\n action: string,\n files: Record<string, File | File[]>,\n fields?: Record<string, string>\n): FormData {\n const formData = new FormData();\n\n // RPC routing fields the server expects\n formData.append(\"intent\", \"execute\");\n formData.append(\"service\", service);\n formData.append(\"action\", action);\n\n // User-provided string fields\n if (fields) {\n for (const [key, value] of Object.entries(fields)) {\n formData.append(key, value);\n }\n }\n\n // File attachments — arrays append multiple entries under the same key\n for (const [key, value] of Object.entries(files)) {\n if (Array.isArray(value)) {\n for (const file of value) {\n formData.append(key, file);\n }\n } else {\n formData.append(key, value);\n }\n }\n\n return formData;\n}\n\n/** Resolve error from safeTry into a ClientResult */\nfunction resolveError<T>(error: unknown): ClientResult<T> {\n let errorMsg = \"An unknown error occurred\";\n\n if (error instanceof Error) {\n errorMsg =\n error.name === \"AbortError\" ? \"Request timed out\" : error.message;\n } else {\n errorMsg = String(error);\n }\n\n return { error: errorMsg, data: null };\n}\n","import { sendNileRequest, sendUploadRequest } from \"./request.js\";\nimport type {\n ClientResult,\n NileClient,\n NileClientConfig,\n UploadParams,\n} from \"./types.js\";\n\n/**\n * Creates a type-safe Nile client for interacting with backend services.\n *\n * @param config - The client configuration including baseUrl\n * @returns A factory object with invoke, explore, schema, and upload methods\n *\n * @example\n * const nile = createNileClient<ServicePayloads>({ baseUrl: \"/api\" });\n * const { error, data } = await nile.invoke({\n * service: \"tasks\",\n * action: \"create\",\n * payload: { title: \"Buy milk\" }\n * });\n */\nexport function createNileClient<\n TPayloads = Record<string, Record<string, unknown>>,\n>(config: NileClientConfig): NileClient<TPayloads> {\n return {\n /** Invoke a service action through the backend engine pipeline */\n invoke: async <\n S extends keyof TPayloads & string,\n A extends keyof TPayloads[S] & string,\n >(\n params: {\n service: S;\n action: A;\n payload: TPayloads[S][A];\n fetchOptions?: Parameters<typeof sendNileRequest>[5];\n }\n ) => {\n const { service, action, payload, fetchOptions } = params;\n const result = await sendNileRequest<Record<string, unknown>>(\n config,\n \"execute\",\n service,\n action,\n payload,\n fetchOptions\n );\n return result as ClientResult;\n },\n\n /** Discover available services and actions (supports \"*\" wildcard) */\n explore: async (params) => {\n const { service, action, fetchOptions } = params;\n return await sendNileRequest(\n config,\n \"explore\",\n service,\n action,\n {},\n fetchOptions\n );\n },\n\n /** Get action schemas as JSON Schema (supports \"*\" wildcard) */\n schema: async (params) => {\n const { service, action, fetchOptions } = params;\n return await sendNileRequest(\n config,\n \"schema\",\n service,\n action,\n {},\n fetchOptions\n );\n },\n\n /** Upload files to an action via multipart form-data */\n upload: async (params: UploadParams) => {\n const { service, action, files, fields, fetchOptions } = params;\n return await sendUploadRequest(\n config,\n service,\n action,\n files,\n fields,\n fetchOptions\n );\n },\n };\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -23,10 +23,33 @@ interface NileClientConfig {
|
|
|
23
23
|
/** Optional timeout in ms (default: 30000) */
|
|
24
24
|
timeout?: number;
|
|
25
25
|
}
|
|
26
|
-
/** Options for individual fetch calls */
|
|
26
|
+
/** Options for individual fetch calls (body and method are managed internally) */
|
|
27
27
|
interface FetchOptions extends Omit<RequestInit, "body" | "method"> {
|
|
28
28
|
timeout?: number;
|
|
29
29
|
}
|
|
30
|
+
/** Parameters for invoke (execute intent) */
|
|
31
|
+
interface InvokeParams<TPayloads = Record<string, Record<string, unknown>>, S extends keyof TPayloads & string = keyof TPayloads & string, A extends keyof TPayloads[S] & string = keyof TPayloads[S] & string> {
|
|
32
|
+
service: S;
|
|
33
|
+
action: A;
|
|
34
|
+
payload: TPayloads[S][A];
|
|
35
|
+
fetchOptions?: FetchOptions;
|
|
36
|
+
}
|
|
37
|
+
/** Parameters for explore and schema intents */
|
|
38
|
+
interface DiscoveryParams {
|
|
39
|
+
service: string;
|
|
40
|
+
action: string;
|
|
41
|
+
fetchOptions?: FetchOptions;
|
|
42
|
+
}
|
|
43
|
+
/** Parameters for upload (multipart form-data execute) */
|
|
44
|
+
interface UploadParams {
|
|
45
|
+
service: string;
|
|
46
|
+
action: string;
|
|
47
|
+
/** Files to upload — keyed by field name */
|
|
48
|
+
files: Record<string, File | File[]>;
|
|
49
|
+
/** Additional string fields to include in the form data */
|
|
50
|
+
fields?: Record<string, string>;
|
|
51
|
+
fetchOptions?: FetchOptions;
|
|
52
|
+
}
|
|
30
53
|
/** Interface for the typed client */
|
|
31
54
|
interface NileClient<TPayloads = Record<string, Record<string, unknown>>> {
|
|
32
55
|
/** Invoke an action with full type-safety for payload */
|
|
@@ -34,24 +57,21 @@ interface NileClient<TPayloads = Record<string, Record<string, unknown>>> {
|
|
|
34
57
|
service: S;
|
|
35
58
|
action: A;
|
|
36
59
|
payload: TPayloads[S][A];
|
|
37
|
-
|
|
60
|
+
fetchOptions?: FetchOptions;
|
|
61
|
+
}) => Promise<ClientResult>;
|
|
38
62
|
/** Discover services/actions (supports "*" wildcard) */
|
|
39
|
-
explore: (params:
|
|
40
|
-
service: string;
|
|
41
|
-
action: string;
|
|
42
|
-
} & FetchOptions) => Promise<ClientResult>;
|
|
63
|
+
explore: (params: DiscoveryParams) => Promise<ClientResult>;
|
|
43
64
|
/** Get action schemas as JSON Schema (supports "*" wildcard) */
|
|
44
|
-
schema: (params:
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
} & FetchOptions) => Promise<ClientResult>;
|
|
65
|
+
schema: (params: DiscoveryParams) => Promise<ClientResult>;
|
|
66
|
+
/** Upload files to an action via multipart form-data */
|
|
67
|
+
upload: (params: UploadParams) => Promise<ClientResult>;
|
|
48
68
|
}
|
|
49
69
|
|
|
50
70
|
/**
|
|
51
71
|
* Creates a type-safe Nile client for interacting with backend services.
|
|
52
72
|
*
|
|
53
73
|
* @param config - The client configuration including baseUrl
|
|
54
|
-
* @returns A factory object with
|
|
74
|
+
* @returns A factory object with invoke, explore, schema, and upload methods
|
|
55
75
|
*
|
|
56
76
|
* @example
|
|
57
77
|
* const nile = createNileClient<ServicePayloads>({ baseUrl: "/api" });
|
|
@@ -63,4 +83,19 @@ interface NileClient<TPayloads = Record<string, Record<string, unknown>>> {
|
|
|
63
83
|
*/
|
|
64
84
|
declare function createNileClient<TPayloads = Record<string, Record<string, unknown>>>(config: NileClientConfig): NileClient<TPayloads>;
|
|
65
85
|
|
|
66
|
-
|
|
86
|
+
/**
|
|
87
|
+
* Handles multipart form-data uploads to the Nile /services endpoint.
|
|
88
|
+
* Builds a FormData body with RPC routing fields (intent, service, action),
|
|
89
|
+
* user-provided fields, and file attachments.
|
|
90
|
+
*
|
|
91
|
+
* Content-Type header is intentionally omitted so the runtime sets the
|
|
92
|
+
* correct multipart boundary automatically.
|
|
93
|
+
*/
|
|
94
|
+
declare function sendUploadRequest<T = Record<string, unknown>>(config: NileClientConfig, service: string, action: string, files: Record<string, File | File[]>, fields?: Record<string, string>, options?: FetchOptions): Promise<ClientResult<T>>;
|
|
95
|
+
/**
|
|
96
|
+
* Builds a FormData instance with RPC routing fields and file/field entries.
|
|
97
|
+
* The server expects 'intent', 'service', 'action' as string fields.
|
|
98
|
+
*/
|
|
99
|
+
declare function buildFormData(service: string, action: string, files: Record<string, File | File[]>, fields?: Record<string, string>): FormData;
|
|
100
|
+
|
|
101
|
+
export { type ClientResult, type DiscoveryParams, type ExternalResponse, type FetchOptions, type InvokeParams, type NileClient, type NileClientConfig, type NileIntentParams, type UploadParams, buildFormData, createNileClient, sendUploadRequest };
|
package/dist/index.d.ts
CHANGED
|
@@ -23,10 +23,33 @@ interface NileClientConfig {
|
|
|
23
23
|
/** Optional timeout in ms (default: 30000) */
|
|
24
24
|
timeout?: number;
|
|
25
25
|
}
|
|
26
|
-
/** Options for individual fetch calls */
|
|
26
|
+
/** Options for individual fetch calls (body and method are managed internally) */
|
|
27
27
|
interface FetchOptions extends Omit<RequestInit, "body" | "method"> {
|
|
28
28
|
timeout?: number;
|
|
29
29
|
}
|
|
30
|
+
/** Parameters for invoke (execute intent) */
|
|
31
|
+
interface InvokeParams<TPayloads = Record<string, Record<string, unknown>>, S extends keyof TPayloads & string = keyof TPayloads & string, A extends keyof TPayloads[S] & string = keyof TPayloads[S] & string> {
|
|
32
|
+
service: S;
|
|
33
|
+
action: A;
|
|
34
|
+
payload: TPayloads[S][A];
|
|
35
|
+
fetchOptions?: FetchOptions;
|
|
36
|
+
}
|
|
37
|
+
/** Parameters for explore and schema intents */
|
|
38
|
+
interface DiscoveryParams {
|
|
39
|
+
service: string;
|
|
40
|
+
action: string;
|
|
41
|
+
fetchOptions?: FetchOptions;
|
|
42
|
+
}
|
|
43
|
+
/** Parameters for upload (multipart form-data execute) */
|
|
44
|
+
interface UploadParams {
|
|
45
|
+
service: string;
|
|
46
|
+
action: string;
|
|
47
|
+
/** Files to upload — keyed by field name */
|
|
48
|
+
files: Record<string, File | File[]>;
|
|
49
|
+
/** Additional string fields to include in the form data */
|
|
50
|
+
fields?: Record<string, string>;
|
|
51
|
+
fetchOptions?: FetchOptions;
|
|
52
|
+
}
|
|
30
53
|
/** Interface for the typed client */
|
|
31
54
|
interface NileClient<TPayloads = Record<string, Record<string, unknown>>> {
|
|
32
55
|
/** Invoke an action with full type-safety for payload */
|
|
@@ -34,24 +57,21 @@ interface NileClient<TPayloads = Record<string, Record<string, unknown>>> {
|
|
|
34
57
|
service: S;
|
|
35
58
|
action: A;
|
|
36
59
|
payload: TPayloads[S][A];
|
|
37
|
-
|
|
60
|
+
fetchOptions?: FetchOptions;
|
|
61
|
+
}) => Promise<ClientResult>;
|
|
38
62
|
/** Discover services/actions (supports "*" wildcard) */
|
|
39
|
-
explore: (params:
|
|
40
|
-
service: string;
|
|
41
|
-
action: string;
|
|
42
|
-
} & FetchOptions) => Promise<ClientResult>;
|
|
63
|
+
explore: (params: DiscoveryParams) => Promise<ClientResult>;
|
|
43
64
|
/** Get action schemas as JSON Schema (supports "*" wildcard) */
|
|
44
|
-
schema: (params:
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
} & FetchOptions) => Promise<ClientResult>;
|
|
65
|
+
schema: (params: DiscoveryParams) => Promise<ClientResult>;
|
|
66
|
+
/** Upload files to an action via multipart form-data */
|
|
67
|
+
upload: (params: UploadParams) => Promise<ClientResult>;
|
|
48
68
|
}
|
|
49
69
|
|
|
50
70
|
/**
|
|
51
71
|
* Creates a type-safe Nile client for interacting with backend services.
|
|
52
72
|
*
|
|
53
73
|
* @param config - The client configuration including baseUrl
|
|
54
|
-
* @returns A factory object with
|
|
74
|
+
* @returns A factory object with invoke, explore, schema, and upload methods
|
|
55
75
|
*
|
|
56
76
|
* @example
|
|
57
77
|
* const nile = createNileClient<ServicePayloads>({ baseUrl: "/api" });
|
|
@@ -63,4 +83,19 @@ interface NileClient<TPayloads = Record<string, Record<string, unknown>>> {
|
|
|
63
83
|
*/
|
|
64
84
|
declare function createNileClient<TPayloads = Record<string, Record<string, unknown>>>(config: NileClientConfig): NileClient<TPayloads>;
|
|
65
85
|
|
|
66
|
-
|
|
86
|
+
/**
|
|
87
|
+
* Handles multipart form-data uploads to the Nile /services endpoint.
|
|
88
|
+
* Builds a FormData body with RPC routing fields (intent, service, action),
|
|
89
|
+
* user-provided fields, and file attachments.
|
|
90
|
+
*
|
|
91
|
+
* Content-Type header is intentionally omitted so the runtime sets the
|
|
92
|
+
* correct multipart boundary automatically.
|
|
93
|
+
*/
|
|
94
|
+
declare function sendUploadRequest<T = Record<string, unknown>>(config: NileClientConfig, service: string, action: string, files: Record<string, File | File[]>, fields?: Record<string, string>, options?: FetchOptions): Promise<ClientResult<T>>;
|
|
95
|
+
/**
|
|
96
|
+
* Builds a FormData instance with RPC routing fields and file/field entries.
|
|
97
|
+
* The server expects 'intent', 'service', 'action' as string fields.
|
|
98
|
+
*/
|
|
99
|
+
declare function buildFormData(service: string, action: string, files: Record<string, File | File[]>, fields?: Record<string, string>): FormData;
|
|
100
|
+
|
|
101
|
+
export { type ClientResult, type DiscoveryParams, type ExternalResponse, type FetchOptions, type InvokeParams, type NileClient, type NileClientConfig, type NileIntentParams, type UploadParams, buildFormData, createNileClient, sendUploadRequest };
|
package/dist/index.js
CHANGED
|
@@ -53,14 +53,7 @@ async function sendNileRequest(config, intent, service, action, payload, options
|
|
|
53
53
|
return json;
|
|
54
54
|
});
|
|
55
55
|
if (requestResult.isErr) {
|
|
56
|
-
|
|
57
|
-
let errorMsg = "An unknown error occurred";
|
|
58
|
-
if (error instanceof Error) {
|
|
59
|
-
errorMsg = error.name === "AbortError" ? "Request timed out" : error.message;
|
|
60
|
-
} else {
|
|
61
|
-
errorMsg = String(error);
|
|
62
|
-
}
|
|
63
|
-
return { error: errorMsg, data: null };
|
|
56
|
+
return resolveError(requestResult.error);
|
|
64
57
|
}
|
|
65
58
|
const result = requestResult.value;
|
|
66
59
|
if (!result.status) {
|
|
@@ -68,50 +61,126 @@ async function sendNileRequest(config, intent, service, action, payload, options
|
|
|
68
61
|
}
|
|
69
62
|
return { error: null, data: result.data };
|
|
70
63
|
}
|
|
64
|
+
async function sendUploadRequest(config, service, action, files, fields, options = {}) {
|
|
65
|
+
const { timeout = config.timeout ?? 3e4, ...fetchOptions } = options;
|
|
66
|
+
const controller = new AbortController();
|
|
67
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
68
|
+
const formData = buildFormData(service, action, files, fields);
|
|
69
|
+
const requestResult = await safeTry(async () => {
|
|
70
|
+
const { "Content-Type": _ct, ...safeHeaders } = config.headers ?? {};
|
|
71
|
+
const { "Content-Type": _ct2, ...safeFetchHeaders } = fetchOptions.headers ?? {};
|
|
72
|
+
const response = await fetch(`${config.baseUrl}/services`, {
|
|
73
|
+
method: "POST",
|
|
74
|
+
headers: {
|
|
75
|
+
...safeHeaders,
|
|
76
|
+
...safeFetchHeaders
|
|
77
|
+
},
|
|
78
|
+
credentials: config.credentials,
|
|
79
|
+
body: formData,
|
|
80
|
+
signal: controller.signal,
|
|
81
|
+
...fetchOptions
|
|
82
|
+
});
|
|
83
|
+
clearTimeout(timeoutId);
|
|
84
|
+
const json = await response.json();
|
|
85
|
+
return json;
|
|
86
|
+
});
|
|
87
|
+
if (requestResult.isErr) {
|
|
88
|
+
return resolveError(requestResult.error);
|
|
89
|
+
}
|
|
90
|
+
const result = requestResult.value;
|
|
91
|
+
if (!result.status) {
|
|
92
|
+
return { error: result.message, data: result.data };
|
|
93
|
+
}
|
|
94
|
+
return { error: null, data: result.data };
|
|
95
|
+
}
|
|
96
|
+
function buildFormData(service, action, files, fields) {
|
|
97
|
+
const formData = new FormData();
|
|
98
|
+
formData.append("intent", "execute");
|
|
99
|
+
formData.append("service", service);
|
|
100
|
+
formData.append("action", action);
|
|
101
|
+
if (fields) {
|
|
102
|
+
for (const [key, value] of Object.entries(fields)) {
|
|
103
|
+
formData.append(key, value);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
for (const [key, value] of Object.entries(files)) {
|
|
107
|
+
if (Array.isArray(value)) {
|
|
108
|
+
for (const file of value) {
|
|
109
|
+
formData.append(key, file);
|
|
110
|
+
}
|
|
111
|
+
} else {
|
|
112
|
+
formData.append(key, value);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return formData;
|
|
116
|
+
}
|
|
117
|
+
function resolveError(error) {
|
|
118
|
+
let errorMsg = "An unknown error occurred";
|
|
119
|
+
if (error instanceof Error) {
|
|
120
|
+
errorMsg = error.name === "AbortError" ? "Request timed out" : error.message;
|
|
121
|
+
} else {
|
|
122
|
+
errorMsg = String(error);
|
|
123
|
+
}
|
|
124
|
+
return { error: errorMsg, data: null };
|
|
125
|
+
}
|
|
71
126
|
|
|
72
127
|
// src/create-client.ts
|
|
73
128
|
function createNileClient(config) {
|
|
74
129
|
return {
|
|
75
130
|
/** Invoke a service action through the backend engine pipeline */
|
|
76
131
|
invoke: async (params) => {
|
|
77
|
-
const { service, action, payload,
|
|
132
|
+
const { service, action, payload, fetchOptions } = params;
|
|
78
133
|
const result = await sendNileRequest(
|
|
79
134
|
config,
|
|
80
135
|
"execute",
|
|
81
136
|
service,
|
|
82
137
|
action,
|
|
83
138
|
payload,
|
|
84
|
-
|
|
139
|
+
fetchOptions
|
|
85
140
|
);
|
|
86
141
|
return result;
|
|
87
142
|
},
|
|
88
143
|
/** Discover available services and actions (supports "*" wildcard) */
|
|
89
144
|
explore: async (params) => {
|
|
90
|
-
const { service, action,
|
|
145
|
+
const { service, action, fetchOptions } = params;
|
|
91
146
|
return await sendNileRequest(
|
|
92
147
|
config,
|
|
93
148
|
"explore",
|
|
94
149
|
service,
|
|
95
150
|
action,
|
|
96
151
|
{},
|
|
97
|
-
|
|
152
|
+
fetchOptions
|
|
98
153
|
);
|
|
99
154
|
},
|
|
100
155
|
/** Get action schemas as JSON Schema (supports "*" wildcard) */
|
|
101
156
|
schema: async (params) => {
|
|
102
|
-
const { service, action,
|
|
157
|
+
const { service, action, fetchOptions } = params;
|
|
103
158
|
return await sendNileRequest(
|
|
104
159
|
config,
|
|
105
160
|
"schema",
|
|
106
161
|
service,
|
|
107
162
|
action,
|
|
108
163
|
{},
|
|
109
|
-
|
|
164
|
+
fetchOptions
|
|
165
|
+
);
|
|
166
|
+
},
|
|
167
|
+
/** Upload files to an action via multipart form-data */
|
|
168
|
+
upload: async (params) => {
|
|
169
|
+
const { service, action, files, fields, fetchOptions } = params;
|
|
170
|
+
return await sendUploadRequest(
|
|
171
|
+
config,
|
|
172
|
+
service,
|
|
173
|
+
action,
|
|
174
|
+
files,
|
|
175
|
+
fields,
|
|
176
|
+
fetchOptions
|
|
110
177
|
);
|
|
111
178
|
}
|
|
112
179
|
};
|
|
113
180
|
}
|
|
114
181
|
export {
|
|
115
|
-
|
|
182
|
+
buildFormData,
|
|
183
|
+
createNileClient,
|
|
184
|
+
sendUploadRequest
|
|
116
185
|
};
|
|
117
186
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/safe-try.ts","../src/request.ts","../src/create-client.ts"],"sourcesContent":["/**\n * Internal result type for safeTry\n */\nexport type SafeResult<T, E = unknown> =\n | { isOk: true; value: T; isErr: false; error: null }\n | { isOk: false; value: null; isErr: true; error: E };\n\n/**\n * Gracefully handles both synchronous and asynchronous operations by returning a result object.\n * This replaces the need for external slang-ts dependency and avoids try/catch boilerplate.\n *\n * @param fn - The function to execute (sync or async)\n * @returns A result object containing either the value or the error\n *\n * @example\n * const { isOk, value, error } = await safeTry(() => fetch(url));\n */\nexport function safeTry<T>(\n fn: () => T | Promise<T>\n): Promise<SafeResult<T>> | SafeResult<T> {\n try {\n const result = fn();\n\n if (result instanceof Promise) {\n return result\n .then(\n (value): SafeResult<T> => ({\n isOk: true,\n value,\n isErr: false,\n error: null,\n })\n )\n .catch(\n (error): SafeResult<T> => ({\n isOk: false,\n value: null,\n isErr: true,\n error,\n })\n );\n }\n\n return { isOk: true, value: result, isErr: false, error: null };\n } catch (error) {\n return { isOk: false, value: null, isErr: true, error };\n }\n}\n","import { safeTry } from \"./safe-try.js\";\nimport type {\n ClientResult,\n ExternalResponse,\n FetchOptions,\n NileClientConfig,\n} from \"./types.js\";\n\n/**\n * Handles communication with the Nile /services endpoint.\n * Uses fetch + safeTry for crash safety and consistent { error, data } results.\n */\nexport async function sendNileRequest<T = Record<string, unknown>>(\n config: NileClientConfig,\n intent: \"explore\" | \"execute\" | \"schema\",\n service: string,\n action: string,\n payload: unknown,\n options: FetchOptions = {}\n): Promise<ClientResult<T>> {\n const { timeout = config.timeout ?? 30_000, ...fetchOptions } = options;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const requestResult = await safeTry(async () => {\n const response = await fetch(`${config.baseUrl}/services`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...config.headers,\n ...(fetchOptions.headers as Record<string, string>),\n },\n credentials: config.credentials,\n body: JSON.stringify({\n intent,\n service,\n action,\n payload: payload ?? {},\n }),\n signal: controller.signal,\n ...fetchOptions,\n });\n\n clearTimeout(timeoutId);\n\n const json = (await response.json()) as ExternalResponse<T>;\n return json;\n });\n\n if (requestResult.isErr) {\n const error: unknown = requestResult.error;\n let errorMsg = \"An unknown error occurred\";\n\n if (error instanceof Error) {\n errorMsg =\n error.name === \"AbortError\" ? \"Request timed out\" : error.message;\n } else {\n errorMsg = String(error);\n }\n\n return { error: errorMsg, data: null };\n }\n\n const result = requestResult.value;\n\n if (!result.status) {\n return { error: result.message, data: result.data };\n }\n\n return { error: null, data: result.data };\n}\n","import { sendNileRequest } from \"./request.js\";\nimport type {\n ClientResult,\n FetchOptions,\n NileClient,\n NileClientConfig,\n} from \"./types.js\";\n\n/**\n * Creates a type-safe Nile client for interacting with backend services.\n *\n * @param config - The client configuration including baseUrl\n * @returns A factory object with execute, explore, and schema methods\n *\n * @example\n * const nile = createNileClient<ServicePayloads>({ baseUrl: \"/api\" });\n * const { error, data } = await nile.invoke({\n * service: \"tasks\",\n * action: \"create\",\n * payload: { title: \"Buy milk\" }\n * });\n */\nexport function createNileClient<\n TPayloads = Record<string, Record<string, unknown>>,\n>(config: NileClientConfig): NileClient<TPayloads> {\n return {\n /** Invoke a service action through the backend engine pipeline */\n invoke: async <\n S extends keyof TPayloads & string,\n A extends keyof TPayloads[S] & string,\n >(\n params: { service: S; action: A; payload: TPayloads[S][A] } & FetchOptions\n ) => {\n const { service, action, payload, ...options } = params;\n const result = await sendNileRequest<Record<string, unknown>>(\n config,\n \"execute\",\n service,\n action,\n payload,\n options\n );\n return result as ClientResult;\n },\n\n /** Discover available services and actions (supports \"*\" wildcard) */\n explore: async (\n params: { service: string; action: string } & FetchOptions\n ) => {\n const { service, action, ...options } = params;\n return await sendNileRequest(\n config,\n \"explore\",\n service,\n action,\n {},\n options\n );\n },\n\n /** Get action schemas as JSON Schema (supports \"*\" wildcard) */\n schema: async (\n params: { service: string; action: string } & FetchOptions\n ) => {\n const { service, action, ...options } = params;\n return await sendNileRequest(\n config,\n \"schema\",\n service,\n action,\n {},\n options\n );\n },\n };\n}\n"],"mappings":";AAiBO,SAAS,QACd,IACwC;AACxC,MAAI;AACF,UAAM,SAAS,GAAG;AAElB,QAAI,kBAAkB,SAAS;AAC7B,aAAO,OACJ;AAAA,QACC,CAAC,WAA0B;AAAA,UACzB,MAAM;AAAA,UACN;AAAA,UACA,OAAO;AAAA,UACP,OAAO;AAAA,QACT;AAAA,MACF,EACC;AAAA,QACC,CAAC,WAA0B;AAAA,UACzB,MAAM;AAAA,UACN,OAAO;AAAA,UACP,OAAO;AAAA,UACP;AAAA,QACF;AAAA,MACF;AAAA,IACJ;AAEA,WAAO,EAAE,MAAM,MAAM,OAAO,QAAQ,OAAO,OAAO,OAAO,KAAK;AAAA,EAChE,SAAS,OAAO;AACd,WAAO,EAAE,MAAM,OAAO,OAAO,MAAM,OAAO,MAAM,MAAM;AAAA,EACxD;AACF;;;ACnCA,eAAsB,gBACpB,QACA,QACA,SACA,QACA,SACA,UAAwB,CAAC,GACC;AAC1B,QAAM,EAAE,UAAU,OAAO,WAAW,KAAQ,GAAG,aAAa,IAAI;AAEhE,QAAM,aAAa,IAAI,gBAAgB;AACvC,QAAM,YAAY,WAAW,MAAM,WAAW,MAAM,GAAG,OAAO;AAE9D,QAAM,gBAAgB,MAAM,QAAQ,YAAY;AAC9C,UAAM,WAAW,MAAM,MAAM,GAAG,OAAO,OAAO,aAAa;AAAA,MACzD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,GAAG,OAAO;AAAA,QACV,GAAI,aAAa;AAAA,MACnB;AAAA,MACA,aAAa,OAAO;AAAA,MACpB,MAAM,KAAK,UAAU;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA,SAAS,WAAW,CAAC;AAAA,MACvB,CAAC;AAAA,MACD,QAAQ,WAAW;AAAA,MACnB,GAAG;AAAA,IACL,CAAC;AAED,iBAAa,SAAS;AAEtB,UAAM,OAAQ,MAAM,SAAS,KAAK;AAClC,WAAO;AAAA,EACT,CAAC;AAED,MAAI,cAAc,OAAO;AACvB,UAAM,QAAiB,cAAc;AACrC,QAAI,WAAW;AAEf,QAAI,iBAAiB,OAAO;AAC1B,iBACE,MAAM,SAAS,eAAe,sBAAsB,MAAM;AAAA,IAC9D,OAAO;AACL,iBAAW,OAAO,KAAK;AAAA,IACzB;AAEA,WAAO,EAAE,OAAO,UAAU,MAAM,KAAK;AAAA,EACvC;AAEA,QAAM,SAAS,cAAc;AAE7B,MAAI,CAAC,OAAO,QAAQ;AAClB,WAAO,EAAE,OAAO,OAAO,SAAS,MAAM,OAAO,KAAK;AAAA,EACpD;AAEA,SAAO,EAAE,OAAO,MAAM,MAAM,OAAO,KAAK;AAC1C;;;ACjDO,SAAS,iBAEd,QAAiD;AACjD,SAAO;AAAA;AAAA,IAEL,QAAQ,OAIN,WACG;AACH,YAAM,EAAE,SAAS,QAAQ,SAAS,GAAG,QAAQ,IAAI;AACjD,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAAA;AAAA,IAGA,SAAS,OACP,WACG;AACH,YAAM,EAAE,SAAS,QAAQ,GAAG,QAAQ,IAAI;AACxC,aAAO,MAAM;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC;AAAA,QACD;AAAA,MACF;AAAA,IACF;AAAA;AAAA,IAGA,QAAQ,OACN,WACG;AACH,YAAM,EAAE,SAAS,QAAQ,GAAG,QAAQ,IAAI;AACxC,aAAO,MAAM;AAAA,QACX;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA,CAAC;AAAA,QACD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/safe-try.ts","../src/request.ts","../src/create-client.ts"],"sourcesContent":["/**\n * Internal result type for safeTry\n */\nexport type SafeResult<T, E = unknown> =\n | { isOk: true; value: T; isErr: false; error: null }\n | { isOk: false; value: null; isErr: true; error: E };\n\n/**\n * Gracefully handles both synchronous and asynchronous operations by returning a result object.\n * This replaces the need for external slang-ts dependency and avoids try/catch boilerplate.\n *\n * @param fn - The function to execute (sync or async)\n * @returns A result object containing either the value or the error\n *\n * @example\n * const { isOk, value, error } = await safeTry(() => fetch(url));\n */\nexport function safeTry<T>(\n fn: () => T | Promise<T>\n): Promise<SafeResult<T>> | SafeResult<T> {\n try {\n const result = fn();\n\n if (result instanceof Promise) {\n return result\n .then(\n (value): SafeResult<T> => ({\n isOk: true,\n value,\n isErr: false,\n error: null,\n })\n )\n .catch(\n (error): SafeResult<T> => ({\n isOk: false,\n value: null,\n isErr: true,\n error,\n })\n );\n }\n\n return { isOk: true, value: result, isErr: false, error: null };\n } catch (error) {\n return { isOk: false, value: null, isErr: true, error };\n }\n}\n","import { safeTry } from \"./safe-try.js\";\nimport type {\n ClientResult,\n ExternalResponse,\n FetchOptions,\n NileClientConfig,\n} from \"./types.js\";\n\n/**\n * Handles JSON communication with the Nile /services endpoint.\n * Uses fetch + safeTry for crash safety and consistent { error, data } results.\n */\nexport async function sendNileRequest<T = Record<string, unknown>>(\n config: NileClientConfig,\n intent: \"explore\" | \"execute\" | \"schema\",\n service: string,\n action: string,\n payload: unknown,\n options: FetchOptions = {}\n): Promise<ClientResult<T>> {\n const { timeout = config.timeout ?? 30_000, ...fetchOptions } = options;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const requestResult = await safeTry(async () => {\n const response = await fetch(`${config.baseUrl}/services`, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n ...config.headers,\n ...(fetchOptions.headers as Record<string, string>),\n },\n credentials: config.credentials,\n body: JSON.stringify({\n intent,\n service,\n action,\n payload: payload ?? {},\n }),\n signal: controller.signal,\n ...fetchOptions,\n });\n\n clearTimeout(timeoutId);\n\n const json = (await response.json()) as ExternalResponse<T>;\n return json;\n });\n\n if (requestResult.isErr) {\n return resolveError(requestResult.error);\n }\n\n const result = requestResult.value;\n\n if (!result.status) {\n return { error: result.message, data: result.data };\n }\n\n return { error: null, data: result.data };\n}\n\n/**\n * Handles multipart form-data uploads to the Nile /services endpoint.\n * Builds a FormData body with RPC routing fields (intent, service, action),\n * user-provided fields, and file attachments.\n *\n * Content-Type header is intentionally omitted so the runtime sets the\n * correct multipart boundary automatically.\n */\nexport async function sendUploadRequest<T = Record<string, unknown>>(\n config: NileClientConfig,\n service: string,\n action: string,\n files: Record<string, File | File[]>,\n fields?: Record<string, string>,\n options: FetchOptions = {}\n): Promise<ClientResult<T>> {\n const { timeout = config.timeout ?? 30_000, ...fetchOptions } = options;\n\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n const formData = buildFormData(service, action, files, fields);\n\n const requestResult = await safeTry(async () => {\n // Spread config.headers but strip Content-Type — let the runtime set multipart boundary\n const { \"Content-Type\": _ct, ...safeHeaders } = config.headers ?? {};\n const { \"Content-Type\": _ct2, ...safeFetchHeaders } =\n (fetchOptions.headers as Record<string, string>) ?? {};\n\n const response = await fetch(`${config.baseUrl}/services`, {\n method: \"POST\",\n headers: {\n ...safeHeaders,\n ...safeFetchHeaders,\n },\n credentials: config.credentials,\n body: formData,\n signal: controller.signal,\n ...fetchOptions,\n });\n\n clearTimeout(timeoutId);\n\n const json = (await response.json()) as ExternalResponse<T>;\n return json;\n });\n\n if (requestResult.isErr) {\n return resolveError(requestResult.error);\n }\n\n const result = requestResult.value;\n\n if (!result.status) {\n return { error: result.message, data: result.data };\n }\n\n return { error: null, data: result.data };\n}\n\n/**\n * Builds a FormData instance with RPC routing fields and file/field entries.\n * The server expects 'intent', 'service', 'action' as string fields.\n */\nexport function buildFormData(\n service: string,\n action: string,\n files: Record<string, File | File[]>,\n fields?: Record<string, string>\n): FormData {\n const formData = new FormData();\n\n // RPC routing fields the server expects\n formData.append(\"intent\", \"execute\");\n formData.append(\"service\", service);\n formData.append(\"action\", action);\n\n // User-provided string fields\n if (fields) {\n for (const [key, value] of Object.entries(fields)) {\n formData.append(key, value);\n }\n }\n\n // File attachments — arrays append multiple entries under the same key\n for (const [key, value] of Object.entries(files)) {\n if (Array.isArray(value)) {\n for (const file of value) {\n formData.append(key, file);\n }\n } else {\n formData.append(key, value);\n }\n }\n\n return formData;\n}\n\n/** Resolve error from safeTry into a ClientResult */\nfunction resolveError<T>(error: unknown): ClientResult<T> {\n let errorMsg = \"An unknown error occurred\";\n\n if (error instanceof Error) {\n errorMsg =\n error.name === \"AbortError\" ? \"Request timed out\" : error.message;\n } else {\n errorMsg = String(error);\n }\n\n return { error: errorMsg, data: null };\n}\n","import { sendNileRequest, sendUploadRequest } from \"./request.js\";\nimport type {\n ClientResult,\n NileClient,\n NileClientConfig,\n UploadParams,\n} from \"./types.js\";\n\n/**\n * Creates a type-safe Nile client for interacting with backend services.\n *\n * @param config - The client configuration including baseUrl\n * @returns A factory object with invoke, explore, schema, and upload methods\n *\n * @example\n * const nile = createNileClient<ServicePayloads>({ baseUrl: \"/api\" });\n * const { error, data } = await nile.invoke({\n * service: \"tasks\",\n * action: \"create\",\n * payload: { title: \"Buy milk\" }\n * });\n */\nexport function createNileClient<\n TPayloads = Record<string, Record<string, unknown>>,\n>(config: NileClientConfig): NileClient<TPayloads> {\n return {\n /** Invoke a service action through the backend engine pipeline */\n invoke: async <\n S extends keyof TPayloads & string,\n A extends keyof TPayloads[S] & string,\n >(\n params: {\n service: S;\n action: A;\n payload: TPayloads[S][A];\n fetchOptions?: Parameters<typeof sendNileRequest>[5];\n }\n ) => {\n const { service, action, payload, fetchOptions } = params;\n const result = await sendNileRequest<Record<string, unknown>>(\n config,\n \"execute\",\n service,\n action,\n payload,\n fetchOptions\n );\n return result as ClientResult;\n },\n\n /** Discover available services and actions (supports \"*\" wildcard) */\n explore: async (params) => {\n const { service, action, fetchOptions } = params;\n return await sendNileRequest(\n config,\n \"explore\",\n service,\n action,\n {},\n fetchOptions\n );\n },\n\n /** Get action schemas as JSON Schema (supports \"*\" wildcard) */\n schema: async (params) => {\n const { service, action, fetchOptions } = params;\n return await sendNileRequest(\n config,\n \"schema\",\n service,\n action,\n {},\n fetchOptions\n );\n },\n\n /** Upload files to an action via multipart form-data */\n upload: async (params: UploadParams) => {\n const { service, action, files, fields, fetchOptions } = params;\n return await sendUploadRequest(\n config,\n service,\n action,\n files,\n fields,\n fetchOptions\n );\n },\n };\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nilejs/client",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Standalone, type-safe client for Nile backend framework",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -18,10 +18,14 @@
|
|
|
18
18
|
],
|
|
19
19
|
"scripts": {
|
|
20
20
|
"build": "tsup",
|
|
21
|
-
"dev": "tsup --watch"
|
|
21
|
+
"dev": "tsup --watch",
|
|
22
|
+
"test": "vitest",
|
|
23
|
+
"test:run": "vitest run"
|
|
22
24
|
},
|
|
23
25
|
"devDependencies": {
|
|
26
|
+
"tsup": "^8.5.1",
|
|
24
27
|
"typescript": "^5",
|
|
25
|
-
"
|
|
28
|
+
"vite-tsconfig-paths": "^6.1.1",
|
|
29
|
+
"vitest": "^4.0.18"
|
|
26
30
|
}
|
|
27
31
|
}
|