[{"data":1,"prerenderedAt":1591},["ShallowReactive",2],{"docs:\u002Fdocs\u002Ferrors":3,"docs:nav":1544},{"id":4,"title":5,"badge":6,"body":7,"description":48,"extension":1537,"meta":1538,"navigation":364,"order":73,"path":1539,"section":1540,"seo":1541,"stem":1542,"__hash__":1543},"docs\u002Fdocs\u002Ferrors.md","Errors",null,{"type":8,"value":9,"toc":1526},"minimark",[10,24,29,39,49,62,92,95,251,255,279,502,506,714,718,721,834,838,853,859,863,869,875,893,900,904,1299,1306,1310,1418,1422,1429,1515,1522],[11,12,13,14,18,19,23],"p",{},"Error handling on this API has a wrinkle worth knowing about before you write your client. There are\n",[15,16,17],"strong",{},"two body formats",", and one class of endpoint returns failures with a ",[20,21,22],"code",{},"200",".",[25,26,28],"h2",{"id":27},"two-formats","Two formats",[11,30,31,34,35,38],{},[15,32,33],{},"Plain text"," — ",[20,36,37],{},"Content-Type: text\u002Fplain; charset=utf-8",", with a trailing newline. Used by\nauthentication failures, method-not-allowed, and all manifest errors:",[40,41,46],"pre",{"className":42,"code":44,"language":45},[43],"language-text","manifest: not found\n","text",[20,47,44],{"__ignoreMap":48},"",[11,50,51,34,54,57,58,61],{},[15,52,53],{},"JSON",[20,55,56],{},"Content-Type: application\u002Fjson",". Used by ",[20,59,60],{},"prepare-write",", cap rejections, and rate\nlimiting:",[40,63,67],{"className":64,"code":65,"language":66,"meta":48,"style":48},"language-json shiki shiki-themes github-dark-default github-dark-default","{ \"error\": \"redundancy 1.400 \u003C 1.5\" }\n","json",[20,68,69],{"__ignoreMap":48},[70,71,74,78,82,85,89],"span",{"class":72,"line":73},"line",1,[70,75,77],{"class":76},"sb7RM","{ ",[70,79,81],{"class":80},"sV7Mv","\"error\"",[70,83,84],{"class":76},": ",[70,86,88],{"class":87},"skZ57","\"redundancy 1.400 \u003C 1.5\"",[70,90,91],{"class":76}," }\n",[11,93,94],{},"A robust client checks the content type, or simply tries to parse JSON and falls back to the raw\ntext:",[40,96,100],{"className":97,"code":98,"language":99,"meta":48,"style":48},"language-ts shiki shiki-themes github-dark-default github-dark-default","async function readError(res: Response): Promise\u003Cstring> {\n  const text = await res.text()\n  try {\n    const parsed = JSON.parse(text)\n    return parsed.error ?? text\n  } catch {\n    return text.trim()\n  }\n}\n","ts",[20,101,102,146,169,178,200,215,226,239,245],{"__ignoreMap":48},[70,103,104,108,111,115,118,122,125,128,131,133,136,139,143],{"class":72,"line":73},[70,105,107],{"class":106},"srH4v","async",[70,109,110],{"class":106}," function",[70,112,114],{"class":113},"sYGIp"," readError",[70,116,117],{"class":76},"(",[70,119,121],{"class":120},"sAxfE","res",[70,123,124],{"class":106},":",[70,126,127],{"class":120}," Response",[70,129,130],{"class":76},")",[70,132,124],{"class":106},[70,134,135],{"class":120}," Promise",[70,137,138],{"class":76},"\u003C",[70,140,142],{"class":141},"sEQcL","string",[70,144,145],{"class":76},"> {\n",[70,147,149,152,155,158,161,164,166],{"class":72,"line":148},2,[70,150,151],{"class":106},"  const",[70,153,154],{"class":141}," text",[70,156,157],{"class":106}," =",[70,159,160],{"class":106}," await",[70,162,163],{"class":76}," res.",[70,165,45],{"class":113},[70,167,168],{"class":76},"()\n",[70,170,172,175],{"class":72,"line":171},3,[70,173,174],{"class":106},"  try",[70,176,177],{"class":76}," {\n",[70,179,181,184,187,189,192,194,197],{"class":72,"line":180},4,[70,182,183],{"class":106},"    const",[70,185,186],{"class":141}," parsed",[70,188,157],{"class":106},[70,190,191],{"class":141}," JSON",[70,193,23],{"class":76},[70,195,196],{"class":113},"parse",[70,198,199],{"class":76},"(text)\n",[70,201,203,206,209,212],{"class":72,"line":202},5,[70,204,205],{"class":106},"    return",[70,207,208],{"class":76}," parsed.error ",[70,210,211],{"class":106},"??",[70,213,214],{"class":76}," text\n",[70,216,218,221,224],{"class":72,"line":217},6,[70,219,220],{"class":76},"  } ",[70,222,223],{"class":106},"catch",[70,225,177],{"class":76},[70,227,229,231,234,237],{"class":72,"line":228},7,[70,230,205],{"class":106},[70,232,233],{"class":76}," text.",[70,235,236],{"class":113},"trim",[70,238,168],{"class":76},[70,240,242],{"class":72,"line":241},8,[70,243,244],{"class":76},"  }\n",[70,246,248],{"class":72,"line":247},9,[70,249,250],{"class":76},"}\n",[25,252,254],{"id":253},"the-200-with-an-error-case","The 200-with-an-error case",[256,257,260],"app-callout",{"title":258,"tone":259},"Check the body, not only the status","warn",[11,261,262,263,266,267,270,271,274,275,278],{},"Some endpoints write a JSON error object without setting a failure status, so a failed call arrives\nas ",[20,264,265],{},"200 OK"," with ",[20,268,269],{},"{\"error\": \"...\"}"," in the body. ",[20,272,273],{},"res.ok"," is therefore not a sufficient success\ncheck. Always inspect the parsed body for an ",[20,276,277],{},"error"," key. This affects operational endpoints more than\nthe core object path, but a client that checks both is correct everywhere and costs nothing.",[40,280,282],{"className":97,"code":281,"language":99,"meta":48,"style":48},"async function call(method: string, path: string, body?: unknown) {\n  const res = await signedFetch(method, path, body)\n  const text = await res.text()\n\n  if (!res.ok) throw new TesseraError(res.status, await readErrorFrom(text))\n\n  const parsed = text ? JSON.parse(text) : null\n  if (parsed && typeof parsed === 'object' && 'error' in parsed) {\n    throw new TesseraError(res.status, parsed.error) \u002F\u002F 200, but not a success\n  }\n  return parsed\n}\n",[20,283,284,327,344,360,366,401,405,433,467,483,488,497],{"__ignoreMap":48},[70,285,286,288,290,293,295,298,300,303,306,309,311,313,315,318,321,324],{"class":72,"line":73},[70,287,107],{"class":106},[70,289,110],{"class":106},[70,291,292],{"class":113}," call",[70,294,117],{"class":76},[70,296,297],{"class":120},"method",[70,299,124],{"class":106},[70,301,302],{"class":141}," string",[70,304,305],{"class":76},", ",[70,307,308],{"class":120},"path",[70,310,124],{"class":106},[70,312,302],{"class":141},[70,314,305],{"class":76},[70,316,317],{"class":120},"body",[70,319,320],{"class":106},"?:",[70,322,323],{"class":141}," unknown",[70,325,326],{"class":76},") {\n",[70,328,329,331,334,336,338,341],{"class":72,"line":148},[70,330,151],{"class":106},[70,332,333],{"class":141}," res",[70,335,157],{"class":106},[70,337,160],{"class":106},[70,339,340],{"class":113}," signedFetch",[70,342,343],{"class":76},"(method, path, body)\n",[70,345,346,348,350,352,354,356,358],{"class":72,"line":171},[70,347,151],{"class":106},[70,349,154],{"class":141},[70,351,157],{"class":106},[70,353,160],{"class":106},[70,355,163],{"class":76},[70,357,45],{"class":113},[70,359,168],{"class":76},[70,361,362],{"class":72,"line":180},[70,363,365],{"emptyLinePlaceholder":364},true,"\n",[70,367,368,371,374,377,380,383,386,389,392,395,398],{"class":72,"line":202},[70,369,370],{"class":106},"  if",[70,372,373],{"class":76}," (",[70,375,376],{"class":106},"!",[70,378,379],{"class":76},"res.ok) ",[70,381,382],{"class":106},"throw",[70,384,385],{"class":106}," new",[70,387,388],{"class":113}," TesseraError",[70,390,391],{"class":76},"(res.status, ",[70,393,394],{"class":106},"await",[70,396,397],{"class":113}," readErrorFrom",[70,399,400],{"class":76},"(text))\n",[70,402,403],{"class":72,"line":217},[70,404,365],{"emptyLinePlaceholder":364},[70,406,407,409,411,413,416,419,421,423,425,428,430],{"class":72,"line":228},[70,408,151],{"class":106},[70,410,186],{"class":141},[70,412,157],{"class":106},[70,414,415],{"class":76}," text ",[70,417,418],{"class":106},"?",[70,420,191],{"class":141},[70,422,23],{"class":76},[70,424,196],{"class":113},[70,426,427],{"class":76},"(text) ",[70,429,124],{"class":106},[70,431,432],{"class":141}," null\n",[70,434,435,437,440,443,446,449,452,455,458,461,464],{"class":72,"line":241},[70,436,370],{"class":106},[70,438,439],{"class":76}," (parsed ",[70,441,442],{"class":106},"&&",[70,444,445],{"class":106}," typeof",[70,447,448],{"class":76}," parsed ",[70,450,451],{"class":106},"===",[70,453,454],{"class":87}," 'object'",[70,456,457],{"class":106}," &&",[70,459,460],{"class":87}," 'error'",[70,462,463],{"class":106}," in",[70,465,466],{"class":76}," parsed) {\n",[70,468,469,472,474,476,479],{"class":72,"line":247},[70,470,471],{"class":106},"    throw",[70,473,385],{"class":106},[70,475,388],{"class":113},[70,477,478],{"class":76},"(res.status, parsed.error) ",[70,480,482],{"class":481},"sI3U9","\u002F\u002F 200, but not a success\n",[70,484,486],{"class":72,"line":485},10,[70,487,244],{"class":76},[70,489,491,494],{"class":72,"line":490},11,[70,492,493],{"class":106},"  return",[70,495,496],{"class":76}," parsed\n",[70,498,500],{"class":72,"line":499},12,[70,501,250],{"class":76},[25,503,505],{"id":504},"status-codes","Status codes",[507,508,509,525],"table",{},[510,511,512],"thead",{},[513,514,515,519,522],"tr",{},[516,517,518],"th",{},"Status",[516,520,521],{},"Meaning",[516,523,524],{},"Retry?",[526,527,528,548,560,575,588,601,614,627,639,651,664,689,702],"tbody",{},[513,529,530,535,545],{},[531,532,533],"td",{},[20,534,22],{},[531,536,537,538,541,542,544],{},"Success — ",[15,539,540],{},"unless"," the body carries an ",[20,543,277],{}," key.",[531,546,547],{},"—",[513,549,550,555,558],{},[531,551,552],{},[20,553,554],{},"201",[531,556,557],{},"Credential created.",[531,559,547],{},[513,561,562,567,573],{},[531,563,564],{},[20,565,566],{},"204",[531,568,569,570,23],{},"Success, no body. Deletes and ",[20,571,572],{},"auth\u002Fcheck",[531,574,547],{},[513,576,577,582,585],{},[531,578,579],{},[20,580,581],{},"400",[531,583,584],{},"Malformed request: bad JSON, bad hex, invalid geometry, missing slab.",[531,586,587],{},"No — fix the request.",[513,589,590,595,598],{},[531,591,592],{},[20,593,594],{},"401",[531,596,597],{},"Authentication failed.",[531,599,600],{},"Only after re-signing.",[513,602,603,608,611],{},[531,604,605],{},[20,606,607],{},"402",[531,609,610],{},"Storage cap exceeded.",[531,612,613],{},"No — needs a cap change or a deletion.",[513,615,616,621,624],{},[531,617,618],{},[20,619,620],{},"403",[531,622,623],{},"The resource belongs to another account.",[531,625,626],{},"No.",[513,628,629,634,637],{},[531,630,631],{},[20,632,633],{},"404",[531,635,636],{},"Not found for this account.",[531,638,626],{},[513,640,641,646,649],{},[531,642,643],{},[20,644,645],{},"405",[531,647,648],{},"Wrong HTTP method for the path.",[531,650,626],{},[513,652,653,658,661],{},[531,654,655],{},[20,656,657],{},"409",[531,659,660],{},"Slab still referenced by an object.",[531,662,663],{},"After deleting the object.",[513,665,666,671,678],{},[531,667,668],{},[20,669,670],{},"429",[531,672,673,674,677],{},"Rate limited. Account signup answers ",[20,675,676],{},"429 signup_limit"," when the daily new-account cap for the source network is reached.",[531,679,680,681,684,685,688],{},"Yes, after ",[20,682,683],{},"Retry-After","; ",[20,686,687],{},"signup_limit"," only after up to 24 hours.",[513,690,691,696,699],{},[531,692,693],{},[20,694,695],{},"500",[531,697,698],{},"Server-side failure.",[531,700,701],{},"Yes, with backoff.",[513,703,704,709,712],{},[531,705,706],{},[20,707,708],{},"503",[531,710,711],{},"A subsystem is unavailable — often no providers right now.",[531,713,701],{},[25,715,717],{"id":716},"manifest-error-strings","Manifest error strings",[11,719,720],{},"Manifest errors arrive as plain text with these exact bodies. Match on them if you need to branch:",[507,722,723,734],{},[510,724,725],{},[513,726,727,730,732],{},[516,728,729],{},"Body",[516,731,518],{},[516,733,521],{},[526,735,736,750,764,778,792,806,820],{},[513,737,738,743,747],{},[531,739,740],{},[20,741,742],{},"manifest: not found",[531,744,745],{},[20,746,633],{},[531,748,749],{},"No such slab or object for this account.",[513,751,752,757,761],{},[531,753,754],{},[20,755,756],{},"manifest: forbidden for this account",[531,758,759],{},[20,760,620],{},[531,762,763],{},"It exists, but belongs to someone else.",[513,765,766,771,775],{},[531,767,768],{},[20,769,770],{},"manifest: invalid argument",[531,772,773],{},[20,774,581],{},[531,776,777],{},"Malformed field.",[513,779,780,785,789],{},[531,781,782],{},[20,783,784],{},"manifest: invalid erasure coding params",[531,786,787],{},[20,788,581],{},[531,790,791],{},"Geometry, duplicate provider, duplicate root, or key length.",[513,793,794,799,803],{},[531,795,796],{},[20,797,798],{},"manifest: slab still referenced by an object",[531,800,801],{},[20,802,657],{},[531,804,805],{},"Unpin blocked by a live reference.",[513,807,808,813,817],{},[531,809,810],{},[20,811,812],{},"manifest: empty account",[531,814,815],{},[20,816,581],{},[531,818,819],{},"No account resolved from the request.",[513,821,822,827,831],{},[531,823,824],{},[20,825,826],{},"manifest: object references missing slab",[531,828,829],{},[20,830,581],{},[531,832,833],{},"Register the slab first.",[25,835,837],{"id":836},"authentication-errors","Authentication errors",[11,839,840,841,843,844,849,850,23],{},"All ",[20,842,594],{},", all plain text. See\n",[845,846,848],"a",{"href":847},"\u002Fdocs\u002Fauthentication#failure-modes","Authentication § failure modes"," for what each one indicates and\nhow to debug ",[20,851,852],{},"signature mismatch",[40,854,857],{"className":855,"code":856,"language":45},[43],"missing auth params · invalid validUntil · signature expired\ninvalid credential  · unknown credential · invalid signature · signature mismatch\n",[20,858,856],{"__ignoreMap":48},[25,860,862],{"id":861},"rate-limiting","Rate limiting",[40,864,867],{"className":865,"code":866,"language":45},[43],"HTTP\u002F1.1 429 Too Many Requests\nRetry-After: 5\n\n{\"error\":\"rate limited\",\"retryAfter\":5}\n",[20,868,866],{"__ignoreMap":48},[11,870,871,872,874],{},"Honour ",[20,873,683],{},". Provisioning has its own limit with a distinct body:",[40,876,878],{"className":64,"code":877,"language":66,"meta":48,"style":48},"{ \"error\": \"rate limited: max 5 keys per hour\" }\n",[20,879,880],{"__ignoreMap":48},[70,881,882,884,886,888,891],{"class":72,"line":73},[70,883,77],{"class":76},[70,885,81],{"class":80},[70,887,84],{"class":76},[70,889,890],{"class":87},"\"rate limited: max 5 keys per hour\"",[70,892,91],{"class":76},[11,894,895,896,23],{},"See ",[845,897,899],{"href":898},"\u002Fdocs\u002Flimits","Limits",[25,901,903],{"id":902},"a-retry-policy-that-behaves","A retry policy that behaves",[40,905,907],{"className":97,"code":906,"language":99,"meta":48,"style":48},"const RETRYABLE = new Set([429, 500, 502, 503, 504])\n\nasync function withRetry\u003CT>(fn: () => Promise\u003CT>, attempts = 5): Promise\u003CT> {\n  let lastErr: unknown\n  for (let i = 0; i \u003C attempts; i++) {\n    try {\n      return await fn()\n    } catch (err) {\n      lastErr = err\n      const status = (err as TesseraError).status\n      if (!RETRYABLE.has(status)) throw err            \u002F\u002F 4xx: retrying cannot help\n\n      const retryAfter = (err as TesseraError).retryAfter\n      const backoff = retryAfter\n        ? retryAfter * 1000\n        : Math.min(2 ** i * 250, 8000) + Math.random() * 250   \u002F\u002F jitter matters\n      await new Promise((r) => setTimeout(r, backoff))\n    }\n  }\n  throw lastErr\n}\n",[20,908,909,950,954,1011,1024,1056,1063,1075,1085,1095,1116,1144,1148,1167,1180,1195,1248,1274,1280,1285,1294],{"__ignoreMap":48},[70,910,911,914,917,919,921,924,927,929,931,933,935,938,940,942,944,947],{"class":72,"line":73},[70,912,913],{"class":106},"const",[70,915,916],{"class":141}," RETRYABLE",[70,918,157],{"class":106},[70,920,385],{"class":106},[70,922,923],{"class":113}," Set",[70,925,926],{"class":76},"([",[70,928,670],{"class":141},[70,930,305],{"class":76},[70,932,695],{"class":141},[70,934,305],{"class":76},[70,936,937],{"class":141},"502",[70,939,305],{"class":76},[70,941,708],{"class":141},[70,943,305],{"class":76},[70,945,946],{"class":141},"504",[70,948,949],{"class":76},"])\n",[70,951,952],{"class":72,"line":148},[70,953,365],{"emptyLinePlaceholder":364},[70,955,956,958,960,963,965,968,971,974,976,979,982,984,986,988,991,994,996,999,1001,1003,1005,1007,1009],{"class":72,"line":171},[70,957,107],{"class":106},[70,959,110],{"class":106},[70,961,962],{"class":113}," withRetry",[70,964,138],{"class":76},[70,966,967],{"class":120},"T",[70,969,970],{"class":76},">(",[70,972,973],{"class":113},"fn",[70,975,124],{"class":106},[70,977,978],{"class":76}," () ",[70,980,981],{"class":106},"=>",[70,983,135],{"class":120},[70,985,138],{"class":76},[70,987,967],{"class":120},[70,989,990],{"class":76},">, ",[70,992,993],{"class":120},"attempts",[70,995,157],{"class":106},[70,997,998],{"class":141}," 5",[70,1000,130],{"class":76},[70,1002,124],{"class":106},[70,1004,135],{"class":120},[70,1006,138],{"class":76},[70,1008,967],{"class":120},[70,1010,145],{"class":76},[70,1012,1013,1016,1019,1021],{"class":72,"line":180},[70,1014,1015],{"class":106},"  let",[70,1017,1018],{"class":76}," lastErr",[70,1020,124],{"class":106},[70,1022,1023],{"class":141}," unknown\n",[70,1025,1026,1029,1031,1034,1037,1040,1043,1046,1048,1051,1054],{"class":72,"line":202},[70,1027,1028],{"class":106},"  for",[70,1030,373],{"class":76},[70,1032,1033],{"class":106},"let",[70,1035,1036],{"class":76}," i ",[70,1038,1039],{"class":106},"=",[70,1041,1042],{"class":141}," 0",[70,1044,1045],{"class":76},"; i ",[70,1047,138],{"class":106},[70,1049,1050],{"class":76}," attempts; i",[70,1052,1053],{"class":106},"++",[70,1055,326],{"class":76},[70,1057,1058,1061],{"class":72,"line":217},[70,1059,1060],{"class":106},"    try",[70,1062,177],{"class":76},[70,1064,1065,1068,1070,1073],{"class":72,"line":228},[70,1066,1067],{"class":106},"      return",[70,1069,160],{"class":106},[70,1071,1072],{"class":113}," fn",[70,1074,168],{"class":76},[70,1076,1077,1080,1082],{"class":72,"line":241},[70,1078,1079],{"class":76},"    } ",[70,1081,223],{"class":106},[70,1083,1084],{"class":76}," (err) {\n",[70,1086,1087,1090,1092],{"class":72,"line":247},[70,1088,1089],{"class":76},"      lastErr ",[70,1091,1039],{"class":106},[70,1093,1094],{"class":76}," err\n",[70,1096,1097,1100,1103,1105,1108,1111,1113],{"class":72,"line":485},[70,1098,1099],{"class":106},"      const",[70,1101,1102],{"class":141}," status",[70,1104,157],{"class":106},[70,1106,1107],{"class":76}," (err ",[70,1109,1110],{"class":106},"as",[70,1112,388],{"class":120},[70,1114,1115],{"class":76},").status\n",[70,1117,1118,1121,1123,1125,1128,1130,1133,1136,1138,1141],{"class":72,"line":490},[70,1119,1120],{"class":106},"      if",[70,1122,373],{"class":76},[70,1124,376],{"class":106},[70,1126,1127],{"class":141},"RETRYABLE",[70,1129,23],{"class":76},[70,1131,1132],{"class":113},"has",[70,1134,1135],{"class":76},"(status)) ",[70,1137,382],{"class":106},[70,1139,1140],{"class":76}," err            ",[70,1142,1143],{"class":481},"\u002F\u002F 4xx: retrying cannot help\n",[70,1145,1146],{"class":72,"line":499},[70,1147,365],{"emptyLinePlaceholder":364},[70,1149,1151,1153,1156,1158,1160,1162,1164],{"class":72,"line":1150},13,[70,1152,1099],{"class":106},[70,1154,1155],{"class":141}," retryAfter",[70,1157,157],{"class":106},[70,1159,1107],{"class":76},[70,1161,1110],{"class":106},[70,1163,388],{"class":120},[70,1165,1166],{"class":76},").retryAfter\n",[70,1168,1170,1172,1175,1177],{"class":72,"line":1169},14,[70,1171,1099],{"class":106},[70,1173,1174],{"class":141}," backoff",[70,1176,157],{"class":106},[70,1178,1179],{"class":76}," retryAfter\n",[70,1181,1183,1186,1189,1192],{"class":72,"line":1182},15,[70,1184,1185],{"class":106},"        ?",[70,1187,1188],{"class":76}," retryAfter ",[70,1190,1191],{"class":106},"*",[70,1193,1194],{"class":141}," 1000\n",[70,1196,1198,1201,1204,1207,1209,1212,1215,1217,1219,1222,1224,1227,1230,1233,1235,1238,1241,1243,1245],{"class":72,"line":1197},16,[70,1199,1200],{"class":106},"        :",[70,1202,1203],{"class":76}," Math.",[70,1205,1206],{"class":113},"min",[70,1208,117],{"class":76},[70,1210,1211],{"class":141},"2",[70,1213,1214],{"class":106}," **",[70,1216,1036],{"class":76},[70,1218,1191],{"class":106},[70,1220,1221],{"class":141}," 250",[70,1223,305],{"class":76},[70,1225,1226],{"class":141},"8000",[70,1228,1229],{"class":76},") ",[70,1231,1232],{"class":106},"+",[70,1234,1203],{"class":76},[70,1236,1237],{"class":113},"random",[70,1239,1240],{"class":76},"() ",[70,1242,1191],{"class":106},[70,1244,1221],{"class":141},[70,1246,1247],{"class":481},"   \u002F\u002F jitter matters\n",[70,1249,1251,1254,1256,1258,1261,1264,1266,1268,1271],{"class":72,"line":1250},17,[70,1252,1253],{"class":106},"      await",[70,1255,385],{"class":106},[70,1257,135],{"class":141},[70,1259,1260],{"class":76},"((",[70,1262,1263],{"class":120},"r",[70,1265,1229],{"class":76},[70,1267,981],{"class":106},[70,1269,1270],{"class":113}," setTimeout",[70,1272,1273],{"class":76},"(r, backoff))\n",[70,1275,1277],{"class":72,"line":1276},18,[70,1278,1279],{"class":76},"    }\n",[70,1281,1283],{"class":72,"line":1282},19,[70,1284,244],{"class":76},[70,1286,1288,1291],{"class":72,"line":1287},20,[70,1289,1290],{"class":106},"  throw",[70,1292,1293],{"class":76}," lastErr\n",[70,1295,1297],{"class":72,"line":1296},21,[70,1298,250],{"class":76},[11,1300,1301,1302,1305],{},"Two things this gets right that naive retry loops do not: it refuses to retry ",[20,1303,1304],{},"4xx"," responses, where\nthe answer will not change, and it adds jitter, so a fleet of clients recovering from an outage does\nnot synchronise into a thundering herd.",[25,1307,1309],{"id":1308},"errors-worth-special-handling","Errors worth special handling",[507,1311,1312,1322],{},[510,1313,1314],{},[513,1315,1316,1319],{},[516,1317,1318],{},"Situation",[516,1320,1321],{},"Right response",[526,1323,1324,1337,1348,1358,1381,1395,1405],{},[513,1325,1326,1334],{},[531,1327,1328,1331,1332],{},[20,1329,1330],{},"503 no contracted hosts available"," from ",[20,1333,60],{},[531,1335,1336],{},"Backoff and retry. Transient provider availability, not a client bug.",[513,1338,1339,1342],{},[531,1340,1341],{},"Shard write fails at a provider",[531,1343,1344,1345,1347],{},"Get a replacement provider from ",[20,1346,60],{},"; do not retry the same one indefinitely.",[513,1349,1350,1355],{},[531,1351,1352],{},[20,1353,1354],{},"402 storage cap exceeded",[531,1356,1357],{},"Stop, alert an operator. Never retry on a loop.",[513,1359,1360,1370],{},[531,1361,1362,1365,1366,1369],{},[20,1363,1364],{},"400 altcha_required"," \u002F ",[20,1367,1368],{},"altcha_invalid"," on signup",[531,1371,1372,1373,1376,1377,1380],{},"Fetch a fresh ",[20,1374,1375],{},"GET \u002Fauth\u002Faltcha-challenge",", solve it, and resend with ",[20,1378,1379],{},"X-Altcha",". Solutions are single use.",[513,1382,1383,1388],{},[531,1384,1385],{},[20,1386,1387],{},"401 signature expired",[531,1389,1390,1391,1394],{},"Re-sign with a fresh ",[20,1392,1393],{},"validUntil",". If it recurs, check clock skew on your host.",[513,1396,1397,1402],{},[531,1398,1399],{},[20,1400,1401],{},"409 slab still referenced",[531,1403,1404],{},"Delete referencing objects, then prune.",[513,1406,1407,1415],{},[531,1408,1409,1411,1412,1414],{},[20,1410,22],{}," with an ",[20,1413,277],{}," key",[531,1416,1417],{},"Treat as the failure it is; log the endpoint, since this is the easiest failure to swallow accidentally.",[25,1419,1421],{"id":1420},"transfer-errors-from-the-cli","Transfer errors from the CLI",[11,1423,1424,1425,1428],{},"Before each upload or download, ",[20,1426,1427],{},"tessera"," checks that enough storage providers are reachable and\nfunded, and names the cause when a transfer cannot run. These are the messages and what to do:",[507,1430,1431,1444],{},[510,1432,1433],{},[513,1434,1435,1438,1441],{},[516,1436,1437],{},"Message",[516,1439,1440],{},"Cause",[516,1442,1443],{},"Fix",[526,1445,1446,1459,1481,1498],{},[513,1447,1448,1453,1456],{},[531,1449,1450],{},[20,1451,1452],{},"only X of the 30 needed hosts are reachable from your network",[531,1454,1455],{},"A firewall, VPN, proxy or sandbox blocks direct outbound TCP to the providers (siamux, on the port each one announces, usually 9984).",[531,1457,1458],{},"Allow outbound TCP to the providers, or run from a network that does. Host lists carry IP addresses, so fake-IP DNS sandboxes work; HTTP(S)-only networks do not.",[513,1460,1461,1466,1469],{},[531,1462,1463],{},[20,1464,1465],{},"insufficient balance",[531,1467,1468],{},"The technical validation is used and the balance is too low.",[531,1470,1471,1472,1476,1477,23],{},"Add funds. See ",[845,1473,1475],{"href":1474},"\u002Fdocs\u002Faccounts#top-ups","Top-ups"," or ",[845,1478,1480],{"href":1479},"\u002Fwallet","Wallet",[513,1482,1483,1488,1491],{},[531,1484,1485],{},[20,1486,1487],{},"account not ready yet",[531,1489,1490],{},"Host funding has not landed within the wait (2 minutes, or 45 seconds without progress).",[531,1492,1493,1494,1497],{},"Retry in a minute; ",[20,1495,1496],{},"tessera account --json"," shows the readiness state.",[513,1499,1500,1506,1509],{},[531,1501,1502,1505],{},[20,1503,1504],{},"not found"," (download)",[531,1507,1508],{},"No file with that name in your index.",[531,1510,1511,1514],{},[20,1512,1513],{},"tessera list"," shows the stored names.",[11,1516,1517,1518,1521],{},"Read-only requests retry on dropped connections (a bare ",[20,1519,1520],{},"EOF",", a reset) before failing. Error output\nnever includes URL query strings, which carry request signatures.",[1523,1524,1525],"style",{},"html pre.shiki code .sb7RM, html code.shiki .sb7RM{--shiki-default:#E6EDF3;--shiki-dark:#E6EDF3}html pre.shiki code .sV7Mv, html code.shiki .sV7Mv{--shiki-default:#7EE787;--shiki-dark:#7EE787}html pre.shiki code .skZ57, html code.shiki .skZ57{--shiki-default:#A5D6FF;--shiki-dark:#A5D6FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .srH4v, html code.shiki .srH4v{--shiki-default:#FF7B72;--shiki-dark:#FF7B72}html pre.shiki code .sYGIp, html code.shiki .sYGIp{--shiki-default:#D2A8FF;--shiki-dark:#D2A8FF}html pre.shiki code .sAxfE, html code.shiki .sAxfE{--shiki-default:#FFA657;--shiki-dark:#FFA657}html pre.shiki code .sEQcL, html code.shiki .sEQcL{--shiki-default:#79C0FF;--shiki-dark:#79C0FF}html pre.shiki code .sI3U9, html code.shiki .sI3U9{--shiki-default:#8B949E;--shiki-dark:#8B949E}",{"title":48,"searchDepth":171,"depth":171,"links":1527},[1528,1529,1530,1531,1532,1533,1534,1535,1536],{"id":27,"depth":148,"text":28},{"id":253,"depth":148,"text":254},{"id":504,"depth":148,"text":505},{"id":716,"depth":148,"text":717},{"id":836,"depth":148,"text":837},{"id":861,"depth":148,"text":862},{"id":902,"depth":148,"text":903},{"id":1308,"depth":148,"text":1309},{"id":1420,"depth":148,"text":1421},"md",{},"\u002Fdocs\u002Ferrors","Reference",{"title":5,"description":48},"docs\u002Ferrors","us4ZF2ZbD0XqL2UyiMZN5K68mOKV7fVKsNBPtaJU51M",[1545,1549,1554,1558,1561,1564,1567,1570,1573,1577,1578,1581,1583,1588],{"path":1546,"title":1547,"description":48,"section":1548,"order":148,"badge":6},"\u002Fdocs\u002Faccounts","Accounts & billing","Guides",{"path":1550,"title":1551,"description":1552,"section":1553,"order":73,"badge":6},"\u002Fdocs\u002Fapi-quickstart","API quickstart","Create a billing account over HTTP, then register a storage key with the SDK.","API",{"path":1555,"title":1556,"description":48,"section":1557,"order":202,"badge":6},"\u002Fdocs\u002Fapi\u002Faccount","Account","API reference",{"path":1559,"title":1560,"description":48,"section":1557,"order":180,"badge":6},"\u002Fdocs\u002Fapi\u002Fobjects","Objects",{"path":1562,"title":1563,"description":48,"section":1557,"order":148,"badge":6},"\u002Fdocs\u002Fapi\u002Fplacement","Placement",{"path":1565,"title":1566,"description":48,"section":1557,"order":73,"badge":6},"\u002Fdocs\u002Fapi\u002Fprovisioning","Credentials",{"path":1568,"title":1569,"description":48,"section":1557,"order":171,"badge":6},"\u002Fdocs\u002Fapi\u002Fslabs","Slabs",{"path":1571,"title":1572,"description":48,"section":1548,"order":171,"badge":6},"\u002Fdocs\u002Fauthentication","Authentication",{"path":1574,"title":1575,"description":48,"section":1576,"order":148,"badge":6},"\u002Fdocs\u002Fconcepts","Concepts & data model","Introduction",{"path":1539,"title":5,"description":48,"section":1540,"order":73,"badge":6},{"path":1579,"title":1580,"description":48,"section":1553,"order":73,"badge":6},"\u002Fdocs","Overview",{"path":898,"title":1582,"description":48,"section":1540,"order":148,"badge":6},"Limits & quotas",{"path":1584,"title":1585,"description":1586,"section":1587,"order":73,"badge":6},"\u002Fdocs\u002Fquickstart","CLI quickstart","Install the CLI, create an account, store one file, and read it back.","CLI",{"path":1589,"title":1590,"description":48,"section":1548,"order":180,"badge":6},"\u002Fdocs\u002Frecovery","Recovery without Tessera",1794060205043]