@jwilleke/ngdpbase-types 0.0.0 → 5.19.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/LICENSE +201 -0
- package/README.md +16 -2
- package/lib/packages/ngdpbase-types/index.d.ts +32 -0
- package/lib/packages/ngdpbase-types/testing.d.ts +43 -0
- package/lib/packages/ngdpbase-types/testing.js +53 -0
- package/lib/src/cache/CacheDependencies.d.ts +50 -0
- package/lib/src/cache/CacheDependencies.js +50 -0
- package/lib/src/cache/ICacheAdapter.d.ts +86 -0
- package/lib/src/cache/RegionCache.d.ts +171 -0
- package/lib/src/context/ActorContext.d.ts +48 -0
- package/lib/src/context/ActorContext.js +33 -0
- package/lib/src/context/ApiContext.d.ts +194 -0
- package/lib/src/context/ApiContext.js +273 -0
- package/lib/src/context/BaseContext.d.ts +110 -0
- package/lib/src/context/BaseContext.js +143 -0
- package/lib/src/context/JobContext.d.ts +153 -0
- package/lib/src/context/JobContext.js +144 -0
- package/lib/src/context/WikiContext.d.ts +404 -0
- package/lib/src/context/bootActions.d.ts +64 -0
- package/lib/src/context/bootActions.js +111 -0
- package/lib/src/converters/HtmlConverter.d.ts +70 -0
- package/lib/src/converters/IContentConverter.d.ts +94 -0
- package/lib/src/converters/JSPWikiConverter.d.ts +117 -0
- package/lib/src/converters/conversionWarning.d.ts +15 -0
- package/lib/src/converters/ncm/bridge.d.ts +22 -0
- package/lib/src/converters/ncm/existing.d.ts +23 -0
- package/lib/src/converters/ncm/fix/blocks.d.ts +89 -0
- package/lib/src/converters/ncm/fix/bulletMarkers.d.ts +21 -0
- package/lib/src/converters/ncm/fix/index.d.ts +36 -0
- package/lib/src/converters/ncm/fix/jspwikiBullets.d.ts +20 -0
- package/lib/src/converters/ncm/fix/jspwikiCodeMarkers.d.ts +38 -0
- package/lib/src/converters/ncm/fix/jspwikiHeadings.d.ts +25 -0
- package/lib/src/converters/ncm/fix/jspwikiIndent.d.ts +24 -0
- package/lib/src/converters/ncm/fix/jspwikiInsert.d.ts +21 -0
- package/lib/src/converters/ncm/fix/jspwikiItalic.d.ts +29 -0
- package/lib/src/converters/ncm/fix/jspwikiLinkLeftovers.d.ts +27 -0
- package/lib/src/converters/ncm/fix/moreInformationFooter.d.ts +25 -0
- package/lib/src/converters/ncm/fix/styleClosers.d.ts +25 -0
- package/lib/src/converters/ncm/fix/tightenLists.d.ts +30 -0
- package/lib/src/converters/ncm/fix/types.d.ts +33 -0
- package/lib/src/converters/ncm/footnotes.d.ts +39 -0
- package/lib/src/converters/ncm/images.d.ts +49 -0
- package/lib/src/converters/ncm/index.d.ts +20 -0
- package/lib/src/converters/ncm/links.d.ts +21 -0
- package/lib/src/converters/ncm/normalize.d.ts +39 -0
- package/lib/src/converters/ncm/placeholder.d.ts +25 -0
- package/lib/src/converters/ncm/tables.d.ts +36 -0
- package/lib/src/converters/ncm/types.d.ts +42 -0
- package/lib/src/http/egressPolicy.d.ts +52 -0
- package/lib/src/http/guardedFetch.d.ts +89 -0
- package/lib/src/http/guardedFetch.js +113 -0
- package/lib/src/http/guardedLookup.d.ts +48 -0
- package/lib/src/http/guardedLookup.js +73 -0
- package/lib/src/http/ssrf.d.ts +83 -0
- package/lib/src/http/ssrf.js +311 -0
- package/lib/src/mail/MailProvider.d.ts +36 -0
- package/lib/src/mail/NodemailerMailProvider.d.ts +26 -0
- package/lib/src/managers/AddonsManager.d.ts +691 -0
- package/lib/src/managers/AgentTokenManager.d.ts +269 -0
- package/lib/src/managers/AssetManager.d.ts +116 -0
- package/lib/src/managers/AttachmentManager.d.ts +1032 -0
- package/lib/src/managers/AuthManager.d.ts +1257 -0
- package/lib/src/managers/BackgroundJobManager.d.ts +434 -0
- package/lib/src/managers/BaseManager.d.ts +427 -0
- package/lib/src/managers/BaseManager.js +415 -0
- package/lib/src/managers/CacheManager.d.ts +159 -0
- package/lib/src/managers/CatalogManager.d.ts +235 -0
- package/lib/src/managers/CommentManager.d.ts +75 -0
- package/lib/src/managers/ConfigurationManager.d.ts +747 -0
- package/lib/src/managers/DatabaseManager.d.ts +188 -0
- package/lib/src/managers/DatabaseManager.js +590 -0
- package/lib/src/managers/EmailManager.d.ts +47 -0
- package/lib/src/managers/ExportManager.d.ts +129 -0
- package/lib/src/managers/ExportManager.js +420 -0
- package/lib/src/managers/FootnoteManager.d.ts +118 -0
- package/lib/src/managers/MediaManager.d.ts +279 -0
- package/lib/src/managers/MetricsManager.d.ts +89 -0
- package/lib/src/managers/NotificationManager.d.ts +165 -0
- package/lib/src/managers/OidcManager.d.ts +210 -0
- package/lib/src/managers/OrganizationManager.d.ts +107 -0
- package/lib/src/managers/PageManager.d.ts +1645 -0
- package/lib/src/managers/PersonManager.d.ts +48 -0
- package/lib/src/managers/PluginManager.d.ts +179 -0
- package/lib/src/managers/PluginManager.js +393 -0
- package/lib/src/managers/PolicyEvaluator.d.ts +213 -0
- package/lib/src/managers/RenderingManager.d.ts +358 -0
- package/lib/src/managers/RoleManager.d.ts +134 -0
- package/lib/src/managers/SearchManager.d.ts +402 -0
- package/lib/src/managers/ShareManager.d.ts +251 -0
- package/lib/src/managers/TemplateManager.d.ts +176 -0
- package/lib/src/managers/ThemeManager.d.ts +56 -0
- package/lib/src/managers/UserManager.d.ts +480 -0
- package/lib/src/managers/ValidationManager.d.ts +426 -0
- package/lib/src/managers/VariableManager.d.ts +145 -0
- package/lib/src/middleware/csrf.d.ts +3 -0
- package/lib/src/parsers/LinkParser.d.ts +457 -0
- package/lib/src/parsers/MarkupParser.d.ts +769 -0
- package/lib/src/parsers/context/ParseContext.d.ts +314 -0
- package/lib/src/parsers/data/emoji-map.d.ts +18 -0
- package/lib/src/parsers/dom/DOMBuilder.d.ts +210 -0
- package/lib/src/parsers/dom/DOMParser.d.ts +252 -0
- package/lib/src/parsers/dom/Tokenizer.d.ts +358 -0
- package/lib/src/parsers/dom/WikiDocument.d.ts +272 -0
- package/lib/src/parsers/dom/handlers/DOMLinkHandler.d.ts +260 -0
- package/lib/src/parsers/dom/handlers/DOMPluginHandler.d.ts +212 -0
- package/lib/src/parsers/dom/handlers/DOMVariableHandler.d.ts +171 -0
- package/lib/src/parsers/filters/BaseFilter.d.ts +269 -0
- package/lib/src/parsers/filters/FilterChain.d.ts +320 -0
- package/lib/src/parsers/handlers/BaseSyntaxHandler.d.ts +331 -0
- package/lib/src/parsers/handlers/HandlerRegistry.d.ts +225 -0
- package/lib/src/parsers/handlers/JSPWikiPreprocessor.d.ts +89 -0
- package/lib/src/parsers/handlers/LinkParserHandler.d.ts +80 -0
- package/lib/src/parsers/handlers/PluginSyntaxHandler.d.ts +78 -0
- package/lib/src/parsers/handlers/WikiFormHandler.d.ts +149 -0
- package/lib/src/parsers/handlers/WikiTagHandler.d.ts +125 -0
- package/lib/src/parsers/jspwikiTableRow.d.ts +39 -0
- package/lib/src/parsers/styleBlockSyntax.d.ts +14 -0
- package/lib/src/plugins/types.d.ts +79 -0
- package/lib/src/providers/AgentTokenAuthProvider.d.ts +40 -0
- package/lib/src/providers/AuthentikBearerAuthProvider.d.ts +75 -0
- package/lib/src/providers/BaseAttachmentProvider.d.ts +197 -0
- package/lib/src/providers/BaseAuthProvider.d.ts +220 -0
- package/lib/src/providers/BaseCacheProvider.d.ts +140 -0
- package/lib/src/providers/BaseCredentialsProvider.d.ts +84 -0
- package/lib/src/providers/BaseDatabaseProvider.d.ts +22 -0
- package/lib/src/providers/BaseDatabaseProvider.js +12 -0
- package/lib/src/providers/BaseLoggingProvider.d.ts +68 -0
- package/lib/src/providers/BaseLoggingProvider.js +37 -0
- package/lib/src/providers/BaseMediaProvider.d.ts +308 -0
- package/lib/src/providers/BasePageProvider.d.ts +337 -0
- package/lib/src/providers/BaseProvider.d.ts +98 -0
- package/lib/src/providers/BaseProvider.js +74 -0
- package/lib/src/providers/BaseSearchProvider.d.ts +362 -0
- package/lib/src/providers/BasicAttachmentProvider.d.ts +599 -0
- package/lib/src/providers/CloudflareAccessAuthProvider.d.ts +72 -0
- package/lib/src/providers/FileCredentialsProvider.d.ts +33 -0
- package/lib/src/providers/FileJobStateProvider.d.ts +58 -0
- package/lib/src/providers/FileLoggingProvider.d.ts +43 -0
- package/lib/src/providers/FileLoggingProvider.js +120 -0
- package/lib/src/providers/FileOidcAdapter.d.ts +25 -0
- package/lib/src/providers/FileSystemMediaProvider.d.ts +403 -0
- package/lib/src/providers/LunrSearchProvider.d.ts +280 -0
- package/lib/src/providers/MagicLinkAuthProvider.d.ts +125 -0
- package/lib/src/providers/NullCacheProvider.d.ts +72 -0
- package/lib/src/providers/OidcAuthProvider.d.ts +180 -0
- package/lib/src/providers/OidcBearerAuthProvider.d.ts +30 -0
- package/lib/src/providers/PasskeyAuthProvider.d.ts +58 -0
- package/lib/src/providers/PasswordAuthProvider.d.ts +20 -0
- package/lib/src/providers/SqliteDatabaseProvider.d.ts +55 -0
- package/lib/src/providers/SqliteDatabaseProvider.js +90 -0
- package/lib/src/providers/SqliteJobStateProvider.d.ts +41 -0
- package/lib/src/providers/databaseMigrations.d.ts +8 -0
- package/lib/src/providers/databaseMigrations.js +47 -0
- package/lib/src/providers/jobState.d.ts +99 -0
- package/lib/src/providers/lunrQueryToMiniSearch.d.ts +32 -0
- package/lib/src/providers/mediaFilenameDate.d.ts +22 -0
- package/lib/src/providers/sqliteBackup.d.ts +128 -0
- package/lib/src/providers/sqliteBackup.js +365 -0
- package/lib/src/providers/sqliteLocation.d.ts +17 -0
- package/lib/src/providers/sqliteLocation.js +55 -0
- package/lib/src/providers/sqliteMigrations.d.ts +48 -0
- package/lib/src/providers/sqliteMigrations.js +72 -0
- package/lib/src/rendering/githubAlerts.d.ts +22 -0
- package/lib/src/rendering/htmlPolicy.d.ts +76 -0
- package/lib/src/rendering/markdownConverter.d.ts +73 -0
- package/lib/src/security/PolicyDecisionPoint.d.ts +245 -0
- package/lib/src/security/PolicyInformationPoint.d.ts +448 -0
- package/lib/src/security/pageActions.d.ts +40 -0
- package/lib/src/security/permissions.generated.d.ts +78 -0
- package/lib/src/types/Asset.d.ts +414 -0
- package/lib/src/types/Catalog.d.ts +61 -0
- package/lib/src/types/Comment.d.ts +11 -0
- package/lib/src/types/Config.d.ts +388 -0
- package/lib/src/types/Organization.d.ts +78 -0
- package/lib/src/types/OrganizationProvider.d.ts +38 -0
- package/lib/src/types/Page.d.ts +220 -0
- package/lib/src/types/Person.d.ts +56 -0
- package/lib/src/types/PersonProvider.d.ts +25 -0
- package/lib/src/types/Policy.d.ts +139 -0
- package/lib/src/types/Policy.js +17 -0
- package/lib/src/types/Provider.d.ts +810 -0
- package/lib/src/types/Role.d.ts +84 -0
- package/lib/src/types/RoleProvider.d.ts +35 -0
- package/lib/src/types/Schema.d.ts +425 -0
- package/lib/src/types/Share.d.ts +172 -0
- package/lib/src/types/Share.js +81 -0
- package/lib/src/types/User.d.ts +304 -0
- package/lib/src/types/Version.d.ts +189 -0
- package/lib/src/types/WikiEngine.d.ts +128 -0
- package/lib/src/types/express.d.ts +120 -0
- package/lib/src/types/express.js +1 -0
- package/lib/src/types/guards.d.ts +78 -0
- package/lib/src/types/heic-decode.d.ts +16 -0
- package/lib/src/types/index.d.ts +19 -0
- package/lib/src/types/linkedom.d.ts +77 -0
- package/lib/src/types/markdown-it-plugins.d.ts +21 -0
- package/lib/src/utils/DeltaStorage.d.ts +118 -0
- package/lib/src/utils/LocaleUtils.d.ts +105 -0
- package/lib/src/utils/LocaleUtils.js +294 -0
- package/lib/src/utils/PageNameMatcher.d.ts +98 -0
- package/lib/src/utils/PathPreflight.d.ts +38 -0
- package/lib/src/utils/PathPreflight.js +50 -0
- package/lib/src/utils/SectionUtils.d.ts +40 -0
- package/lib/src/utils/addonConfigLayer.d.ts +144 -0
- package/lib/src/utils/addonConfigLayer.js +382 -0
- package/lib/src/utils/addonDatabaseRules.d.ts +25 -0
- package/lib/src/utils/addonDatabaseRules.js +57 -0
- package/lib/src/utils/addonHost.d.ts +51 -0
- package/lib/src/utils/addonHost.js +72 -0
- package/lib/src/utils/addonInstaller.d.ts +109 -0
- package/lib/src/utils/addonLock.d.ts +37 -0
- package/lib/src/utils/addonLock.js +48 -0
- package/lib/src/utils/addonPageSync.d.ts +45 -0
- package/lib/src/utils/addonProvenance.d.ts +48 -0
- package/lib/src/utils/addonTarball.d.ts +41 -0
- package/lib/src/utils/addonsPathResolver.d.ts +76 -0
- package/lib/src/utils/addonsPathResolver.js +129 -0
- package/lib/src/utils/assetMetadataTags.d.ts +66 -0
- package/lib/src/utils/atomicWrite.d.ts +28 -0
- package/lib/src/utils/auditConfigChange.d.ts +57 -0
- package/lib/src/utils/auditEventNames.d.ts +50 -0
- package/lib/src/utils/auditEventNames.generated.d.ts +169 -0
- package/lib/src/utils/auditEventNames.generated.js +174 -0
- package/lib/src/utils/auditEventNames.js +49 -0
- package/lib/src/utils/auditEvents.d.ts +265 -0
- package/lib/src/utils/auditEvents.js +309 -0
- package/lib/src/utils/auditRegistry.d.ts +102 -0
- package/lib/src/utils/auditRegistry.js +168 -0
- package/lib/src/utils/bip39English.d.ts +2 -0
- package/lib/src/utils/configEnvKeys.d.ts +68 -0
- package/lib/src/utils/configFiles.d.ts +74 -0
- package/lib/src/utils/configFiles.js +150 -0
- package/lib/src/utils/delegation.d.ts +48 -0
- package/lib/src/utils/deriveUsername.d.ts +21 -0
- package/lib/src/utils/explainMediaPath.d.ts +123 -0
- package/lib/src/utils/formerTitles.d.ts +69 -0
- package/lib/src/utils/frontmatterAccess.d.ts +54 -0
- package/lib/src/utils/headlessAdminPassword.d.ts +55 -0
- package/lib/src/utils/imageTransform.d.ts +52 -0
- package/lib/src/utils/instanceEnvSecret.d.ts +51 -0
- package/lib/src/utils/jobSlots.d.ts +43 -0
- package/lib/src/utils/keywordNormalizer.d.ts +127 -0
- package/lib/src/utils/logger.d.ts +70 -0
- package/lib/src/utils/logger.js +106 -0
- package/lib/src/utils/magicLinkDeviceState.d.ts +95 -0
- package/lib/src/utils/managerUtils.d.ts +40 -0
- package/lib/src/utils/migrateLegacyPrivateAttachments.d.ts +15 -0
- package/lib/src/utils/orgFilename.d.ts +22 -0
- package/lib/src/utils/pageFeature.d.ts +27 -0
- package/lib/src/utils/pageFrontmatter.d.ts +21 -0
- package/lib/src/utils/pageNotes.d.ts +150 -0
- package/lib/src/utils/pageTitleRule.d.ts +37 -0
- package/lib/src/utils/pageToArticle.d.ts +59 -0
- package/lib/src/utils/pageUrl.d.ts +18 -0
- package/lib/src/utils/passwordChange.d.ts +12 -0
- package/lib/src/utils/passwordHash.d.ts +60 -0
- package/lib/src/utils/permissionCatalog.d.ts +52 -0
- package/lib/src/utils/pluginFormatters.d.ts +452 -0
- package/lib/src/utils/pluginFormatters.js +714 -0
- package/lib/src/utils/privateLinkRewrite.d.ts +42 -0
- package/lib/src/utils/privateStoreAccess.d.ts +57 -0
- package/lib/src/utils/privateStoreAccess.js +65 -0
- package/lib/src/utils/privateStoreCatalogs.d.ts +40 -0
- package/lib/src/utils/privateStoreCrypto.d.ts +127 -0
- package/lib/src/utils/privateStoreDoor.d.ts +181 -0
- package/lib/src/utils/privateStoreExport.d.ts +72 -0
- package/lib/src/utils/privateStoreFiles.d.ts +120 -0
- package/lib/src/utils/privateStoreMeta.d.ts +64 -0
- package/lib/src/utils/privateStoreMigrations.d.ts +37 -0
- package/lib/src/utils/privateStorePath.d.ts +259 -0
- package/lib/src/utils/privateStorePath.js +436 -0
- package/lib/src/utils/privateStoreTakeout.d.ts +76 -0
- package/lib/src/utils/privateStoreUnlock.d.ts +175 -0
- package/lib/src/utils/proxyClaim.d.ts +59 -0
- package/lib/src/utils/proxyClaim.js +30 -0
- package/lib/src/utils/redactPrivateNames.d.ts +21 -0
- package/lib/src/utils/redactPrivateNames.js +89 -0
- package/lib/src/utils/redactSecrets.d.ts +58 -0
- package/lib/src/utils/redactSecrets.js +171 -0
- package/lib/src/utils/renameLinkRewrite.d.ts +112 -0
- package/lib/src/utils/roleGrants.d.ts +35 -0
- package/lib/src/utils/safeRedirect.d.ts +32 -0
- package/lib/src/utils/schedule.d.ts +54 -0
- package/lib/src/utils/secretFileMode.d.ts +17 -0
- package/lib/src/utils/seededShippedPages.d.ts +45 -0
- package/lib/src/utils/sensitiveValues.d.ts +59 -0
- package/lib/src/utils/sensitiveValues.js +106 -0
- package/lib/src/utils/sessionEnd.d.ts +12 -0
- package/lib/src/utils/sessionGeneration.d.ts +24 -0
- package/lib/src/utils/sessionIdle.d.ts +41 -0
- package/lib/src/utils/sessionLimits.d.ts +68 -0
- package/lib/src/utils/shareLockbox.d.ts +64 -0
- package/lib/src/utils/sigstoreTrustedRoot.d.ts +33 -0
- package/lib/src/utils/sniffMime.d.ts +21 -0
- package/lib/src/utils/storeSearchIndex.d.ts +75 -0
- package/lib/src/utils/subjectMayDo.d.ts +21 -0
- package/lib/src/utils/systemCategoryRules.d.ts +30 -0
- package/lib/src/utils/systemCategoryRules.js +41 -0
- package/lib/src/utils/userCreateError.d.ts +62 -0
- package/lib/src/utils/username.d.ts +53 -0
- package/lib/src/utils/vaultUrlRewrite.d.ts +27 -0
- package/lib/src/utils/version.d.ts +84 -0
- package/lib/src/utils/videoFrame.d.ts +21 -0
- package/package.json +54 -3
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import type ICacheAdapter from './ICacheAdapter.js';
|
|
2
|
+
import type { CacheStats } from './ICacheAdapter.js';
|
|
3
|
+
import CacheDependencies, { type VersionLookup } from './CacheDependencies.js';
|
|
4
|
+
/**
|
|
5
|
+
* Cache set options
|
|
6
|
+
*/
|
|
7
|
+
export interface CacheSetOptions {
|
|
8
|
+
/** Time to live in seconds */
|
|
9
|
+
ttl?: number;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Region cache statistics
|
|
13
|
+
*/
|
|
14
|
+
export interface RegionStats {
|
|
15
|
+
/** Region name */
|
|
16
|
+
region: string;
|
|
17
|
+
/** Number of keys in this region */
|
|
18
|
+
keys: number;
|
|
19
|
+
/** Global cache statistics */
|
|
20
|
+
globalStats: CacheStats;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Factory function type for getOrSet
|
|
24
|
+
*/
|
|
25
|
+
export type CacheFactory<T> = () => Promise<T>;
|
|
26
|
+
/** Options for getOrSetVersioned. */
|
|
27
|
+
export interface VersionedSetOptions extends CacheSetOptions {
|
|
28
|
+
/** Told whether the value came from the cache (true) or was computed (false); for hit/miss metrics. */
|
|
29
|
+
onResult?: (hit: boolean) => void;
|
|
30
|
+
}
|
|
31
|
+
/** The two calls the read-through needs from a store. */
|
|
32
|
+
export interface VersionedStore {
|
|
33
|
+
get<T = unknown>(key: string): Promise<T | undefined | null>;
|
|
34
|
+
set(key: string, value: unknown, options?: CacheSetOptions): Promise<unknown>;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Read-through with data versions (#1751), over any store with get and set.
|
|
38
|
+
* Returns the stored value while every topic it was built from still has the
|
|
39
|
+
* version it had then; otherwise computes it again with `factory`, stores it
|
|
40
|
+
* with the versions it read (unless the render marked itself volatile), and
|
|
41
|
+
* returns it. RegionCache.getOrSetVersioned is this over a region.
|
|
42
|
+
*/
|
|
43
|
+
export declare function readThroughVersioned<T>(store: VersionedStore, versionOf: VersionLookup, key: string, factory: (deps: CacheDependencies) => Promise<T>, options?: VersionedSetOptions): Promise<T>;
|
|
44
|
+
/**
|
|
45
|
+
* RegionCache - Cache wrapper that provides namespaced access to a cache adapter
|
|
46
|
+
*
|
|
47
|
+
* This class wraps a cache adapter and automatically prefixes all keys with a region name,
|
|
48
|
+
* providing isolation between different cache users (managers, components, etc.)
|
|
49
|
+
*/
|
|
50
|
+
declare class RegionCache {
|
|
51
|
+
private readonly adapter;
|
|
52
|
+
private readonly region;
|
|
53
|
+
private readonly prefix;
|
|
54
|
+
private readonly versionOf;
|
|
55
|
+
/**
|
|
56
|
+
* @param versionOf How to read a data topic's current version (CacheManager.version).
|
|
57
|
+
* Without it every topic reads as version 0, so only a
|
|
58
|
+
* volatile render or the TTL ends an entry.
|
|
59
|
+
*/
|
|
60
|
+
constructor(adapter: ICacheAdapter, region: string, versionOf?: VersionLookup);
|
|
61
|
+
/**
|
|
62
|
+
* Create a full key by prefixing with the region
|
|
63
|
+
*
|
|
64
|
+
* @param {string} key - The cache key
|
|
65
|
+
* @returns {string} The prefixed key
|
|
66
|
+
*/
|
|
67
|
+
private _getFullKey;
|
|
68
|
+
/**
|
|
69
|
+
* Remove region prefix from a key
|
|
70
|
+
*
|
|
71
|
+
* @param {string} fullKey - The prefixed key
|
|
72
|
+
* @returns {string} The key without region prefix
|
|
73
|
+
*/
|
|
74
|
+
private _stripPrefix;
|
|
75
|
+
/**
|
|
76
|
+
* Get a value from the cache
|
|
77
|
+
*
|
|
78
|
+
* @param {string} key - The cache key
|
|
79
|
+
* @returns {Promise<T|undefined>} The cached value or undefined if not found
|
|
80
|
+
*/
|
|
81
|
+
get<T = unknown>(key: string): Promise<T | undefined>;
|
|
82
|
+
/**
|
|
83
|
+
* Set a value in the cache
|
|
84
|
+
*
|
|
85
|
+
* @param {string} key - The cache key
|
|
86
|
+
* @param {unknown} value - The value to cache
|
|
87
|
+
* @param {CacheSetOptions} [options] - Cache options
|
|
88
|
+
* @returns {Promise<void>}
|
|
89
|
+
*/
|
|
90
|
+
set(key: string, value: unknown, options?: CacheSetOptions): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Delete one or more keys from the cache
|
|
93
|
+
*
|
|
94
|
+
* @param {string|string[]} keys - Single key or array of keys to delete
|
|
95
|
+
* @returns {Promise<void>}
|
|
96
|
+
*/
|
|
97
|
+
del(keys: string | string[]): Promise<void>;
|
|
98
|
+
/**
|
|
99
|
+
* Clear all cache entries for this region
|
|
100
|
+
*
|
|
101
|
+
* @param {string} [pattern] - Optional pattern to match keys within the region
|
|
102
|
+
* @returns {Promise<void>}
|
|
103
|
+
*/
|
|
104
|
+
clear(pattern?: string): Promise<void>;
|
|
105
|
+
/**
|
|
106
|
+
* Get keys matching a pattern within this region
|
|
107
|
+
*
|
|
108
|
+
* @param {string} [pattern='*'] - Pattern to match
|
|
109
|
+
* @returns {Promise<string[]>} Array of matching keys (without region prefix)
|
|
110
|
+
*/
|
|
111
|
+
keys(pattern?: string): Promise<string[]>;
|
|
112
|
+
/**
|
|
113
|
+
* Get cache statistics for this region
|
|
114
|
+
*
|
|
115
|
+
* @returns {Promise<RegionStats>} Cache statistics for this region
|
|
116
|
+
*/
|
|
117
|
+
stats(): Promise<RegionStats>;
|
|
118
|
+
/**
|
|
119
|
+
* Check if a key exists in this region
|
|
120
|
+
*
|
|
121
|
+
* @param {string} key - The cache key
|
|
122
|
+
* @returns {Promise<boolean>} True if key exists
|
|
123
|
+
*/
|
|
124
|
+
has(key: string): Promise<boolean>;
|
|
125
|
+
/**
|
|
126
|
+
* Get or set a value (cache-aside pattern)
|
|
127
|
+
*
|
|
128
|
+
* @param {string} key - The cache key
|
|
129
|
+
* @param {CacheFactory<T>} factory - Function to generate the value if not cached
|
|
130
|
+
* @param {CacheSetOptions} [options] - Cache options
|
|
131
|
+
* @returns {Promise<T>} The cached or generated value
|
|
132
|
+
*/
|
|
133
|
+
getOrSet<T>(key: string, factory: CacheFactory<T>, options?: CacheSetOptions): Promise<T>;
|
|
134
|
+
/**
|
|
135
|
+
* Read-through with data versions (#1751). Returns the stored value while
|
|
136
|
+
* every topic it was built from still has the version it had then;
|
|
137
|
+
* otherwise computes it again with `factory`, stores it with the versions it
|
|
138
|
+
* read (unless the render marked itself volatile), and returns it.
|
|
139
|
+
*
|
|
140
|
+
* The factory declares what it reads: `deps.dependsOn('LedgerManager')`.
|
|
141
|
+
*/
|
|
142
|
+
getOrSetVersioned<T>(key: string, factory: (deps: CacheDependencies) => Promise<T>, options?: VersionedSetOptions): Promise<T>;
|
|
143
|
+
/**
|
|
144
|
+
* Get multiple keys at once
|
|
145
|
+
*
|
|
146
|
+
* @param {string[]} keys - Array of cache keys
|
|
147
|
+
* @returns {Promise<Record<string, T|undefined>>} Object with keys as properties and cached values
|
|
148
|
+
*/
|
|
149
|
+
mget<T = unknown>(keys: string[]): Promise<Record<string, T | undefined>>;
|
|
150
|
+
/**
|
|
151
|
+
* Set multiple keys at once
|
|
152
|
+
*
|
|
153
|
+
* @param {Record<string, unknown>} keyValuePairs - Object with keys and values to set
|
|
154
|
+
* @param {CacheSetOptions} [options] - Cache options
|
|
155
|
+
* @returns {Promise<void>}
|
|
156
|
+
*/
|
|
157
|
+
mset(keyValuePairs: Record<string, unknown>, options?: CacheSetOptions): Promise<void>;
|
|
158
|
+
/**
|
|
159
|
+
* Get the region name
|
|
160
|
+
*
|
|
161
|
+
* @returns {string} The region name
|
|
162
|
+
*/
|
|
163
|
+
getRegion(): string;
|
|
164
|
+
/**
|
|
165
|
+
* Get the underlying adapter
|
|
166
|
+
*
|
|
167
|
+
* @returns {ICacheAdapter} The cache adapter
|
|
168
|
+
*/
|
|
169
|
+
getAdapter(): ICacheAdapter;
|
|
170
|
+
}
|
|
171
|
+
export default RegionCache;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The context an acting call carries (#1179, security-posture P1).
|
|
3
|
+
*
|
|
4
|
+
* P1: any entry point that decides, records, or acts on someone's behalf
|
|
5
|
+
* takes a context — mandatory and positional. The two contexts that exist for
|
|
6
|
+
* that are the request's subject (`PermissionSubject`, which is what
|
|
7
|
+
* `WikiContext.userContext` and `req.userContext` are) and the job's
|
|
8
|
+
* (`JobContext`, for boot, schedule and queued work). This is the union a
|
|
9
|
+
* manager accepts, so a caller forwards whichever it was given and never
|
|
10
|
+
* rebuilds one from its fields.
|
|
11
|
+
*
|
|
12
|
+
* What travels: who, from where (request / boot / schedule), the delegation
|
|
13
|
+
* the call arrived under, and the address it came from. What does not: roles.
|
|
14
|
+
* Authority is resolved at the moment of each decision, never carried.
|
|
15
|
+
*/
|
|
16
|
+
import type { PermissionSubject } from '../managers/UserManager.js';
|
|
17
|
+
import type { JobContext } from './JobContext.js';
|
|
18
|
+
export type ActorContext = PermissionSubject | JobContext;
|
|
19
|
+
/**
|
|
20
|
+
* The fields an audit record takes from a context.
|
|
21
|
+
*
|
|
22
|
+
* An emitter spreads it — `{ eventType, ...who, …, metadata: { ...who.metadata, … } }`
|
|
23
|
+
* — rather than copying `user` and `ipAddress` across one at a time, so a
|
|
24
|
+
* field added here (`actor`, #1762 slice 3) reaches every row without
|
|
25
|
+
* touching every emitter. `scripts/check-audit-attribution.ts` holds every
|
|
26
|
+
* emitter to that.
|
|
27
|
+
*/
|
|
28
|
+
export interface ActorAttribution {
|
|
29
|
+
/** The account acted on: under a proxy grant, the person represented. */
|
|
30
|
+
user: string;
|
|
31
|
+
/** Who actually did it, present only when that is not `user` — under a proxy grant (#1762). */
|
|
32
|
+
actor?: string;
|
|
33
|
+
ipAddress: string | undefined;
|
|
34
|
+
/** `origin` always; `reason` / `requestedAt` for a job; `delegated` when the request came through a token, share or proxy grant (with `proxyGrantId` for a proxy). */
|
|
35
|
+
metadata: Record<string, unknown>;
|
|
36
|
+
}
|
|
37
|
+
export declare function isJobContext(ctx: ActorContext): ctx is JobContext;
|
|
38
|
+
/**
|
|
39
|
+
* Who acted, for the record — read from the context, never guessed.
|
|
40
|
+
*
|
|
41
|
+
* A job says its origin and reason; a request says `origin: request`, the
|
|
42
|
+
* address, and whether it acted under a delegation. A token's or share's id
|
|
43
|
+
* is not repeated here: that record already carries it, and a config-change
|
|
44
|
+
* record naming a token id would be a second place to redact. A proxy grant's
|
|
45
|
+
* id is (`proxyGrantId`): it is not a credential, and it is what joins the row
|
|
46
|
+
* to the grant that allowed it (#1762).
|
|
47
|
+
*/
|
|
48
|
+
export declare function actorOf(ctx: ActorContext): ActorAttribution;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { attributedTo } from './bootActions.js';
|
|
2
|
+
import { proxyAttribution } from '../utils/proxyClaim.js';
|
|
3
|
+
export function isJobContext(ctx) {
|
|
4
|
+
return 'origin' in ctx && 'requestedAt' in ctx;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Who acted, for the record — read from the context, never guessed.
|
|
8
|
+
*
|
|
9
|
+
* A job says its origin and reason; a request says `origin: request`, the
|
|
10
|
+
* address, and whether it acted under a delegation. A token's or share's id
|
|
11
|
+
* is not repeated here: that record already carries it, and a config-change
|
|
12
|
+
* record naming a token id would be a second place to redact. A proxy grant's
|
|
13
|
+
* id is (`proxyGrantId`): it is not a credential, and it is what joins the row
|
|
14
|
+
* to the grant that allowed it (#1762).
|
|
15
|
+
*/
|
|
16
|
+
export function actorOf(ctx) {
|
|
17
|
+
if (isJobContext(ctx)) {
|
|
18
|
+
return attributedTo(ctx);
|
|
19
|
+
}
|
|
20
|
+
// #1762 slice 3: a proxy claim names the person who acted beside the one
|
|
21
|
+
// represented. Never mixed with a token or share — every door refuses that
|
|
22
|
+
// subject — so the token and share kinds keep their precedence here.
|
|
23
|
+
const { metadata: proxyMeta, ...proxy } = proxyAttribution(ctx.viaProxy);
|
|
24
|
+
return {
|
|
25
|
+
user: ctx.username,
|
|
26
|
+
...proxy,
|
|
27
|
+
ipAddress: ctx.ipAddress,
|
|
28
|
+
metadata: {
|
|
29
|
+
origin: 'request',
|
|
30
|
+
...(ctx.viaToken ? { delegated: 'token' } : ctx.viaShare ? { delegated: 'share' } : proxyMeta)
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ApiContext — Lightweight request context for API route handlers.
|
|
3
|
+
*
|
|
4
|
+
* Parallel to WikiContext (used for page rendering), ApiContext provides a
|
|
5
|
+
* clean, typed, consistent object for addon and core API routes. It replaces
|
|
6
|
+
* scattered access to `req.userContext`, `req.session`, and engine managers.
|
|
7
|
+
*
|
|
8
|
+
* Usage:
|
|
9
|
+
* import { ApiContext, ApiError, sendApiError } from '../../../dist/src/context/ApiContext.js';
|
|
10
|
+
*
|
|
11
|
+
* router.post('/reservations', async (req, res) => {
|
|
12
|
+
* try {
|
|
13
|
+
* const ctx = ApiContext.from(req, engine);
|
|
14
|
+
* await ctx.requirePermission('page-edit');
|
|
15
|
+
* const username = ctx.actingUsername();
|
|
16
|
+
* // ...
|
|
17
|
+
* } catch (err) {
|
|
18
|
+
* if (err instanceof ApiError) return sendApiError(res, err);
|
|
19
|
+
* res.status(500).json({ error: String(err) });
|
|
20
|
+
* }
|
|
21
|
+
* });
|
|
22
|
+
*/
|
|
23
|
+
import type { Request, Response } from 'express';
|
|
24
|
+
import '../types/express.js';
|
|
25
|
+
import { BaseContext } from './BaseContext.js';
|
|
26
|
+
import type { WikiEngine } from '../types/WikiEngine.js';
|
|
27
|
+
import type { AgentTokenGrant, PermissionSubject, ProxyClaim } from '../managers/UserManager.js';
|
|
28
|
+
import type { ShareGrant } from '../types/Share.js';
|
|
29
|
+
import type { ReauthMode } from '../managers/AuthManager.js';
|
|
30
|
+
import { type Decision } from '../types/Policy.js';
|
|
31
|
+
/**
|
|
32
|
+
* Thrown by ApiContext guard methods (requirePermission, actingUsername).
|
|
33
|
+
* Route handlers should catch this and forward `status` to `res.status()`.
|
|
34
|
+
*/
|
|
35
|
+
export declare class ApiError extends Error {
|
|
36
|
+
readonly status: number;
|
|
37
|
+
/**
|
|
38
|
+
* For a step-up refusal (#1745): where the person re-authenticates,
|
|
39
|
+
* returning to the page they were on. Send it with the 403 so the page can
|
|
40
|
+
* offer the way forward, as core routes do (`{ error, reauth }`).
|
|
41
|
+
*/
|
|
42
|
+
readonly reauth?: string | undefined;
|
|
43
|
+
constructor(status: number, message: string,
|
|
44
|
+
/**
|
|
45
|
+
* For a step-up refusal (#1745): where the person re-authenticates,
|
|
46
|
+
* returning to the page they were on. Send it with the 403 so the page can
|
|
47
|
+
* offer the way forward, as core routes do (`{ error, reauth }`).
|
|
48
|
+
*/
|
|
49
|
+
reauth?: string | undefined);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Send a refusal — the one way it reaches the client, from core routes and
|
|
53
|
+
* every add-on route alike (#1749). JSON is `{ success: false, error, reauth? }`;
|
|
54
|
+
* text is the message, then where to sign in again for a step-up refusal.
|
|
55
|
+
* `page` is for a link the person followed in the browser: a step-up refusal
|
|
56
|
+
* redirects to the re-authenticate page, a 401 to sign-in (returning here),
|
|
57
|
+
* anything else is the message as text. A route never writes its own refusal:
|
|
58
|
+
* the step-up `reauth` is easy to drop.
|
|
59
|
+
*/
|
|
60
|
+
export declare function sendApiError(res: Response, err: ApiError, mode?: ReauthMode): void;
|
|
61
|
+
export declare class ApiContext extends BaseContext {
|
|
62
|
+
/** Reference to the wiki engine */
|
|
63
|
+
readonly engine: WikiEngine;
|
|
64
|
+
/** Whether the caller has an active authenticated session */
|
|
65
|
+
readonly isAuthenticated: boolean;
|
|
66
|
+
/** Caller's username, or null for anonymous */
|
|
67
|
+
readonly username: string | null;
|
|
68
|
+
/** Caller's display name, or null */
|
|
69
|
+
readonly displayName: string | null;
|
|
70
|
+
/** Caller's email address, or null */
|
|
71
|
+
readonly email: string | null;
|
|
72
|
+
/** Caller's assigned roles (always an array, never undefined) */
|
|
73
|
+
readonly roles: string[];
|
|
74
|
+
/**
|
|
75
|
+
* The agent token this request arrived with, when it did (#1173).
|
|
76
|
+
*
|
|
77
|
+
* Absent before this: `from()` copied five fields off `req.userContext` and
|
|
78
|
+
* `viaToken` was not one of them, so every `ctx.hasPermission()` — including
|
|
79
|
+
* every addon API route using `requirePermission()` — resolved against the
|
|
80
|
+
* token OWNER's live roles with the token's scope ceiling unable to run. The
|
|
81
|
+
* same defect #1164 fixed in route code, reached through a context class
|
|
82
|
+
* instead, and invisible to a check that only scans `src/routes/`.
|
|
83
|
+
*/
|
|
84
|
+
readonly viaToken?: AgentTokenGrant;
|
|
85
|
+
/** The share this request presented, when it did (#1222). Carried for the same reason as `viaToken`. */
|
|
86
|
+
readonly viaShare?: ShareGrant;
|
|
87
|
+
/** The proxy grant this request acts under, when it does (#1762). Carried for the same reason as `viaToken`: a job started from this context keeps it. */
|
|
88
|
+
readonly viaProxy?: ProxyClaim;
|
|
89
|
+
/**
|
|
90
|
+
* The request's subject exactly as the middleware wrote it (#1179/#1382).
|
|
91
|
+
*
|
|
92
|
+
* The fields above are a flattened copy for convenience; this is the context
|
|
93
|
+
* itself, to forward to a manager door that takes one — never rebuilt from
|
|
94
|
+
* the fields, which is the #1173 defect. `null` for a request with no subject.
|
|
95
|
+
*/
|
|
96
|
+
readonly subject: PermissionSubject | null;
|
|
97
|
+
/**
|
|
98
|
+
* The address the request came from (#1179), read from the subject the
|
|
99
|
+
* middleware wrote — not a copy. Forwarded with the context, so a job or a
|
|
100
|
+
* record an add-on starts from it carries the provenance (#1667).
|
|
101
|
+
*/
|
|
102
|
+
get ipAddress(): string | undefined;
|
|
103
|
+
/**
|
|
104
|
+
* Whether the caller is signed in to a test account (#1805), read from the
|
|
105
|
+
* subject the middleware wrote (the account record's flag). An attribute for
|
|
106
|
+
* an add-on to enforce its own rules from; no policy reads it.
|
|
107
|
+
*/
|
|
108
|
+
get isTest(): boolean;
|
|
109
|
+
private constructor();
|
|
110
|
+
/** The request this context was built from; the step-up answer needs its return page (#1745). */
|
|
111
|
+
private readonly request;
|
|
112
|
+
/**
|
|
113
|
+
* Build an ApiContext from an Express request and engine reference.
|
|
114
|
+
*
|
|
115
|
+
* Reads `req.userContext` (set by the session middleware in app.ts) and
|
|
116
|
+
* normalises the values into a fully-typed object. Always succeeds — an
|
|
117
|
+
* unauthenticated request produces a context with `isAuthenticated: false`
|
|
118
|
+
* and an empty/anonymous roles array.
|
|
119
|
+
*/
|
|
120
|
+
static from(req: Request, engine: WikiEngine): ApiContext;
|
|
121
|
+
/**
|
|
122
|
+
* The username this request acts as, for a feature that belongs to a
|
|
123
|
+
* person (a journal, a reservation). Asked AFTER `requirePermission`: policy
|
|
124
|
+
* decides whether the caller may, this only says whether there is someone
|
|
125
|
+
* to act as (#1430). A permission delegated to anonymous visitors still
|
|
126
|
+
* finds nobody here, so the refusal is a 401, never a crash on a missing
|
|
127
|
+
* name.
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* await ctx.requirePermission('page-edit');
|
|
131
|
+
* const username = ctx.actingUsername(); // → 401 if nobody is signed in
|
|
132
|
+
*/
|
|
133
|
+
actingUsername(): string;
|
|
134
|
+
/**
|
|
135
|
+
* Returns true if the caller has the given permission.
|
|
136
|
+
*
|
|
137
|
+
* Asks the PDP (`PolicyDecisionPoint.permits`, #1431 step 14) — same canonical
|
|
138
|
+
* `PolicyEvaluator`-backed path that `WikiContext.hasPermission` uses.
|
|
139
|
+
* Honors anonymous/authenticated role expansion, deny policies, resource
|
|
140
|
+
* patterns, and the `'All'`/`'Authenticated'` role semantics. (#630)
|
|
141
|
+
*
|
|
142
|
+
* @example
|
|
143
|
+
* if (await ctx.hasPermission('user-read')) { // include PII fields }
|
|
144
|
+
*/
|
|
145
|
+
/**
|
|
146
|
+
* #1399: the door is BaseContext's, which asks UserManager with the subject
|
|
147
|
+
* this context was handed. This method used to rebuild that subject from the
|
|
148
|
+
* flattened fields above — the #1173 defect, in the class where #1173
|
|
149
|
+
* happened. The rebuild listed username, roles, isAuthenticated, viaToken and
|
|
150
|
+
* viaShare, so it dropped `privateStoreHandle` and an addon API route could
|
|
151
|
+
* not see the caller's own sealed pages (#1382).
|
|
152
|
+
*
|
|
153
|
+
* @example
|
|
154
|
+
* if (await ctx.hasPermission('user-read')) { // include PII fields }
|
|
155
|
+
*/
|
|
156
|
+
/**
|
|
157
|
+
* Throws unless policy grants the caller this permission.
|
|
158
|
+
*
|
|
159
|
+
* #1399: the refusal classifies itself — 401 for a caller who has not
|
|
160
|
+
* signed in, 403 for one who has. That is the ONE sanctioned use of
|
|
161
|
+
* `isAuthenticated` (security-posture P2): it never decides, it only says
|
|
162
|
+
* which refusal to send after policy has already said no. Before this,
|
|
163
|
+
* every route paired `requireAuthenticated()` with this call to get the 401,
|
|
164
|
+
* which read as though authentication were half the gate.
|
|
165
|
+
*
|
|
166
|
+
* #1745: a refusal for someone who HOLDS the permission is the step-up one
|
|
167
|
+
* (#1635) — their sign-in is not fresh enough. It carries `reauth`, built
|
|
168
|
+
* where core routes build it (AuthManager.askForFreshSignIn, #1758), and the prompt is
|
|
169
|
+
* audited there; a delegated credential gets no `reauth`. The refusal itself
|
|
170
|
+
* is {@link enforceDeny}'s, shared with managers that ask the PDP directly.
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* await ctx.requirePermission('search-user'); // → 401 anonymous, 403 signed in
|
|
174
|
+
*/
|
|
175
|
+
requirePermission(permission: string): Promise<void>;
|
|
176
|
+
/**
|
|
177
|
+
* Turn a deny into the refusal (#1431) — the one implementation of refusal
|
|
178
|
+
* shaping, shared by {@link requirePermission} and every manager that asks
|
|
179
|
+
* the PDP itself. Always throws:
|
|
180
|
+
*
|
|
181
|
+
* - a step-up deny (`reason` {@link STEP_UP_REASON}) on a request:
|
|
182
|
+
* `AuthManager.askForFreshSignIn` answers and records the reauth prompt —
|
|
183
|
+
* `ApiError(403, …, reauth)`, or no `reauth` for a delegated credential
|
|
184
|
+
* (agent token, share), which cannot give a fresh sign-in;
|
|
185
|
+
* - any other deny (policy, or a token, share or proxy ceiling): `ApiError(401)`
|
|
186
|
+
* for a caller who has not signed in, `ApiError(403)` for one who has;
|
|
187
|
+
* - an allow: a programming error. A refusal never silently passes.
|
|
188
|
+
*
|
|
189
|
+
* @example
|
|
190
|
+
* const d = await pdp.decide(ctx.getActor(), { action: 'ledger-adjust', resource: { type: 'ledger-entry', id } });
|
|
191
|
+
* if (!d.permit) await ctx.enforceDeny('ledger-adjust', d);
|
|
192
|
+
*/
|
|
193
|
+
enforceDeny(permission: string, decision: Decision): Promise<never>;
|
|
194
|
+
}
|