@nosana/api 2.3.1 → 2.5.1

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.ts CHANGED
@@ -19,6 +19,7 @@ export type NosanaApiClient = NosanaApi | NosanaApiWithApiKey;
19
19
  export declare function createNosanaApi(environment: NosanaNetworkType, noAuth: undefined, options?: CreateNosanaApiOptions): NosanaApi;
20
20
  export declare function createNosanaApi(environment: NosanaNetworkType, signerAuth: SignerAuth, options?: CreateNosanaApiOptions): NosanaApi;
21
21
  export declare function createNosanaApi(environment: NosanaNetworkType, apiKeyAuth: ApiKeyAuth, options?: CreateNosanaApiOptions): NosanaApiWithApiKey;
22
+ export { generateIdempotencyKey } from './utils/idempotency.js';
22
23
  export * from './types.js';
23
24
  export type { CreateNosanaApiOptions as ApiConfig, CreateNosanaApiOptions } from './types.js';
24
25
  export type * from './routes/jobs/types.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EACgB,KAAK,aAAa,EACf,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACvB,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAElE,MAAM,mBAAmB,CAAC;AAG3B,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,UAAU,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAErH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,WAAW,EAAE,cAAc,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,WAAW,EAAE,iBAAiB,CAAC;CAChC;AAED,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,mBAAmB,CAAC;AAG9D,wBAAgB,eAAe,CAAC,WAAW,EAAE,iBAAiB,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;AAChI,wBAAgB,eAAe,CAAC,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;AACrI,wBAAgB,eAAe,CAAC,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,mBAAmB,CAAC;AAwB/I,cAAc,YAAY,CAAC;AAC3B,YAAY,EAAE,sBAAsB,IAAI,SAAS,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAG9F,mBAAmB,wBAAwB,CAAC;AAC5C,mBAAmB,2BAA2B,CAAC;AAC/C,mBAAmB,2BAA2B,CAAC;AAC/C,mBAAmB,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EACgB,KAAK,aAAa,EACf,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACvB,KAAK,cAAc,EAAE,KAAK,iBAAiB,EAElE,MAAM,mBAAmB,CAAC;AAG3B,OAAO,KAAK,EAAE,UAAU,EAAE,sBAAsB,EAAE,UAAU,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAErH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,WAAW,EAAE,cAAc,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,gBAAgB,CAAC;IAC1B,OAAO,EAAE,gBAAgB,CAAC;IAC1B,WAAW,EAAE,iBAAiB,CAAC;CAChC;AAED,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,mBAAmB,CAAC;AAG9D,wBAAgB,eAAe,CAAC,WAAW,EAAE,iBAAiB,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;AAChI,wBAAgB,eAAe,CAAC,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,SAAS,CAAC;AACrI,wBAAgB,eAAe,CAAC,WAAW,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,mBAAmB,CAAC;AAwB/I,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAGhE,cAAc,YAAY,CAAC;AAC3B,YAAY,EAAE,sBAAsB,IAAI,SAAS,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAG9F,mBAAmB,wBAAwB,CAAC;AAC5C,mBAAmB,2BAA2B,CAAC;AAC/C,mBAAmB,2BAA2B,CAAC;AAC/C,mBAAmB,+BAA+B,CAAC"}
package/dist/index.js CHANGED
@@ -15,6 +15,8 @@ export function createNosanaApi(environment = NosanaNetwork.MAINNET, signerOrApi
15
15
  : createDeploymentsApi({ client: dashboardClient }, true)
16
16
  };
17
17
  }
18
+ // Export helpers
19
+ export { generateIdempotencyKey } from './utils/idempotency.js';
18
20
  // Export types
19
21
  export * from './types.js';
