@nvwa-app/sdk-functions 6.0.50 → 6.0.52

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.d.mts CHANGED
@@ -73,4 +73,23 @@ declare function getAvailableProviders(options?: GetAvailableProvidersOptions):
73
73
  /** 单例:Functions 内 getPayment() 使用 env PAYMENT_GATEWAY_URL、PAYMENT_PROJECT_KEY。 */
74
74
  declare function getPayment(options?: PaymentGatewayClientOptions): PaymentGatewayClient;
75
75
 
76
- export { type AuthUser, type CreateOrderParams, type CreateOrderResult, type GetAvailableProvidersOptions, type GetOrderResult, type PaymentGatewayClient, type PaymentGatewayClientOptions, type PaymentPlatform, createPaymentClient, filterProvidersByPlatform, getAvailableProviders, getConfiguredProviders, getDb, getPayment, getRequestUser, providerSupportedPlatforms };
76
+ interface ExecuteCapabilityOptions {
77
+ /** 覆盖 NVWA_SERVER_BASE_URL(Workspace/Server 根地址,与 nvwa.json server.baseUrl 一致) */
78
+ serverBaseUrl?: string;
79
+ /** 覆盖 NVWA_INTERNAL_SECRET(与 nvwa.json server.internalSecret / 项目 runtimeInternalKey 一致) */
80
+ internalSecret?: string;
81
+ /** 覆盖 NVWA_PROJECT_CODE */
82
+ projectCode?: string;
83
+ }
84
+ interface CapabilityExecuteResponse<Data = unknown> {
85
+ status: number;
86
+ data?: Data;
87
+ message?: string;
88
+ }
89
+ /**
90
+ * 在 Edge Function 中调用已开通的 Nvwa capability(经 Server internal HMAC 路由)。
91
+ * 需在环境中配置 NVWA_SERVER_BASE_URL、NVWA_INTERNAL_SECRET、NVWA_PROJECT_CODE(与 Runtime nvwa.json server 块一致)。
92
+ */
93
+ declare function executeCapability<Result = unknown>(capabilityName: string, param?: unknown, options?: ExecuteCapabilityOptions): Promise<Result | undefined>;
94
+
95
+ export { type AuthUser, type CapabilityExecuteResponse, type CreateOrderParams, type CreateOrderResult, type ExecuteCapabilityOptions, type GetAvailableProvidersOptions, type GetOrderResult, type PaymentGatewayClient, type PaymentGatewayClientOptions, type PaymentPlatform, createPaymentClient, executeCapability, filterProvidersByPlatform, getAvailableProviders, getConfiguredProviders, getDb, getPayment, getRequestUser, providerSupportedPlatforms };
package/dist/index.d.ts CHANGED
@@ -73,4 +73,23 @@ declare function getAvailableProviders(options?: GetAvailableProvidersOptions):
73
73
  /** 单例:Functions 内 getPayment() 使用 env PAYMENT_GATEWAY_URL、PAYMENT_PROJECT_KEY。 */
74
74
  declare function getPayment(options?: PaymentGatewayClientOptions): PaymentGatewayClient;
75
75
 
76
- export { type AuthUser, type CreateOrderParams, type CreateOrderResult, type GetAvailableProvidersOptions, type GetOrderResult, type PaymentGatewayClient, type PaymentGatewayClientOptions, type PaymentPlatform, createPaymentClient, filterProvidersByPlatform, getAvailableProviders, getConfiguredProviders, getDb, getPayment, getRequestUser, providerSupportedPlatforms };
76
+ interface ExecuteCapabilityOptions {
77
+ /** 覆盖 NVWA_SERVER_BASE_URL(Workspace/Server 根地址,与 nvwa.json server.baseUrl 一致) */
78
+ serverBaseUrl?: string;
79
+ /** 覆盖 NVWA_INTERNAL_SECRET(与 nvwa.json server.internalSecret / 项目 runtimeInternalKey 一致) */
80
+ internalSecret?: string;
81
+ /** 覆盖 NVWA_PROJECT_CODE */
82
+ projectCode?: string;
83
+ }
84
+ interface CapabilityExecuteResponse<Data = unknown> {
85
+ status: number;
86
+ data?: Data;
87
+ message?: string;
88
+ }
89
+ /**
90
+ * 在 Edge Function 中调用已开通的 Nvwa capability(经 Server internal HMAC 路由)。
91
+ * 需在环境中配置 NVWA_SERVER_BASE_URL、NVWA_INTERNAL_SECRET、NVWA_PROJECT_CODE(与 Runtime nvwa.json server 块一致)。
92
+ */
93
+ declare function executeCapability<Result = unknown>(capabilityName: string, param?: unknown, options?: ExecuteCapabilityOptions): Promise<Result | undefined>;
94
+
95
+ export { type AuthUser, type CapabilityExecuteResponse, type CreateOrderParams, type CreateOrderResult, type ExecuteCapabilityOptions, type GetAvailableProvidersOptions, type GetOrderResult, type PaymentGatewayClient, type PaymentGatewayClientOptions, type PaymentPlatform, createPaymentClient, executeCapability, filterProvidersByPlatform, getAvailableProviders, getConfiguredProviders, getDb, getPayment, getRequestUser, providerSupportedPlatforms };
package/dist/index.js CHANGED
@@ -31,6 +31,7 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
31
31
  var index_exports = {};
