@milaboratories/pl-client 3.12.0 → 3.13.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.
Files changed (65) hide show
  1. package/dist/core/capabilities.cjs.map +1 -1
  2. package/dist/core/capabilities.d.ts +2 -3
  3. package/dist/core/capabilities.d.ts.map +1 -1
  4. package/dist/core/capabilities.js.map +1 -1
  5. package/dist/core/client.cjs +42 -4
  6. package/dist/core/client.cjs.map +1 -1
  7. package/dist/core/client.d.ts +21 -4
  8. package/dist/core/client.d.ts.map +1 -1
  9. package/dist/core/client.js +42 -4
  10. package/dist/core/client.js.map +1 -1
  11. package/dist/core/config.cjs +1 -0
  12. package/dist/core/config.cjs.map +1 -1
  13. package/dist/core/config.d.ts +4 -0
  14. package/dist/core/config.d.ts.map +1 -1
  15. package/dist/core/config.js +1 -0
  16. package/dist/core/config.js.map +1 -1
  17. package/dist/core/errors.cjs +1 -0
  18. package/dist/core/errors.cjs.map +1 -1
  19. package/dist/core/errors.d.ts.map +1 -1
  20. package/dist/core/errors.js +1 -0
  21. package/dist/core/errors.js.map +1 -1
  22. package/dist/core/final.cjs +4 -1
  23. package/dist/core/final.cjs.map +1 -1
  24. package/dist/core/final.d.ts.map +1 -1
  25. package/dist/core/final.js +4 -1
  26. package/dist/core/final.js.map +1 -1
  27. package/dist/core/ll_client.cjs +47 -8
  28. package/dist/core/ll_client.cjs.map +1 -1
  29. package/dist/core/ll_client.d.ts +22 -7
  30. package/dist/core/ll_client.d.ts.map +1 -1
  31. package/dist/core/ll_client.js +48 -9
  32. package/dist/core/ll_client.js.map +1 -1
  33. package/dist/core/transaction.cjs +82 -1
  34. package/dist/core/transaction.cjs.map +1 -1
  35. package/dist/core/transaction.d.ts +52 -2
  36. package/dist/core/transaction.d.ts.map +1 -1
  37. package/dist/core/transaction.js +80 -2
  38. package/dist/core/transaction.js.map +1 -1
  39. package/dist/core/user_resources.cjs +54 -0
  40. package/dist/core/user_resources.cjs.map +1 -1
  41. package/dist/core/user_resources.d.ts +55 -1
  42. package/dist/core/user_resources.d.ts.map +1 -1
  43. package/dist/core/user_resources.js +54 -0
  44. package/dist/core/user_resources.js.map +1 -1
  45. package/dist/index.cjs +3 -0
  46. package/dist/index.d.ts +3 -3
  47. package/dist/index.js +2 -2
  48. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.cjs +6 -6
  49. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.cjs.map +1 -1
  50. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.d.ts +6 -6
  51. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.d.ts.map +1 -1
  52. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.js +6 -6
  53. package/dist/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.js.map +1 -1
  54. package/package.json +4 -4
  55. package/src/core/capabilities.ts +10 -3
  56. package/src/core/client.ts +69 -4
  57. package/src/core/config.test.ts +15 -0
  58. package/src/core/config.ts +6 -0
  59. package/src/core/errors.ts +2 -0
  60. package/src/core/final.ts +4 -0
  61. package/src/core/ll_client.test.ts +15 -2
  62. package/src/core/ll_client.ts +59 -9
  63. package/src/core/transaction.ts +103 -3
  64. package/src/core/user_resources.ts +85 -0
  65. package/src/proto-grpc/github.com/milaboratory/pl/plapi/plapiproto/api.ts +9 -9
