@opvious/api
Advanced tools
| syntax = "proto3"; | ||
| package opvious.formulation; | ||
| message Assembly { | ||
| repeated Dimension dimensions = 1; | ||
| repeated Parameter parameters = 2; | ||
| repeated Variable variables = 3; | ||
| repeated Constraint constraints = 4; | ||
| repeated Objective objectives = 5; | ||
| } | ||
| message Dimension { | ||
| string label = 1; | ||
| bool is_numeric = 2; | ||
| } | ||
| message Parameter { | ||
| string label = 1; | ||
| repeated string qualifiers = 2; // Label or empty string for default | ||
| TensorSignature signature = 3; | ||
| } | ||
| message TensorSignature { | ||
| Space domain = 1; | ||
| Image image = 2; | ||
| } | ||
| message Image { | ||
| bool is_integral = 1; | ||
| Interval interval = 2; | ||
| } | ||
| message Interval { | ||
| Expression lower_bound = 1; | ||
| Expression upper_bound = 2; | ||
| } | ||
| message Variable { | ||
| string label = 1; | ||
| repeated string qualifiers = 2; // Label or empty string for default | ||
| TensorSignature signature = 3; | ||
| } | ||
| message Space { | ||
| repeated Binding bindings = 1; | ||
| Predicate mask = 2; | ||
| } | ||
| message Binding { | ||
| int32 anchor = 1; | ||
| oneof source { | ||
| string dimension_label = 2; | ||
| Interval range = 3; | ||
| } | ||
| } | ||
| message Predicate { | ||
| message Satisfies { | ||
| enum Condition { | ||
| UNKNOWN = 0; | ||
| ZERO = 1; | ||
| NON_NEGATIVE = 2; | ||
| NON_POSITIVE = 3; | ||
| NON_ZERO = 4; | ||
| NEGATIVE = 5; | ||
| POSITIVE = 6; | ||
| } | ||
| Condition condition = 1; | ||
| Expression expression = 2; | ||
| } | ||
| message Selects { | ||
| oneof source { | ||
| string dimension_label = 1; | ||
| Interval range = 2; | ||
| } | ||
| Expression expression = 3; | ||
| bool is_member = 4; | ||
| } | ||
| message Connects { | ||
| enum Connective { | ||
| UNKNOWN = 0; | ||
| AND = 1; | ||
| OR = 2; | ||
| } | ||
| Connective connective = 1; | ||
| Predicate left_predicate = 2; | ||
| Predicate right_predicate = 3; | ||
| } | ||
| oneof predicate { | ||
| Satisfies satisfies = 1; | ||
| Selects selects = 2; | ||
| Connects connects = 3; | ||
| } | ||
| } | ||
| message Constraint { | ||
| string label = 1; | ||
| repeated string qualifiers = 2; | ||
| Space domain = 3; | ||
| Combination combination = 4; | ||
| double lower_bound = 5; | ||
| double upper_bound = 6; | ||
| } | ||
| message Combination { | ||
| // Constant term | ||
| Expression offset = 1; | ||
| // Non-constant terms | ||
| message Weight { | ||
| repeated Factor factors = 1; | ||
| Coefficient coefficient = 2; | ||
| } | ||
| message Factor { | ||
| string variable_label = 1; | ||
| repeated Expression subscripts = 2; | ||
| } | ||
| repeated Weight weights = 2; | ||
| } | ||
| message Coefficient { | ||
| Expression value = 1; | ||
| message Over { | ||
| Space domain = 1; | ||
| Coefficient coefficient = 2; | ||
| } | ||
| Over over = 2; | ||
| } | ||
| message Expression { | ||
| message Input { | ||
| string label = 1; | ||
| repeated Expression subscripts = 2; | ||
| } | ||
| message Unary { | ||
| enum Operator { | ||
| UNKNOWN = 0; | ||
| CEIL = 1; | ||
| FLOOR = 2; | ||
| SQRT = 3; | ||
| INV = 4; | ||
| ABS = 5; | ||
| } | ||
| Operator operator = 1; | ||
| Expression expression = 2; | ||
| } | ||
| message Binary { | ||
| enum Operator { | ||
| UNKNOWN = 0; | ||
| MUL = 1; | ||
| ADD = 2; | ||
| MOD = 3; | ||
| POW = 4; | ||
| } | ||
| Operator operator = 1; | ||
| Expression left_expression = 2; | ||
| Expression right_expression = 3; | ||
| } | ||
| message Sum { | ||
| Space domain = 1; | ||
| Expression expression = 2; | ||
| } | ||
| message Cardinality { | ||
| Space space = 1; | ||
| } | ||
| message Switched { | ||
| message Case { | ||
| Predicate predicate = 1; | ||
| Expression expression = 2; | ||
| } | ||
| repeated Case cases = 1; | ||
| } | ||
| oneof expression { | ||
| double literal = 1; | ||
| Input input = 2; | ||
| int32 anchor = 3; | ||
| Unary unary = 4; | ||
| Binary binary = 5; | ||
| Sum sum = 6; | ||
| Cardinality cardinality = 7; | ||
| Switched switched = 8; | ||
| } | ||
| } | ||
| message Objective { | ||
| bool is_maximization = 1; | ||
| Combination combination = 2; | ||
| string label = 3; | ||
| } |
+1
-1
@@ -1,1 +0,1 @@ | ||
| (()=>{"use strict";const e="*/*",t="application/json",o="application/octet-stream",s="text/*";function a(t,o){for(const s of o){if(t===s||s===e)return!0;const o=t.split("/"),a=s.split("/");if(o[0]===a[0]&&(o[1]===a[1]||"*"===a[1]))return!0}return!1}class n{constructor(e){this.entries=e}static create(t){return new n(new Map([[e,t]]))}add(e,t){this.entries.set(e,t)}addAll(e){for(const[t,o]of Object.entries(e??{}))this.add(t,o)}getBest(t){const o=this.entries.get(t);if(o)return o;return this.entries.get(t.replace(/\/.+/,"/*"))||this.entries.get(e)}}class r{constructor(e){this.data=e}static create(e){const t=new Map;for(const[o,s]of Object.entries(e)){const e=+o;t.set(isNaN(e)?o:e,new Set(s))}return new r(t)}getBest(e){const t=this.getBestCode(e);return{code:t,declared:this.data.get(t)}}getBestCode(e){const{data:t}=this;if(t.has(e))return e;const o=(e/100|0)+"XX";return t.has(o)?o:"default"}acceptable(e){for(const t of this.data.values()){if(!t.size)continue;let o=!1;for(const s of t)if(a(s,e)){o=!0;break}if(!o)return!1}return!0}}function p(e){const{value:t,declared:o,accepted:s}=e;return null==o?null==t||a(t,s):o.size?!(null==t||!o.has(t))&&a(t,s):null==t}function i(e){const t=new Set;for(const o of e.split(",")){const e=o.split(";")[0].trim();e&&!t.has(e)&&t.add(e)}return t}const c=e=>e,d=e=>e.blob(),l=e=>JSON.stringify(e),u=e=>e.json(),h=e=>null==e?"":""+e,f=e=>e.text(),m=e=>{const t=new URLSearchParams;for(const[o,s]of Object.entries(e))if(Array.isArray(s))for(const e of s)t.append(o,""+e);else t.set(o,""+s);return t},y=e=>{const o=new FormData;if(!e||"object"!=typeof e)throw new Error("Unsupported multipart-form input: "+e);for(const[s,a]of Object.entries(e))o.set(s,"string"==typeof a||a instanceof Blob?a:new Blob([JSON.stringify(a)],{type:t}));return o},j=(e,t)=>{throw new Error("Unsupported request content-type: "+t.contentType)},g=(e,t)=>{throw new Error("Unsupported response content-type: "+t.contentType)},w=async(e,t)=>{const o=t.received;if(!(o&&null==t.declared||"text/plain"===o&&!t.declared?.has(o)))throw new Error(`Unexpected ${t.method.toUpperCase()} ${t.path} response content type ${o} for status ${e.status} (accepted: [${[...t.accepted]}], declared: `+(t.declared?`[${[...t.declared]}]`:"<none>")+")");await e.text()},b={getOpenapiSchema:{path:"/openapi.yaml",method:"get",parameters:{},responses:{200:["text/yaml"]}},getOpenapiComponentSchema:{path:"/schema.json",method:"get",parameters:{name:{location:"query",required:!0}},responses:{200:["application/json"],404:[]}},getGraphqlSchema:{path:"/schema.graphql",method:"get",parameters:{},responses:{200:["text/graphql"]}},runQuery:{path:"/graphql",method:"post",parameters:{},body:{required:!0,types:["application/json"]},responses:{200:["application/json"],default:["application/json","text/plain"]}},transformOutline:{path:"/outlines/transform",method:"post",parameters:{},body:{required:!0,types:["application/json"]},responses:{200:["application/json"],default:["application/json","text/plain"]}},parseSources:{path:"/sources/parse",method:"post",parameters:{},body:{required:!0,types:["application/json"]},responses:{200:["application/json"],default:["application/json","text/plain"]}},solve:{path:"/solve",method:"post",parameters:{},body:{required:!0,types:["application/json"]},responses:{200:["application/json","application/json-seq"],default:["application/json","text/plain"]}},formatProblem:{path:"/format-problem",method:"post",parameters:{},body:{required:!0,types:["application/json"]},responses:{200:["text/plain"],default:["application/json","text/plain"]}},summarizeProblem:{path:"/summarize-problem",method:"post",parameters:{},body:{required:!0,types:["application/json"]},responses:{200:["application/json"],default:["application/json","text/plain"]}},queueSolve:{path:"/queue-solve",method:"post",parameters:{},body:{required:!0,types:["application/json"]},responses:{200:["application/json"],default:["application/json","text/plain"]}},getQueuedSolveInputs:{path:"/queued-solves/{uuid}/inputs",method:"get",parameters:{uuid:{location:"path",required:!0}},responses:{200:["application/json"],404:[],default:["application/json","text/plain"]}},getQueuedSolveOutputs:{path:"/queued-solves/{uuid}/outputs",method:"get",parameters:{uuid:{location:"path",required:!0}},responses:{200:["application/json"],404:[],409:[],default:["application/json","text/plain"]}}};window.opviousSdk=function(e){const a="string"==typeof e||e instanceof URL||e&&"port"in e?{address:e}:{address:"https://api.cloud.opvious.io/",...e};return function(e,a){const b=a.fetch??fetch,q=a.address,v="string"==typeof q||q instanceof URL?q.toString().replace(/\/+$/,""):`http://${q.address.includes(":")?`[${q.address}]`:q.address}:${q.port}`,x=a.options??{},S=a.headers,O=a.coercer??w,U=n.create(j);U.add("multipart/form-data",y),U.add("application/x-www-form-urlencoded",m),U.add(t,l),U.add(o,c),U.add(s,h),U.addAll(a.encoders);const $=n.create(g);$.add(t,u),$.add(o,d),$.add(s,f),$.addAll(a.decoders);const B={};for(const[t,o]of Object.entries(e)){const e=r.create(o.responses);B[t]=async s=>{const{body:a,encoder:n,decoder:r,...c}=s??{},d=c?.params??{},l=new URL(v+(u=o.path,h=d,u.replace(/{[^}]+}/,(e=>{const t=h[e.slice(1,-1)];return null==t?e:""+t}))),"undefined"==typeof document?void 0:document.baseURI);var u,h;const f={};for(const[e,t]of Object.entries(d))switch(o.parameters[e]?.location){case"header":f[e]=encodeURIComponent(t);break;case"query":l.searchParams.set(e,encodeURIComponent(t))}const m=s?.headers?.accept??"application/json;q=1, text/*;q=0.5",y=s?.headers?.["content-type"]??"application/json",j={...S,...s?.headers,...f,"content-type":y,accept:m};let g;if(void 0!==a){const e=n??U.getBest(y);g=await e(a,{operationId:t,contentType:y,headers:j,options:s?.options})}(void 0===g||g instanceof FormData)&&delete j["content-type"];const w=await b(""+l,{...x,...c.options,headers:j,method:o.method,body:g});let q=w.headers.get("content-type")?.split(";")?.[0]||void 0;const B=i(m),{code:R,declared:C}=e.getBest(w.status);let I;if(p({value:q,declared:C,accepted:B})||(q=await O(w,{path:o.path,method:o.method,received:q,declared:C,accepted:B})),q){const e=r??$.getBest(q);I=await e(w,{operationId:t,contentType:q,headers:j,options:s?.options})}const A={code:R,data:I};return Object.defineProperty(A,"raw",{value:w}),A}}return B}(b,a)}})(); | ||
| (()=>{"use strict";const e="*/*",t="application/json",o="application/octet-stream",s="text/*";function n(t,o){for(const s of o){if(t===s||s===e)return s;const o=t.split("/"),n=s.split("/");if(o[0]===n[0]&&(o[1]===n[1]||"*"===n[1]))return s}}class a{constructor(e){this.entries=e}static create(t){return new a(new Map([[e,t]]))}add(e,t){this.entries.set(e,t)}addAll(e){for(const[t,o]of Object.entries(e??{}))this.add(t,o)}getBest(t){const o=this.entries.get(t);if(o)return o;return this.entries.get(t.replace(/\/.+/,"/*"))||this.entries.get(e)}}class p{constructor(e){this.data=e}static create(e){const t=new Map;for(const[o,s]of Object.entries(e)){const e=+o,n=new Map;for(const e of s)n.set(e.mimeType,e);t.set(isNaN(e)?o:e,n)}return new p(t)}getBest(e){const t=this.getBestCode(e);return{code:t,declared:this.data.get(t)}}getBestCode(e){const{data:t}=this;if(t.has(e))return e;const o=(e/100|0)+"XX";return t.has(o)?o:"default"}acceptable(e){for(const t of this.data.values()){if(!t.size)continue;let o=!1;for(const s of t.keys())if(null!=n(s,e)){o=!0;break}if(!o)return!1}return!0}}const r=e=>e,i=e=>e.blob(),c=e=>JSON.stringify(e),d=e=>e.json(),l=e=>null==e?"":""+e,m=e=>e.text(),u=e=>{const t=new URLSearchParams;for(const[o,s]of Object.entries(e))if(Array.isArray(s))for(const e of s)t.append(o,""+e);else t.set(o,""+s);return t},y=e=>{const o=new FormData;if(!e||"object"!=typeof e)throw new Error("Unsupported multipart-form input: "+e);for(const[s,n]of Object.entries(e))n instanceof Blob?o.set(s,n,n instanceof File?n.name:void 0):o.set(s,"string"==typeof n?n:new Blob([JSON.stringify(n)],{type:t}));return o},h=(e,t)=>{throw new Error("Unsupported request content-type: "+t.content.mimeType)},f=(e,t)=>{if(t.content.isBinary)return e.blob();throw new Error("Unsupported response content-type: "+t.content.mimeType)},j=async(e,t)=>{const o=t.received;if(!(o&&null==t.declared||"text/plain"===o&&!t.declared?.has(o)))throw await e.text(),new Error(`Unexpected ${t.method.toUpperCase()} ${t.path} response content type ${o} for status ${e.status} (accepted: [${[...t.accepted]}], declared: `+(t.declared?`[${[...t.declared]}]`:"<none>")+")")};const T={getOpenapiSchema:{path:"/openapi.yaml",method:"get",parameters:{},responses:{200:[{mimeType:"text/yaml"}]}},getOpenapiComponentSchema:{path:"/schema.json",method:"get",parameters:{name:{location:"query",required:!0}},responses:{200:[{mimeType:"application/json"}],404:[]}},getGraphqlSchema:{path:"/schema.graphql",method:"get",parameters:{},responses:{200:[{mimeType:"text/graphql"}]}},runQuery:{path:"/graphql",method:"post",parameters:{},body:{required:!0,types:["application/json"]},responses:{200:[{mimeType:"application/json"}],default:[{mimeType:"application/json"},{mimeType:"text/plain"}]}},transformOutline:{path:"/outlines/transform",method:"post",parameters:{},body:{required:!0,types:["application/json"]},responses:{200:[{mimeType:"application/json"}],default:[{mimeType:"application/json"},{mimeType:"text/plain"}]}},assembleSources:{path:"/sources/assemble",method:"post",parameters:{},body:{required:!0,types:["application/json"]},responses:{200:[{mimeType:"application/octet-stream",isBinary:!0}],default:[{mimeType:"application/json"},{mimeType:"text/plain"}]}},parseSources:{path:"/sources/parse",method:"post",parameters:{},body:{required:!0,types:["application/json"]},responses:{200:[{mimeType:"application/json"}],default:[{mimeType:"application/json"},{mimeType:"text/plain"}]}},solve:{path:"/solve",method:"post",parameters:{},body:{required:!0,types:["application/json"]},responses:{200:[{mimeType:"application/json"},{mimeType:"application/json-seq",isStream:!0}],default:[{mimeType:"application/json"},{mimeType:"text/plain"}]}},formatProblem:{path:"/format-problem",method:"post",parameters:{},body:{required:!0,types:["application/json"]},responses:{200:[{mimeType:"text/plain"}],default:[{mimeType:"application/json"},{mimeType:"text/plain"}]}},summarizeProblem:{path:"/summarize-problem",method:"post",parameters:{},body:{required:!0,types:["application/json"]},responses:{200:[{mimeType:"application/json"}],default:[{mimeType:"application/json"},{mimeType:"text/plain"}]}},queueSolve:{path:"/queue-solve",method:"post",parameters:{},body:{required:!0,types:["application/json"]},responses:{200:[{mimeType:"application/json"}],default:[{mimeType:"application/json"},{mimeType:"text/plain"}]}},getQueuedSolveInputs:{path:"/queued-solves/{uuid}/inputs",method:"get",parameters:{uuid:{location:"path",required:!0}},responses:{200:[{mimeType:"application/json"}],404:[],default:[{mimeType:"application/json"},{mimeType:"text/plain"}]}},getQueuedSolveOutputs:{path:"/queued-solves/{uuid}/outputs",method:"get",parameters:{uuid:{location:"path",required:!0}},responses:{200:[{mimeType:"application/json"}],404:[],409:[],default:[{mimeType:"application/json"},{mimeType:"text/plain"}]}}};window.opviousSdk=function(e){const b="string"==typeof e||e instanceof URL||e&&"port"in e?{address:e}:{address:"https://api.cloud.opvious.io/",...e};return function(e,T){const b=T.fetch??fetch,w=T.address,g="string"==typeof w||w instanceof URL?w.toString().replace(/\/+$/,""):`http://${w.address.includes(":")?`[${w.address}]`:w.address}:${w.port}`,q=T.options??{},v=T.headers,x=T.coercer??j,S=a.create(h);S.add("multipart/form-data",y),S.add("application/x-www-form-urlencoded",u),S.add(t,c),S.add(o,r),S.add(s,l),S.addAll(T.encoders);const O=a.create(f);async function U(t,o){const s=e[t];if(!s)throw new Error("Unknown operation ID: "+t);const a=p.create(s.responses),{body:r,encoder:i,decoder:c,...d}=o??{},l=d?.params??{},m=new URL(g+(u=s.path,y=l,u.replace(/{[^}]+}/,(e=>{const t=y[e.slice(1,-1)];return null==t?e:""+t}))),"undefined"==typeof document?void 0:document.baseURI);var u,y;const h={};for(const[e,t]of Object.entries(l))switch(s.parameters[e]?.location){case"header":h[e]=encodeURIComponent(t);break;case"query":m.searchParams.set(e,encodeURIComponent(t))}const f=o?.headers?.accept??"application/json;q=1, text/*;q=0.5",j=o?.headers?.["content-type"]??"application/json",T={...v,...o?.headers,...h,"content-type":j,accept:f};let w;if(void 0!==r){const e=i??S.getBest(j);w=await e(r,{operationId:t,contentType:j,headers:T,options:o?.options})}(void 0===w||w instanceof FormData)&&delete T["content-type"];const U=await b(""+m,{...q,...d.options,headers:T,method:s.method,body:w});let B=U.headers.get("content-type")?.split(";")?.[0]||void 0;const $=function(e){const t=new Set;for(const o of e.split(",")){const e=o.split(";")[0].trim();e&&!t.has(e)&&t.add(e)}return t}(f),{code:I,declared:R}=a.getBest(U.status);let k,C;if(function(e){const{received:t,declared:o,accepted:s}=e;return null==o?null==t||null!=n(t,s):o.size?!(null==t||!o.has(t))&&null!=n(t,s):null==t}({received:B,declared:R,accepted:$})||(B=await x(U,{path:s.path,method:s.method,received:B,declared:R,accepted:$})),B){const e=c??O.getBest(B);k=await e(U,{operationId:t,content:R?.get(B)??{mimeType:B,isBinary:!1},headers:T,options:o?.options})}else C=await U.text();const A={code:I,body:k,debug:C};return Object.defineProperty(A,"raw",{value:U}),A}O.add(t,d),O.add(o,i),O.add(s,m),O.addAll(T.decoders);const B=U;for(const t of Object.keys(e))B[t]=e=>U(t,e);return B}(T,b)}})(); |
+1
-1
@@ -17,3 +17,3 @@ /** | ||
| */ | ||
| import type { BaseFetch, RequestOptions } from 'abaca-runtime'; | ||
| import type { BaseFetch, RequestOptions } from 'abaca'; | ||
| import { getSdk } from './graphql/index.js'; | ||
@@ -20,0 +20,0 @@ import { Sdk } from './sdk.gen.js'; |
+3
-3
@@ -21,7 +21,7 @@ import { graphqlErrorFromFailure } from "@opvious/stl-graphql"; | ||
| return { | ||
| errors: [graphqlErrorFromFailure(res.data)], | ||
| errors: [graphqlErrorFromFailure(res.body)], | ||
| extensions: trace ? { trace } : undefined, | ||
| }; | ||
| } | ||
| const { data, errors, extensions } = res.data; | ||
| const { data, errors, extensions } = res.body; | ||
| return { | ||
@@ -36,3 +36,3 @@ data: data, | ||
| "fflate-gzip", | ||
| "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" | ||
| ); |
+247
-126
@@ -1,2 +0,2 @@ | ||
| // Do not edit, this file was auto-generated (Abaca 0.10.13) | ||
| // Do not edit, this file was auto-generated (Abaca 0.0.0) | ||
| const DEFAULT_ACCEPT = "application/json;q=1, text/*;q=0.5"; | ||
@@ -13,14 +13,14 @@ const DEFAULT_CONTENT_TYPE = "application/json"; | ||
| const TEXT_MIME_TYPE = 'text/*'; | ||
| function contentTypeMatches(exact, accepted) { | ||
| for (const item of accepted) { | ||
| if (exact === item || item === FALLBACK_MIME_TYPE) { | ||
| return true; | ||
| function matchingMimeType(exact, accepted) { | ||
| for (const elem of accepted) { | ||
| if (exact === elem || elem === FALLBACK_MIME_TYPE) { | ||
| return elem; | ||
| } | ||
| const got = exact.split('/'); | ||
| const want = item.split('/'); | ||
| const want = elem.split('/'); | ||
| if (got[0] === want[0] && (got[1] === want[1] || want[1] === '*')) { | ||
| return true; | ||
| return elem; | ||
| } | ||
| } | ||
| return false; | ||
| return undefined; | ||
| } | ||
@@ -60,5 +60,9 @@ class ByMimeType { | ||
| const data = new Map(); | ||
| for (const [code, mtypes] of Object.entries(responses)) { | ||
| for (const [code, defs] of Object.entries(responses)) { | ||
| const ncode = +code; | ||
| data.set(isNaN(ncode) ? code : ncode, new Set(mtypes)); | ||
| const formats = new Map(); | ||
| for (const def of defs) { | ||
| formats.set(def.mimeType, def); | ||
| } | ||
| data.set(isNaN(ncode) ? code : ncode, formats); | ||
| } | ||
@@ -88,4 +92,4 @@ return new ResponseClauseMatcher(data); | ||
| let overlap = false; | ||
| for (const mtype of mtypes) { | ||
| if (contentTypeMatches(mtype, accepted)) { | ||
| for (const mtype of mtypes.keys()) { | ||
| if (matchingMimeType(mtype, accepted) != null) { | ||
| overlap = true; | ||
@@ -102,14 +106,20 @@ break; | ||
| } | ||
| function isResponseTypeValid(args) { | ||
| const { value, declared, accepted } = args; | ||
| /** | ||
| * Returns whether the given mime-type is compatible with declared (from the | ||
| * OpenAPI specification) and acceptable (from the request) values. If returns | ||
| * true and `received` is not-null, it is guaranteed that `received` is a key in | ||
| * `declared`. | ||
| */ | ||
| function isContentCompatible(args) { | ||
| const { received, declared, accepted } = args; | ||
| if (declared == null) { | ||
| return value == null || contentTypeMatches(value, accepted); | ||
| return received == null || matchingMimeType(received, accepted) != null; | ||
| } | ||
| if (!declared.size) { | ||
| return value == null; | ||
| return received == null; | ||
| } | ||
| if (value == null || !declared.has(value)) { | ||
| if (received == null || !declared.has(received)) { | ||
| return false; | ||
| } | ||
| return contentTypeMatches(value, accepted); | ||
| return matchingMimeType(received, accepted) != null; | ||
| } | ||
@@ -155,5 +165,10 @@ function acceptedMimeTypes(header) { | ||
| for (const [key, val] of Object.entries(body)) { | ||
| form.set(key, typeof val == 'string' || val instanceof Blob | ||
| ? val | ||
| : new Blob([JSON.stringify(val)], { type: JSON_MIME_TYPE })); | ||
| if (val instanceof Blob) { | ||
| form.set(key, val, val instanceof File ? val.name : undefined); | ||
| } | ||
| else { | ||
| form.set(key, typeof val == 'string' | ||
| ? val | ||
| : new Blob([JSON.stringify(val)], { type: JSON_MIME_TYPE })); | ||
| } | ||
| } | ||
@@ -163,6 +178,10 @@ return form; | ||
| const fallbackEncoder = (_body, ctx) => { | ||
| throw new Error('Unsupported request content-type: ' + ctx.contentType); | ||
| // TODO: Support blob pass-through. | ||
| throw new Error('Unsupported request content-type: ' + ctx.content.mimeType); | ||
| }; | ||
| const fallbackDecoder = (_res, ctx) => { | ||
| throw new Error('Unsupported response content-type: ' + ctx.contentType); | ||
| const fallbackDecoder = (res, ctx) => { | ||
| if (ctx.content.isBinary) { | ||
| return res.blob(); | ||
| } | ||
| throw new Error('Unsupported response content-type: ' + ctx.content.mimeType); | ||
| }; | ||
@@ -173,5 +192,5 @@ const defaultCoercer = async (res, ctx) => { | ||
| (mtype === PLAIN_MIME_TYPE && !ctx.declared?.has(mtype))) { | ||
| await res.text(); // Consume response body. | ||
| return undefined; | ||
| } | ||
| await res.text(); // Consume response body | ||
| throw new Error(`Unexpected ${ctx.method.toUpperCase()} ${ctx.path} response content ` + | ||
@@ -203,79 +222,91 @@ `type ${mtype} for status ${res.status} (accepted: ` + | ||
| decoders.addAll(config.decoders); | ||
| const fetchers = {}; | ||
| for (const [id, op] of Object.entries(operations)) { | ||
| async function sdk(id, arg) { | ||
| const op = operations[id]; | ||
| if (!op) { | ||
| throw new Error('Unknown operation ID: ' + id); | ||
| } | ||
| const clauseMatcher = ResponseClauseMatcher.create(op.responses); | ||
| fetchers[id] = async (init) => { | ||
| const { body: rawBody, encoder, decoder, ...input } = init ?? {}; | ||
| const params = input?.params ?? {}; | ||
| const url = new URL(root + formatPath(op.path, params), typeof document == 'undefined' ? undefined : document.baseURI); | ||
| const paramHeaders = {}; | ||
| for (const [name, val] of Object.entries(params)) { | ||
| switch (op.parameters[name]?.location) { | ||
| case 'header': | ||
| paramHeaders[name] = encodeURIComponent(val); | ||
| break; | ||
| case 'query': | ||
| url.searchParams.set(name, encodeURIComponent(val)); | ||
| break; | ||
| } | ||
| const { body: rawReqBody, encoder, decoder, ...input } = arg ?? {}; | ||
| const params = input?.params ?? {}; | ||
| const url = new URL(root + formatPath(op.path, params), typeof document == 'undefined' ? undefined : document.baseURI); | ||
| const paramHeaders = {}; | ||
| for (const [name, val] of Object.entries(params)) { | ||
| switch (op.parameters[name]?.location) { | ||
| case 'header': | ||
| paramHeaders[name] = encodeURIComponent(val); | ||
| break; | ||
| case 'query': | ||
| url.searchParams.set(name, encodeURIComponent(val)); | ||
| break; | ||
| } | ||
| const accept = init?.headers?.['accept'] ?? DEFAULT_ACCEPT; | ||
| const requestType = init?.headers?.['content-type'] ?? DEFAULT_CONTENT_TYPE; | ||
| const headers = { | ||
| ...baseHeaders, | ||
| ...init?.headers, | ||
| ...paramHeaders, | ||
| 'content-type': requestType, | ||
| accept, | ||
| }; | ||
| let body; | ||
| if (rawBody !== undefined) { | ||
| const encode = encoder ?? encoders.getBest(requestType); | ||
| body = await encode(rawBody, { | ||
| operationId: id, | ||
| contentType: requestType, | ||
| headers, | ||
| options: init?.options, | ||
| }); | ||
| } | ||
| if (body === undefined || body instanceof FormData) { | ||
| delete headers['content-type']; | ||
| } | ||
| const res = await realFetch('' + url, { | ||
| ...base, | ||
| ...input.options, | ||
| } | ||
| const accept = arg?.headers?.['accept'] ?? DEFAULT_ACCEPT; | ||
| const requestType = arg?.headers?.['content-type'] ?? DEFAULT_CONTENT_TYPE; | ||
| const headers = { | ||
| ...baseHeaders, | ||
| ...arg?.headers, | ||
| ...paramHeaders, | ||
| 'content-type': requestType, | ||
| accept, | ||
| }; | ||
| let reqBody; | ||
| if (rawReqBody !== undefined) { | ||
| const encode = encoder ?? encoders.getBest(requestType); | ||
| reqBody = await encode(rawReqBody, { | ||
| operationId: id, | ||
| contentType: requestType, | ||
| headers, | ||
| options: arg?.options, | ||
| }); | ||
| } | ||
| if (reqBody === undefined || reqBody instanceof FormData) { | ||
| delete headers['content-type']; | ||
| } | ||
| const res = await realFetch('' + url, { | ||
| ...base, | ||
| ...input.options, | ||
| headers, | ||
| method: op.method, | ||
| body: reqBody, | ||
| }); | ||
| let resType = res.headers.get('content-type')?.split(';')?.[0] || undefined; | ||
| const accepted = acceptedMimeTypes(accept); | ||
| const { code, declared } = clauseMatcher.getBest(res.status); | ||
| if (!isContentCompatible({ received: resType, declared, accepted })) { | ||
| resType = await coercer(res, { | ||
| path: op.path, | ||
| method: op.method, | ||
| body, | ||
| received: resType, | ||
| declared, | ||
| accepted, | ||
| }); | ||
| let responseType = res.headers.get('content-type')?.split(';')?.[0] || undefined; | ||
| const accepted = acceptedMimeTypes(accept); | ||
| const { code, declared } = clauseMatcher.getBest(res.status); | ||
| if (!isResponseTypeValid({ value: responseType, declared, accepted })) { | ||
| responseType = await coercer(res, { | ||
| path: op.path, | ||
| method: op.method, | ||
| received: responseType, | ||
| declared, | ||
| accepted, | ||
| }); | ||
| } | ||
| let data; | ||
| if (responseType) { | ||
| const decode = decoder ?? decoders.getBest(responseType); | ||
| data = await decode(res, { | ||
| operationId: id, | ||
| contentType: responseType, | ||
| headers, | ||
| options: init?.options, | ||
| }); | ||
| } | ||
| const ret = { code, data }; | ||
| // Add the raw response as non-enumerable property so that it doesn't get | ||
| // displayed in error messages. | ||
| Object.defineProperty(ret, 'raw', { value: res }); | ||
| return ret; | ||
| }; | ||
| } | ||
| let resBody, debug; | ||
| if (resType) { | ||
| const decode = decoder ?? decoders.getBest(resType); | ||
| resBody = await decode(res, { | ||
| operationId: id, | ||
| content: declared?.get(resType) ?? { | ||
| mimeType: resType, | ||
| isBinary: false, | ||
| }, | ||
| headers, | ||
| options: arg?.options, | ||
| }); | ||
| } | ||
| else { | ||
| // We add any response text here to help debug. | ||
| debug = await res.text(); | ||
| } | ||
| const ret = { code, body: resBody, debug }; | ||
| // Add the raw response as non-enumerable property so that it doesn't get | ||
| // displayed in error messages. | ||
| Object.defineProperty(ret, 'raw', { value: res }); | ||
| return ret; | ||
| } | ||
| return fetchers; | ||
| const ret = sdk; | ||
| for (const id of Object.keys(operations)) { | ||
| ret[id] = (arg) => sdk(id, arg); | ||
| } | ||
| return ret; | ||
| } | ||
@@ -295,3 +326,5 @@ function formatPath(p, o) { | ||
| "200": [ | ||
| "text/yaml" | ||
| { | ||
| "mimeType": "text/yaml" | ||
| } | ||
| ] | ||
@@ -311,3 +344,5 @@ } | ||
| "200": [ | ||
| "application/json" | ||
| { | ||
| "mimeType": "application/json" | ||
| } | ||
| ], | ||
@@ -323,3 +358,5 @@ "404": [] | ||
| "200": [ | ||
| "text/graphql" | ||
| { | ||
| "mimeType": "text/graphql" | ||
| } | ||
| ] | ||
@@ -340,7 +377,13 @@ } | ||
| "200": [ | ||
| "application/json" | ||
| { | ||
| "mimeType": "application/json" | ||
| } | ||
| ], | ||
| "default": [ | ||
| "application/json", | ||
| "text/plain" | ||
| { | ||
| "mimeType": "application/json" | ||
| }, | ||
| { | ||
| "mimeType": "text/plain" | ||
| } | ||
| ] | ||
@@ -361,7 +404,40 @@ } | ||
| "200": [ | ||
| { | ||
| "mimeType": "application/json" | ||
| } | ||
| ], | ||
| "default": [ | ||
| { | ||
| "mimeType": "application/json" | ||
| }, | ||
| { | ||
| "mimeType": "text/plain" | ||
| } | ||
| ] | ||
| } | ||
| }, | ||
| "assembleSources": { | ||
| "path": "/sources/assemble", | ||
| "method": "post", | ||
| "parameters": {}, | ||
| "body": { | ||
| "required": true, | ||
| "types": [ | ||
| "application/json" | ||
| ] | ||
| }, | ||
| "responses": { | ||
| "200": [ | ||
| { | ||
| "mimeType": "application/octet-stream", | ||
| "isBinary": true | ||
| } | ||
| ], | ||
| "default": [ | ||
| "application/json", | ||
| "text/plain" | ||
| { | ||
| "mimeType": "application/json" | ||
| }, | ||
| { | ||
| "mimeType": "text/plain" | ||
| } | ||
| ] | ||
@@ -382,7 +458,13 @@ } | ||
| "200": [ | ||
| "application/json" | ||
| { | ||
| "mimeType": "application/json" | ||
| } | ||
| ], | ||
| "default": [ | ||
| "application/json", | ||
| "text/plain" | ||
| { | ||
| "mimeType": "application/json" | ||
| }, | ||
| { | ||
| "mimeType": "text/plain" | ||
| } | ||
| ] | ||
@@ -403,8 +485,17 @@ } | ||
| "200": [ | ||
| "application/json", | ||
| "application/json-seq" | ||
| { | ||
| "mimeType": "application/json" | ||
| }, | ||
| { | ||
| "mimeType": "application/json-seq", | ||
| "isStream": true | ||
| } | ||
| ], | ||
| "default": [ | ||
| "application/json", | ||
| "text/plain" | ||
| { | ||
| "mimeType": "application/json" | ||
| }, | ||
| { | ||
| "mimeType": "text/plain" | ||
| } | ||
| ] | ||
@@ -425,7 +516,13 @@ } | ||
| "200": [ | ||
| "text/plain" | ||
| { | ||
| "mimeType": "text/plain" | ||
| } | ||
| ], | ||
| "default": [ | ||
| "application/json", | ||
| "text/plain" | ||
| { | ||
| "mimeType": "application/json" | ||
| }, | ||
| { | ||
| "mimeType": "text/plain" | ||
| } | ||
| ] | ||
@@ -446,7 +543,13 @@ } | ||
| "200": [ | ||
| "application/json" | ||
| { | ||
| "mimeType": "application/json" | ||
| } | ||
| ], | ||
| "default": [ | ||
| "application/json", | ||
| "text/plain" | ||
| { | ||
| "mimeType": "application/json" | ||
| }, | ||
| { | ||
| "mimeType": "text/plain" | ||
| } | ||
| ] | ||
@@ -467,7 +570,13 @@ } | ||
| "200": [ | ||
| "application/json" | ||
| { | ||
| "mimeType": "application/json" | ||
| } | ||
| ], | ||
| "default": [ | ||
| "application/json", | ||
| "text/plain" | ||
| { | ||
| "mimeType": "application/json" | ||
| }, | ||
| { | ||
| "mimeType": "text/plain" | ||
| } | ||
| ] | ||
@@ -487,8 +596,14 @@ } | ||
| "200": [ | ||
| "application/json" | ||
| { | ||
| "mimeType": "application/json" | ||
| } | ||
| ], | ||
| "404": [], | ||
| "default": [ | ||
| "application/json", | ||
| "text/plain" | ||
| { | ||
| "mimeType": "application/json" | ||
| }, | ||
| { | ||
| "mimeType": "text/plain" | ||
| } | ||
| ] | ||
@@ -508,3 +623,5 @@ } | ||
| "200": [ | ||
| "application/json" | ||
| { | ||
| "mimeType": "application/json" | ||
| } | ||
| ], | ||
@@ -514,4 +631,8 @@ "404": [], | ||
| "default": [ | ||
| "application/json", | ||
| "text/plain" | ||
| { | ||
| "mimeType": "application/json" | ||
| }, | ||
| { | ||
| "mimeType": "text/plain" | ||
| } | ||
| ] | ||
@@ -518,0 +639,0 @@ } |
+10
-9
| { | ||
| "name": "@opvious/api", | ||
| "version": "0.24.1", | ||
| "version": "0.25.0", | ||
| "repository": "github:opvious/api-gateway", | ||
@@ -26,5 +26,5 @@ "description": "API resources", | ||
| "dependencies": { | ||
| "@opvious/stl-errors": "^0.25.4", | ||
| "@opvious/stl-graphql": "^0.25.4", | ||
| "graphql": "16.8.2", | ||
| "@opvious/stl-errors": "^0.25.6", | ||
| "@opvious/stl-graphql": "^0.25.6", | ||
| "graphql": "16.9.0", | ||
| "inlinable-runtime": "^0.3.3" | ||
@@ -41,7 +41,8 @@ }, | ||
| "@graphql-codegen/typescript-operations": "^4.2.1", | ||
| "@opvious/account-operations": "^0.18.1", | ||
| "@opvious/attempt-operations": "^0.18.3", | ||
| "@opvious/formulation-operations": "^0.22.2", | ||
| "abaca": "^0.10.13", | ||
| "abaca-runtime": "^0.10.13", | ||
| "@opvious/account-operations": "^0.18.3", | ||
| "@opvious/attempt-operations": "^0.18.4", | ||
| "@opvious/formulation-operations": "^0.23.1", | ||
| "@opvious/formulation-protos": "^0.23.1", | ||
| "abaca": "^0.15.1", | ||
| "abaca-cli": "^0.15.1", | ||
| "graphql-tag": "^2.12.6", | ||
@@ -48,0 +49,0 @@ "inlinable": "^0.3.3", |
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
614882
1.44%49
2.08%5785
2.55%5
-58.33%21
5%+ Added
- Removed
Updated
Updated
Updated