20
22
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kCAAkC,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AAEvG,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA0B3C,MAAM,UAAU,eAAe,CAC7B,cAAiC,aAAa,CAAC,OAAO,EACtD,cAAmD,EACnD,OAAgC;IAEhC,MAAM,SAAS,GAAG,OAAO,cAAc,KAAK,QAAQ,CAAC;IAErD,MAAM,mBAAmB,GAAG,kCAAkC,CAAC,WAAW,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IACrG,MAAM,eAAe,GAAG,8BAA8B,CAAC,WAAW,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAE7F,OAAO;QACL,IAAI,EAAE,mBAAmB,CAAC,mBAAmB,CAAC;QAC9C,IAAI,EAAE,mBAAmB,CAAC,eAAe,CAAC;QAC1C,OAAO,EAAE,sBAAsB,CAAC,eAAe,CAAC;QAChD,OAAO,EAAE,sBAAsB,CAAC,eAAe,CAAC;QAChD,WAAW,EAAE,CAAC,SAAS,IAAI,cAAc;YACvC,CAAC,CAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC;YACzF,CAAC,CAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,IAAI,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED,eAAe;AACf,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kCAAkC,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AAEvG,OAAO,EACL,mBAAmB,EACnB,sBAAsB,EACtB,sBAAsB,EACtB,oBAAoB,EACpB,mBAAmB,EACpB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AA0B3C,MAAM,UAAU,eAAe,CAC7B,cAAiC,aAAa,CAAC,OAAO,EACtD,cAAmD,EACnD,OAAgC;IAEhC,MAAM,SAAS,GAAG,OAAO,cAAc,KAAK,QAAQ,CAAC;IAErD,MAAM,mBAAmB,GAAG,kCAAkC,CAAC,WAAW,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IACrG,MAAM,eAAe,GAAG,8BAA8B,CAAC,WAAW,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;IAE7F,OAAO;QACL,IAAI,EAAE,mBAAmB,CAAC,mBAAmB,CAAC;QAC9C,IAAI,EAAE,mBAAmB,CAAC,eAAe,CAAC;QAC1C,OAAO,EAAE,sBAAsB,CAAC,eAAe,CAAC;QAChD,OAAO,EAAE,sBAAsB,CAAC,eAAe,CAAC;QAChD,WAAW,EAAE,CAAC,SAAS,IAAI,cAAc;YACvC,CAAC,CAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,EAAE,EAAE,KAAK,CAAC;YACzF,CAAC,CAAC,oBAAoB,CAAC,EAAE,MAAM,EAAE,eAAe,EAAE,EAAE,IAAI,CAAC;KAC5D,CAAC;AACJ,CAAC;AAED,iBAAiB;AACjB,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAEhE,eAAe;AACf,cAAc,YAAY,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/jobs/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EACV,aAAa,EASd,MAAM,YAAY,CAAC;AAEpB,cAAc,YAAY,CAAC;AAE3B,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,aAAa,CA4DtE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/jobs/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EACV,aAAa,EAUd,MAAM,YAAY,CAAC;AAEpB,cAAc,YAAY,CAAC;AAU3B,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,WAAW,GAAG,aAAa,CA+DtE"}
@@ -1,9 +1,16 @@
1
1
  import { errorFormatter } from '../../utils/errorFormatter.js';
2
2
  export * from './types.js';