32
32
  __export(index_exports, {
33
33
  createPaymentClient: () => createPaymentClient,
34
+ executeCapability: () => executeCapability,
34
35
  filterProvidersByPlatform: () => filterProvidersByPlatform,
35
36
  getAvailableProviders: () => getAvailableProviders,
36
37
  getConfiguredProviders: () => getConfiguredProviders,
@@ -211,9 +212,98 @@ function getPayment(options) {
211
212
  if (!_payment) _payment = createPaymentClient();
212
213
  return _payment;
213
214
  }
215
+
216
+ // src/capability.ts
217
+ function bytesToHex(bytes) {
218
+ return Array.from(bytes).map((byte) => byte.toString(16).padStart(2, "0")).join("");
219
+ }
220
+ async function sha256Hex(content) {
221
+ const digest = await crypto.subtle.digest(
222
+ "SHA-256",
223
+ new TextEncoder().encode(content)
224
+ );
225
+ return bytesToHex(new Uint8Array(digest));
226
+ }
227
+ async function hmacSha256Hex(secret, content) {
228
+ const key = await crypto.subtle.importKey(
229
+ "raw",
230
+ new TextEncoder().encode(secret),
231
+ { name: "HMAC", hash: "SHA-256" },
232
+ false,
233
+ ["sign"]
234
+ );
235
+ const signature = await crypto.subtle.sign(
236
+ "HMAC",
237
+ key,
238
+ new TextEncoder().encode(content)
239
+ );
240
+ return bytesToHex(new Uint8Array(signature));
241
+ }
242
+ function resolveServerBaseUrl(explicit) {
243
+ const url = explicit ?? getEnv("NVWA_SERVER_BASE_URL");
244
+ if (!url) {
245
+ throw new Error(
246
+ "NVWA_SERVER_BASE_URL is not set; executeCapability requires Workspace server base URL (same as nvwa.json server.baseUrl)"
247
+ );
248
+ }
249
+ return url.replace(/\/$/, "");
250
+ }
251
+ function resolveInternalSecret(explicit) {
252
+ const s = explicit ?? getEnv("NVWA_INTERNAL_SECRET");
253
+ if (!s) {
254
+ throw new Error(
255
+ "NVWA_INTERNAL_SECRET is not set; must match project runtime internal HMAC secret"
256
+ );
257
+ }
258
+ return s;
259
+ }
260
+ function resolveProjectCode(explicit) {
261
+ const c = explicit ?? getEnv("NVWA_PROJECT_CODE");
262
+ if (!c) {
263
+ throw new Error("NVWA_PROJECT_CODE is not set");
264
+ }
265
+ return c;
266
+ }
267
+ async function executeCapability(capabilityName, param, options) {
268
+ const projectCode = resolveProjectCode(options?.projectCode);
269
+ const baseUrl = resolveServerBaseUrl(options?.serverBaseUrl);
270
+ const internalSecret = resolveInternalSecret(options?.internalSecret);
271
+ const path = `/internal/project/${projectCode}/capability/${capabilityName}/execute`;
272
+ const bodyText = param != null ? JSON.stringify(param) : "";
273
+ const timestamp = Date.now().toString();
274
+ const nonce = crypto.randomUUID();
275
+ const bodySha256 = await sha256Hex(bodyText);
276
+ const signingPayload = `POST
277
+ ${path}
278
+ ${timestamp}
279
+ ${nonce}
280
+ ${bodySha256}
281
+ ${projectCode}`;
282
+ const signature = await hmacSha256Hex(internalSecret, signingPayload);
283
+ const response = await fetch(`${baseUrl}${path}`, {
284
+ method: "POST",
285
+ headers: {
286
+ "Content-Type": "application/json",
287
+ "X-Internal-Timestamp": timestamp,
288
+ "X-Internal-Nonce": nonce,
289
+ "X-Internal-Body-Sha256": bodySha256,
290
+ "X-Internal-Signature": signature,
291
+ "X-Internal-Project-Code": projectCode
292
+ },
293
+ body: bodyText
294
+ });
295
+ const responseBody = await response.json();
296
+ if (responseBody.status !== 200) {
297
+ throw new Error(
298
+ responseBody.message ?? `Capability execute failed with status ${responseBody.status}`
299
+ );
300
+ }
301
+ return responseBody.data;
302
+ }
214
303
  // Annotate the CommonJS export names for ESM import in node:
215
304
  0 && (module.exports = {
216
305
  createPaymentClient,
306
+ executeCapability,
217
307
  filterProvidersByPlatform,
218
308
  getAvailableProviders,
219
309
  getConfiguredProviders,
package/dist/index.mjs CHANGED
@@ -168,8 +168,97 @@ function getPayment(options) {
168
168
  if (!_payment) _payment = createPaymentClient();
169
169
  return _payment;
170
170
  }
171
+
172
+ // src/capability.ts
173
+ function bytesToHex(bytes) {
174
+ return Array.from(bytes).map((byte) => byte.toString(16).padStart(2, "0")).join("");
175
+ }
176
+ async function sha256Hex(content) {
177
+ const digest = await crypto.subtle.digest(
178
+ "SHA-256",
179
+ new TextEncoder().encode(content)
180
+ );
181
+ return bytesToHex(new Uint8Array(digest));
182
+ }
183
+ async function hmacSha256Hex(secret, content) {
184
+ const key = await crypto.subtle.importKey(
185
+ "raw",
186
+ new TextEncoder().encode(secret),
187
+ { name: "HMAC", hash: "SHA-256" },
188
+ false,
189
+ ["sign"]
190
+ );
191
+ const signature = await crypto.subtle.sign(
192
+ "HMAC",
193
+ key,
194
+ new TextEncoder().encode(content)
195
+ );
196
+ return bytesToHex(new Uint8Array(signature));
197
+ }
198
+ function resolveServerBaseUrl(explicit) {
199
+ const url = explicit ?? getEnv("NVWA_SERVER_BASE_URL");
200
+ if (!url) {
201
+ throw new Error(
202
+ "NVWA_SERVER_BASE_URL is not set; executeCapability requires Workspace server base URL (same as nvwa.json server.baseUrl)"
203
+ );
204
+ }
205
+ return url.replace(/\/$/, "");
206
+ }
207
+ function resolveInternalSecret(explicit) {
208
+ const s = explicit ?? getEnv("NVWA_INTERNAL_SECRET");
209
+ if (!s) {
210
+ throw new Error(
211
+ "NVWA_INTERNAL_SECRET is not set; must match project runtime internal HMAC secret"
212
+ );
213
+ }
214
+ return s;
215
+ }
216
+ function resolveProjectCode(explicit) {
217
+ const c = explicit ?? getEnv("NVWA_PROJECT_CODE");
218
+ if (!c) {
219
+ throw new Error("NVWA_PROJECT_CODE is not set");
220
+ }
221
+ return c;
222
+ }
223
+ async function executeCapability(capabilityName, param, options) {
224
+ const projectCode = resolveProjectCode(options?.projectCode);
225
+ const baseUrl = resolveServerBaseUrl(options?.serverBaseUrl);
226
+ const internalSecret = resolveInternalSecret(options?.internalSecret);
227
+ const path = `/internal/project/${projectCode}/capability/${capabilityName}/execute`;
228
+ const bodyText = param != null ? JSON.stringify(param) : "";
229
+ const timestamp = Date.now().toString();
230
+ const nonce = crypto.randomUUID();
231
+ const bodySha256 = await sha256Hex(bodyText);
232
+ const signingPayload = `POST
233
+ ${path}
234
+ ${timestamp}
235
+ ${nonce}
236
+ ${bodySha256}
237
+ ${projectCode}`;
238
+ const signature = await hmacSha256Hex(internalSecret, signingPayload);
239
+ const response = await fetch(`${baseUrl}${path}`, {
240
+ method: "POST",
241
+ headers: {
242
+ "Content-Type": "application/json",
243
+ "X-Internal-Timestamp": timestamp,
244
+ "X-Internal-Nonce": nonce,
245
+ "X-Internal-Body-Sha256": bodySha256,
246
+ "X-Internal-Signature": signature,
247
+ "X-Internal-Project-Code": projectCode
248
+ },
249
+ body: bodyText
250
+ });
251
+ const responseBody = await response.json();
252
+ if (responseBody.status !== 200) {
253
+ throw new Error(
254
+ responseBody.message ?? `Capability execute failed with status ${responseBody.status}`
255
+ );
256
+ }
257
+ return responseBody.data;
258
+ }
171
259
  export {
172
260
  createPaymentClient,
261
+ executeCapability,
173
262
  filterProvidersByPlatform,
174
263
  getAvailableProviders,
175
264
  getConfiguredProviders,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nvwa-app/sdk-functions",
3
- "version": "6.0.50",
3
+ "version": "6.0.52",
4
4
  "description": "NVWA Edge Functions SDK: db, payment gateway, auth, provider list. Use in Deno: import from 'npm:@nvwa-app/sdk-functions'.",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",