@milaboratories/pl-client 3.11.5 → 3.12.0
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/core/PromiseTracker.cjs.map +1 -1
- package/dist/core/PromiseTracker.d.ts.map +1 -1
- package/dist/core/PromiseTracker.js.map +1 -1
- package/dist/core/StatefulPromise.cjs +2 -0
- package/dist/core/StatefulPromise.cjs.map +1 -1
- package/dist/core/StatefulPromise.js +2 -0
- package/dist/core/StatefulPromise.js.map +1 -1
- package/dist/core/abstract_stream.d.ts +1 -1
- package/dist/core/advisory_locks.cjs.map +1 -1
- package/dist/core/advisory_locks.js.map +1 -1
- package/dist/core/auth.cjs.map +1 -1
- package/dist/core/auth.d.ts.map +1 -1
- package/dist/core/auth.js.map +1 -1
- package/dist/core/cache.d.ts.map +1 -1
- package/dist/core/capabilities.cjs.map +1 -1
- package/dist/core/capabilities.d.ts.map +1 -1
- package/dist/core/capabilities.js.map +1 -1
- package/dist/core/client.cjs +3 -3
- package/dist/core/client.cjs.map +1 -1
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/client.js +2 -2
- package/dist/core/client.js.map +1 -1
- package/dist/core/config.cjs.map +1 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js.map +1 -1
- package/dist/core/default_client.cjs +5 -5
- package/dist/core/default_client.cjs.map +1 -1
- package/dist/core/default_client.d.ts.map +1 -1
- package/dist/core/default_client.js.map +1 -1
- package/dist/core/driver.cjs.map +1 -1
- package/dist/core/driver.d.ts.map +1 -1
- package/dist/core/driver.js.map +1 -1
- package/dist/core/error_resource.cjs.map +1 -1
- package/dist/core/error_resource.js.map +1 -1
- package/dist/core/errors.cjs +10 -11
- package/dist/core/errors.cjs.map +1 -1
- package/dist/core/errors.d.ts.map +1 -1
- package/dist/core/errors.js +10 -10
- package/dist/core/errors.js.map +1 -1
- package/dist/core/final.cjs +2 -1
- package/dist/core/final.cjs.map +1 -1
- package/dist/core/final.d.ts.map +1 -1
- package/dist/core/final.js.map +1 -1
- package/dist/core/ll_client.cjs +14 -9
- package/dist/core/ll_client.cjs.map +1 -1
- package/dist/core/ll_client.d.ts +1 -0
- package/dist/core/ll_client.d.ts.map +1 -1
- package/dist/core/ll_client.js +15 -9
- package/dist/core/ll_client.js.map +1 -1
- package/dist/core/ll_transaction.cjs +3 -1
- package/dist/core/ll_transaction.cjs.map +1 -1
- package/dist/core/ll_transaction.d.ts +1 -1
- package/dist/core/ll_transaction.d.ts.map +1 -1
- package/dist/core/ll_transaction.js +2 -1
- package/dist/core/ll_transaction.js.map +1 -1
- package/dist/core/stat.cjs.map +1 -1
- package/dist/core/stat.js.map +1 -1
- package/dist/core/transaction.cjs +11 -5
- package/dist/core/transaction.cjs.map +1 -1
- package/dist/core/transaction.d.ts.map +1 -1
- package/dist/core/transaction.js +11 -4
- package/dist/core/transaction.js.map +1 -1
- package/dist/core/tree_filter.cjs +73 -18
- package/dist/core/tree_filter.cjs.map +1 -1
- package/dist/core/tree_filter.d.ts +1 -1
- package/dist/core/tree_filter.d.ts.map +1 -1
- package/dist/core/tree_filter.js +72 -19
- package/dist/core/tree_filter.js.map +1 -1
- package/dist/core/type_conversion.cjs +19 -20
- package/dist/core/type_conversion.cjs.map +1 -1
- package/dist/core/type_conversion.js +19 -19
- package/dist/core/type_conversion.js.map +1 -1
- package/dist/core/types.cjs +2 -3
- package/dist/core/types.cjs.map +1 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js +2 -2
- package/dist/core/types.js.map +1 -1
- package/dist/core/unauth_client.cjs +7 -6
- package/dist/core/unauth_client.cjs.map +1 -1
- package/dist/core/unauth_client.d.ts +9 -0
- package/dist/core/unauth_client.d.ts.map +1 -1
- package/dist/core/unauth_client.js +7 -5
- package/dist/core/unauth_client.js.map +1 -1
- package/dist/core/user_resources.cjs +3 -1
- package/dist/core/user_resources.cjs.map +1 -1
- package/dist/core/user_resources.d.ts.map +1 -1
- package/dist/core/user_resources.js +3 -0
- package/dist/core/user_resources.js.map +1 -1
- package/dist/core/websocket_stream.cjs +17 -20
- package/dist/core/websocket_stream.cjs.map +1 -1
- package/dist/core/websocket_stream.js +16 -19
- package/dist/core/websocket_stream.js.map +1 -1
- package/dist/core/wire.d.ts.map +1 -1
- package/dist/helpers/pl.cjs +25 -0
- package/dist/helpers/pl.cjs.map +1 -1
- package/dist/helpers/pl.d.ts +1 -1
- package/dist/helpers/pl.d.ts.map +1 -1
- package/dist/helpers/pl.js +1 -1
- package/dist/helpers/pl.js.map +1 -1
- package/dist/helpers/poll.cjs +5 -1
- package/dist/helpers/poll.cjs.map +1 -1
- package/dist/helpers/poll.d.ts.map +1 -1
- package/dist/helpers/poll.js +4 -0
- package/dist/helpers/poll.js.map +1 -1
- package/dist/helpers/retry_strategy.cjs +1 -0
- package/dist/helpers/retry_strategy.cjs.map +1 -1
- package/dist/helpers/retry_strategy.js +1 -1
- package/dist/helpers/retry_strategy.js.map +1 -1
- package/dist/helpers/tx_helpers.cjs +0 -1
- package/dist/helpers/tx_helpers.cjs.map +1 -1
- package/dist/helpers/tx_helpers.d.ts.map +1 -1
- package/dist/helpers/tx_helpers.js.map +1 -1
- package/dist/index.cjs +0 -1
- package/dist/index.d.ts +1 -1
- package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.cjs +0 -1
- package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.cjs.map +1 -1
- package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.d.ts.map +1 -1
- package/dist/proto-grpc/github.com/googleapis/googleapis/google/rpc/status.js.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.cjs +531 -77
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.cjs.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.cjs +11 -4
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.cjs.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.d.ts +12 -6
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.d.ts.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.js +11 -3
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.js.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.d.ts +106 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.d.ts.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.js +330 -77
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.js.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.cjs +23 -7
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.cjs.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.d.ts +10 -3
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.d.ts.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.js +18 -7
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.js.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.cjs +1 -2
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.cjs.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.d.ts.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.js +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/base_types.js.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.cjs +2 -2
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.cjs.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.d.ts +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.d.ts.map +1 -1
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.js +2 -2
- package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/resource_types.js.map +1 -1
- package/dist/proto-grpc/google/protobuf/any.cjs +1 -2
- package/dist/proto-grpc/google/protobuf/any.cjs.map +1 -1
- package/dist/proto-grpc/google/protobuf/any.d.ts.map +1 -1
- package/dist/proto-grpc/google/protobuf/any.js +1 -1
- package/dist/proto-grpc/google/protobuf/any.js.map +1 -1
- package/dist/proto-grpc/google/protobuf/duration.cjs +0 -1
- package/dist/proto-grpc/google/protobuf/duration.cjs.map +1 -1
- package/dist/proto-grpc/google/protobuf/duration.d.ts.map +1 -1
- package/dist/proto-grpc/google/protobuf/duration.js.map +1 -1
- package/dist/proto-grpc/google/protobuf/timestamp.cjs +0 -1
- package/dist/proto-grpc/google/protobuf/timestamp.cjs.map +1 -1
- package/dist/proto-grpc/google/protobuf/timestamp.d.ts.map +1 -1
- package/dist/proto-grpc/google/protobuf/timestamp.js.map +1 -1
- package/dist/proto-grpc/google/rpc/code.d.ts.map +1 -1
- package/dist/proto-rest/index.cjs +1 -1
- package/dist/proto-rest/index.cjs.map +1 -1
- package/dist/proto-rest/index.d.ts +1 -1
- package/dist/proto-rest/index.d.ts.map +1 -1
- package/dist/proto-rest/index.js.map +1 -1
- package/dist/proto-rest/plapi.d.ts +30 -9
- package/dist/proto-rest/plapi.d.ts.map +1 -1
- package/dist/test/tcp-proxy.cjs +2 -2
- package/dist/test/tcp-proxy.cjs.map +1 -1
- package/dist/test/tcp-proxy.d.ts +1 -1
- package/dist/test/tcp-proxy.js.map +1 -1
- package/dist/test/test_config.cjs +8 -2
- package/dist/test/test_config.cjs.map +1 -1
- package/dist/test/test_config.d.ts +1 -1
- package/dist/test/test_config.d.ts.map +1 -1
- package/dist/test/test_config.js +1 -1
- package/dist/test/test_config.js.map +1 -1
- package/dist/util/pl.cjs.map +1 -1
- package/dist/util/pl.js.map +1 -1
- package/dist/util/util.cjs.map +1 -1
- package/dist/util/util.js.map +1 -1
- package/package.json +4 -4
- package/src/core/ll_client.ts +7 -2
- package/src/core/unauth_client.ts +17 -2
- package/src/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.client.ts +16 -3
- package/src/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.ts +326 -3
- package/src/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api_types.ts +21 -7
- package/src/proto-rest/plapi.ts +29 -8
- package/dist/proto-grpc/google/rpc/code.cjs +0 -224
- package/dist/proto-grpc/google/rpc/code.cjs.map +0 -1
- package/dist/proto-grpc/google/rpc/code.js +0 -224
- package/dist/proto-grpc/google/rpc/code.js.map +0 -1
package/dist/core/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","names":[],"sources":["../../src/core/config.ts"],"sourcesContent":["import type { ProxySettings } from \"@milaboratories/pl-http\";\nimport type { ExponentialBackoffRetryOptions } from \"@milaboratories/ts-helpers\";\n\nexport const SUPPORTED_WIRE_PROTOCOLS = [\"grpc\", \"rest\"] as const;\nexport type wireProtocol = (typeof SUPPORTED_WIRE_PROTOCOLS)[number];\n\n/** Base configuration structure for PL client */\nexport interface PlClientConfig {\n /** Port and host of remote pl server */\n hostAndPort: string;\n\n /** Type of wire connection (protocol server uses for communication) */\n wireProtocol?: wireProtocol;\n\n /** If set, client will expose a nested object under a field with name `alternative_root_${alternativeRoot}` as a\n * client root. */\n alternativeRoot?: string;\n\n /** If true, client will establish tls connection to the server, using default\n * CA of node instance. */\n // Not implementing custom ssl validation logic for now.\n // Implementing it in a correct way is really nontrivial thing,\n // real use-cases should be considered.\n ssl: boolean;\n\n /** Default timeout in milliseconds for unary calls, like ping and login. */\n defaultRequestTimeout: number;\n\n /** Default timeout in milliseconds for read-write transaction, should be\n * adjusted for long round-trip or low bandwidth connections. */\n defaultRWTransactionTimeout: number;\n /** Default timeout in milliseconds for read-only transaction, should be\n * adjusted for long round-trip or low bandwidth connections. */\n defaultROTransactionTimeout: number;\n\n /** Controls what TTL will be requested from the server, when new JWT token\n * is requested. */\n authTTLSeconds: number;\n /** If token is older than this time, it will be refreshed regardless of its\n * expiration time. */\n authMaxRefreshSeconds: number;\n\n /** Proxy server config to use for pl connection. */\n grpcProxy?: string | ProxySettings;\n /** Proxy server config to use for http connections of pl drivers, like file\n * downloading. */\n httpProxy?: string | ProxySettings;\n\n /** Username extracted from pl URL. Ignored by {@link PlClient}, picked up by {@link defaultPlClient}. */\n user?: string;\n /** Password extracted from pl URL. Ignored by {@link PlClient}, picked up by {@link defaultPlClient}. */\n password?: string;\n\n /** Artificial delay introduced after write transactions completion, to\n * somewhat throttle the load on pl. Delay introduced after sync, if requested. */\n txDelay: number;\n\n /** Last resort measure to solve complicated race conditions in pl. */\n forceSync: boolean;\n\n /** Maximal number of bytes of resource state to cache */\n maxCacheBytes: number;\n\n //\n // Retry\n //\n\n /**\n * What type of backoff strategy to use in transaction retries\n * (pl uses optimistic transaction model with regular retries in write transactions)\n */\n retryBackoffAlgorithm: \"exponential\" | \"linear\";\n\n /** Maximal number of attempts in */\n retryMaxAttempts: number;\n\n /** Delay after first failed attempt, in ms. */\n retryInitialDelay: number;\n\n /** Each time delay will be multiplied by this number (1.5 means plus on 50% each attempt) */\n retryExponentialBackoffMultiplier: number;\n\n /** [used only for ] This value will be added to the delay from the previous step, in ms */\n retryLinearBackoffStep: number;\n\n /** Value from 0 to 1, determine level of randomness to introduce to the backoff delays sequence. (0 meaning no randomness) */\n retryJitter: number;\n}\n\nexport const DEFAULT_REQUEST_TIMEOUT = 5_000;\nexport const DEFAULT_RO_TX_TIMEOUT = 300_000;\nexport const DEFAULT_RW_TX_TIMEOUT = 60_000;\nexport const DEFAULT_TOKEN_TTL_SECONDS = 31 * 24 * 60 * 60;\nexport const DEFAULT_AUTH_MAX_REFRESH = 12 * 24 * 60 * 60;\n\nexport const DEFAULT_MAX_CACHE_BYTES = 128_000_000; // 128 Mb\n\nexport const DEFAULT_RETRY_BACKOFF_ALGORITHM = \"exponential\";\nexport const DEFAULT_RETRY_MAX_ATTEMPTS = 21; // 1st attempt + 20 retries\nexport const DEFAULT_RETRY_INITIAL_DELAY = 20; // 20 ms * <jitter> of sleep after first failure\nexport const DEFAULT_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER = 1.5; // + 50% on each round\nexport const DEFAULT_RETRY_LINEAR_BACKOFF_STEP = 50; // + 50 ms\nexport const DEFAULT_RETRY_JITTER = 0.3; // 30%\n\nexport const DefaultRetryOptions: ExponentialBackoffRetryOptions = {\n type: \"exponentialBackoff\",\n maxAttempts: DEFAULT_RETRY_MAX_ATTEMPTS,\n initialDelay: DEFAULT_RETRY_INITIAL_DELAY,\n backoffMultiplier: DEFAULT_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER,\n jitter: DEFAULT_RETRY_JITTER,\n};\n\ntype PlConfigOverrides = Partial<\n Pick<\n PlClientConfig,\n | \"ssl\"\n | \"defaultRequestTimeout\"\n | \"defaultROTransactionTimeout\"\n | \"defaultRWTransactionTimeout\"\n | \"httpProxy\"\n | \"grpcProxy\"\n >\n>;\n\nfunction parseInt(s: string | null | undefined): number | undefined {\n if (!s) return undefined;\n const num = Number(s);\n if (Number.isNaN(num)) throw new Error(`Can't parse number: ${s}`);\n return num;\n}\n\n/** Parses pl url and creates a config object that can be passed to\n * {@link PlClient} of {@link UnauthenticatedPlClient}. */\nexport function plAddressToConfig(\n address: string,\n overrides: PlConfigOverrides = {},\n): PlClientConfig {\n if (address.indexOf(\"://\") === -1)\n // non-url address\n return {\n hostAndPort: address,\n ssl: false,\n defaultRequestTimeout: DEFAULT_REQUEST_TIMEOUT,\n defaultROTransactionTimeout: DEFAULT_RO_TX_TIMEOUT,\n defaultRWTransactionTimeout: DEFAULT_RW_TX_TIMEOUT,\n authTTLSeconds: DEFAULT_TOKEN_TTL_SECONDS,\n authMaxRefreshSeconds: DEFAULT_AUTH_MAX_REFRESH,\n txDelay: 0,\n forceSync: false,\n\n maxCacheBytes: DEFAULT_MAX_CACHE_BYTES,\n\n retryBackoffAlgorithm: DEFAULT_RETRY_BACKOFF_ALGORITHM,\n retryMaxAttempts: DEFAULT_RETRY_MAX_ATTEMPTS,\n retryInitialDelay: DEFAULT_RETRY_INITIAL_DELAY,\n retryExponentialBackoffMultiplier: DEFAULT_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER,\n retryLinearBackoffStep: DEFAULT_RETRY_LINEAR_BACKOFF_STEP,\n retryJitter: DEFAULT_RETRY_JITTER,\n\n ...overrides,\n };\n\n const url = new URL(address);\n\n if (\n url.protocol !== \"https:\" &&\n url.protocol !== \"http:\" &&\n url.protocol !== \"grpc:\" &&\n url.protocol !== \"tls:\"\n )\n throw new Error(`Unexpected URL schema: ${url.protocol}`);\n\n if (url.pathname !== \"/\" && url.pathname !== \"\")\n throw new Error(`Unexpected URL path: ${url.pathname}`);\n\n let port = url.port;\n if (!port) {\n switch (url.protocol) {\n case \"http:\":\n port = \"80\";\n break;\n case \"https:\":\n port = \"443\";\n break;\n default:\n throw new Error(`Port must be specified explicitly for ${url.protocol} protocol.`);\n }\n }\n\n return {\n hostAndPort: `${url.hostname}:${port}`,\n alternativeRoot: url.searchParams.get(\"alternative-root\") ?? undefined,\n ssl: url.protocol === \"https:\" || url.protocol === \"tls:\",\n\n wireProtocol: (url.searchParams.get(\"wire-protocol\") as wireProtocol) ?? undefined,\n\n defaultRequestTimeout:\n parseInt(url.searchParams.get(\"request-timeout\")) ?? DEFAULT_REQUEST_TIMEOUT,\n defaultROTransactionTimeout:\n parseInt(url.searchParams.get(\"ro-tx-timeout\")) ??\n parseInt(url.searchParams.get(\"tx-timeout\")) ??\n DEFAULT_RO_TX_TIMEOUT,\n defaultRWTransactionTimeout:\n parseInt(url.searchParams.get(\"rw-tx-timeout\")) ??\n parseInt(url.searchParams.get(\"tx-timeout\")) ??\n DEFAULT_RW_TX_TIMEOUT,\n authTTLSeconds: DEFAULT_TOKEN_TTL_SECONDS,\n authMaxRefreshSeconds: DEFAULT_AUTH_MAX_REFRESH,\n grpcProxy: url.searchParams.get(\"grpc-proxy\") ?? undefined,\n httpProxy: url.searchParams.get(\"http-proxy\") ?? undefined,\n user: url.username === \"\" ? undefined : url.username,\n password: url.password === \"\" ? undefined : url.password,\n txDelay: parseInt(url.searchParams.get(\"tx-delay\")) ?? 0,\n forceSync: Boolean(url.searchParams.get(\"force-sync\")),\n\n maxCacheBytes: parseInt(url.searchParams.get(\"max-cache-bytes\")) ?? DEFAULT_MAX_CACHE_BYTES,\n\n retryBackoffAlgorithm: (url.searchParams.get(\"retry-backoff-algorithm\") ??\n DEFAULT_RETRY_BACKOFF_ALGORITHM) as any,\n retryMaxAttempts:\n parseInt(url.searchParams.get(\"retry-max-attempts\")) ?? DEFAULT_RETRY_MAX_ATTEMPTS,\n retryInitialDelay:\n parseInt(url.searchParams.get(\"retry-initial-delay\")) ?? DEFAULT_RETRY_INITIAL_DELAY,\n retryExponentialBackoffMultiplier:\n parseInt(url.searchParams.get(\"retry-exp-backoff-multiplier\")) ??\n DEFAULT_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER,\n retryLinearBackoffStep:\n parseInt(url.searchParams.get(\"retry-linear-backoff-step\")) ??\n DEFAULT_RETRY_LINEAR_BACKOFF_STEP,\n retryJitter: parseInt(url.searchParams.get(\"retry-backoff-jitter\")) ?? DEFAULT_RETRY_JITTER,\n\n ...overrides,\n };\n}\n\n/**\n * Authorization data / JWT Token.\n * Absent JWT Token tells the client to connect as anonymous user.\n */\nexport interface AuthInformation {\n /** Absent token means anonymous access */\n jwtToken?: string;\n}\n\nexport const AnonymousAuthInformation: AuthInformation = {};\n\n/** Authorization related settings to pass to {@link PlClient}. */\nexport interface AuthOps {\n /** Initial authorization information */\n authInformation: AuthInformation;\n /** Will be executed after successful authorization information refresh */\n readonly onUpdate?: (newInfo: AuthInformation) => void;\n /** Will be executed if auth-related error happens during normal client operation */\n readonly onAuthError?: () => void;\n /** Will be executed if error encountered during token update */\n readonly onUpdateError?: (error: unknown) => void;\n}\n\n/** Connection status. */\nexport type PlConnectionStatus = \"OK\" | \"Disconnected\" | \"Unauthenticated\";\n\n/** Listener that will be called each time connection status changes. */\nexport type PlConnectionStatusListener = (status: PlConnectionStatus) => void;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","names":[],"sources":["../../src/core/config.ts"],"sourcesContent":["import type { ProxySettings } from \"@milaboratories/pl-http\";\nimport type { ExponentialBackoffRetryOptions } from \"@milaboratories/ts-helpers\";\n\nexport const SUPPORTED_WIRE_PROTOCOLS = [\"grpc\", \"rest\"] as const;\nexport type wireProtocol = (typeof SUPPORTED_WIRE_PROTOCOLS)[number];\n\n/** Base configuration structure for PL client */\nexport interface PlClientConfig {\n /** Port and host of remote pl server */\n hostAndPort: string;\n\n /** Type of wire connection (protocol server uses for communication) */\n wireProtocol?: wireProtocol;\n\n /** If set, client will expose a nested object under a field with name `alternative_root_${alternativeRoot}` as a\n * client root. */\n alternativeRoot?: string;\n\n /** If true, client will establish tls connection to the server, using default\n * CA of node instance. */\n // Not implementing custom ssl validation logic for now.\n // Implementing it in a correct way is really nontrivial thing,\n // real use-cases should be considered.\n ssl: boolean;\n\n /** Default timeout in milliseconds for unary calls, like ping and login. */\n defaultRequestTimeout: number;\n\n /** Default timeout in milliseconds for read-write transaction, should be\n * adjusted for long round-trip or low bandwidth connections. */\n defaultRWTransactionTimeout: number;\n /** Default timeout in milliseconds for read-only transaction, should be\n * adjusted for long round-trip or low bandwidth connections. */\n defaultROTransactionTimeout: number;\n\n /** Controls what TTL will be requested from the server, when new JWT token\n * is requested. */\n authTTLSeconds: number;\n /** If token is older than this time, it will be refreshed regardless of its\n * expiration time. */\n authMaxRefreshSeconds: number;\n\n /** Proxy server config to use for pl connection. */\n grpcProxy?: string | ProxySettings;\n /** Proxy server config to use for http connections of pl drivers, like file\n * downloading. */\n httpProxy?: string | ProxySettings;\n\n /** Username extracted from pl URL. Ignored by {@link PlClient}, picked up by {@link defaultPlClient}. */\n user?: string;\n /** Password extracted from pl URL. Ignored by {@link PlClient}, picked up by {@link defaultPlClient}. */\n password?: string;\n\n /** Artificial delay introduced after write transactions completion, to\n * somewhat throttle the load on pl. Delay introduced after sync, if requested. */\n txDelay: number;\n\n /** Last resort measure to solve complicated race conditions in pl. */\n forceSync: boolean;\n\n /** Maximal number of bytes of resource state to cache */\n maxCacheBytes: number;\n\n //\n // Retry\n //\n\n /**\n * What type of backoff strategy to use in transaction retries\n * (pl uses optimistic transaction model with regular retries in write transactions)\n */\n retryBackoffAlgorithm: \"exponential\" | \"linear\";\n\n /** Maximal number of attempts in */\n retryMaxAttempts: number;\n\n /** Delay after first failed attempt, in ms. */\n retryInitialDelay: number;\n\n /** Each time delay will be multiplied by this number (1.5 means plus on 50% each attempt) */\n retryExponentialBackoffMultiplier: number;\n\n /** [used only for ] This value will be added to the delay from the previous step, in ms */\n retryLinearBackoffStep: number;\n\n /** Value from 0 to 1, determine level of randomness to introduce to the backoff delays sequence. (0 meaning no randomness) */\n retryJitter: number;\n}\n\nexport const DEFAULT_REQUEST_TIMEOUT = 5_000;\nexport const DEFAULT_RO_TX_TIMEOUT = 300_000;\nexport const DEFAULT_RW_TX_TIMEOUT = 60_000;\nexport const DEFAULT_TOKEN_TTL_SECONDS = 31 * 24 * 60 * 60;\nexport const DEFAULT_AUTH_MAX_REFRESH = 12 * 24 * 60 * 60;\n\nexport const DEFAULT_MAX_CACHE_BYTES = 128_000_000; // 128 Mb\n\nexport const DEFAULT_RETRY_BACKOFF_ALGORITHM = \"exponential\";\nexport const DEFAULT_RETRY_MAX_ATTEMPTS = 21; // 1st attempt + 20 retries\nexport const DEFAULT_RETRY_INITIAL_DELAY = 20; // 20 ms * <jitter> of sleep after first failure\nexport const DEFAULT_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER = 1.5; // + 50% on each round\nexport const DEFAULT_RETRY_LINEAR_BACKOFF_STEP = 50; // + 50 ms\nexport const DEFAULT_RETRY_JITTER = 0.3; // 30%\n\nexport const DefaultRetryOptions: ExponentialBackoffRetryOptions = {\n type: \"exponentialBackoff\",\n maxAttempts: DEFAULT_RETRY_MAX_ATTEMPTS,\n initialDelay: DEFAULT_RETRY_INITIAL_DELAY,\n backoffMultiplier: DEFAULT_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER,\n jitter: DEFAULT_RETRY_JITTER,\n};\n\ntype PlConfigOverrides = Partial<\n Pick<\n PlClientConfig,\n | \"ssl\"\n | \"defaultRequestTimeout\"\n | \"defaultROTransactionTimeout\"\n | \"defaultRWTransactionTimeout\"\n | \"httpProxy\"\n | \"grpcProxy\"\n >\n>;\n\nfunction parseInt(s: string | null | undefined): number | undefined {\n if (!s) return undefined;\n const num = Number(s);\n if (Number.isNaN(num)) throw new Error(`Can't parse number: ${s}`);\n return num;\n}\n\n/** Parses pl url and creates a config object that can be passed to\n * {@link PlClient} of {@link UnauthenticatedPlClient}. */\nexport function plAddressToConfig(\n address: string,\n overrides: PlConfigOverrides = {},\n): PlClientConfig {\n if (address.indexOf(\"://\") === -1)\n // non-url address\n return {\n hostAndPort: address,\n ssl: false,\n defaultRequestTimeout: DEFAULT_REQUEST_TIMEOUT,\n defaultROTransactionTimeout: DEFAULT_RO_TX_TIMEOUT,\n defaultRWTransactionTimeout: DEFAULT_RW_TX_TIMEOUT,\n authTTLSeconds: DEFAULT_TOKEN_TTL_SECONDS,\n authMaxRefreshSeconds: DEFAULT_AUTH_MAX_REFRESH,\n txDelay: 0,\n forceSync: false,\n\n maxCacheBytes: DEFAULT_MAX_CACHE_BYTES,\n\n retryBackoffAlgorithm: DEFAULT_RETRY_BACKOFF_ALGORITHM,\n retryMaxAttempts: DEFAULT_RETRY_MAX_ATTEMPTS,\n retryInitialDelay: DEFAULT_RETRY_INITIAL_DELAY,\n retryExponentialBackoffMultiplier: DEFAULT_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER,\n retryLinearBackoffStep: DEFAULT_RETRY_LINEAR_BACKOFF_STEP,\n retryJitter: DEFAULT_RETRY_JITTER,\n\n ...overrides,\n };\n\n const url = new URL(address);\n\n if (\n url.protocol !== \"https:\" &&\n url.protocol !== \"http:\" &&\n url.protocol !== \"grpc:\" &&\n url.protocol !== \"tls:\"\n )\n throw new Error(`Unexpected URL schema: ${url.protocol}`);\n\n if (url.pathname !== \"/\" && url.pathname !== \"\")\n throw new Error(`Unexpected URL path: ${url.pathname}`);\n\n let port = url.port;\n if (!port) {\n switch (url.protocol) {\n case \"http:\":\n port = \"80\";\n break;\n case \"https:\":\n port = \"443\";\n break;\n default:\n throw new Error(`Port must be specified explicitly for ${url.protocol} protocol.`);\n }\n }\n\n return {\n hostAndPort: `${url.hostname}:${port}`,\n alternativeRoot: url.searchParams.get(\"alternative-root\") ?? undefined,\n ssl: url.protocol === \"https:\" || url.protocol === \"tls:\",\n\n wireProtocol: (url.searchParams.get(\"wire-protocol\") as wireProtocol) ?? undefined,\n\n defaultRequestTimeout:\n parseInt(url.searchParams.get(\"request-timeout\")) ?? DEFAULT_REQUEST_TIMEOUT,\n defaultROTransactionTimeout:\n parseInt(url.searchParams.get(\"ro-tx-timeout\")) ??\n parseInt(url.searchParams.get(\"tx-timeout\")) ??\n DEFAULT_RO_TX_TIMEOUT,\n defaultRWTransactionTimeout:\n parseInt(url.searchParams.get(\"rw-tx-timeout\")) ??\n parseInt(url.searchParams.get(\"tx-timeout\")) ??\n DEFAULT_RW_TX_TIMEOUT,\n authTTLSeconds: DEFAULT_TOKEN_TTL_SECONDS,\n authMaxRefreshSeconds: DEFAULT_AUTH_MAX_REFRESH,\n grpcProxy: url.searchParams.get(\"grpc-proxy\") ?? undefined,\n httpProxy: url.searchParams.get(\"http-proxy\") ?? undefined,\n user: url.username === \"\" ? undefined : url.username,\n password: url.password === \"\" ? undefined : url.password,\n txDelay: parseInt(url.searchParams.get(\"tx-delay\")) ?? 0,\n forceSync: Boolean(url.searchParams.get(\"force-sync\")),\n\n maxCacheBytes: parseInt(url.searchParams.get(\"max-cache-bytes\")) ?? DEFAULT_MAX_CACHE_BYTES,\n\n retryBackoffAlgorithm: (url.searchParams.get(\"retry-backoff-algorithm\") ??\n DEFAULT_RETRY_BACKOFF_ALGORITHM) as any,\n retryMaxAttempts:\n parseInt(url.searchParams.get(\"retry-max-attempts\")) ?? DEFAULT_RETRY_MAX_ATTEMPTS,\n retryInitialDelay:\n parseInt(url.searchParams.get(\"retry-initial-delay\")) ?? DEFAULT_RETRY_INITIAL_DELAY,\n retryExponentialBackoffMultiplier:\n parseInt(url.searchParams.get(\"retry-exp-backoff-multiplier\")) ??\n DEFAULT_RETRY_EXPONENTIAL_BACKOFF_MULTIPLIER,\n retryLinearBackoffStep:\n parseInt(url.searchParams.get(\"retry-linear-backoff-step\")) ??\n DEFAULT_RETRY_LINEAR_BACKOFF_STEP,\n retryJitter: parseInt(url.searchParams.get(\"retry-backoff-jitter\")) ?? DEFAULT_RETRY_JITTER,\n\n ...overrides,\n };\n}\n\n/**\n * Authorization data / JWT Token.\n * Absent JWT Token tells the client to connect as anonymous user.\n */\nexport interface AuthInformation {\n /** Absent token means anonymous access */\n jwtToken?: string;\n}\n\nexport const AnonymousAuthInformation: AuthInformation = {};\n\n/** Authorization related settings to pass to {@link PlClient}. */\nexport interface AuthOps {\n /** Initial authorization information */\n authInformation: AuthInformation;\n /** Will be executed after successful authorization information refresh */\n readonly onUpdate?: (newInfo: AuthInformation) => void;\n /** Will be executed if auth-related error happens during normal client operation */\n readonly onAuthError?: () => void;\n /** Will be executed if error encountered during token update */\n readonly onUpdateError?: (error: unknown) => void;\n}\n\n/** Connection status. */\nexport type PlConnectionStatus = \"OK\" | \"Disconnected\" | \"Unauthenticated\";\n\n/** Listener that will be called each time connection status changes. */\nexport type PlConnectionStatusListener = (status: PlConnectionStatus) => void;\n"],"mappings":"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"}
|
|
@@ -6,15 +6,15 @@ const require_unauth_client = require("./unauth_client.cjs");
|
|
|
6
6
|
let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
|
|
7
7
|
let node_crypto = require("node:crypto");
|
|
8
8
|
let node_fs = require("node:fs");
|
|
9
|
-
node_fs = require_runtime.__toESM(node_fs);
|
|
9
|
+
node_fs = require_runtime.__toESM(node_fs, 1);
|
|
10
10
|
let canonicalize = require("canonicalize");
|
|
11
|
-
canonicalize = require_runtime.__toESM(canonicalize);
|
|
11
|
+
canonicalize = require_runtime.__toESM(canonicalize, 1);
|
|
12
12
|
let yaml = require("yaml");
|
|
13
|
-
yaml = require_runtime.__toESM(yaml);
|
|
13
|
+
yaml = require_runtime.__toESM(yaml, 1);
|
|
14
14
|
let node_os = require("node:os");
|
|
15
|
-
node_os = require_runtime.__toESM(node_os);
|
|
15
|
+
node_os = require_runtime.__toESM(node_os, 1);
|
|
16
16
|
let node_path = require("node:path");
|
|
17
|
-
node_path = require_runtime.__toESM(node_path);
|
|
17
|
+
node_path = require_runtime.__toESM(node_path, 1);
|
|
18
18
|
//#region src/core/default_client.ts
|
|
19
19
|
const CONF_FILE_SEQUENCE = [
|
|
20
20
|
"pl.json",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default_client.cjs","names":["path","os","fs","YAML","inferAuthRefreshTime","plAddressToConfig","UnauthenticatedPlClient","PlClient"],"sources":["../../src/core/default_client.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport type { AuthInformation, PlClientConfig } from \"./config\";\nimport { plAddressToConfig } from \"./config\";\nimport canonicalize from \"canonicalize\";\nimport YAML from \"yaml\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport { UnauthenticatedPlClient } from \"./unauth_client\";\nimport { PlClient } from \"./client\";\nimport { createHash } from \"node:crypto\";\nimport { inferAuthRefreshTime } from \"./auth\";\n\nconst CONFIG_FILE_LOCAL_JSON = \"pl.json\";\nconst CONFIG_FILE_USER_JSON = path.join(os.homedir(), \".pl.json\");\nconst CONFIG_FILE_LOCAL_YAML = \"pl.yaml\";\nconst CONFIG_FILE_USER_YAML = path.join(os.homedir(), \".pl.yaml\");\nconst CONF_FILE_SEQUENCE = [\n CONFIG_FILE_LOCAL_JSON,\n CONFIG_FILE_LOCAL_YAML,\n CONFIG_FILE_USER_JSON,\n CONFIG_FILE_USER_YAML,\n];\n\nconst AUTH_DATA_FILE = \".pl_auth.json\";\n\ntype FileConfigOverrideFields =\n | \"grpcProxy\"\n | \"httpProxy\"\n | \"user\"\n | \"password\"\n | \"alternativeRoot\"\n | \"defaultROTransactionTimeout\"\n | \"defaultRWTransactionTimeout\"\n | \"defaultRequestTimeout\"\n | \"authTTLSeconds\"\n | \"authMaxRefreshSeconds\";\nconst FILE_CONFIG_OVERRIDE_FIELDS: FileConfigOverrideFields[] = [\n \"grpcProxy\",\n \"httpProxy\",\n \"user\",\n \"password\",\n \"alternativeRoot\",\n \"defaultROTransactionTimeout\",\n \"defaultRWTransactionTimeout\",\n \"defaultRequestTimeout\",\n \"authTTLSeconds\",\n \"authMaxRefreshSeconds\",\n];\n\ntype PlConfigFile = {\n address: string;\n} & Partial<Pick<PlClientConfig, FileConfigOverrideFields>>;\n\ninterface AuthCache {\n /** To check if config changed */\n confHash: string;\n expiration: number;\n authInformation: AuthInformation;\n}\n\nexport function tryGetFileConfig(): [PlConfigFile, string] | undefined {\n for (const confPath of CONF_FILE_SEQUENCE)\n if (fs.existsSync(confPath)) {\n const fileContent = fs.readFileSync(confPath, { encoding: \"utf-8\" });\n if (confPath.endsWith(\"json\")) return [JSON.parse(fileContent) as PlConfigFile, confPath];\n else return [YAML.parse(fileContent) as PlConfigFile, confPath];\n }\n return undefined;\n}\n\nfunction saveAuthInfoCallback(\n confHash: string,\n authMaxRefreshSeconds: number,\n): (newAuthInfo: AuthInformation) => void {\n return (newAuthInfo) => {\n fs.writeFileSync(\n AUTH_DATA_FILE,\n Buffer.from(\n JSON.stringify({\n confHash,\n authInformation: newAuthInfo,\n expiration: inferAuthRefreshTime(newAuthInfo, authMaxRefreshSeconds),\n } as AuthCache),\n ),\n \"utf8\",\n );\n };\n}\n\nconst cleanAuthInfoCallback = () => {\n fs.rmSync(AUTH_DATA_FILE);\n};\n\n/** Uses default algorithm to construct a pl client from the environment */\nexport async function defaultPlClient(): Promise<PlClient> {\n let config: PlClientConfig | undefined = undefined;\n if (process.env.PL_ADDRESS !== undefined) {\n config = plAddressToConfig(process.env.PL_ADDRESS);\n } else {\n const fromFile = tryGetFileConfig();\n if (fromFile !== undefined) {\n const [fileConfig, configPath] = fromFile;\n const address = notEmpty(fileConfig.address, `no pl address in file: ${configPath}`);\n config = plAddressToConfig(address);\n // applying overrides\n for (const field of FILE_CONFIG_OVERRIDE_FIELDS)\n if (fileConfig[field] !== undefined) (config as any)[field] = fileConfig[field];\n }\n }\n\n if (config === undefined)\n throw new Error(\"Can't find configuration to create default platform client.\");\n\n if (process.env.PL_USER !== undefined) config.user = process.env.PL_USER;\n\n if (process.env.PL_PASSWORD !== undefined) config.user = process.env.PL_PASSWORD;\n\n const confHash = createHash(\"sha256\")\n .update(Buffer.from(canonicalize(config)!))\n .digest(\"base64\");\n\n let authInformation: AuthInformation | undefined = undefined;\n\n // try recover auth information from cache\n if (fs.existsSync(AUTH_DATA_FILE)) {\n const cache: AuthCache = JSON.parse(fs.readFileSync(AUTH_DATA_FILE, { encoding: \"utf-8\" }));\n if (cache.confHash === confHash && cache.expiration > Date.now())\n authInformation = cache.authInformation;\n }\n\n if (authInformation === undefined) {\n const client = await UnauthenticatedPlClient.build(config);\n\n if (await client.requireAuth()) {\n if (config.user === undefined || config.password === undefined)\n throw new Error(`No auth information for found to authenticate with PL server.`);\n authInformation = await client.login(config.user, config.password);\n } else {\n // No authorization is required\n authInformation = {};\n }\n\n // saving cache\n fs.writeFileSync(\n AUTH_DATA_FILE,\n Buffer.from(\n JSON.stringify({\n confHash,\n authInformation,\n expiration: inferAuthRefreshTime(authInformation, config.authMaxRefreshSeconds),\n } as AuthCache),\n ),\n \"utf8\",\n );\n }\n\n return await PlClient.init(config, {\n authInformation,\n onUpdate: (_newAuthInfo) => saveAuthInfoCallback(confHash, config.authMaxRefreshSeconds),\n onUpdateError: cleanAuthInfoCallback,\n onAuthError: cleanAuthInfoCallback,\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAiBA,MAAM,qBAAqB;
|
|
1
|
+
{"version":3,"file":"default_client.cjs","names":["path","os","fs","YAML","inferAuthRefreshTime","plAddressToConfig","UnauthenticatedPlClient","PlClient"],"sources":["../../src/core/default_client.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport type { AuthInformation, PlClientConfig } from \"./config\";\nimport { plAddressToConfig } from \"./config\";\nimport canonicalize from \"canonicalize\";\nimport YAML from \"yaml\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport { UnauthenticatedPlClient } from \"./unauth_client\";\nimport { PlClient } from \"./client\";\nimport { createHash } from \"node:crypto\";\nimport { inferAuthRefreshTime } from \"./auth\";\n\nconst CONFIG_FILE_LOCAL_JSON = \"pl.json\";\nconst CONFIG_FILE_USER_JSON = path.join(os.homedir(), \".pl.json\");\nconst CONFIG_FILE_LOCAL_YAML = \"pl.yaml\";\nconst CONFIG_FILE_USER_YAML = path.join(os.homedir(), \".pl.yaml\");\nconst CONF_FILE_SEQUENCE = [\n CONFIG_FILE_LOCAL_JSON,\n CONFIG_FILE_LOCAL_YAML,\n CONFIG_FILE_USER_JSON,\n CONFIG_FILE_USER_YAML,\n];\n\nconst AUTH_DATA_FILE = \".pl_auth.json\";\n\ntype FileConfigOverrideFields =\n | \"grpcProxy\"\n | \"httpProxy\"\n | \"user\"\n | \"password\"\n | \"alternativeRoot\"\n | \"defaultROTransactionTimeout\"\n | \"defaultRWTransactionTimeout\"\n | \"defaultRequestTimeout\"\n | \"authTTLSeconds\"\n | \"authMaxRefreshSeconds\";\nconst FILE_CONFIG_OVERRIDE_FIELDS: FileConfigOverrideFields[] = [\n \"grpcProxy\",\n \"httpProxy\",\n \"user\",\n \"password\",\n \"alternativeRoot\",\n \"defaultROTransactionTimeout\",\n \"defaultRWTransactionTimeout\",\n \"defaultRequestTimeout\",\n \"authTTLSeconds\",\n \"authMaxRefreshSeconds\",\n];\n\ntype PlConfigFile = {\n address: string;\n} & Partial<Pick<PlClientConfig, FileConfigOverrideFields>>;\n\ninterface AuthCache {\n /** To check if config changed */\n confHash: string;\n expiration: number;\n authInformation: AuthInformation;\n}\n\nexport function tryGetFileConfig(): [PlConfigFile, string] | undefined {\n for (const confPath of CONF_FILE_SEQUENCE)\n if (fs.existsSync(confPath)) {\n const fileContent = fs.readFileSync(confPath, { encoding: \"utf-8\" });\n if (confPath.endsWith(\"json\")) return [JSON.parse(fileContent) as PlConfigFile, confPath];\n else return [YAML.parse(fileContent) as PlConfigFile, confPath];\n }\n return undefined;\n}\n\nfunction saveAuthInfoCallback(\n confHash: string,\n authMaxRefreshSeconds: number,\n): (newAuthInfo: AuthInformation) => void {\n return (newAuthInfo) => {\n fs.writeFileSync(\n AUTH_DATA_FILE,\n Buffer.from(\n JSON.stringify({\n confHash,\n authInformation: newAuthInfo,\n expiration: inferAuthRefreshTime(newAuthInfo, authMaxRefreshSeconds),\n } as AuthCache),\n ),\n \"utf8\",\n );\n };\n}\n\nconst cleanAuthInfoCallback = () => {\n fs.rmSync(AUTH_DATA_FILE);\n};\n\n/** Uses default algorithm to construct a pl client from the environment */\nexport async function defaultPlClient(): Promise<PlClient> {\n let config: PlClientConfig | undefined = undefined;\n if (process.env.PL_ADDRESS !== undefined) {\n config = plAddressToConfig(process.env.PL_ADDRESS);\n } else {\n const fromFile = tryGetFileConfig();\n if (fromFile !== undefined) {\n const [fileConfig, configPath] = fromFile;\n const address = notEmpty(fileConfig.address, `no pl address in file: ${configPath}`);\n config = plAddressToConfig(address);\n // applying overrides\n for (const field of FILE_CONFIG_OVERRIDE_FIELDS)\n if (fileConfig[field] !== undefined) (config as any)[field] = fileConfig[field];\n }\n }\n\n if (config === undefined)\n throw new Error(\"Can't find configuration to create default platform client.\");\n\n if (process.env.PL_USER !== undefined) config.user = process.env.PL_USER;\n\n if (process.env.PL_PASSWORD !== undefined) config.user = process.env.PL_PASSWORD;\n\n const confHash = createHash(\"sha256\")\n .update(Buffer.from(canonicalize(config)!))\n .digest(\"base64\");\n\n let authInformation: AuthInformation | undefined = undefined;\n\n // try recover auth information from cache\n if (fs.existsSync(AUTH_DATA_FILE)) {\n const cache: AuthCache = JSON.parse(fs.readFileSync(AUTH_DATA_FILE, { encoding: \"utf-8\" }));\n if (cache.confHash === confHash && cache.expiration > Date.now())\n authInformation = cache.authInformation;\n }\n\n if (authInformation === undefined) {\n const client = await UnauthenticatedPlClient.build(config);\n\n if (await client.requireAuth()) {\n if (config.user === undefined || config.password === undefined)\n throw new Error(`No auth information for found to authenticate with PL server.`);\n authInformation = await client.login(config.user, config.password);\n } else {\n // No authorization is required\n authInformation = {};\n }\n\n // saving cache\n fs.writeFileSync(\n AUTH_DATA_FILE,\n Buffer.from(\n JSON.stringify({\n confHash,\n authInformation,\n expiration: inferAuthRefreshTime(authInformation, config.authMaxRefreshSeconds),\n } as AuthCache),\n ),\n \"utf8\",\n );\n }\n\n return await PlClient.init(config, {\n authInformation,\n onUpdate: (_newAuthInfo) => saveAuthInfoCallback(confHash, config.authMaxRefreshSeconds),\n onUpdateError: cleanAuthInfoCallback,\n onAuthError: cleanAuthInfoCallback,\n });\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default_client.d.ts","names":[],"sources":["../../src/core/default_client.ts"],"mappings":";;;;KA0BK,wBAAA;AAAA,KAwBA,YAAA;EACH,OAAA;AAAA,IACE,OAAA,CAAQ,IAAA,CAAK,cAAA,EAAgB,wBAAA;AAAA,iBASjB,gBAAA,
|
|
1
|
+
{"version":3,"file":"default_client.d.ts","names":[],"sources":["../../src/core/default_client.ts"],"mappings":";;;;KA0BK,wBAAA;AAAA,KAwBA,YAAA;EACH,OAAA;AAAA,IACE,OAAA,CAAQ,IAAA,CAAK,cAAA,EAAgB,wBAAA;AAAA,iBASjB,gBAAA,KAAqB,YAAY;;iBAkC3B,eAAA,IAAmB,OAAO,CAAC,QAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default_client.js","names":[],"sources":["../../src/core/default_client.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport type { AuthInformation, PlClientConfig } from \"./config\";\nimport { plAddressToConfig } from \"./config\";\nimport canonicalize from \"canonicalize\";\nimport YAML from \"yaml\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport { UnauthenticatedPlClient } from \"./unauth_client\";\nimport { PlClient } from \"./client\";\nimport { createHash } from \"node:crypto\";\nimport { inferAuthRefreshTime } from \"./auth\";\n\nconst CONFIG_FILE_LOCAL_JSON = \"pl.json\";\nconst CONFIG_FILE_USER_JSON = path.join(os.homedir(), \".pl.json\");\nconst CONFIG_FILE_LOCAL_YAML = \"pl.yaml\";\nconst CONFIG_FILE_USER_YAML = path.join(os.homedir(), \".pl.yaml\");\nconst CONF_FILE_SEQUENCE = [\n CONFIG_FILE_LOCAL_JSON,\n CONFIG_FILE_LOCAL_YAML,\n CONFIG_FILE_USER_JSON,\n CONFIG_FILE_USER_YAML,\n];\n\nconst AUTH_DATA_FILE = \".pl_auth.json\";\n\ntype FileConfigOverrideFields =\n | \"grpcProxy\"\n | \"httpProxy\"\n | \"user\"\n | \"password\"\n | \"alternativeRoot\"\n | \"defaultROTransactionTimeout\"\n | \"defaultRWTransactionTimeout\"\n | \"defaultRequestTimeout\"\n | \"authTTLSeconds\"\n | \"authMaxRefreshSeconds\";\nconst FILE_CONFIG_OVERRIDE_FIELDS: FileConfigOverrideFields[] = [\n \"grpcProxy\",\n \"httpProxy\",\n \"user\",\n \"password\",\n \"alternativeRoot\",\n \"defaultROTransactionTimeout\",\n \"defaultRWTransactionTimeout\",\n \"defaultRequestTimeout\",\n \"authTTLSeconds\",\n \"authMaxRefreshSeconds\",\n];\n\ntype PlConfigFile = {\n address: string;\n} & Partial<Pick<PlClientConfig, FileConfigOverrideFields>>;\n\ninterface AuthCache {\n /** To check if config changed */\n confHash: string;\n expiration: number;\n authInformation: AuthInformation;\n}\n\nexport function tryGetFileConfig(): [PlConfigFile, string] | undefined {\n for (const confPath of CONF_FILE_SEQUENCE)\n if (fs.existsSync(confPath)) {\n const fileContent = fs.readFileSync(confPath, { encoding: \"utf-8\" });\n if (confPath.endsWith(\"json\")) return [JSON.parse(fileContent) as PlConfigFile, confPath];\n else return [YAML.parse(fileContent) as PlConfigFile, confPath];\n }\n return undefined;\n}\n\nfunction saveAuthInfoCallback(\n confHash: string,\n authMaxRefreshSeconds: number,\n): (newAuthInfo: AuthInformation) => void {\n return (newAuthInfo) => {\n fs.writeFileSync(\n AUTH_DATA_FILE,\n Buffer.from(\n JSON.stringify({\n confHash,\n authInformation: newAuthInfo,\n expiration: inferAuthRefreshTime(newAuthInfo, authMaxRefreshSeconds),\n } as AuthCache),\n ),\n \"utf8\",\n );\n };\n}\n\nconst cleanAuthInfoCallback = () => {\n fs.rmSync(AUTH_DATA_FILE);\n};\n\n/** Uses default algorithm to construct a pl client from the environment */\nexport async function defaultPlClient(): Promise<PlClient> {\n let config: PlClientConfig | undefined = undefined;\n if (process.env.PL_ADDRESS !== undefined) {\n config = plAddressToConfig(process.env.PL_ADDRESS);\n } else {\n const fromFile = tryGetFileConfig();\n if (fromFile !== undefined) {\n const [fileConfig, configPath] = fromFile;\n const address = notEmpty(fileConfig.address, `no pl address in file: ${configPath}`);\n config = plAddressToConfig(address);\n // applying overrides\n for (const field of FILE_CONFIG_OVERRIDE_FIELDS)\n if (fileConfig[field] !== undefined) (config as any)[field] = fileConfig[field];\n }\n }\n\n if (config === undefined)\n throw new Error(\"Can't find configuration to create default platform client.\");\n\n if (process.env.PL_USER !== undefined) config.user = process.env.PL_USER;\n\n if (process.env.PL_PASSWORD !== undefined) config.user = process.env.PL_PASSWORD;\n\n const confHash = createHash(\"sha256\")\n .update(Buffer.from(canonicalize(config)!))\n .digest(\"base64\");\n\n let authInformation: AuthInformation | undefined = undefined;\n\n // try recover auth information from cache\n if (fs.existsSync(AUTH_DATA_FILE)) {\n const cache: AuthCache = JSON.parse(fs.readFileSync(AUTH_DATA_FILE, { encoding: \"utf-8\" }));\n if (cache.confHash === confHash && cache.expiration > Date.now())\n authInformation = cache.authInformation;\n }\n\n if (authInformation === undefined) {\n const client = await UnauthenticatedPlClient.build(config);\n\n if (await client.requireAuth()) {\n if (config.user === undefined || config.password === undefined)\n throw new Error(`No auth information for found to authenticate with PL server.`);\n authInformation = await client.login(config.user, config.password);\n } else {\n // No authorization is required\n authInformation = {};\n }\n\n // saving cache\n fs.writeFileSync(\n AUTH_DATA_FILE,\n Buffer.from(\n JSON.stringify({\n confHash,\n authInformation,\n expiration: inferAuthRefreshTime(authInformation, config.authMaxRefreshSeconds),\n } as AuthCache),\n ),\n \"utf8\",\n );\n }\n\n return await PlClient.init(config, {\n authInformation,\n onUpdate: (_newAuthInfo) => saveAuthInfoCallback(confHash, config.authMaxRefreshSeconds),\n onUpdateError: cleanAuthInfoCallback,\n onAuthError: cleanAuthInfoCallback,\n });\n}\n"],"mappings":";;;;;;;;;;;;AAiBA,MAAM,qBAAqB;
|
|
1
|
+
{"version":3,"file":"default_client.js","names":[],"sources":["../../src/core/default_client.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport type { AuthInformation, PlClientConfig } from \"./config\";\nimport { plAddressToConfig } from \"./config\";\nimport canonicalize from \"canonicalize\";\nimport YAML from \"yaml\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { notEmpty } from \"@milaboratories/ts-helpers\";\nimport { UnauthenticatedPlClient } from \"./unauth_client\";\nimport { PlClient } from \"./client\";\nimport { createHash } from \"node:crypto\";\nimport { inferAuthRefreshTime } from \"./auth\";\n\nconst CONFIG_FILE_LOCAL_JSON = \"pl.json\";\nconst CONFIG_FILE_USER_JSON = path.join(os.homedir(), \".pl.json\");\nconst CONFIG_FILE_LOCAL_YAML = \"pl.yaml\";\nconst CONFIG_FILE_USER_YAML = path.join(os.homedir(), \".pl.yaml\");\nconst CONF_FILE_SEQUENCE = [\n CONFIG_FILE_LOCAL_JSON,\n CONFIG_FILE_LOCAL_YAML,\n CONFIG_FILE_USER_JSON,\n CONFIG_FILE_USER_YAML,\n];\n\nconst AUTH_DATA_FILE = \".pl_auth.json\";\n\ntype FileConfigOverrideFields =\n | \"grpcProxy\"\n | \"httpProxy\"\n | \"user\"\n | \"password\"\n | \"alternativeRoot\"\n | \"defaultROTransactionTimeout\"\n | \"defaultRWTransactionTimeout\"\n | \"defaultRequestTimeout\"\n | \"authTTLSeconds\"\n | \"authMaxRefreshSeconds\";\nconst FILE_CONFIG_OVERRIDE_FIELDS: FileConfigOverrideFields[] = [\n \"grpcProxy\",\n \"httpProxy\",\n \"user\",\n \"password\",\n \"alternativeRoot\",\n \"defaultROTransactionTimeout\",\n \"defaultRWTransactionTimeout\",\n \"defaultRequestTimeout\",\n \"authTTLSeconds\",\n \"authMaxRefreshSeconds\",\n];\n\ntype PlConfigFile = {\n address: string;\n} & Partial<Pick<PlClientConfig, FileConfigOverrideFields>>;\n\ninterface AuthCache {\n /** To check if config changed */\n confHash: string;\n expiration: number;\n authInformation: AuthInformation;\n}\n\nexport function tryGetFileConfig(): [PlConfigFile, string] | undefined {\n for (const confPath of CONF_FILE_SEQUENCE)\n if (fs.existsSync(confPath)) {\n const fileContent = fs.readFileSync(confPath, { encoding: \"utf-8\" });\n if (confPath.endsWith(\"json\")) return [JSON.parse(fileContent) as PlConfigFile, confPath];\n else return [YAML.parse(fileContent) as PlConfigFile, confPath];\n }\n return undefined;\n}\n\nfunction saveAuthInfoCallback(\n confHash: string,\n authMaxRefreshSeconds: number,\n): (newAuthInfo: AuthInformation) => void {\n return (newAuthInfo) => {\n fs.writeFileSync(\n AUTH_DATA_FILE,\n Buffer.from(\n JSON.stringify({\n confHash,\n authInformation: newAuthInfo,\n expiration: inferAuthRefreshTime(newAuthInfo, authMaxRefreshSeconds),\n } as AuthCache),\n ),\n \"utf8\",\n );\n };\n}\n\nconst cleanAuthInfoCallback = () => {\n fs.rmSync(AUTH_DATA_FILE);\n};\n\n/** Uses default algorithm to construct a pl client from the environment */\nexport async function defaultPlClient(): Promise<PlClient> {\n let config: PlClientConfig | undefined = undefined;\n if (process.env.PL_ADDRESS !== undefined) {\n config = plAddressToConfig(process.env.PL_ADDRESS);\n } else {\n const fromFile = tryGetFileConfig();\n if (fromFile !== undefined) {\n const [fileConfig, configPath] = fromFile;\n const address = notEmpty(fileConfig.address, `no pl address in file: ${configPath}`);\n config = plAddressToConfig(address);\n // applying overrides\n for (const field of FILE_CONFIG_OVERRIDE_FIELDS)\n if (fileConfig[field] !== undefined) (config as any)[field] = fileConfig[field];\n }\n }\n\n if (config === undefined)\n throw new Error(\"Can't find configuration to create default platform client.\");\n\n if (process.env.PL_USER !== undefined) config.user = process.env.PL_USER;\n\n if (process.env.PL_PASSWORD !== undefined) config.user = process.env.PL_PASSWORD;\n\n const confHash = createHash(\"sha256\")\n .update(Buffer.from(canonicalize(config)!))\n .digest(\"base64\");\n\n let authInformation: AuthInformation | undefined = undefined;\n\n // try recover auth information from cache\n if (fs.existsSync(AUTH_DATA_FILE)) {\n const cache: AuthCache = JSON.parse(fs.readFileSync(AUTH_DATA_FILE, { encoding: \"utf-8\" }));\n if (cache.confHash === confHash && cache.expiration > Date.now())\n authInformation = cache.authInformation;\n }\n\n if (authInformation === undefined) {\n const client = await UnauthenticatedPlClient.build(config);\n\n if (await client.requireAuth()) {\n if (config.user === undefined || config.password === undefined)\n throw new Error(`No auth information for found to authenticate with PL server.`);\n authInformation = await client.login(config.user, config.password);\n } else {\n // No authorization is required\n authInformation = {};\n }\n\n // saving cache\n fs.writeFileSync(\n AUTH_DATA_FILE,\n Buffer.from(\n JSON.stringify({\n confHash,\n authInformation,\n expiration: inferAuthRefreshTime(authInformation, config.authMaxRefreshSeconds),\n } as AuthCache),\n ),\n \"utf8\",\n );\n }\n\n return await PlClient.init(config, {\n authInformation,\n onUpdate: (_newAuthInfo) => saveAuthInfoCallback(confHash, config.authMaxRefreshSeconds),\n onUpdateError: cleanAuthInfoCallback,\n onAuthError: cleanAuthInfoCallback,\n });\n}\n"],"mappings":";;;;;;;;;;;;AAiBA,MAAM,qBAAqB;CACzB;CACA;CAL4B,KAAK,KAAK,GAAG,QAAQ,GAAG,UAMhC;CAJQ,KAAK,KAAK,GAAG,QAAQ,GAAG,UAKhC;AACtB;AAEA,MAAM,iBAAiB;AAavB,MAAM,8BAA0D;CAC9D;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAaA,SAAgB,mBAAuD;CACrE,KAAK,MAAM,YAAY,oBACrB,IAAI,GAAG,WAAW,QAAQ,GAAG;EAC3B,MAAM,cAAc,GAAG,aAAa,UAAU,EAAE,UAAU,QAAQ,CAAC;EACnE,IAAI,SAAS,SAAS,MAAM,GAAG,OAAO,CAAC,KAAK,MAAM,WAAW,GAAmB,QAAQ;OACnF,OAAO,CAAC,KAAK,MAAM,WAAW,GAAmB,QAAQ;CAChE;AAEJ;AAEA,SAAS,qBACP,UACA,uBACwC;CACxC,QAAQ,gBAAgB;EACtB,GAAG,cACD,gBACA,OAAO,KACL,KAAK,UAAU;GACb;GACA,iBAAiB;GACjB,YAAY,qBAAqB,aAAa,qBAAqB;EACrE,CAAc,CAChB,GACA,MACF;CACF;AACF;AAEA,MAAM,8BAA8B;CAClC,GAAG,OAAO,cAAc;AAC1B;;AAGA,eAAsB,kBAAqC;CACzD,IAAI,SAAqC,KAAA;CACzC,IAAI,QAAQ,IAAI,eAAe,KAAA,GAC7B,SAAS,kBAAkB,QAAQ,IAAI,UAAU;MAC5C;EACL,MAAM,WAAW,iBAAiB;EAClC,IAAI,aAAa,KAAA,GAAW;GAC1B,MAAM,CAAC,YAAY,cAAc;GAEjC,SAAS,kBADO,SAAS,WAAW,SAAS,0BAA0B,YACtC,CAAC;GAElC,KAAK,MAAM,SAAS,6BAClB,IAAI,WAAW,WAAW,KAAA,GAAW,OAAgB,SAAS,WAAW;EAC7E;CACF;CAEA,IAAI,WAAW,KAAA,GACb,MAAM,IAAI,MAAM,6DAA6D;CAE/E,IAAI,QAAQ,IAAI,YAAY,KAAA,GAAW,OAAO,OAAO,QAAQ,IAAI;CAEjE,IAAI,QAAQ,IAAI,gBAAgB,KAAA,GAAW,OAAO,OAAO,QAAQ,IAAI;CAErE,MAAM,WAAW,WAAW,QAAQ,CAAC,CAClC,OAAO,OAAO,KAAK,aAAa,MAAM,CAAE,CAAC,CAAC,CAC1C,OAAO,QAAQ;CAElB,IAAI,kBAA+C,KAAA;CAGnD,IAAI,GAAG,WAAW,cAAc,GAAG;EACjC,MAAM,QAAmB,KAAK,MAAM,GAAG,aAAa,gBAAgB,EAAE,UAAU,QAAQ,CAAC,CAAC;EAC1F,IAAI,MAAM,aAAa,YAAY,MAAM,aAAa,KAAK,IAAI,GAC7D,kBAAkB,MAAM;CAC5B;CAEA,IAAI,oBAAoB,KAAA,GAAW;EACjC,MAAM,SAAS,MAAM,wBAAwB,MAAM,MAAM;EAEzD,IAAI,MAAM,OAAO,YAAY,GAAG;GAC9B,IAAI,OAAO,SAAS,KAAA,KAAa,OAAO,aAAa,KAAA,GACnD,MAAM,IAAI,MAAM,+DAA+D;GACjF,kBAAkB,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,QAAQ;EACnE,OAEE,kBAAkB,CAAC;EAIrB,GAAG,cACD,gBACA,OAAO,KACL,KAAK,UAAU;GACb;GACA;GACA,YAAY,qBAAqB,iBAAiB,OAAO,qBAAqB;EAChF,CAAc,CAChB,GACA,MACF;CACF;CAEA,OAAO,MAAM,SAAS,KAAK,QAAQ;EACjC;EACA,WAAW,iBAAiB,qBAAqB,UAAU,OAAO,qBAAqB;EACvF,eAAe;EACf,aAAa;CACf,CAAC;AACH"}
|
package/dist/core/driver.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.cjs","names":[],"sources":["../../src/core/driver.ts"],"sourcesContent":["import type { PlClient } from \"./client\";\nimport type { RpcOptions } from \"@protobuf-ts/runtime-rpc\";\nimport type { Dispatcher } from \"undici\";\nimport type { ResourceType } from \"./types\";\nimport type { WireClientProviderFactory } from \"./wire\";\n\n/** Drivers must implement this interface */\nexport interface PlDriver {\n close(): void;\n}\n\n/** Definition to use driver via {@link PlClient} */\nexport interface PlDriverDefinition<Drv extends PlDriver> {\n /** Used as key to only once instantiate specific drivers */\n readonly name: string;\n\n /** Initialization routine, will be executed only once for each driver in a specific client */\n init(pl: PlClient, wireClientFactory: WireClientProviderFactory, httpDispatcher: Dispatcher): Drv;\n}\n\n// addRTypeToMetadata adds a metadata with resource type\n// for every RPC call. It is necessary for the platform core\n// to proxy the call to the proper controller.\nexport function addRTypeToMetadata(rType: ResourceType, options?: RpcOptions) {\n options = options ?? {};\n options.meta = options.meta ?? {};\n options.meta[\"resourceType\"] = `${rType.name}:${rType.version}`;\n\n return options;\n}\n\n/**\n * addRTypeToHeaders adds a header that helps to route request to the right resource and controller.\n * Without this header, API router on server side cannot route request to proper controller in internal\n * RPC proxy.\n */\nexport function createRTypeRoutingHeader(rType: ResourceType): Record<string, string> {\n return {\n resourceType: `${rType.name}:${rType.version}`,\n };\n}\n"],"mappings":";AAuBA,SAAgB,mBAAmB,OAAqB,SAAsB;
|
|
1
|
+
{"version":3,"file":"driver.cjs","names":[],"sources":["../../src/core/driver.ts"],"sourcesContent":["import type { PlClient } from \"./client\";\nimport type { RpcOptions } from \"@protobuf-ts/runtime-rpc\";\nimport type { Dispatcher } from \"undici\";\nimport type { ResourceType } from \"./types\";\nimport type { WireClientProviderFactory } from \"./wire\";\n\n/** Drivers must implement this interface */\nexport interface PlDriver {\n close(): void;\n}\n\n/** Definition to use driver via {@link PlClient} */\nexport interface PlDriverDefinition<Drv extends PlDriver> {\n /** Used as key to only once instantiate specific drivers */\n readonly name: string;\n\n /** Initialization routine, will be executed only once for each driver in a specific client */\n init(pl: PlClient, wireClientFactory: WireClientProviderFactory, httpDispatcher: Dispatcher): Drv;\n}\n\n// addRTypeToMetadata adds a metadata with resource type\n// for every RPC call. It is necessary for the platform core\n// to proxy the call to the proper controller.\nexport function addRTypeToMetadata(rType: ResourceType, options?: RpcOptions) {\n options = options ?? {};\n options.meta = options.meta ?? {};\n options.meta[\"resourceType\"] = `${rType.name}:${rType.version}`;\n\n return options;\n}\n\n/**\n * addRTypeToHeaders adds a header that helps to route request to the right resource and controller.\n * Without this header, API router on server side cannot route request to proper controller in internal\n * RPC proxy.\n */\nexport function createRTypeRoutingHeader(rType: ResourceType): Record<string, string> {\n return {\n resourceType: `${rType.name}:${rType.version}`,\n };\n}\n"],"mappings":";AAuBA,SAAgB,mBAAmB,OAAqB,SAAsB;CAC5E,UAAU,WAAW,CAAC;CACtB,QAAQ,OAAO,QAAQ,QAAQ,CAAC;CAChC,QAAQ,KAAK,kBAAkB,GAAG,MAAM,KAAK,GAAG,MAAM;CAEtD,OAAO;AACT;;;;;;AAOA,SAAgB,yBAAyB,OAA6C;CACpF,OAAO,EACL,cAAc,GAAG,MAAM,KAAK,GAAG,MAAM,UACvC;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.d.ts","names":[],"sources":["../../src/core/driver.ts"],"mappings":";;;;;;;;UAOiB,QAAA;EACf,
|
|
1
|
+
{"version":3,"file":"driver.d.ts","names":[],"sources":["../../src/core/driver.ts"],"mappings":";;;;;;;;UAOiB,QAAA;EACf,KAAK;AAAA;;UAIU,kBAAA,aAA+B,QAAA;EAJzC;EAAA,SAMI,IAAA;EAFwB;EAKjC,IAAA,CAAK,EAAA,EAAI,QAAA,EAAU,iBAAA,EAAmB,yBAAA,EAA2B,cAAA,EAAgB,UAAA,GAAa,GAAA;AAAA;AAAA,iBAMhF,kBAAA,CAAmB,KAAA,EAAO,YAAA,EAAc,OAAA,GAAU,UAAA,GAAU,UAAA;;;;;;iBAa5D,wBAAA,CAAyB,KAAA,EAAO,YAAA,GAAe,MAAM"}
|
package/dist/core/driver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.js","names":[],"sources":["../../src/core/driver.ts"],"sourcesContent":["import type { PlClient } from \"./client\";\nimport type { RpcOptions } from \"@protobuf-ts/runtime-rpc\";\nimport type { Dispatcher } from \"undici\";\nimport type { ResourceType } from \"./types\";\nimport type { WireClientProviderFactory } from \"./wire\";\n\n/** Drivers must implement this interface */\nexport interface PlDriver {\n close(): void;\n}\n\n/** Definition to use driver via {@link PlClient} */\nexport interface PlDriverDefinition<Drv extends PlDriver> {\n /** Used as key to only once instantiate specific drivers */\n readonly name: string;\n\n /** Initialization routine, will be executed only once for each driver in a specific client */\n init(pl: PlClient, wireClientFactory: WireClientProviderFactory, httpDispatcher: Dispatcher): Drv;\n}\n\n// addRTypeToMetadata adds a metadata with resource type\n// for every RPC call. It is necessary for the platform core\n// to proxy the call to the proper controller.\nexport function addRTypeToMetadata(rType: ResourceType, options?: RpcOptions) {\n options = options ?? {};\n options.meta = options.meta ?? {};\n options.meta[\"resourceType\"] = `${rType.name}:${rType.version}`;\n\n return options;\n}\n\n/**\n * addRTypeToHeaders adds a header that helps to route request to the right resource and controller.\n * Without this header, API router on server side cannot route request to proper controller in internal\n * RPC proxy.\n */\nexport function createRTypeRoutingHeader(rType: ResourceType): Record<string, string> {\n return {\n resourceType: `${rType.name}:${rType.version}`,\n };\n}\n"],"mappings":";AAuBA,SAAgB,mBAAmB,OAAqB,SAAsB;
|
|
1
|
+
{"version":3,"file":"driver.js","names":[],"sources":["../../src/core/driver.ts"],"sourcesContent":["import type { PlClient } from \"./client\";\nimport type { RpcOptions } from \"@protobuf-ts/runtime-rpc\";\nimport type { Dispatcher } from \"undici\";\nimport type { ResourceType } from \"./types\";\nimport type { WireClientProviderFactory } from \"./wire\";\n\n/** Drivers must implement this interface */\nexport interface PlDriver {\n close(): void;\n}\n\n/** Definition to use driver via {@link PlClient} */\nexport interface PlDriverDefinition<Drv extends PlDriver> {\n /** Used as key to only once instantiate specific drivers */\n readonly name: string;\n\n /** Initialization routine, will be executed only once for each driver in a specific client */\n init(pl: PlClient, wireClientFactory: WireClientProviderFactory, httpDispatcher: Dispatcher): Drv;\n}\n\n// addRTypeToMetadata adds a metadata with resource type\n// for every RPC call. It is necessary for the platform core\n// to proxy the call to the proper controller.\nexport function addRTypeToMetadata(rType: ResourceType, options?: RpcOptions) {\n options = options ?? {};\n options.meta = options.meta ?? {};\n options.meta[\"resourceType\"] = `${rType.name}:${rType.version}`;\n\n return options;\n}\n\n/**\n * addRTypeToHeaders adds a header that helps to route request to the right resource and controller.\n * Without this header, API router on server side cannot route request to proper controller in internal\n * RPC proxy.\n */\nexport function createRTypeRoutingHeader(rType: ResourceType): Record<string, string> {\n return {\n resourceType: `${rType.name}:${rType.version}`,\n };\n}\n"],"mappings":";AAuBA,SAAgB,mBAAmB,OAAqB,SAAsB;CAC5E,UAAU,WAAW,CAAC;CACtB,QAAQ,OAAO,QAAQ,QAAQ,CAAC;CAChC,QAAQ,KAAK,kBAAkB,GAAG,MAAM,KAAK,GAAG,MAAM;CAEtD,OAAO;AACT;;;;;;AAOA,SAAgB,yBAAyB,OAA6C;CACpF,OAAO,EACL,cAAc,GAAG,MAAM,KAAK,GAAG,MAAM,UACvC;AACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error_resource.cjs","names":[],"sources":["../../src/core/error_resource.ts"],"sourcesContent":["import type { ResourceType } from \"./types\";\n\nexport type ErrorResourceData = {\n message: string;\n};\n\nexport const ErrorResourceType: ResourceType = {\n name: \"json/resourceError\",\n version: \"1\",\n};\n"],"mappings":";AAMA,MAAa,oBAAkC;CAC7C,MAAM;CACN,SAAS;
|
|
1
|
+
{"version":3,"file":"error_resource.cjs","names":[],"sources":["../../src/core/error_resource.ts"],"sourcesContent":["import type { ResourceType } from \"./types\";\n\nexport type ErrorResourceData = {\n message: string;\n};\n\nexport const ErrorResourceType: ResourceType = {\n name: \"json/resourceError\",\n version: \"1\",\n};\n"],"mappings":";AAMA,MAAa,oBAAkC;CAC7C,MAAM;CACN,SAAS;AACX"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error_resource.js","names":[],"sources":["../../src/core/error_resource.ts"],"sourcesContent":["import type { ResourceType } from \"./types\";\n\nexport type ErrorResourceData = {\n message: string;\n};\n\nexport const ErrorResourceType: ResourceType = {\n name: \"json/resourceError\",\n version: \"1\",\n};\n"],"mappings":";AAMA,MAAa,oBAAkC;CAC7C,MAAM;CACN,SAAS;
|
|
1
|
+
{"version":3,"file":"error_resource.js","names":[],"sources":["../../src/core/error_resource.ts"],"sourcesContent":["import type { ResourceType } from \"./types\";\n\nexport type ErrorResourceData = {\n message: string;\n};\n\nexport const ErrorResourceType: ResourceType = {\n name: \"json/resourceError\",\n version: \"1\",\n};\n"],"mappings":";AAMA,MAAa,oBAAkC;CAC7C,MAAM;CACN,SAAS;AACX"}
|
package/dist/core/errors.cjs
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
|
-
require("../_virtual/_rolldown/runtime.cjs");
|
|
2
|
-
const require_code = require("../proto-grpc/google/rpc/code.cjs");
|
|
3
1
|
let _milaboratories_ts_helpers = require("@milaboratories/ts-helpers");
|
|
4
2
|
//#region src/core/errors.ts
|
|
5
3
|
function isConnectionProblem(err, nested = false) {
|
|
6
4
|
if (err === void 0 || err === null) return false;
|
|
7
5
|
if (err instanceof DisconnectedError) return true;
|
|
8
6
|
if (err.name == "RpcError" && err.code == "UNAVAILABLE") return true;
|
|
9
|
-
if (err.name == "RESTError" && err.status.code ==
|
|
7
|
+
if (err.name == "RESTError" && err.status.code == 14) return true;
|
|
10
8
|
if (err.cause !== void 0 && !nested) return isConnectionProblem(err.cause, true);
|
|
11
9
|
return false;
|
|
12
10
|
}
|
|
@@ -14,7 +12,7 @@ function isUnauthenticated(err, nested = false) {
|
|
|
14
12
|
if (err === void 0 || err === null) return false;
|
|
15
13
|
if (err instanceof UnauthenticatedError) return true;
|
|
16
14
|
if (err.name == "RpcError" && err.code == "UNAUTHENTICATED") return true;
|
|
17
|
-
if (err.name == "RESTError" && err.status.code ==
|
|
15
|
+
if (err.name == "RESTError" && err.status.code == 16) return true;
|
|
18
16
|
if (err.cause !== void 0 && !nested) return isUnauthenticated(err.cause, true);
|
|
19
17
|
return false;
|
|
20
18
|
}
|
|
@@ -22,7 +20,7 @@ function isPermissionDenied(err, nested = false) {
|
|
|
22
20
|
if (err === void 0 || err === null) return false;
|
|
23
21
|
if (err instanceof PermissionDeniedError) return true;
|
|
24
22
|
if (err.name == "RpcError" && err.code == "PERMISSION_DENIED") return true;
|
|
25
|
-
if (err.name == "RESTError" && err.status.code ==
|
|
23
|
+
if (err.name == "RESTError" && err.status.code == 7) return true;
|
|
26
24
|
if (err.cause !== void 0 && !nested) return isPermissionDenied(err.cause, true);
|
|
27
25
|
return false;
|
|
28
26
|
}
|
|
@@ -30,14 +28,14 @@ function isTimeoutError(err, nested = false) {
|
|
|
30
28
|
if (err === void 0 || err === null) return false;
|
|
31
29
|
if (err.name == "TimeoutError") return true;
|
|
32
30
|
if (err.name == "RpcError" && err.code == "DEADLINE_EXCEEDED") return true;
|
|
33
|
-
if (err.name == "RESTError" && err.status.code ==
|
|
31
|
+
if (err.name == "RESTError" && err.status.code == 4) return true;
|
|
34
32
|
if (err.cause !== void 0 && !nested) return isTimeoutError(err.cause, true);
|
|
35
33
|
return false;
|
|
36
34
|
}
|
|
37
35
|
function isCancelError(err, nested = false) {
|
|
38
36
|
if (err === void 0 || err === null) return false;
|
|
39
37
|
if (err.name == "RpcError" && err.code == "CANCELLED") return true;
|
|
40
|
-
if (err.name == "RESTError" && err.status.code ==
|
|
38
|
+
if (err.name == "RESTError" && err.status.code == 1) return true;
|
|
41
39
|
if (err.cause !== void 0 && !nested) return isCancelError(err.cause, true);
|
|
42
40
|
return false;
|
|
43
41
|
}
|
|
@@ -47,7 +45,7 @@ function isAbortedError(err, nested = false) {
|
|
|
47
45
|
if (err.code == "ABORT_ERR") return true;
|
|
48
46
|
if (err instanceof DOMException && err.code === DOMException.ABORT_ERR) return true;
|
|
49
47
|
if (err.name == "RpcError" && err.code == "ABORTED") return true;
|
|
50
|
-
if (err.name == "RESTError" && err.status.code ==
|
|
48
|
+
if (err.name == "RESTError" && err.status.code == 10) return true;
|
|
51
49
|
if (err.cause !== void 0 && !nested) return isAbortedError(err.cause, true);
|
|
52
50
|
return false;
|
|
53
51
|
}
|
|
@@ -62,19 +60,20 @@ function isTimeoutOrCancelError(err, nested = false) {
|
|
|
62
60
|
function isUnimplementedError(err, nested = false) {
|
|
63
61
|
if (err === void 0 || err === null) return false;
|
|
64
62
|
if (err.name == "RpcError" && err.code == "UNIMPLEMENTED") return true;
|
|
65
|
-
if (err.name == "RESTError" && err.status.code ==
|
|
63
|
+
if (err.name == "RESTError" && err.status.code == 12) return true;
|
|
66
64
|
if (err.cause !== void 0 && !nested) return isUnimplementedError(err.cause, true);
|
|
67
65
|
return false;
|
|
68
66
|
}
|
|
69
67
|
function isNotFoundError(err, nested = false) {
|
|
70
68
|
if (err === void 0 || err === null) return false;
|
|
71
69
|
if (err.name == "RpcError" && err.code == "NOT_FOUND") return true;
|
|
72
|
-
if (err.name == "RESTError" && err.status.code ==
|
|
70
|
+
if (err.name == "RESTError" && err.status.code == 5) return true;
|
|
73
71
|
if (err.cause !== void 0 && !nested) return isNotFoundError(err.cause, true);
|
|
74
72
|
return err instanceof RecoverablePlError && err.status.code === PlErrorCodeNotFound;
|
|
75
73
|
}
|
|
76
|
-
const PlErrorCodeNotFound =
|
|
74
|
+
const PlErrorCodeNotFound = 5;
|
|
77
75
|
var PlError = class extends Error {
|
|
76
|
+
status;
|
|
78
77
|
name = "PlError";
|
|
79
78
|
constructor(status, opts) {
|
|
80
79
|
super(`code=${status.code} ${status.message}`, opts);
|
package/dist/core/errors.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.cjs","names":["Code","Aborted"],"sources":["../../src/core/errors.ts"],"sourcesContent":["import type { Status } from \"../proto-grpc/github.com/googleapis/googleapis/google/rpc/status\";\nimport { Aborted } from \"@milaboratories/ts-helpers\";\nimport { Code } from \"../proto-grpc/google/rpc/code\";\n\nexport function isConnectionProblem(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if (err instanceof DisconnectedError) return true;\n if ((err as any).name == \"RpcError\" && (err as any).code == \"UNAVAILABLE\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.UNAVAILABLE) return true;\n if ((err as any).cause !== undefined && !nested)\n return isConnectionProblem((err as any).cause, true);\n return false;\n}\n\nexport function isUnauthenticated(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if (err instanceof UnauthenticatedError) return true;\n if ((err as any).name == \"RpcError\" && (err as any).code == \"UNAUTHENTICATED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.UNAUTHENTICATED)\n return true;\n if ((err as any).cause !== undefined && !nested)\n return isUnauthenticated((err as any).cause, true);\n return false;\n}\n\nexport function isPermissionDenied(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if (err instanceof PermissionDeniedError) return true;\n if ((err as any).name == \"RpcError\" && (err as any).code == \"PERMISSION_DENIED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.PERMISSION_DENIED)\n return true;\n if ((err as any).cause !== undefined && !nested)\n return isPermissionDenied((err as any).cause, true);\n return false;\n}\n\nexport function isTimeoutError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if ((err as any).name == \"TimeoutError\") return true;\n if ((err as any).name == \"RpcError\" && (err as any).code == \"DEADLINE_EXCEEDED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.DEADLINE_EXCEEDED)\n return true;\n if ((err as any).cause !== undefined && !nested) return isTimeoutError((err as any).cause, true);\n return false;\n}\n\nexport function isCancelError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if ((err as any).name == \"RpcError\" && (err as any).code == \"CANCELLED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.CANCELLED) return true;\n if ((err as any).cause !== undefined && !nested) return isCancelError((err as any).cause, true);\n return false;\n}\n\nexport function isAbortedError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if (err instanceof Aborted || (err as any).name == \"AbortError\") return true;\n if ((err as any).code == \"ABORT_ERR\") return true;\n if (err instanceof DOMException && err.code === DOMException.ABORT_ERR) return true; // WebSocket error\n if ((err as any).name == \"RpcError\" && (err as any).code == \"ABORTED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.ABORTED) return true;\n if ((err as any).cause !== undefined && !nested) return isAbortedError((err as any).cause, true);\n return false;\n}\n\nexport function isTimeoutOrCancelError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if (isAbortedError(err, true)) return true;\n if (isTimeoutError(err, true)) return true;\n if (isCancelError(err, true)) return true;\n if ((err as any).cause !== undefined && !nested)\n return isTimeoutOrCancelError((err as any).cause, true);\n return false;\n}\n\nexport function isUnimplementedError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if ((err as any).name == \"RpcError\" && (err as any).code == \"UNIMPLEMENTED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.UNIMPLEMENTED)\n return true;\n if ((err as any).cause !== undefined && !nested)\n return isUnimplementedError((err as any).cause, true);\n return false;\n}\n\nexport function isNotFoundError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if ((err as any).name == \"RpcError\" && (err as any).code == \"NOT_FOUND\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.NOT_FOUND) return true;\n if ((err as any).cause !== undefined && !nested) return isNotFoundError((err as any).cause, true);\n return err instanceof RecoverablePlError && err.status.code === PlErrorCodeNotFound;\n}\n\nexport const PlErrorCodeNotFound: number = Code.NOT_FOUND;\n\nexport class PlError extends Error {\n name = \"PlError\";\n constructor(\n public readonly status: Status,\n opts?: ErrorOptions,\n ) {\n super(`code=${status.code} ${status.message}`, opts);\n }\n}\n\nexport function throwPlNotFoundError(message: string): never {\n throw new RecoverablePlError({ code: PlErrorCodeNotFound, message, details: [] });\n}\n\nexport class RecoverablePlError extends PlError {\n name = \"RecoverablePlError\";\n constructor(status: Status) {\n super(status);\n }\n}\n\nexport class UnrecoverablePlError extends PlError {\n name = \"UnrecoverablePlError\";\n constructor(status: Status) {\n super(status);\n }\n}\n\nexport class UnauthenticatedError extends Error {\n name = \"UnauthenticatedError\";\n constructor(message: string) {\n super(\"LoginFailed: \" + message);\n }\n}\n\nexport class PermissionDeniedError extends Error {\n name = \"PermissionDeniedError\";\n constructor(message: string) {\n super(\"PermissionDenied: \" + message);\n }\n}\n\nexport class DisconnectedError extends Error {\n name = \"DisconnectedError\";\n constructor(message: string) {\n super(\"Disconnected: \" + message);\n }\n}\n\nexport class RESTError extends PlError {\n name = \"RESTError\";\n constructor(status: Status, opts?: ErrorOptions) {\n super(status, opts);\n }\n}\n\nexport function rethrowMeaningfulError(error: any, wrapIfUnknown: boolean = false): never {\n if (isUnauthenticated(error)) {\n if (error instanceof UnauthenticatedError) throw error;\n throw new UnauthenticatedError(error.message);\n }\n if (isPermissionDenied(error)) {\n if (error instanceof PermissionDeniedError) throw error;\n throw new PermissionDeniedError(error.message);\n }\n if (isConnectionProblem(error)) {\n if (error instanceof DisconnectedError) throw error;\n throw new DisconnectedError(error.message);\n }\n if (isTimeoutOrCancelError(error)) throw new Aborted(error);\n if (wrapIfUnknown) {\n const message = error.message || String(error) || \"Unknown error\";\n throw new Error(message, { cause: error });\n } else throw error;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"errors.cjs","names":["Aborted"],"sources":["../../src/core/errors.ts"],"sourcesContent":["import type { Status } from \"../proto-grpc/github.com/googleapis/googleapis/google/rpc/status\";\nimport { Aborted } from \"@milaboratories/ts-helpers\";\nimport { Code } from \"../proto-grpc/google/rpc/code\";\n\nexport function isConnectionProblem(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if (err instanceof DisconnectedError) return true;\n if ((err as any).name == \"RpcError\" && (err as any).code == \"UNAVAILABLE\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.UNAVAILABLE) return true;\n if ((err as any).cause !== undefined && !nested)\n return isConnectionProblem((err as any).cause, true);\n return false;\n}\n\nexport function isUnauthenticated(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if (err instanceof UnauthenticatedError) return true;\n if ((err as any).name == \"RpcError\" && (err as any).code == \"UNAUTHENTICATED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.UNAUTHENTICATED)\n return true;\n if ((err as any).cause !== undefined && !nested)\n return isUnauthenticated((err as any).cause, true);\n return false;\n}\n\nexport function isPermissionDenied(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if (err instanceof PermissionDeniedError) return true;\n if ((err as any).name == \"RpcError\" && (err as any).code == \"PERMISSION_DENIED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.PERMISSION_DENIED)\n return true;\n if ((err as any).cause !== undefined && !nested)\n return isPermissionDenied((err as any).cause, true);\n return false;\n}\n\nexport function isTimeoutError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if ((err as any).name == \"TimeoutError\") return true;\n if ((err as any).name == \"RpcError\" && (err as any).code == \"DEADLINE_EXCEEDED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.DEADLINE_EXCEEDED)\n return true;\n if ((err as any).cause !== undefined && !nested) return isTimeoutError((err as any).cause, true);\n return false;\n}\n\nexport function isCancelError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if ((err as any).name == \"RpcError\" && (err as any).code == \"CANCELLED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.CANCELLED) return true;\n if ((err as any).cause !== undefined && !nested) return isCancelError((err as any).cause, true);\n return false;\n}\n\nexport function isAbortedError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if (err instanceof Aborted || (err as any).name == \"AbortError\") return true;\n if ((err as any).code == \"ABORT_ERR\") return true;\n if (err instanceof DOMException && err.code === DOMException.ABORT_ERR) return true; // WebSocket error\n if ((err as any).name == \"RpcError\" && (err as any).code == \"ABORTED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.ABORTED) return true;\n if ((err as any).cause !== undefined && !nested) return isAbortedError((err as any).cause, true);\n return false;\n}\n\nexport function isTimeoutOrCancelError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if (isAbortedError(err, true)) return true;\n if (isTimeoutError(err, true)) return true;\n if (isCancelError(err, true)) return true;\n if ((err as any).cause !== undefined && !nested)\n return isTimeoutOrCancelError((err as any).cause, true);\n return false;\n}\n\nexport function isUnimplementedError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if ((err as any).name == \"RpcError\" && (err as any).code == \"UNIMPLEMENTED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.UNIMPLEMENTED)\n return true;\n if ((err as any).cause !== undefined && !nested)\n return isUnimplementedError((err as any).cause, true);\n return false;\n}\n\nexport function isNotFoundError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if ((err as any).name == \"RpcError\" && (err as any).code == \"NOT_FOUND\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.NOT_FOUND) return true;\n if ((err as any).cause !== undefined && !nested) return isNotFoundError((err as any).cause, true);\n return err instanceof RecoverablePlError && err.status.code === PlErrorCodeNotFound;\n}\n\nexport const PlErrorCodeNotFound: number = Code.NOT_FOUND;\n\nexport class PlError extends Error {\n name = \"PlError\";\n constructor(\n public readonly status: Status,\n opts?: ErrorOptions,\n ) {\n super(`code=${status.code} ${status.message}`, opts);\n }\n}\n\nexport function throwPlNotFoundError(message: string): never {\n throw new RecoverablePlError({ code: PlErrorCodeNotFound, message, details: [] });\n}\n\nexport class RecoverablePlError extends PlError {\n name = \"RecoverablePlError\";\n constructor(status: Status) {\n super(status);\n }\n}\n\nexport class UnrecoverablePlError extends PlError {\n name = \"UnrecoverablePlError\";\n constructor(status: Status) {\n super(status);\n }\n}\n\nexport class UnauthenticatedError extends Error {\n name = \"UnauthenticatedError\";\n constructor(message: string) {\n super(\"LoginFailed: \" + message);\n }\n}\n\nexport class PermissionDeniedError extends Error {\n name = \"PermissionDeniedError\";\n constructor(message: string) {\n super(\"PermissionDenied: \" + message);\n }\n}\n\nexport class DisconnectedError extends Error {\n name = \"DisconnectedError\";\n constructor(message: string) {\n super(\"Disconnected: \" + message);\n }\n}\n\nexport class RESTError extends PlError {\n name = \"RESTError\";\n constructor(status: Status, opts?: ErrorOptions) {\n super(status, opts);\n }\n}\n\nexport function rethrowMeaningfulError(error: any, wrapIfUnknown: boolean = false): never {\n if (isUnauthenticated(error)) {\n if (error instanceof UnauthenticatedError) throw error;\n throw new UnauthenticatedError(error.message);\n }\n if (isPermissionDenied(error)) {\n if (error instanceof PermissionDeniedError) throw error;\n throw new PermissionDeniedError(error.message);\n }\n if (isConnectionProblem(error)) {\n if (error instanceof DisconnectedError) throw error;\n throw new DisconnectedError(error.message);\n }\n if (isTimeoutOrCancelError(error)) throw new Aborted(error);\n if (wrapIfUnknown) {\n const message = error.message || String(error) || \"Unknown error\";\n throw new Error(message, { cause: error });\n } else throw error;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","names":[],"sources":["../../src/core/errors.ts"],"mappings":";;;iBAIgB,mBAAA,CAAoB,GAAA,WAAc,
|
|
1
|
+
{"version":3,"file":"errors.d.ts","names":[],"sources":["../../src/core/errors.ts"],"mappings":";;;iBAIgB,mBAAA,CAAoB,GAAA,WAAc,MAAuB;AAAA,iBAWzD,iBAAA,CAAkB,GAAA,WAAc,MAAuB;AAAA,iBAYvD,kBAAA,CAAmB,GAAA,WAAc,MAAuB;AAAA,iBAYxD,cAAA,CAAe,GAAA,WAAc,MAAuB;AAAA,iBAWpD,aAAA,CAAc,GAAA,WAAc,MAAuB;AAAA,iBASnD,cAAA,CAAe,GAAA,WAAc,MAAuB;AAAA,iBAYpD,sBAAA,CAAuB,GAAA,WAAc,MAAuB;AAAA,iBAW5D,oBAAA,CAAqB,GAAA,WAAc,MAAuB;AAAA,iBAW1D,eAAA,CAAgB,GAAA,WAAc,MAAuB;AAAA,cASxD,mBAAA;AAAA,cAEA,OAAA,SAAgB,KAAA;EAAA,SAGT,MAAA,EAAQ,MAAA;EAF1B,IAAA;cAEkB,MAAA,EAAQ,MAAA,EACxB,IAAA,GAAO,YAAA;AAAA;AAAA,iBAMK,oBAAA,CAAqB,OAAe;AAAA,cAIvC,kBAAA,SAA2B,OAAO;EAC7C,IAAA;cACY,MAAA,EAAQ,MAAA;AAAA;AAAA,cAKT,oBAAA,SAA6B,OAAO;EAC/C,IAAA;cACY,MAAA,EAAQ,MAAA;AAAA;AAAA,cAKT,oBAAA,SAA6B,KAAK;EAC7C,IAAA;cACY,OAAA;AAAA;AAAA,cAKD,qBAAA,SAA8B,KAAK;EAC9C,IAAA;cACY,OAAA;AAAA;AAAA,cAKD,iBAAA,SAA0B,KAAK;EAC1C,IAAA;cACY,OAAA;AAAA;AAAA,cAKD,SAAA,SAAkB,OAAA;EAC7B,IAAA;cACY,MAAA,EAAQ,MAAA,EAAQ,IAAA,GAAO,YAAA;AAAA;AAAA,iBAKrB,sBAAA,CAAuB,KAAA,OAAY,aAA8B"}
|
package/dist/core/errors.js
CHANGED
|
@@ -1,11 +1,10 @@
|
|
|
1
|
-
import { Code } from "../proto-grpc/google/rpc/code.js";
|
|
2
1
|
import { Aborted } from "@milaboratories/ts-helpers";
|
|
3
2
|
//#region src/core/errors.ts
|
|
4
3
|
function isConnectionProblem(err, nested = false) {
|
|
5
4
|
if (err === void 0 || err === null) return false;
|
|
6
5
|
if (err instanceof DisconnectedError) return true;
|
|
7
6
|
if (err.name == "RpcError" && err.code == "UNAVAILABLE") return true;
|
|
8
|
-
if (err.name == "RESTError" && err.status.code ==
|
|
7
|
+
if (err.name == "RESTError" && err.status.code == 14) return true;
|
|
9
8
|
if (err.cause !== void 0 && !nested) return isConnectionProblem(err.cause, true);
|
|
10
9
|
return false;
|
|
11
10
|
}
|
|
@@ -13,7 +12,7 @@ function isUnauthenticated(err, nested = false) {
|
|
|
13
12
|
if (err === void 0 || err === null) return false;
|
|
14
13
|
if (err instanceof UnauthenticatedError) return true;
|
|
15
14
|
if (err.name == "RpcError" && err.code == "UNAUTHENTICATED") return true;
|
|
16
|
-
if (err.name == "RESTError" && err.status.code ==
|
|
15
|
+
if (err.name == "RESTError" && err.status.code == 16) return true;
|
|
17
16
|
if (err.cause !== void 0 && !nested) return isUnauthenticated(err.cause, true);
|
|
18
17
|
return false;
|
|
19
18
|
}
|
|
@@ -21,7 +20,7 @@ function isPermissionDenied(err, nested = false) {
|
|
|
21
20
|
if (err === void 0 || err === null) return false;
|
|
22
21
|
if (err instanceof PermissionDeniedError) return true;
|
|
23
22
|
if (err.name == "RpcError" && err.code == "PERMISSION_DENIED") return true;
|
|
24
|
-
if (err.name == "RESTError" && err.status.code ==
|
|
23
|
+
if (err.name == "RESTError" && err.status.code == 7) return true;
|
|
25
24
|
if (err.cause !== void 0 && !nested) return isPermissionDenied(err.cause, true);
|
|
26
25
|
return false;
|
|
27
26
|
}
|
|
@@ -29,14 +28,14 @@ function isTimeoutError(err, nested = false) {
|
|
|
29
28
|
if (err === void 0 || err === null) return false;
|
|
30
29
|
if (err.name == "TimeoutError") return true;
|
|
31
30
|
if (err.name == "RpcError" && err.code == "DEADLINE_EXCEEDED") return true;
|
|
32
|
-
if (err.name == "RESTError" && err.status.code ==
|
|
31
|
+
if (err.name == "RESTError" && err.status.code == 4) return true;
|
|
33
32
|
if (err.cause !== void 0 && !nested) return isTimeoutError(err.cause, true);
|
|
34
33
|
return false;
|
|
35
34
|
}
|
|
36
35
|
function isCancelError(err, nested = false) {
|
|
37
36
|
if (err === void 0 || err === null) return false;
|
|
38
37
|
if (err.name == "RpcError" && err.code == "CANCELLED") return true;
|
|
39
|
-
if (err.name == "RESTError" && err.status.code ==
|
|
38
|
+
if (err.name == "RESTError" && err.status.code == 1) return true;
|
|
40
39
|
if (err.cause !== void 0 && !nested) return isCancelError(err.cause, true);
|
|
41
40
|
return false;
|
|
42
41
|
}
|
|
@@ -46,7 +45,7 @@ function isAbortedError(err, nested = false) {
|
|
|
46
45
|
if (err.code == "ABORT_ERR") return true;
|
|
47
46
|
if (err instanceof DOMException && err.code === DOMException.ABORT_ERR) return true;
|
|
48
47
|
if (err.name == "RpcError" && err.code == "ABORTED") return true;
|
|
49
|
-
if (err.name == "RESTError" && err.status.code ==
|
|
48
|
+
if (err.name == "RESTError" && err.status.code == 10) return true;
|
|
50
49
|
if (err.cause !== void 0 && !nested) return isAbortedError(err.cause, true);
|
|
51
50
|
return false;
|
|
52
51
|
}
|
|
@@ -61,19 +60,20 @@ function isTimeoutOrCancelError(err, nested = false) {
|
|
|
61
60
|
function isUnimplementedError(err, nested = false) {
|
|
62
61
|
if (err === void 0 || err === null) return false;
|
|
63
62
|
if (err.name == "RpcError" && err.code == "UNIMPLEMENTED") return true;
|
|
64
|
-
if (err.name == "RESTError" && err.status.code ==
|
|
63
|
+
if (err.name == "RESTError" && err.status.code == 12) return true;
|
|
65
64
|
if (err.cause !== void 0 && !nested) return isUnimplementedError(err.cause, true);
|
|
66
65
|
return false;
|
|
67
66
|
}
|
|
68
67
|
function isNotFoundError(err, nested = false) {
|
|
69
68
|
if (err === void 0 || err === null) return false;
|
|
70
69
|
if (err.name == "RpcError" && err.code == "NOT_FOUND") return true;
|
|
71
|
-
if (err.name == "RESTError" && err.status.code ==
|
|
70
|
+
if (err.name == "RESTError" && err.status.code == 5) return true;
|
|
72
71
|
if (err.cause !== void 0 && !nested) return isNotFoundError(err.cause, true);
|
|
73
72
|
return err instanceof RecoverablePlError && err.status.code === PlErrorCodeNotFound;
|
|
74
73
|
}
|
|
75
|
-
const PlErrorCodeNotFound =
|
|
74
|
+
const PlErrorCodeNotFound = 5;
|
|
76
75
|
var PlError = class extends Error {
|
|
76
|
+
status;
|
|
77
77
|
name = "PlError";
|
|
78
78
|
constructor(status, opts) {
|
|
79
79
|
super(`code=${status.code} ${status.message}`, opts);
|
package/dist/core/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","names":[],"sources":["../../src/core/errors.ts"],"sourcesContent":["import type { Status } from \"../proto-grpc/github.com/googleapis/googleapis/google/rpc/status\";\nimport { Aborted } from \"@milaboratories/ts-helpers\";\nimport { Code } from \"../proto-grpc/google/rpc/code\";\n\nexport function isConnectionProblem(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if (err instanceof DisconnectedError) return true;\n if ((err as any).name == \"RpcError\" && (err as any).code == \"UNAVAILABLE\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.UNAVAILABLE) return true;\n if ((err as any).cause !== undefined && !nested)\n return isConnectionProblem((err as any).cause, true);\n return false;\n}\n\nexport function isUnauthenticated(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if (err instanceof UnauthenticatedError) return true;\n if ((err as any).name == \"RpcError\" && (err as any).code == \"UNAUTHENTICATED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.UNAUTHENTICATED)\n return true;\n if ((err as any).cause !== undefined && !nested)\n return isUnauthenticated((err as any).cause, true);\n return false;\n}\n\nexport function isPermissionDenied(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if (err instanceof PermissionDeniedError) return true;\n if ((err as any).name == \"RpcError\" && (err as any).code == \"PERMISSION_DENIED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.PERMISSION_DENIED)\n return true;\n if ((err as any).cause !== undefined && !nested)\n return isPermissionDenied((err as any).cause, true);\n return false;\n}\n\nexport function isTimeoutError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if ((err as any).name == \"TimeoutError\") return true;\n if ((err as any).name == \"RpcError\" && (err as any).code == \"DEADLINE_EXCEEDED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.DEADLINE_EXCEEDED)\n return true;\n if ((err as any).cause !== undefined && !nested) return isTimeoutError((err as any).cause, true);\n return false;\n}\n\nexport function isCancelError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if ((err as any).name == \"RpcError\" && (err as any).code == \"CANCELLED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.CANCELLED) return true;\n if ((err as any).cause !== undefined && !nested) return isCancelError((err as any).cause, true);\n return false;\n}\n\nexport function isAbortedError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if (err instanceof Aborted || (err as any).name == \"AbortError\") return true;\n if ((err as any).code == \"ABORT_ERR\") return true;\n if (err instanceof DOMException && err.code === DOMException.ABORT_ERR) return true; // WebSocket error\n if ((err as any).name == \"RpcError\" && (err as any).code == \"ABORTED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.ABORTED) return true;\n if ((err as any).cause !== undefined && !nested) return isAbortedError((err as any).cause, true);\n return false;\n}\n\nexport function isTimeoutOrCancelError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if (isAbortedError(err, true)) return true;\n if (isTimeoutError(err, true)) return true;\n if (isCancelError(err, true)) return true;\n if ((err as any).cause !== undefined && !nested)\n return isTimeoutOrCancelError((err as any).cause, true);\n return false;\n}\n\nexport function isUnimplementedError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if ((err as any).name == \"RpcError\" && (err as any).code == \"UNIMPLEMENTED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.UNIMPLEMENTED)\n return true;\n if ((err as any).cause !== undefined && !nested)\n return isUnimplementedError((err as any).cause, true);\n return false;\n}\n\nexport function isNotFoundError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if ((err as any).name == \"RpcError\" && (err as any).code == \"NOT_FOUND\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.NOT_FOUND) return true;\n if ((err as any).cause !== undefined && !nested) return isNotFoundError((err as any).cause, true);\n return err instanceof RecoverablePlError && err.status.code === PlErrorCodeNotFound;\n}\n\nexport const PlErrorCodeNotFound: number = Code.NOT_FOUND;\n\nexport class PlError extends Error {\n name = \"PlError\";\n constructor(\n public readonly status: Status,\n opts?: ErrorOptions,\n ) {\n super(`code=${status.code} ${status.message}`, opts);\n }\n}\n\nexport function throwPlNotFoundError(message: string): never {\n throw new RecoverablePlError({ code: PlErrorCodeNotFound, message, details: [] });\n}\n\nexport class RecoverablePlError extends PlError {\n name = \"RecoverablePlError\";\n constructor(status: Status) {\n super(status);\n }\n}\n\nexport class UnrecoverablePlError extends PlError {\n name = \"UnrecoverablePlError\";\n constructor(status: Status) {\n super(status);\n }\n}\n\nexport class UnauthenticatedError extends Error {\n name = \"UnauthenticatedError\";\n constructor(message: string) {\n super(\"LoginFailed: \" + message);\n }\n}\n\nexport class PermissionDeniedError extends Error {\n name = \"PermissionDeniedError\";\n constructor(message: string) {\n super(\"PermissionDenied: \" + message);\n }\n}\n\nexport class DisconnectedError extends Error {\n name = \"DisconnectedError\";\n constructor(message: string) {\n super(\"Disconnected: \" + message);\n }\n}\n\nexport class RESTError extends PlError {\n name = \"RESTError\";\n constructor(status: Status, opts?: ErrorOptions) {\n super(status, opts);\n }\n}\n\nexport function rethrowMeaningfulError(error: any, wrapIfUnknown: boolean = false): never {\n if (isUnauthenticated(error)) {\n if (error instanceof UnauthenticatedError) throw error;\n throw new UnauthenticatedError(error.message);\n }\n if (isPermissionDenied(error)) {\n if (error instanceof PermissionDeniedError) throw error;\n throw new PermissionDeniedError(error.message);\n }\n if (isConnectionProblem(error)) {\n if (error instanceof DisconnectedError) throw error;\n throw new DisconnectedError(error.message);\n }\n if (isTimeoutOrCancelError(error)) throw new Aborted(error);\n if (wrapIfUnknown) {\n const message = error.message || String(error) || \"Unknown error\";\n throw new Error(message, { cause: error });\n } else throw error;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"errors.js","names":[],"sources":["../../src/core/errors.ts"],"sourcesContent":["import type { Status } from \"../proto-grpc/github.com/googleapis/googleapis/google/rpc/status\";\nimport { Aborted } from \"@milaboratories/ts-helpers\";\nimport { Code } from \"../proto-grpc/google/rpc/code\";\n\nexport function isConnectionProblem(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if (err instanceof DisconnectedError) return true;\n if ((err as any).name == \"RpcError\" && (err as any).code == \"UNAVAILABLE\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.UNAVAILABLE) return true;\n if ((err as any).cause !== undefined && !nested)\n return isConnectionProblem((err as any).cause, true);\n return false;\n}\n\nexport function isUnauthenticated(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if (err instanceof UnauthenticatedError) return true;\n if ((err as any).name == \"RpcError\" && (err as any).code == \"UNAUTHENTICATED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.UNAUTHENTICATED)\n return true;\n if ((err as any).cause !== undefined && !nested)\n return isUnauthenticated((err as any).cause, true);\n return false;\n}\n\nexport function isPermissionDenied(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if (err instanceof PermissionDeniedError) return true;\n if ((err as any).name == \"RpcError\" && (err as any).code == \"PERMISSION_DENIED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.PERMISSION_DENIED)\n return true;\n if ((err as any).cause !== undefined && !nested)\n return isPermissionDenied((err as any).cause, true);\n return false;\n}\n\nexport function isTimeoutError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if ((err as any).name == \"TimeoutError\") return true;\n if ((err as any).name == \"RpcError\" && (err as any).code == \"DEADLINE_EXCEEDED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.DEADLINE_EXCEEDED)\n return true;\n if ((err as any).cause !== undefined && !nested) return isTimeoutError((err as any).cause, true);\n return false;\n}\n\nexport function isCancelError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if ((err as any).name == \"RpcError\" && (err as any).code == \"CANCELLED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.CANCELLED) return true;\n if ((err as any).cause !== undefined && !nested) return isCancelError((err as any).cause, true);\n return false;\n}\n\nexport function isAbortedError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if (err instanceof Aborted || (err as any).name == \"AbortError\") return true;\n if ((err as any).code == \"ABORT_ERR\") return true;\n if (err instanceof DOMException && err.code === DOMException.ABORT_ERR) return true; // WebSocket error\n if ((err as any).name == \"RpcError\" && (err as any).code == \"ABORTED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.ABORTED) return true;\n if ((err as any).cause !== undefined && !nested) return isAbortedError((err as any).cause, true);\n return false;\n}\n\nexport function isTimeoutOrCancelError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if (isAbortedError(err, true)) return true;\n if (isTimeoutError(err, true)) return true;\n if (isCancelError(err, true)) return true;\n if ((err as any).cause !== undefined && !nested)\n return isTimeoutOrCancelError((err as any).cause, true);\n return false;\n}\n\nexport function isUnimplementedError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if ((err as any).name == \"RpcError\" && (err as any).code == \"UNIMPLEMENTED\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.UNIMPLEMENTED)\n return true;\n if ((err as any).cause !== undefined && !nested)\n return isUnimplementedError((err as any).cause, true);\n return false;\n}\n\nexport function isNotFoundError(err: unknown, nested: boolean = false): boolean {\n if (err === undefined || err === null) return false;\n\n if ((err as any).name == \"RpcError\" && (err as any).code == \"NOT_FOUND\") return true;\n if ((err as any).name == \"RESTError\" && (err as any).status.code == Code.NOT_FOUND) return true;\n if ((err as any).cause !== undefined && !nested) return isNotFoundError((err as any).cause, true);\n return err instanceof RecoverablePlError && err.status.code === PlErrorCodeNotFound;\n}\n\nexport const PlErrorCodeNotFound: number = Code.NOT_FOUND;\n\nexport class PlError extends Error {\n name = \"PlError\";\n constructor(\n public readonly status: Status,\n opts?: ErrorOptions,\n ) {\n super(`code=${status.code} ${status.message}`, opts);\n }\n}\n\nexport function throwPlNotFoundError(message: string): never {\n throw new RecoverablePlError({ code: PlErrorCodeNotFound, message, details: [] });\n}\n\nexport class RecoverablePlError extends PlError {\n name = \"RecoverablePlError\";\n constructor(status: Status) {\n super(status);\n }\n}\n\nexport class UnrecoverablePlError extends PlError {\n name = \"UnrecoverablePlError\";\n constructor(status: Status) {\n super(status);\n }\n}\n\nexport class UnauthenticatedError extends Error {\n name = \"UnauthenticatedError\";\n constructor(message: string) {\n super(\"LoginFailed: \" + message);\n }\n}\n\nexport class PermissionDeniedError extends Error {\n name = \"PermissionDeniedError\";\n constructor(message: string) {\n super(\"PermissionDenied: \" + message);\n }\n}\n\nexport class DisconnectedError extends Error {\n name = \"DisconnectedError\";\n constructor(message: string) {\n super(\"Disconnected: \" + message);\n }\n}\n\nexport class RESTError extends PlError {\n name = \"RESTError\";\n constructor(status: Status, opts?: ErrorOptions) {\n super(status, opts);\n }\n}\n\nexport function rethrowMeaningfulError(error: any, wrapIfUnknown: boolean = false): never {\n if (isUnauthenticated(error)) {\n if (error instanceof UnauthenticatedError) throw error;\n throw new UnauthenticatedError(error.message);\n }\n if (isPermissionDenied(error)) {\n if (error instanceof PermissionDeniedError) throw error;\n throw new PermissionDeniedError(error.message);\n }\n if (isConnectionProblem(error)) {\n if (error instanceof DisconnectedError) throw error;\n throw new DisconnectedError(error.message);\n }\n if (isTimeoutOrCancelError(error)) throw new Aborted(error);\n if (wrapIfUnknown) {\n const message = error.message || String(error) || \"Unknown error\";\n throw new Error(message, { cause: error });\n } else throw error;\n}\n"],"mappings":";;AAIA,SAAgB,oBAAoB,KAAc,SAAkB,OAAgB;CAClF,IAAI,QAAQ,KAAA,KAAa,QAAQ,MAAM,OAAO;CAE9C,IAAI,eAAe,mBAAmB,OAAO;CAC7C,IAAK,IAAY,QAAQ,cAAe,IAAY,QAAQ,eAAe,OAAO;CAClF,IAAK,IAAY,QAAQ,eAAgB,IAAY,OAAO,QAAA,IAA0B,OAAO;CAC7F,IAAK,IAAY,UAAU,KAAA,KAAa,CAAC,QACvC,OAAO,oBAAqB,IAAY,OAAO,IAAI;CACrD,OAAO;AACT;AAEA,SAAgB,kBAAkB,KAAc,SAAkB,OAAgB;CAChF,IAAI,QAAQ,KAAA,KAAa,QAAQ,MAAM,OAAO;CAE9C,IAAI,eAAe,sBAAsB,OAAO;CAChD,IAAK,IAAY,QAAQ,cAAe,IAAY,QAAQ,mBAAmB,OAAO;CACtF,IAAK,IAAY,QAAQ,eAAgB,IAAY,OAAO,QAAA,IAC1D,OAAO;CACT,IAAK,IAAY,UAAU,KAAA,KAAa,CAAC,QACvC,OAAO,kBAAmB,IAAY,OAAO,IAAI;CACnD,OAAO;AACT;AAEA,SAAgB,mBAAmB,KAAc,SAAkB,OAAgB;CACjF,IAAI,QAAQ,KAAA,KAAa,QAAQ,MAAM,OAAO;CAE9C,IAAI,eAAe,uBAAuB,OAAO;CACjD,IAAK,IAAY,QAAQ,cAAe,IAAY,QAAQ,qBAAqB,OAAO;CACxF,IAAK,IAAY,QAAQ,eAAgB,IAAY,OAAO,QAAA,GAC1D,OAAO;CACT,IAAK,IAAY,UAAU,KAAA,KAAa,CAAC,QACvC,OAAO,mBAAoB,IAAY,OAAO,IAAI;CACpD,OAAO;AACT;AAEA,SAAgB,eAAe,KAAc,SAAkB,OAAgB;CAC7E,IAAI,QAAQ,KAAA,KAAa,QAAQ,MAAM,OAAO;CAE9C,IAAK,IAAY,QAAQ,gBAAgB,OAAO;CAChD,IAAK,IAAY,QAAQ,cAAe,IAAY,QAAQ,qBAAqB,OAAO;CACxF,IAAK,IAAY,QAAQ,eAAgB,IAAY,OAAO,QAAA,GAC1D,OAAO;CACT,IAAK,IAAY,UAAU,KAAA,KAAa,CAAC,QAAQ,OAAO,eAAgB,IAAY,OAAO,IAAI;CAC/F,OAAO;AACT;AAEA,SAAgB,cAAc,KAAc,SAAkB,OAAgB;CAC5E,IAAI,QAAQ,KAAA,KAAa,QAAQ,MAAM,OAAO;CAE9C,IAAK,IAAY,QAAQ,cAAe,IAAY,QAAQ,aAAa,OAAO;CAChF,IAAK,IAAY,QAAQ,eAAgB,IAAY,OAAO,QAAA,GAAwB,OAAO;CAC3F,IAAK,IAAY,UAAU,KAAA,KAAa,CAAC,QAAQ,OAAO,cAAe,IAAY,OAAO,IAAI;CAC9F,OAAO;AACT;AAEA,SAAgB,eAAe,KAAc,SAAkB,OAAgB;CAC7E,IAAI,QAAQ,KAAA,KAAa,QAAQ,MAAM,OAAO;CAE9C,IAAI,eAAe,WAAY,IAAY,QAAQ,cAAc,OAAO;CACxE,IAAK,IAAY,QAAQ,aAAa,OAAO;CAC7C,IAAI,eAAe,gBAAgB,IAAI,SAAS,aAAa,WAAW,OAAO;CAC/E,IAAK,IAAY,QAAQ,cAAe,IAAY,QAAQ,WAAW,OAAO;CAC9E,IAAK,IAAY,QAAQ,eAAgB,IAAY,OAAO,QAAA,IAAsB,OAAO;CACzF,IAAK,IAAY,UAAU,KAAA,KAAa,CAAC,QAAQ,OAAO,eAAgB,IAAY,OAAO,IAAI;CAC/F,OAAO;AACT;AAEA,SAAgB,uBAAuB,KAAc,SAAkB,OAAgB;CACrF,IAAI,QAAQ,KAAA,KAAa,QAAQ,MAAM,OAAO;CAE9C,IAAI,eAAe,KAAK,IAAI,GAAG,OAAO;CACtC,IAAI,eAAe,KAAK,IAAI,GAAG,OAAO;CACtC,IAAI,cAAc,KAAK,IAAI,GAAG,OAAO;CACrC,IAAK,IAAY,UAAU,KAAA,KAAa,CAAC,QACvC,OAAO,uBAAwB,IAAY,OAAO,IAAI;CACxD,OAAO;AACT;AAEA,SAAgB,qBAAqB,KAAc,SAAkB,OAAgB;CACnF,IAAI,QAAQ,KAAA,KAAa,QAAQ,MAAM,OAAO;CAE9C,IAAK,IAAY,QAAQ,cAAe,IAAY,QAAQ,iBAAiB,OAAO;CACpF,IAAK,IAAY,QAAQ,eAAgB,IAAY,OAAO,QAAA,IAC1D,OAAO;CACT,IAAK,IAAY,UAAU,KAAA,KAAa,CAAC,QACvC,OAAO,qBAAsB,IAAY,OAAO,IAAI;CACtD,OAAO;AACT;AAEA,SAAgB,gBAAgB,KAAc,SAAkB,OAAgB;CAC9E,IAAI,QAAQ,KAAA,KAAa,QAAQ,MAAM,OAAO;CAE9C,IAAK,IAAY,QAAQ,cAAe,IAAY,QAAQ,aAAa,OAAO;CAChF,IAAK,IAAY,QAAQ,eAAgB,IAAY,OAAO,QAAA,GAAwB,OAAO;CAC3F,IAAK,IAAY,UAAU,KAAA,KAAa,CAAC,QAAQ,OAAO,gBAAiB,IAAY,OAAO,IAAI;CAChG,OAAO,eAAe,sBAAsB,IAAI,OAAO,SAAS;AAClE;AAEA,MAAa,sBAAA;AAEb,IAAa,UAAb,cAA6B,MAAM;CAGf;CAFlB,OAAO;CACP,YACE,QACA,MACA;EACA,MAAM,QAAQ,OAAO,KAAK,GAAG,OAAO,WAAW,IAAI;EAHnC,KAAA,SAAA;CAIlB;AACF;AAEA,SAAgB,qBAAqB,SAAwB;CAC3D,MAAM,IAAI,mBAAmB;EAAE,MAAM;EAAqB;EAAS,SAAS,CAAC;CAAE,CAAC;AAClF;AAEA,IAAa,qBAAb,cAAwC,QAAQ;CAC9C,OAAO;CACP,YAAY,QAAgB;EAC1B,MAAM,MAAM;CACd;AACF;AAEA,IAAa,uBAAb,cAA0C,QAAQ;CAChD,OAAO;CACP,YAAY,QAAgB;EAC1B,MAAM,MAAM;CACd;AACF;AAEA,IAAa,uBAAb,cAA0C,MAAM;CAC9C,OAAO;CACP,YAAY,SAAiB;EAC3B,MAAM,kBAAkB,OAAO;CACjC;AACF;AAEA,IAAa,wBAAb,cAA2C,MAAM;CAC/C,OAAO;CACP,YAAY,SAAiB;EAC3B,MAAM,uBAAuB,OAAO;CACtC;AACF;AAEA,IAAa,oBAAb,cAAuC,MAAM;CAC3C,OAAO;CACP,YAAY,SAAiB;EAC3B,MAAM,mBAAmB,OAAO;CAClC;AACF;AAEA,IAAa,YAAb,cAA+B,QAAQ;CACrC,OAAO;CACP,YAAY,QAAgB,MAAqB;EAC/C,MAAM,QAAQ,IAAI;CACpB;AACF;AAEA,SAAgB,uBAAuB,OAAY,gBAAyB,OAAc;CACxF,IAAI,kBAAkB,KAAK,GAAG;EAC5B,IAAI,iBAAiB,sBAAsB,MAAM;EACjD,MAAM,IAAI,qBAAqB,MAAM,OAAO;CAC9C;CACA,IAAI,mBAAmB,KAAK,GAAG;EAC7B,IAAI,iBAAiB,uBAAuB,MAAM;EAClD,MAAM,IAAI,sBAAsB,MAAM,OAAO;CAC/C;CACA,IAAI,oBAAoB,KAAK,GAAG;EAC9B,IAAI,iBAAiB,mBAAmB,MAAM;EAC9C,MAAM,IAAI,kBAAkB,MAAM,OAAO;CAC3C;CACA,IAAI,uBAAuB,KAAK,GAAG,MAAM,IAAI,QAAQ,KAAK;CAC1D,IAAI,eAAe;EACjB,MAAM,UAAU,MAAM,WAAW,OAAO,KAAK,KAAK;EAClD,MAAM,IAAI,MAAM,SAAS,EAAE,OAAO,MAAM,CAAC;CAC3C,OAAO,MAAM;AACf"}
|
package/dist/core/final.cjs
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
require("../_virtual/_rolldown/runtime.cjs");
|
|
2
1
|
const require_types = require("./types.cjs");
|
|
3
2
|
let _milaboratories_pl_model_common = require("@milaboratories/pl-model-common");
|
|
4
3
|
//#region src/core/final.ts
|
|
@@ -71,5 +70,7 @@ const DefaultFinalResourceDataPredicate = (r) => {
|
|
|
71
70
|
};
|
|
72
71
|
//#endregion
|
|
73
72
|
exports.DefaultFinalResourceDataPredicate = DefaultFinalResourceDataPredicate;
|
|
73
|
+
exports.ResourceTypeName = _milaboratories_pl_model_common.ResourceTypeName;
|
|
74
|
+
exports.ResourceTypePrefix = _milaboratories_pl_model_common.ResourceTypePrefix;
|
|
74
75
|
|
|
75
76
|
//# sourceMappingURL=final.cjs.map
|
package/dist/core/final.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"final.cjs","names":["isNotNullSignedResourceId","isNullSignedResourceId","ResourceTypeName","getField","ResourceTypePrefix"],"sources":["../../src/core/final.ts"],"sourcesContent":["import type { Optional } from \"utility-types\";\nimport type { BasicResourceData, ResourceData } from \"./types\";\nimport { getField, isNotNullSignedResourceId, isNullSignedResourceId } from \"./types\";\nimport { ResourceTypeName, ResourceTypePrefix } from \"@milaboratories/pl-model-common\";\nexport { ResourceTypeName, ResourceTypePrefix };\n\n/**\n * Function is used to guide multiple layers of caching in pl-client and derived pl-tree.\n *\n * This function defines expected resource-specific state mutation behaviour,\n * if it returns true, system will expect that this data will never change as long as resource exist.\n *\n * If resource data contain information about fields, if should be taken into account, fields are undefined,\n * \"final\" state should be calculated for \"basic\" part of resource data only.\n */\nexport type FinalResourceDataPredicate = (\n resourceData: Optional<ResourceData, \"fields\">,\n) => boolean;\n\nfunction readyOrDuplicateOrError(r: ResourceData | BasicResourceData): boolean {\n return (\n r.resourceReady ||\n isNotNullSignedResourceId(r.originalResourceId) ||\n isNotNullSignedResourceId(r.error)\n );\n}\n\nfunction readyAndHasAllOutputsFilled(r: Optional<ResourceData, \"fields\">): boolean {\n if (!readyOrDuplicateOrError(r)) return false;\n if (!r.outputsLocked) return false;\n if (r.fields === undefined) return true; // if fields are not provided basic resource state is not expected to change in the future\n for (const f of r.fields)\n if (isNullSignedResourceId(f.error) && (isNullSignedResourceId(f.value) || !f.valueIsFinal))\n return false;\n return true;\n}\n\n// solely for logging\nconst unknownResourceTypeNames = new Set<string>();\n\n/** Default implementation, defining behaviour for built-in resource types. */\nexport const DefaultFinalResourceDataPredicate: FinalResourceDataPredicate = (r): boolean => {\n switch (r.type.name) {\n case ResourceTypeName.StreamManager: {\n if (!readyOrDuplicateOrError(r)) return false;\n if (r.fields === undefined) return true; // if fields are not provided basic resource state is not expected to change in the future\n if (isNotNullSignedResourceId(r.error)) return true;\n const downloadable = getField(r as ResourceData, \"downloadable\");\n const stream = getField(r as ResourceData, \"stream\");\n return stream.value === downloadable.value; // it's equal to the resource is marked as final on backend side\n }\n case ResourceTypeName.StdMap:\n case ResourceTypeName.StdMapSlash:\n case ResourceTypeName.EphStdMap:\n case ResourceTypeName.PFrame:\n case ResourceTypeName.ParquetChunk:\n case ResourceTypeName.BContext:\n case ResourceTypeName.BlockPackCustom:\n case ResourceTypeName.BinaryMap:\n case ResourceTypeName.BinaryValue:\n case ResourceTypeName.BlobMap:\n case ResourceTypeName.BResolveSingle:\n case ResourceTypeName.BResolveSingleNoResult:\n case ResourceTypeName.BQueryResult:\n case ResourceTypeName.TengoTemplate:\n case ResourceTypeName.TengoLib:\n case ResourceTypeName.SoftwareInfo:\n case ResourceTypeName.Dummy:\n return readyOrDuplicateOrError(r);\n case ResourceTypeName.JsonResourceError:\n return r.type.version === \"1\";\n case ResourceTypeName.JsonObject:\n case ResourceTypeName.JsonGzObject:\n case ResourceTypeName.JsonString:\n case ResourceTypeName.JsonArray:\n case ResourceTypeName.JsonNumber:\n case ResourceTypeName.BContextEnd:\n case ResourceTypeName.FrontendFromUrl:\n case ResourceTypeName.FrontendFromFolder:\n case ResourceTypeName.BObjectSpec:\n case ResourceTypeName.Blob:\n case ResourceTypeName.Null:\n case ResourceTypeName.Binary:\n case ResourceTypeName.LSProvider:\n case ResourceTypeName.WorkingDirectory:\n return true;\n case ResourceTypeName.UserProject:\n case ResourceTypeName.Projects:\n case ResourceTypeName.ClientRoot:\n return false;\n default:\n if (\n r.type.name.startsWith(ResourceTypePrefix.Blob) ||\n r.type.name.startsWith(ResourceTypePrefix.LS) ||\n r.type.name.startsWith(ResourceTypePrefix.WorkingDirectory) ||\n r.type.name.startsWith(ResourceTypePrefix.StorageSpaceAllocation)\n ) {\n return true;\n } else if (\n r.type.name.startsWith(ResourceTypePrefix.BlobUpload) ||\n r.type.name.startsWith(ResourceTypePrefix.BlobIndex)\n ) {\n return readyAndHasAllOutputsFilled(r);\n } else if (r.type.name.startsWith(ResourceTypePrefix.PColumnData)) {\n return readyOrDuplicateOrError(r);\n } else if (r.type.name.startsWith(ResourceTypePrefix.StreamWorkdir)) {\n return readyOrDuplicateOrError(r);\n } else {\n // Unknown resource type detected\n // Set used to log this message only once\n if (!unknownResourceTypeNames.has(r.type.name)) {\n console.log(\"UNKNOWN RESOURCE TYPE: \" + r.type.name);\n unknownResourceTypeNames.add(r.type.name);\n }\n }\n }\n return false;\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"final.cjs","names":["isNotNullSignedResourceId","isNullSignedResourceId","ResourceTypeName","getField","ResourceTypePrefix"],"sources":["../../src/core/final.ts"],"sourcesContent":["import type { Optional } from \"utility-types\";\nimport type { BasicResourceData, ResourceData } from \"./types\";\nimport { getField, isNotNullSignedResourceId, isNullSignedResourceId } from \"./types\";\nimport { ResourceTypeName, ResourceTypePrefix } from \"@milaboratories/pl-model-common\";\nexport { ResourceTypeName, ResourceTypePrefix };\n\n/**\n * Function is used to guide multiple layers of caching in pl-client and derived pl-tree.\n *\n * This function defines expected resource-specific state mutation behaviour,\n * if it returns true, system will expect that this data will never change as long as resource exist.\n *\n * If resource data contain information about fields, if should be taken into account, fields are undefined,\n * \"final\" state should be calculated for \"basic\" part of resource data only.\n */\nexport type FinalResourceDataPredicate = (\n resourceData: Optional<ResourceData, \"fields\">,\n) => boolean;\n\nfunction readyOrDuplicateOrError(r: ResourceData | BasicResourceData): boolean {\n return (\n r.resourceReady ||\n isNotNullSignedResourceId(r.originalResourceId) ||\n isNotNullSignedResourceId(r.error)\n );\n}\n\nfunction readyAndHasAllOutputsFilled(r: Optional<ResourceData, \"fields\">): boolean {\n if (!readyOrDuplicateOrError(r)) return false;\n if (!r.outputsLocked) return false;\n if (r.fields === undefined) return true; // if fields are not provided basic resource state is not expected to change in the future\n for (const f of r.fields)\n if (isNullSignedResourceId(f.error) && (isNullSignedResourceId(f.value) || !f.valueIsFinal))\n return false;\n return true;\n}\n\n// solely for logging\nconst unknownResourceTypeNames = new Set<string>();\n\n/** Default implementation, defining behaviour for built-in resource types. */\nexport const DefaultFinalResourceDataPredicate: FinalResourceDataPredicate = (r): boolean => {\n switch (r.type.name) {\n case ResourceTypeName.StreamManager: {\n if (!readyOrDuplicateOrError(r)) return false;\n if (r.fields === undefined) return true; // if fields are not provided basic resource state is not expected to change in the future\n if (isNotNullSignedResourceId(r.error)) return true;\n const downloadable = getField(r as ResourceData, \"downloadable\");\n const stream = getField(r as ResourceData, \"stream\");\n return stream.value === downloadable.value; // it's equal to the resource is marked as final on backend side\n }\n case ResourceTypeName.StdMap:\n case ResourceTypeName.StdMapSlash:\n case ResourceTypeName.EphStdMap:\n case ResourceTypeName.PFrame:\n case ResourceTypeName.ParquetChunk:\n case ResourceTypeName.BContext:\n case ResourceTypeName.BlockPackCustom:\n case ResourceTypeName.BinaryMap:\n case ResourceTypeName.BinaryValue:\n case ResourceTypeName.BlobMap:\n case ResourceTypeName.BResolveSingle:\n case ResourceTypeName.BResolveSingleNoResult:\n case ResourceTypeName.BQueryResult:\n case ResourceTypeName.TengoTemplate:\n case ResourceTypeName.TengoLib:\n case ResourceTypeName.SoftwareInfo:\n case ResourceTypeName.Dummy:\n return readyOrDuplicateOrError(r);\n case ResourceTypeName.JsonResourceError:\n return r.type.version === \"1\";\n case ResourceTypeName.JsonObject:\n case ResourceTypeName.JsonGzObject:\n case ResourceTypeName.JsonString:\n case ResourceTypeName.JsonArray:\n case ResourceTypeName.JsonNumber:\n case ResourceTypeName.BContextEnd:\n case ResourceTypeName.FrontendFromUrl:\n case ResourceTypeName.FrontendFromFolder:\n case ResourceTypeName.BObjectSpec:\n case ResourceTypeName.Blob:\n case ResourceTypeName.Null:\n case ResourceTypeName.Binary:\n case ResourceTypeName.LSProvider:\n case ResourceTypeName.WorkingDirectory:\n return true;\n case ResourceTypeName.UserProject:\n case ResourceTypeName.Projects:\n case ResourceTypeName.ClientRoot:\n return false;\n default:\n if (\n r.type.name.startsWith(ResourceTypePrefix.Blob) ||\n r.type.name.startsWith(ResourceTypePrefix.LS) ||\n r.type.name.startsWith(ResourceTypePrefix.WorkingDirectory) ||\n r.type.name.startsWith(ResourceTypePrefix.StorageSpaceAllocation)\n ) {\n return true;\n } else if (\n r.type.name.startsWith(ResourceTypePrefix.BlobUpload) ||\n r.type.name.startsWith(ResourceTypePrefix.BlobIndex)\n ) {\n return readyAndHasAllOutputsFilled(r);\n } else if (r.type.name.startsWith(ResourceTypePrefix.PColumnData)) {\n return readyOrDuplicateOrError(r);\n } else if (r.type.name.startsWith(ResourceTypePrefix.StreamWorkdir)) {\n return readyOrDuplicateOrError(r);\n } else {\n // Unknown resource type detected\n // Set used to log this message only once\n if (!unknownResourceTypeNames.has(r.type.name)) {\n console.log(\"UNKNOWN RESOURCE TYPE: \" + r.type.name);\n unknownResourceTypeNames.add(r.type.name);\n }\n }\n }\n return false;\n};\n"],"mappings":"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"}
|
package/dist/core/final.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"final.d.ts","names":[],"sources":["../../src/core/final.ts"],"mappings":";;;;;;AAeA;;;;;;;;KAAY,0BAAA,IACV,YAAA,EAAc,
|
|
1
|
+
{"version":3,"file":"final.d.ts","names":[],"sources":["../../src/core/final.ts"],"mappings":";;;;;;AAeA;;;;;;;;KAAY,0BAAA,IACV,YAAA,EAAc,QAAQ,CAAC,YAAA;AAyBzB;AAAA,cAAa,iCAAA,EAAmC,0BA4E/C"}
|