chore: add mobile app

This commit is contained in:
2026-02-07 22:33:02 +01:00
parent db34640acc
commit e89384ad4e
29327 changed files with 3886944 additions and 12 deletions
@@ -0,0 +1,92 @@
import { CombinedError, Operation, Exchange } from '@urql/core';
/** Input parameters for the {@link retryExchange}. */
interface RetryExchangeOptions {
/** Specify the minimum time to wait until retrying.
*
* @remarks
* `initialDelayMs` specifies the minimum time (in milliseconds) to wait
* until a failed operation is retried.
*
* @defaultValue `1_000` - one second
*/
initialDelayMs?: number;
/** Specifies the maximum time to wait until retrying.
*
* @remarks
* `maxDelayMs` specifies the maximum time (in milliseconds) to wait
* until a failed operation is retried. While `initialDelayMs`
* specifies the minimum amount of time, `randomDelay` may cause
* the delay to increase over multiple attempts.
*
* @defaultValue `15_000` - 15 seconds
*/
maxDelayMs?: number;
/** Enables a random exponential backoff to increase the delay over multiple retries.
*
* @remarks
* `randomDelay`, unless disabled, increases the time until a failed
* operation is retried over multiple attempts. It increases the time
* starting at `initialDelayMs` by 1.5x with an added factor of 01,
* until `maxDelayMs` is reached.
*
* @defaultValue `true` - enables random exponential backoff
*/
randomDelay?: boolean;
/** Specifies the maximum times an operation should be sent to the API.
*
* @remarks
* `maxNumberAttempts` defines the number of attempts an operation should
* be retried until it's considered failed.
*
* @defaultValue `2` - Retry once, i.e. two attempts
*/
maxNumberAttempts?: number;
/** Predicate allowing you to selectively not retry `Operation`s.
*
* @remarks
* `retryIf` is called with a {@link CombinedError} and the {@link Operation} that
* failed. If this function returns false the failed `Operation` is not retried.
*
* @defaultValue `(error) => !!error.networkError` - retries only on network errors.
*/
retryIf?(error: CombinedError, operation: Operation): boolean;
/** Transform function allowing you to selectively replace a retried `Operation` or return nullish value.
*
* @remarks
* `retryWhen` is called with a {@link CombinedError} and the {@link Operation} that
* failed. If this function returns an `Operation`, `retryExchange` will replace the
* failed `Operation` and retry. It won't retry the `Operation` if a nullish value
* is returned.
*
* The `retryIf` function, if defined, takes precedence and overrides this option.
*/
retryWith?(error: CombinedError, operation: Operation): Operation | null | undefined;
}
/** Exchange factory that retries failed operations.
*
* @param options - A {@link RetriesExchangeOptions} configuration object.
* @returns the created retry {@link Exchange}.
*
* @remarks
* The `retryExchange` retries failed operations with specified delays
* and exponential backoff.
*
* You may define a {@link RetryExchangeOptions.retryIf} or
* {@link RetryExchangeOptions.retryWhen} function to only retry
* certain kinds of operations, e.g. only queries.
*
* @example
* ```ts
* retryExchange({
* initialDelayMs: 1000,
* maxDelayMs: 15000,
* randomDelay: true,
* maxNumberAttempts: 2,
* retryIf: err => err && err.networkError,
* });
* ```
*/
declare const retryExchange: (options?: RetryExchangeOptions) => Exchange;
export { RetryExchangeOptions, retryExchange };
@@ -0,0 +1,133 @@
Object.defineProperty(exports, '__esModule', { value: true });
var wonka = require('wonka');
var core = require('@urql/core');
/** Input parameters for the {@link retryExchange}. */
/** Exchange factory that retries failed operations.
*
* @param options - A {@link RetriesExchangeOptions} configuration object.
* @returns the created retry {@link Exchange}.
*
* @remarks
* The `retryExchange` retries failed operations with specified delays
* and exponential backoff.
*
* You may define a {@link RetryExchangeOptions.retryIf} or
* {@link RetryExchangeOptions.retryWhen} function to only retry
* certain kinds of operations, e.g. only queries.
*
* @example
* ```ts
* retryExchange({
* initialDelayMs: 1000,
* maxDelayMs: 15000,
* randomDelay: true,
* maxNumberAttempts: 2,
* retryIf: err => err && err.networkError,
* });
* ```
*/
var retryExchange = (options = {}) => {
var {
retryIf,
retryWith
} = options;
var MIN_DELAY = options.initialDelayMs || 1000;
var MAX_DELAY = options.maxDelayMs || 15_000;
var MAX_ATTEMPTS = options.maxNumberAttempts || 2;
var RANDOM_DELAY = options.randomDelay != null ? !!options.randomDelay : true;
return ({
forward,
dispatchDebug
}) => operations$ => {
var {
source: retry$,
next: nextRetryOperation
} = wonka.makeSubject();
var retryWithBackoff$ = wonka.mergeMap(operation => {
var retry = operation.context.retry || {
count: 0,
delay: null
};
var retryCount = ++retry.count;
var delayAmount = retry.delay || MIN_DELAY;
var backoffFactor = Math.random() + 1.5;
if (RANDOM_DELAY) {
// if randomDelay is enabled and it won't exceed the max delay, apply a random
// amount to the delay to avoid thundering herd problem
if (delayAmount * backoffFactor < MAX_DELAY) {
delayAmount *= backoffFactor;
} else {
delayAmount = MAX_DELAY;
}
} else {
// otherwise, increase the delay proportionately by the initial delay
delayAmount = Math.min(retryCount * MIN_DELAY, MAX_DELAY);
}
// ensure the delay is carried over to the next context
retry.delay = delayAmount;
// We stop the retries if a teardown event for this operation comes in
// But if this event comes through regularly we also stop the retries, since it's
// basically the query retrying itself, no backoff should be added!
var teardown$ = wonka.filter(op => {
return (op.kind === 'query' || op.kind === 'teardown') && op.key === operation.key;
})(operations$);
process.env.NODE_ENV !== 'production' ? dispatchDebug({
type: 'retryAttempt',
message: `The operation has failed and a retry has been triggered (${retryCount} / ${MAX_ATTEMPTS})`,
operation,
data: {
retryCount,
delayAmount
},
"source": "retryExchange"
}) : undefined;
// Add new retryDelay and retryCount to operation
return (
// Stop retry if a teardown comes in
wonka.takeUntil(teardown$)(wonka.debounce(() => delayAmount)(wonka.fromValue(core.makeOperation(operation.kind, operation, {
...operation.context,
retry
}))))
);
})(retry$);
return wonka.filter(res => {
var retry = res.operation.context.retry;
// Only retry if the error passes the conditional retryIf function (if passed)
// or if the error contains a networkError
if (!res.error || (retryIf ? !retryIf(res.error, res.operation) : !retryWith && !res.error.networkError)) {
// Reset the delay state for a successful operation
if (retry) {
retry.count = 0;
retry.delay = null;
}
return true;
}
var maxNumberAttemptsExceeded = (retry && retry.count || 0) >= MAX_ATTEMPTS - 1;
if (!maxNumberAttemptsExceeded) {
var _operation = retryWith ? retryWith(res.error, res.operation) : res.operation;
if (!_operation) return true;
// Send failed responses to be retried by calling next on the retry$ subject
// Exclude operations that have been retried more than the specified max
nextRetryOperation(_operation);
return false;
}
process.env.NODE_ENV !== 'production' ? dispatchDebug({
type: 'retryExhausted',
message: 'Maximum number of retries has been reached. No further retries will be performed.',
operation: res.operation,
"source": "retryExchange"
}) : undefined;
return true;
})(forward(wonka.merge([operations$, retryWithBackoff$])));
};
};
exports.retryExchange = retryExchange;
//# sourceMappingURL=urql-exchange-retry.js.map
@@ -0,0 +1 @@
{"version":3,"file":"urql-exchange-retry.js","sources":["../src/retryExchange.ts"],"sourcesContent":null,"names":["retryExchange","options","retryIf","retryWith","MIN_DELAY","initialDelayMs","MAX_DELAY","maxDelayMs","MAX_ATTEMPTS","maxNumberAttempts","RANDOM_DELAY","randomDelay","forward","dispatchDebug","operations$","source","retry$","next","nextRetryOperation","makeSubject","retryWithBackoff$","mergeMap","operation","retry","context","count","delay","retryCount","delayAmount","backoffFactor","Math","random","min","teardown$","filter","op","kind","key","process","env","NODE_ENV","type","message","data","undefined","takeUntil","debounce","fromValue","makeOperation","res","error","networkError","maxNumberAttemptsExceeded","merge"],"mappings":"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"}
@@ -0,0 +1,76 @@
import { makeSubject as r, mergeMap as e, filter as t, takeUntil as a, debounce as o, fromValue as n, merge as i } from "wonka";
import { makeOperation as u } from "@urql/core";
var retryExchange = (y = {}) => {
var {retryIf: d, retryWith: s} = y;
var l = y.initialDelayMs || 1e3;
var p = y.maxDelayMs || 15e3;
var m = y.maxNumberAttempts || 2;
var c = null != y.randomDelay ? !!y.randomDelay : !0;
return ({forward: y, dispatchDebug: v}) => f => {
var {source: h, next: x} = r();
var E = e((r => {
var e = r.context.retry || {
count: 0,
delay: null
};
var i = ++e.count;
var y = e.delay || l;
var d = Math.random() + 1.5;
if (c) {
if (y * d < p) {
y *= d;
} else {
y = p;
}
} else {
y = Math.min(i * l, p);
}
e.delay = y;
var s = t((e => ("query" === e.kind || "teardown" === e.kind) && e.key === r.key))(f);
"production" !== process.env.NODE_ENV && v({
type: "retryAttempt",
message: `The operation has failed and a retry has been triggered (${i} / ${m})`,
operation: r,
data: {
retryCount: i,
delayAmount: y
},
source: "retryExchange"
});
return a(s)(o((() => y))(n(u(r.kind, r, {
...r.context,
retry: e
}))));
}))(h);
return t((r => {
var e = r.operation.context.retry;
if (!(r.error && (d ? d(r.error, r.operation) : s || r.error.networkError))) {
if (e) {
e.count = 0;
e.delay = null;
}
return !0;
}
if (!((e && e.count || 0) >= m - 1)) {
var t = s ? s(r.error, r.operation) : r.operation;
if (!t) {
return !0;
}
x(t);
return !1;
}
"production" !== process.env.NODE_ENV && v({
type: "retryExhausted",
message: "Maximum number of retries has been reached. No further retries will be performed.",
operation: r.operation,
source: "retryExchange"
});
return !0;
}))(y(i([ f, E ])));
};
};
export { retryExchange };
//# sourceMappingURL=urql-exchange-retry.mjs.map
@@ -0,0 +1 @@
{"version":3,"file":"urql-exchange-retry.mjs","sources":["../src/retryExchange.ts"],"sourcesContent":null,"names":["retryExchange","options","retryIf","retryWith","MIN_DELAY","initialDelayMs","MAX_DELAY","maxDelayMs","MAX_ATTEMPTS","maxNumberAttempts","RANDOM_DELAY","randomDelay","forward","dispatchDebug","operations$","source","retry$","next","nextRetryOperation","makeSubject","retryWithBackoff$","mergeMap","operation","retry","context","count","delay","retryCount","delayAmount","backoffFactor","Math","random","min","teardown$","filter","op","kind","key","process","env","NODE_ENV","type","message","data","takeUntil","debounce","fromValue","makeOperation","res","error","networkError","merge"],"mappings":";;;;AA8GO,IAAMA,gBAAgBA,CAACC,IAAgC;EAC5D,KAAMC,SAAEA,GAAOC,WAAEA,KAAcF;EAC/B,IAAMG,IAAYH,EAAQI,kBAAkB;EAC5C,IAAMC,IAAYL,EAAQM,cAAc;EACxC,IAAMC,IAAeP,EAAQQ,qBAAqB;EAClD,IAAMC,IACmB,QAAvBT,EAAQU,gBAAwBV,EAAQU,eAAc;EAExD,OAAO,EAAGC,YAASC,sBACjBC;IACE,KAAQC,QAAQC,GAAQC,MAAMC,KAC5BC;IAEF,IAAMC,IAEJC,GAAUC;MACR,IAAMC,IAAoBD,EAAUE,QAAQD,SAAS;QACnDE,OAAO;QACPC,OAAO;;MAGT,IAAMC,MAAeJ,EAAME;MAC3B,IAAIG,IAAcL,EAAMG,SAAStB;MAEjC,IAAMyB,IAAgBC,KAAKC,WAAW;MACtC,IAAIrB;QAGF,IAAIkB,IAAcC,IAAgBvB;UAChCsB,KAAeC;;UAEfD,IAActB;;;QAIhBsB,IAAcE,KAAKE,IAAIL,IAAavB,GAAWE;;MAIjDiB,EAAMG,QAAQE;MAKd,IAAMK,IAEJC,GAAOC,MAEU,YAAZA,EAAGC,QAAgC,eAAZD,EAAGC,SAC3BD,EAAGE,QAAQf,EAAUe,KAHzBH,CADApB;MASF,iBAAAwB,QAAAC,IAAAC,YAAA3B,EAAc;QACZ4B,MAAM;QACNC,SAAS,4DAA4Df,OAAgBnB;QACrFc;QACAqB,MAAM;UACJhB;UACAC;;QACDb,QAAA;;MAIH,OASE6B,EAAUX,EATZ,CAOEY,GAAS,MAAMjB,GAAfiB,CANAC,EACEC,EAAczB,EAAUc,MAAMd,GAAW;WACpCA,EAAUE;QACbD;;AAEH,OAxDLF,CADAL;IAiEF,OAGEkB,GAAOc;MACL,IAAMzB,IAAQyB,EAAI1B,UAAUE,QAAQD;MAGpC,MACGyB,EAAIC,UACJ/C,IACIA,EAAQ8C,EAAIC,OAAOD,EAAI1B,aACvBnB,KAAc6C,EAAIC,MAAMC,gBAC7B;QAEA,IAAI3B,GAAO;UACTA,EAAME,QAAQ;UACdF,EAAMG,QAAQ;AAChB;QACA,QAAO;AACT;MAIA,OADIH,KAASA,EAAME,SAAU,MAAMjB,IAAe,IAClB;QAC9B,IAAMc,IAAYnB,IACdA,EAAU6C,EAAIC,OAAOD,EAAI1B,aACzB0B,EAAI1B;QACR,KAAKA;UAAW,QAAO;;QAIvBJ,EAAmBI;QACnB,QAAO;AACT;MAEA,iBAAAgB,QAAAC,IAAAC,YAAA3B,EAAc;QACZ4B,MAAM;QACNC,SACE;QACFpB,WAAW0B,EAAI1B;QAASP,QAAA;;MAG1B,QAAO;AAAI,OAvCbmB,CADAtB,EADAuC,EAAM,EAACrC,GAAaM;AAAmB;AA4C1C;;"}