3
+ /**
4
+ * Builds the optional request init that carries the `Idempotency-Key` header.
5
+ * Returns an empty object when no key is supplied so the request is unchanged.
6
+ */
7
+ function idempotencyInit({ idempotencyKey } = {}) {
8
+ return idempotencyKey ? { headers: { 'Idempotency-Key': idempotencyKey } } : {};
9
+ }
3
10
  export function createNosanaJobsApi(client) {
4
11
  return {
5
12
  async get(address) {
6
- const { data, error } = await client.GET('/api/jobs/{address}', {
13
+ const { data, error, response } = await client.GET('/api/jobs/{address}', {
7
14
  params: {
8
15
  path: {
9
16
  address
@@ -11,43 +18,46 @@ export function createNosanaJobsApi(client) {
11
18
  }
12
19
  });
13
20
  if (error || !data) {
14
- throw errorFormatter('Failed to get job', error);
21
+ throw errorFormatter('Failed to get job', error, response);
15
22
  }
16
23
  return data;
17
24
  },
18
- async list(request) {
19
- const { data, error } = await client.POST('/api/jobs/list', {
25
+ async list(request, options) {
26
+ const { data, error, response } = await client.POST('/api/jobs/list', {
20
27
  body: request,
28
+ ...idempotencyInit(options),
21
29
  });
22
30
  if (error || !data) {
23
- throw errorFormatter('Failed to list job', error);
31
+ throw errorFormatter('Failed to list job', error, response);
24
32
  }
25
33
  return data;
26
34
  },
27
- async extend({ address, ...request }) {
28
- const { data, error } = await client.POST('/api/jobs/{address}/extend', {
35
+ async extend({ address, ...request }, options) {
36
+ const { data, error, response } = await client.POST('/api/jobs/{address}/extend', {
29
37
  params: {
30
38
  path: {
31
39
  address
32
40
  }
33
41
  },
34
42
  body: request,
43
+ ...idempotencyInit(options),
35
44
  });
36
45
  if (error || !data) {
37
- throw errorFormatter('Failed to extend job', error);
46
+ throw errorFormatter('Failed to extend job', error, response);
38
47
  }
39
48
  return data;
40
49
  },
41
- async stop(address) {
42
- const { data, error } = await client.POST('/api/jobs/{address}/stop', {
50
+ async stop(address, options) {
51
+ const { data, error, response } = await client.POST('/api/jobs/{address}/stop', {
43
52
  params: {
44
53
  path: {
45
54
  address
46
55
  }
47
56
  },
57
+ ...idempotencyInit(options),
48
58
  });
49
59
  if (error || !data) {
50
- throw errorFormatter('Failed to stop job', error);
60
+ throw errorFormatter('Failed to stop job', error, response);
51
61
  }
52
62
  return data;
53
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/jobs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAe/D,cAAc,YAAY,CAAC;AAE3B,MAAM,UAAU,mBAAmB,CAAC,MAAmB;IACrD,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,OAAwC;YAChD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,qBAAqB,EAAE;gBAC9D,MAAM,EAAE;oBACN,IAAI,EAAE;wBACJ,OAAO;qBACR;iBACF;aACF,CAAC,CAAC;YAEH,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;gBACnB,MAAM,cAAc,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;YACnD,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,OAAgC;YACzC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBAC1D,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;YAEH,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;gBACnB,MAAM,cAAc,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;YACpD,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,EAA6B;YAC7D,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;gBACtE,MAAM,EAAE;oBACN,IAAI,EAAE;wBACJ,OAAO;qBACR;iBACF;gBACD,IAAI,EAAE,OAAO;aACd,CAAC,CAAC;YAEH,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;gBACnB,MAAM,cAAc,CAAC,sBAAsB,EAAE,KAAK,CAAC,CAAC;YACtD,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,OAAgC;YACzC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE;gBACpE,MAAM,EAAE;oBACN,IAAI,EAAE;wBACJ,OAAO;qBACR;iBACF;aACF,CAAC,CAAC;YAEH,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;gBACnB,MAAM,cAAc,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;YACpD,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/jobs/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAgB/D,cAAc,YAAY,CAAC;AAE3B;;;GAGG;AACH,SAAS,eAAe,CAAC,EAAE,cAAc,KAA6B,EAAE;IACtE,OAAO,cAAc,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,iBAAiB,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAClF,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAmB;IACrD,OAAO;QACL,KAAK,CAAC,GAAG,CAAC,OAAwC;YAChD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,qBAAqB,EAAE;gBACxE,MAAM,EAAE;oBACN,IAAI,EAAE;wBACJ,OAAO;qBACR;iBACF;aACF,CAAC,CAAC;YAEH,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;gBACnB,MAAM,cAAc,CAAC,mBAAmB,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC7D,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,OAAgC,EAAE,OAAgC;YAC3E,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAAE;gBACpE,IAAI,EAAE,OAAO;gBACb,GAAG,eAAe,CAAC,OAAO,CAAC;aAC5B,CAAC,CAAC;YAEH,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;gBACnB,MAAM,cAAc,CAAC,oBAAoB,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC9D,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,EAA6B,EAAE,OAAgC;YAC/F,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,4BAA4B,EAAE;gBAChF,MAAM,EAAE;oBACN,IAAI,EAAE;wBACJ,OAAO;qBACR;iBACF;gBACD,IAAI,EAAE,OAAO;gBACb,GAAG,eAAe,CAAC,OAAO,CAAC;aAC5B,CAAC,CAAC;YAEH,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;gBACnB,MAAM,cAAc,CAAC,sBAAsB,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAChE,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,OAAgC,EAAE,OAAgC;YAC3E,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,0BAA0B,EAAE;gBAC9E,MAAM,EAAE;oBACN,IAAI,EAAE;wBACJ,OAAO;qBACR;iBACF;gBACD,GAAG,eAAe,CAAC,OAAO,CAAC;aAC5B,CAAC,CAAC;YAEH,IAAI,KAAK,IAAI,CAAC,IAAI,EAAE,CAAC;gBACnB,MAAM,cAAc,CAAC,oBAAoB,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC9D,CAAC;YAED,OAAO,IAAI,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -7,10 +7,18 @@ export type NosanaApiListJobResponse = operations['postApiJobsList']['responses'
7
7
  export type NosanaApiExtendJobResponse = operations['postApiJobsByAddressExtend']['responses'][200]['content']['application/json'];
8
8
  export type NosanaApiStopJobResponse = operations['postApiJobsByAddressStop']['responses'][200]['content']['application/json'];
9
9
  export type NosanaApiGetJobByAddressResponse = operations['getApiJobsByAddress']['responses'][200]['content']['application/json'];
10
+ export interface NosanaJobActionOptions {
11
+ /**
12
+ * Optional idempotency key. When provided it is sent as the `Idempotency-Key`
13
+ * request header so the API can safely de-duplicate retried requests. The
14
+ * header is fully optional and omitting it leaves behaviour unchanged.
15
+ */
16
+ idempotencyKey?: string;
17
+ }
10
18
  export interface NosanaJobsApi {
11
19
  get: (request: NosanaApiGetJobByAddressRequest) => Promise<NosanaApiGetJobByAddressResponse>;
12
- list: (request: NosanaApiListJobRequest) => Promise<NosanaApiListJobResponse>;
13
- extend: (request: NosanaApiExtendJobRequest) => Promise<NosanaApiExtendJobResponse>;
14
- stop: (request: NosanaApiStopJobRequest) => Promise<NosanaApiStopJobResponse>;
20
+ list: (request: NosanaApiListJobRequest, options?: NosanaJobActionOptions) => Promise<NosanaApiListJobResponse>;
21
+ extend: (request: NosanaApiExtendJobRequest, options?: NosanaJobActionOptions) => Promise<NosanaApiExtendJobResponse>;
22
+ stop: (request: NosanaApiStopJobRequest, options?: NosanaJobActionOptions) => Promise<NosanaApiStopJobResponse>;
15
23
  }
16
24
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/routes/jobs/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,MAAM,MAAM,+BAA+B,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC;AACjH,MAAM,MAAM,uBAAuB,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;AAClH,MAAM,MAAM,yBAAyB,GACnC,UAAU,CAAC,4BAA4B,CAAC,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,GACtF,UAAU,CAAC,4BAA4B,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AACjE,MAAM,MAAM,uBAAuB,GAAG,UAAU,CAAC,0BAA0B,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC;AAG9G,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;AACtH,MAAM,MAAM,0BAA0B,GAAG,UAAU,CAAC,4BAA4B,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;AACnI,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,0BAA0B,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;AAC/H,MAAM,MAAM,gCAAgC,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;AAElI,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,CAAC,OAAO,EAAE,+BAA+B,KAAK,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAC7F,IAAI,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAC9E,MAAM,EAAE,CAAC,OAAO,EAAE,yBAAyB,KAAK,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACpF,IAAI,EAAE,CAAC,OAAO,EAAE,uBAAuB,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;CAC/E"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/routes/jobs/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpD,MAAM,MAAM,+BAA+B,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC;AACjH,MAAM,MAAM,uBAAuB,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;AAClH,MAAM,MAAM,yBAAyB,GACnC,UAAU,CAAC,4BAA4B,CAAC,CAAC,aAAa,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,GACtF,UAAU,CAAC,4BAA4B,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AACjE,MAAM,MAAM,uBAAuB,GAAG,UAAU,CAAC,0BAA0B,CAAC,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC;AAG9G,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;AACtH,MAAM,MAAM,0BAA0B,GAAG,UAAU,CAAC,4BAA4B,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;AACnI,MAAM,MAAM,wBAAwB,GAAG,UAAU,CAAC,0BAA0B,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;AAC/H,MAAM,MAAM,gCAAgC,GAAG,UAAU,CAAC,qBAAqB,CAAC,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,kBAAkB,CAAC,CAAC;AAElI,MAAM,WAAW,sBAAsB;IACrC;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,CAAC,OAAO,EAAE,+BAA+B,KAAK,OAAO,CAAC,gCAAgC,CAAC,CAAC;IAC7F,IAAI,EAAE,CAAC,OAAO,EAAE,uBAAuB,EAAE,OAAO,CAAC,EAAE,sBAAsB,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAChH,MAAM,EAAE,CAAC,OAAO,EAAE,yBAAyB,EAAE,OAAO,CAAC,EAAE,sBAAsB,KAAK,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACtH,IAAI,EAAE,CAAC,OAAO,EAAE,uBAAuB,EAAE,OAAO,CAAC,EAAE,sBAAsB,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;CACjH"}
@@ -1,6 +1,8 @@
1
1
  export interface ApiError extends Error {
2
2
  code?: string;
3
3
  statusCode?: number;
4
+ /** Raw `Retry-After` header value, when present (e.g. on a 409 IN_PROGRESS). */
5
+ retryAfter?: string;
4
6
  details?: unknown;
5
7
  }
6
8
  interface ErrorResponse {
@@ -9,6 +11,15 @@ interface ErrorResponse {
9
11
  code?: string;
10
12
  statusCode?: number;
11
13
  }
12
- export declare function errorFormatter(customMessage: string, errorObject?: ErrorResponse | unknown): ApiError;
14
+ /**
15
+ * Builds an {@link ApiError} from an openapi-fetch failure.
16
+ *
17
+ * The HTTP status and `Retry-After` are taken from `response` rather than the
18
+ * error body: the status is a property of the response, so reading it from
19
+ * `response.status` stays correct for error shapes that don't echo a status —
20
+ * proxy/gateway 5xx, framework default error pages, etc. A body `statusCode`,
21
+ * when present, still wins so existing payloads are unaffected.
22
+ */
23
+ export declare function errorFormatter(customMessage: string, errorObject?: ErrorResponse | unknown, response?: Response): ApiError;
13
24
  export {};
14
25
  //# sourceMappingURL=errorFormatter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errorFormatter.d.ts","sourceRoot":"","sources":["../../src/utils/errorFormatter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAS,SAAQ,KAAK;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,cAAc,CAC5B,aAAa,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,aAAa,GAAG,OAAO,GACpC,QAAQ,CA2BV"}
1
+ {"version":3,"file":"errorFormatter.d.ts","sourceRoot":"","sources":["../../src/utils/errorFormatter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,QAAS,SAAQ,KAAK;IACrC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,aAAa,EAAE,MAAM,EACrB,WAAW,CAAC,EAAE,aAAa,GAAG,OAAO,EACrC,QAAQ,CAAC,EAAE,QAAQ,GAClB,QAAQ,CAsCV"}
@@ -1,14 +1,31 @@
1
- export function errorFormatter(customMessage, errorObject) {
1
+ /**
2
+ * Builds an {@link ApiError} from an openapi-fetch failure.
3
+ *
4
+ * The HTTP status and `Retry-After` are taken from `response` rather than the
5
+ * error body: the status is a property of the response, so reading it from
6
+ * `response.status` stays correct for error shapes that don't echo a status —
7
+ * proxy/gateway 5xx, framework default error pages, etc. A body `statusCode`,
8
+ * when present, still wins so existing payloads are unaffected.
9
+ */
10
+ export function errorFormatter(customMessage, errorObject, response) {
2
11
  const err = new Error();
12
+ // Response-derived metadata is independent of the error body.
13
+ const bodyStatus = typeof errorObject === 'object' && errorObject !== null
14
+ ? errorObject.statusCode
15
+ : undefined;
16
+ err.statusCode = bodyStatus ?? response?.status;
17
+ const retryAfter = response?.headers?.get('retry-after');
18
+ if (retryAfter) {
19
+ err.retryAfter = retryAfter;
20
+ }
3
21
  if (!errorObject) {
4
22
  err.message = customMessage;
5
23
  return err;
6
24
  }
7
25
  if (typeof errorObject === 'object' && errorObject !== null) {
8
- const { error, message, code, statusCode } = errorObject;
26
+ const { error, message, code } = errorObject;
9
27
  err.message = `${customMessage}: ${error || message || 'Unknown error'}`;
10
28
  err.code = code;
11
- err.statusCode = statusCode;
12
29
  err.details = errorObject;
13
30
  return err;
14
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"errorFormatter.js","sourceRoot":"","sources":["../../src/utils/errorFormatter.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,cAAc,CAC5B,aAAqB,EACrB,WAAqC;IAErC,MAAM,GAAG,GAAG,IAAI,KAAK,EAAc,CAAC;IAEpC,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,aAAa,CAAC;QAC5B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QAC5D,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,WAA4B,CAAC;QAE1E,GAAG,CAAC,OAAO,GAAG,GAAG,aAAa,KAAK,KAAK,IAAI,OAAO,IAAI,eAAe,EAAE,CAAC;QACzE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAChB,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC;QAC5B,GAAG,CAAC,OAAO,GAAG,WAAW,CAAC;QAE1B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpC,GAAG,CAAC,OAAO,GAAG,GAAG,aAAa,KAAK,WAAW,EAAE,CAAC;QACjD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,GAAG,CAAC,OAAO,GAAG,aAAa,CAAC;IAC5B,GAAG,CAAC,OAAO,GAAG,WAAW,CAAC;IAC1B,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"errorFormatter.js","sourceRoot":"","sources":["../../src/utils/errorFormatter.ts"],"names":[],"mappings":"AAeA;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAC5B,aAAqB,EACrB,WAAqC,EACrC,QAAmB;IAEnB,MAAM,GAAG,GAAG,IAAI,KAAK,EAAc,CAAC;IAEpC,8DAA8D;IAC9D,MAAM,UAAU,GACd,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,IAAI;QACrD,CAAC,CAAE,WAA6B,CAAC,UAAU;QAC3C,CAAC,CAAC,SAAS,CAAC;IAChB,GAAG,CAAC,UAAU,GAAG,UAAU,IAAI,QAAQ,EAAE,MAAM,CAAC;IAEhD,MAAM,UAAU,GAAG,QAAQ,EAAE,OAAO,EAAE,GAAG,CAAC,aAAa,CAAC,CAAC;IACzD,IAAI,UAAU,EAAE,CAAC;QACf,GAAG,CAAC,UAAU,GAAG,UAAU,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,GAAG,CAAC,OAAO,GAAG,aAAa,CAAC;QAC5B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QAC5D,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,WAA4B,CAAC;QAE9D,GAAG,CAAC,OAAO,GAAG,GAAG,aAAa,KAAK,KAAK,IAAI,OAAO,IAAI,eAAe,EAAE,CAAC;QACzE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAChB,GAAG,CAAC,OAAO,GAAG,WAAW,CAAC;QAE1B,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QACpC,GAAG,CAAC,OAAO,GAAG,GAAG,aAAa,KAAK,WAAW,EAAE,CAAC;QACjD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,GAAG,CAAC,OAAO,GAAG,aAAa,CAAC;IAC5B,GAAG,CAAC,OAAO,GAAG,WAAW,CAAC;IAC1B,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Generates a unique idempotency key suitable for the optional `idempotencyKey`
3
+ * option on the jobs API (`list`, `extend`, `stop`).
4
+ *
5
+ * Reuse the returned value when retrying the *same* logical operation so the API
6
+ * can de-duplicate the retry. Generate a fresh key for each new operation — a
7
+ * different key per attempt provides no de-duplication.
8
+ *
9
+ * Uses the Web Crypto API, which is available in Node 20+ and modern browsers.
10
+ *
11
+ * @example
12
+ * const key = generateIdempotencyKey();
13
+ * await api.jobs.list(request, { idempotencyKey: key });
14
+ * // ...later, retrying the SAME request:
15
+ * await api.jobs.list(request, { idempotencyKey: key }); // de-duplicated
16
+ */
17
+ export declare function generateIdempotencyKey(): string;
18
+ //# sourceMappingURL=idempotency.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency.d.ts","sourceRoot":"","sources":["../../src/utils/idempotency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAE/C"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Generates a unique idempotency key suitable for the optional `idempotencyKey`
3
+ * option on the jobs API (`list`, `extend`, `stop`).
4
+ *
5
+ * Reuse the returned value when retrying the *same* logical operation so the API
6
+ * can de-duplicate the retry. Generate a fresh key for each new operation — a
7
+ * different key per attempt provides no de-duplication.
8
+ *
9
+ * Uses the Web Crypto API, which is available in Node 20+ and modern browsers.
10
+ *
11
+ * @example
12
+ * const key = generateIdempotencyKey();
13
+ * await api.jobs.list(request, { idempotencyKey: key });
14
+ * // ...later, retrying the SAME request:
15
+ * await api.jobs.list(request, { idempotencyKey: key }); // de-duplicated
16
+ */
17
+ export function generateIdempotencyKey() {
18
+ return globalThis.crypto.randomUUID();
19
+ }
20
+ //# sourceMappingURL=idempotency.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idempotency.js","sourceRoot":"","sources":["../../src/utils/idempotency.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,UAAU,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;AACxC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nosana/api",
3
- "version": "2.3.1",
3
+ "version": "2.5.1",
4
4
  "description": "Nosana API module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -52,5 +52,5 @@
52
52
  "engines": {
53
53
  "node": ">=20.18.0"
54
54
  },
55
- "gitHead": "f0557eb71c17043450f159a72d67967a6045c74a"
55
+ "gitHead": "e3d3b1b9c487b248f0c501a7455540ae01391cea"
56
56
  }