@@ -63,6 +63,7 @@ function plAddressToConfig(address, overrides = {}) {
63
63
  return {
64
64
  hostAndPort: `${url.hostname}:${port}`,
65
65
  alternativeRoot: url.searchParams.get("alternative-root") ?? void 0,
66
+ asUser: url.searchParams.get("as-user") || void 0,
66
67
  ssl: url.protocol === "https:" || url.protocol === "tls:",
67
68
  wireProtocol: url.searchParams.get("wire-protocol") ?? void 0,
68
69
  defaultRequestTimeout: parseInt(url.searchParams.get("request-timeout")) ?? 5e3,
@@ -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 /** Admin-only impersonation: if set, the client opens the root of the user with this login instead of the\n * caller's own root. The backend authorizes this by role and silently falls back to the caller's own root for\n * regular users, so it is safe without a client-side gate. Mutually exclusive with {@link alternativeRoot}. */\n asUser?: 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 asUser: url.searchParams.get(\"as-user\") || 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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"}
@@ -13,6 +13,7 @@ function isUnauthenticated(err, nested = false) {
13
13
  if (err instanceof UnauthenticatedError) return true;
14
14
  if (err.name == "RpcError" && err.code == "UNAUTHENTICATED") return true;
15
15
  if (err.name == "RESTError" && err.status.code == 16) return true;
16
+ if (err instanceof PlError && err.status?.code === 16) return true;
16
17
  if (err.cause !== void 0 && !nested) return isUnauthenticated(err.cause, true);
17
18
  return false;
18
19
  }
@@ -1 +1 @@
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
+ {"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 // PlError (e.g. UnrecoverablePlError from a failed streaming tx) carries the status code numerically.\n if (err instanceof PlError && err.status?.code === Code.UNAUTHENTICATED) 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,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"}
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,iBAcvD,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"}
@@ -13,6 +13,7 @@ function isUnauthenticated(err, nested = false) {
13
13
  if (err instanceof UnauthenticatedError) return true;
14
14
  if (err.name == "RpcError" && err.code == "UNAUTHENTICATED") return true;
15
15
  if (err.name == "RESTError" && err.status.code == 16) return true;
16
+ if (err instanceof PlError && err.status?.code === 16) return true;
16
17
  if (err.cause !== void 0 && !nested) return isUnauthenticated(err.cause, true);
17
18
  return false;
18
19
  }
@@ -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 // PlError (e.g. UnrecoverablePlError from a failed streaming tx) carries the status code numerically.\n if (err instanceof PlError && err.status?.code === Code.UNAUTHENTICATED) 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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"}
@@ -56,7 +56,10 @@ const DefaultFinalResourceDataPredicate = (r) => {
56
56
  case _milaboratories_pl_model_common.ResourceTypeName.WorkingDirectory: return true;
57
57
  case _milaboratories_pl_model_common.ResourceTypeName.UserProject:
58
58
  case _milaboratories_pl_model_common.ResourceTypeName.Projects:
59
- case _milaboratories_pl_model_common.ResourceTypeName.ClientRoot: return false;
59
+ case _milaboratories_pl_model_common.ResourceTypeName.ClientRoot:
60
+ case _milaboratories_pl_model_common.ResourceTypeName.SharingOutbox:
61
+ case _milaboratories_pl_model_common.ResourceTypeName.SharingState:
62
+ case _milaboratories_pl_model_common.ResourceTypeName.SharedEnvelope: return false;
60
63
  default: if (r.type.name.startsWith(_milaboratories_pl_model_common.ResourceTypePrefix.Blob) || r.type.name.startsWith(_milaboratories_pl_model_common.ResourceTypePrefix.LS) || r.type.name.startsWith(_milaboratories_pl_model_common.ResourceTypePrefix.WorkingDirectory) || r.type.name.startsWith(_milaboratories_pl_model_common.ResourceTypePrefix.StorageSpaceAllocation)) return true;
61
64
  else if (r.type.name.startsWith(_milaboratories_pl_model_common.ResourceTypePrefix.BlobUpload) || r.type.name.startsWith(_milaboratories_pl_model_common.ResourceTypePrefix.BlobIndex)) return readyAndHasAllOutputsFilled(r);
62
65
  else if (r.type.name.startsWith(_milaboratories_pl_model_common.ResourceTypePrefix.PColumnData)) return readyOrDuplicateOrError(r);
@@ -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":"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"}
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 // Never final — these sharing resources gain and lose dynamic child fields over their lifetime.\n case ResourceTypeName.SharingOutbox:\n case ResourceTypeName.SharingState:\n case ResourceTypeName.SharedEnvelope:\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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"}
@@ -1 +1 @@
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"}
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,0BAgF/C"}
@@ -56,7 +56,10 @@ const DefaultFinalResourceDataPredicate = (r) => {
56
56
  case ResourceTypeName.WorkingDirectory: return true;
57
57
  case ResourceTypeName.UserProject:
58
58
  case ResourceTypeName.Projects:
59
- case ResourceTypeName.ClientRoot: return false;
59
+ case ResourceTypeName.ClientRoot:
60
+ case ResourceTypeName.SharingOutbox:
61
+ case ResourceTypeName.SharingState:
62
+ case ResourceTypeName.SharedEnvelope: return false;
60
63
  default: if (r.type.name.startsWith(ResourceTypePrefix.Blob) || r.type.name.startsWith(ResourceTypePrefix.LS) || r.type.name.startsWith(ResourceTypePrefix.WorkingDirectory) || r.type.name.startsWith(ResourceTypePrefix.StorageSpaceAllocation)) return true;
61
64
  else if (r.type.name.startsWith(ResourceTypePrefix.BlobUpload) || r.type.name.startsWith(ResourceTypePrefix.BlobIndex)) return readyAndHasAllOutputsFilled(r);
62
65
  else if (r.type.name.startsWith(ResourceTypePrefix.PColumnData)) return readyOrDuplicateOrError(r);
@@ -1 +1 @@
1
- {"version":3,"file":"final.js","names":[],"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":";;;AAmBA,SAAS,wBAAwB,GAA8C;CAC7E,OACE,EAAE,iBACF,0BAA0B,EAAE,kBAAkB,KAC9C,0BAA0B,EAAE,KAAK;AAErC;AAEA,SAAS,4BAA4B,GAA8C;CACjF,IAAI,CAAC,wBAAwB,CAAC,GAAG,OAAO;CACxC,IAAI,CAAC,EAAE,eAAe,OAAO;CAC7B,IAAI,EAAE,WAAW,KAAA,GAAW,OAAO;CACnC,KAAK,MAAM,KAAK,EAAE,QAChB,IAAI,uBAAuB,EAAE,KAAK,MAAM,uBAAuB,EAAE,KAAK,KAAK,CAAC,EAAE,eAC5E,OAAO;CACX,OAAO;AACT;AAGA,MAAM,2CAA2B,IAAI,IAAY;;AAGjD,MAAa,qCAAiE,MAAe;CAC3F,QAAQ,EAAE,KAAK,MAAf;EACE,KAAK,iBAAiB,eAAe;GACnC,IAAI,CAAC,wBAAwB,CAAC,GAAG,OAAO;GACxC,IAAI,EAAE,WAAW,KAAA,GAAW,OAAO;GACnC,IAAI,0BAA0B,EAAE,KAAK,GAAG,OAAO;GAC/C,MAAM,eAAe,SAAS,GAAmB,cAAc;GAE/D,OADe,SAAS,GAAmB,QAC/B,CAAC,CAAC,UAAU,aAAa;EACvC;EACA,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB,OACpB,OAAO,wBAAwB,CAAC;EAClC,KAAK,iBAAiB,mBACpB,OAAO,EAAE,KAAK,YAAY;EAC5B,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB,kBACpB,OAAO;EACT,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB,YACpB,OAAO;EACT,SACE,IACE,EAAE,KAAK,KAAK,WAAW,mBAAmB,IAAI,KAC9C,EAAE,KAAK,KAAK,WAAW,mBAAmB,EAAE,KAC5C,EAAE,KAAK,KAAK,WAAW,mBAAmB,gBAAgB,KAC1D,EAAE,KAAK,KAAK,WAAW,mBAAmB,sBAAsB,GAEhE,OAAO;OACF,IACL,EAAE,KAAK,KAAK,WAAW,mBAAmB,UAAU,KACpD,EAAE,KAAK,KAAK,WAAW,mBAAmB,SAAS,GAEnD,OAAO,4BAA4B,CAAC;OAC/B,IAAI,EAAE,KAAK,KAAK,WAAW,mBAAmB,WAAW,GAC9D,OAAO,wBAAwB,CAAC;OAC3B,IAAI,EAAE,KAAK,KAAK,WAAW,mBAAmB,aAAa,GAChE,OAAO,wBAAwB,CAAC;OAIhC,IAAI,CAAC,yBAAyB,IAAI,EAAE,KAAK,IAAI,GAAG;GAC9C,QAAQ,IAAI,4BAA4B,EAAE,KAAK,IAAI;GACnD,yBAAyB,IAAI,EAAE,KAAK,IAAI;EAC1C;CAEN;CACA,OAAO;AACT"}
1
+ {"version":3,"file":"final.js","names":[],"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 // Never final — these sharing resources gain and lose dynamic child fields over their lifetime.\n case ResourceTypeName.SharingOutbox:\n case ResourceTypeName.SharingState:\n case ResourceTypeName.SharedEnvelope:\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":";;;AAmBA,SAAS,wBAAwB,GAA8C;CAC7E,OACE,EAAE,iBACF,0BAA0B,EAAE,kBAAkB,KAC9C,0BAA0B,EAAE,KAAK;AAErC;AAEA,SAAS,4BAA4B,GAA8C;CACjF,IAAI,CAAC,wBAAwB,CAAC,GAAG,OAAO;CACxC,IAAI,CAAC,EAAE,eAAe,OAAO;CAC7B,IAAI,EAAE,WAAW,KAAA,GAAW,OAAO;CACnC,KAAK,MAAM,KAAK,EAAE,QAChB,IAAI,uBAAuB,EAAE,KAAK,MAAM,uBAAuB,EAAE,KAAK,KAAK,CAAC,EAAE,eAC5E,OAAO;CACX,OAAO;AACT;AAGA,MAAM,2CAA2B,IAAI,IAAY;;AAGjD,MAAa,qCAAiE,MAAe;CAC3F,QAAQ,EAAE,KAAK,MAAf;EACE,KAAK,iBAAiB,eAAe;GACnC,IAAI,CAAC,wBAAwB,CAAC,GAAG,OAAO;GACxC,IAAI,EAAE,WAAW,KAAA,GAAW,OAAO;GACnC,IAAI,0BAA0B,EAAE,KAAK,GAAG,OAAO;GAC/C,MAAM,eAAe,SAAS,GAAmB,cAAc;GAE/D,OADe,SAAS,GAAmB,QAC/B,CAAC,CAAC,UAAU,aAAa;EACvC;EACA,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB,OACpB,OAAO,wBAAwB,CAAC;EAClC,KAAK,iBAAiB,mBACpB,OAAO,EAAE,KAAK,YAAY;EAC5B,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB,kBACpB,OAAO;EACT,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EAEtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB;EACtB,KAAK,iBAAiB,gBACpB,OAAO;EACT,SACE,IACE,EAAE,KAAK,KAAK,WAAW,mBAAmB,IAAI,KAC9C,EAAE,KAAK,KAAK,WAAW,mBAAmB,EAAE,KAC5C,EAAE,KAAK,KAAK,WAAW,mBAAmB,gBAAgB,KAC1D,EAAE,KAAK,KAAK,WAAW,mBAAmB,sBAAsB,GAEhE,OAAO;OACF,IACL,EAAE,KAAK,KAAK,WAAW,mBAAmB,UAAU,KACpD,EAAE,KAAK,KAAK,WAAW,mBAAmB,SAAS,GAEnD,OAAO,4BAA4B,CAAC;OAC/B,IAAI,EAAE,KAAK,KAAK,WAAW,mBAAmB,WAAW,GAC9D,OAAO,wBAAwB,CAAC;OAC3B,IAAI,EAAE,KAAK,KAAK,WAAW,mBAAmB,aAAa,GAChE,OAAO,wBAAwB,CAAC;OAIhC,IAAI,CAAC,yBAAyB,IAAI,EAAE,KAAK,IAAI,GAAG;GAC9C,QAAQ,IAAI,4BAA4B,EAAE,KAAK,IAAI;GACnD,yBAAyB,IAAI,EAAE,KAAK,IAAI;EAC1C;CAEN;CACA,OAAO;AACT"}
@@ -74,6 +74,7 @@ var LLPlClient = class LLPlClient {
74
74
  _serverInfo;
75
75
  _authMethodsSync;
76
76
  _status = "OK";
77
+ authProbeInFlight = false;
77
78
  statusListener;
78
79
  _wireProto = "grpc";
79
80
  _wireConn;
@@ -245,6 +246,24 @@ var LLPlClient = class LLPlClient {
245
246
  }
246
247
  });
247
248
  }
249
+ /**
250
+ * UNAUTHENTICATED covers both a dead session (must reset) and a per-request authorization failure
251
+ * such as a revoked resource signature (must not). Disambiguate by probing getSessionInfo — an
252
+ * authenticated call with no resource signature: success means the session is alive and the failure
253
+ * was resource-level; a probe that is itself Unauthenticated means real auth loss. Coalesced via
254
+ * authProbeInFlight so a burst of failures costs one probe.
255
+ */
256
+ async verifyThenMaybeEscalateUnauthenticated() {
257
+ if (this._status !== "OK" || this.authProbeInFlight) return;
258
+ this.authProbeInFlight = true;
259
+ try {
260
+ await this.getSessionInfo();
261
+ } catch (e) {
262
+ if (require_errors.isUnauthenticated(e)) this.updateStatus("Unauthenticated");
263
+ } finally {
264
+ this.authProbeInFlight = false;
265
+ }
266
+ }
248
267
  get status() {
249
268
  return this._status;
250
269
  }
@@ -294,7 +313,7 @@ var LLPlClient = class LLPlClient {
294
313
  ...resOptions,
295
314
  status: response.status
296
315
  });
297
- if (respErr.error.code === 16) this.updateStatus("Unauthenticated");
316
+ if (respErr.error.code === 16) this.verifyThenMaybeEscalateUnauthenticated();
298
317
  return new Response(respErr.origBody, {
299
318
  ...resOptions,
300
319
  status: response.status
@@ -306,7 +325,7 @@ var LLPlClient = class LLPlClient {
306
325
  return (options, nextCall) => {
307
326
  return new _grpc_grpc_js.InterceptingCall(nextCall(options), { start: (metadata, listener, next) => {
308
327
  next(metadata, { onReceiveStatus: (status, next) => {
309
- if (status.code == _grpc_grpc_js.status.UNAUTHENTICATED) this.updateStatus("Unauthenticated");
328
+ if (status.code == _grpc_grpc_js.status.UNAUTHENTICATED) this.verifyThenMaybeEscalateUnauthenticated();
310
329
  if (status.code == _grpc_grpc_js.status.UNAVAILABLE) this.updateStatus("Disconnected");
311
330
  next(status);
312
331
  } });
@@ -500,13 +519,12 @@ var LLPlClient = class LLPlClient {
500
519
  ]);
501
520
  }
502
521
  /**
503
- * True if the backend honors per-file `permissions` on workdir fill rules
504
- * (PR #1830 in milaboratory/pl). Backends before this change ignore the
505
- * requested mode and always land files at the canonical archive perm,
506
- * making `exec.builder().writeFile/addFile({ writable: true })` a no-op.
522
+ * True if the backend honors per-file `permissions` on workdir fill rules, so
523
+ * `exec.builder().writeFile/addFile({ writable: true })` takes effect. When false
524
+ * the requested mode is ignored and files land at the canonical archive perm.
507
525
  *
508
- * Tagged at 3.5.0 cut without the change, so [3, 5, 0] excludes the tagged
509
- * release but includes dev builds past the tag (e.g. "3.5.0-224-g0ca182").
526
+ * [3, 5, 0] excludes the tagged 3.5.0 release but includes dev builds past the
527
+ * tag (e.g. "3.5.0-224-g0ca182"), which is where the support lands.
510
528
  */
511
529
  get supportsWritableWorkdirFiles() {
512
530
  return isAfterVersion(this.serverInfo.coreVersion, [
@@ -629,6 +647,27 @@ var LLPlClient = class LLPlClient {
629
647
  for await (const msg of call.responses) responses.push(msg);
630
648
  return responses;
631
649
  }
650
+ /** Returns the authenticated caller's session id and effective role.
651
+ * Models the {@link getUserRoot} wrapper: gRPC unary with a REST fallback. */
652
+ async getSessionInfo() {
653
+ const cl = this.clientProvider.get();
654
+ if (cl instanceof require_api_client.PlatformClient) return (await cl.getSessionInfo({})).response;
655
+ else {
656
+ const resp = (0, _milaboratories_ts_helpers.notEmpty)((await cl.POST("/v1/auth/session-info", { body: {} })).data, "REST: empty response for getSessionInfo request");
657
+ return {
658
+ sessionId: Uint8Array.from(Buffer.from(resp.sessionId, "base64")),
659
+ role: resp.role
660
+ };
661
+ }
662
+ }
663
+ /** Lists the users known to the server — the recipient picker's source. A user
664
+ * becomes known on first login; provisioned users who have never logged in do not
665
+ * appear. gRPC-only (unary, no REST binding). */
666
+ async listUsers() {
667
+ const cl = this.clientProvider.get();
668
+ if (!(cl instanceof require_api_client.PlatformClient)) throw new Error("ListUsers requires gRPC wire protocol; REST is not supported");
669
+ return (await cl.listUsers({})).response.users;
670
+ }
632
671
  async txSync(txId) {
633
672
  const cl = this.clientProvider.get();
634
673
  if (cl instanceof require_api_client.PlatformClient) await cl.txSync({ txId: BigInt(txId) });