Exciting news!Announcing our $4.6M Series Seed. Learn more
Log in


Package Overview
File Explorer

Advanced tools


A storage service with a configurable provider


Version published
Yearly downloads
increased by13.61%

Weekly downloads



2.0.5 (Mai 20, 2022)

  • Portal: The resource and the proxy target URLs of Remote Apps can now overlap as long as requested resources have an extension. E.g.: If your plugin definition looks like this: { "name": "My Remote App", "type": "portal-app2", "remote": { "resourcesRoot": "/" }, "defaultConfig": { "proxies": { "bff": { "targetUri": "http://localhost:6089" } } } } the Portal will calculate a resource base URL http://yourhost.com/ and a base URL for the bff proxy of http://yourhost.com/, so they overlap. Now you can request a resource /index.js with this setup, previously you couldn't, because the Portal has treated it as an attempt to fetch API data via (potentially less protected) resource request.
  • Security Service: Start authentication flow (e.g. redirect to the login page) only for GET and non-Ajax requests



Mashroom Storage

Plugin for Mashroom Server, a Microfrontend Integration Platform.

This plugin adds a storage service abstraction that delegates to a provider plugin.


If node_modules/@mashroom is configured as plugin path just add @mashroom/mashroom-storage as dependency.

Then use the storage service like this:

import type {MashroomStorageService} from '@mashroom/mashroom-storage/type-definitions'; export default async (req: Request, res: ExpressResponse) => { const storageService: MashroomStorageService = req.pluginContext.services.storage.service; const customerCollection = await storageService.getCollection('my-collection'); const customer = await customerCollection.findOne({customerNr: 1234567}); const customers = await customerCollection.find({ $and: [{ name: { $regex: 'jo.*' } }, { visits: { $gt: 10 } }], 20, 10, { visits: 'desc' }); // ... }

You can override the default config in your Mashroom config file like this:

{ "plugins": { "Mashroom Storage Services": { "provider": "Mashroom Storage Filestore Provider", "memoryCache": { "enabled": false, "ttlSec": 120, "invalidateOnUpdate": true, "collections": { "mashroom-portal-pages": { "enabled": true, "ttlSec": 300 } } } } } }
  • provider: The storage-provider plugin that implements the actual storage (Default: Mashroom Storage Filestore Provider)
  • memoryCache: Use the memory cache to improve the performance. Requires @mashroom/mashroom-memory-cache to be installed.
    • enabled: Enable cache (of all) collections. The preferred way is to set this to false and enable caching per collection (Default: false)
    • ttlSec: The default TTL in seconds. Can be overwritten per collection (Default: 120)
    • invalidateOnUpdate: Clear the cache for the whole collection if an entry gets updated (Default: true). This might be an expensive operation on some memory cache implementations (e.g. based on Redis). So use this only if updates don't happen frequently.
    • collections: A map of collections specific settings. You can overwrite here enabled, ttlSec and invalidateOnUpdate.



The exposed service is accessible through pluginContext.services.storage.service


export interface MashroomStorageService { /** * Get (or create) the MashroomStorageCollection with given name. */ getCollection<T extends StorageRecord>(name: string): Promise<MashroomStorageCollection<T>>; } export interface MashroomStorageCollection<T extends MashroomStorageRecord> { /** * Find all items that match given filter. The filter supports a subset of Mongo's filter operations (like $gt, $regex, ...). */ find(filter?: MashroomStorageObjectFilter<T>, limit?: number, skip?: number, sort?: MashroomStorageSort<T>): Promise<MashroomStorageSearchResult<T>>; /** * Return the first item that matches the given filter or null otherwise. */ findOne(filter: MashroomStorageObjectFilter<T>): Promise<MashroomStorageObject<T> | null | undefined>; /** * Insert one item */ insertOne(item: T): Promise<MashroomStorageObject<T>>; /** * Update the first item that matches the given filter. */ updateOne(filter: MashroomStorageObjectFilter<T>, propertiesToUpdate: Partial<MashroomStorageObject<T>>): Promise<MashroomStorageUpdateResult>; /** * Update multiple entries */ updateMany(filter: MashroomStorageObjectFilter<T>, propertiesToUpdate: Partial<MashroomStorageObject<T>>): Promise<MashroomStorageUpdateResult>; /** * Replace the first item that matches the given filter. */ replaceOne(filter: MashroomStorageObjectFilter<T>, newItem: T): Promise<MashroomStorageUpdateResult>; /** * Delete the first item that matches the given filter. */ deleteOne(filter: MashroomStorageObjectFilter<T>): Promise<MashroomStorageDeleteResult>; /** * Delete all items that match the given filter. */ deleteMany(filter: MashroomStorageObjectFilter<T>): Promise<MashroomStorageDeleteResult>; }

Plugin type


This plugin type adds a a new storage implementation that can be used by this plugin.

To register a new storage-provider plugin add this to package.json:

{ "mashroom": { "plugins": [ { "name": "My Storage Provider", "type": "storage-provider", "bootstrap": "./dist/mashroom-bootstrap.js", "defaultConfig": { "myProperty": "test" } } ] } }

The bootstrap returns the provider:

import MyStorage from './MyStorage'; import type {MashroomStoragePluginBootstrapFunction} from '@mashroom/mashroom-storage/type-definitions'; const bootstrap: MashroomStoragePluginBootstrapFunction = async (pluginName, pluginConfig, pluginContextHolder) => { return new MyStorage(/* .... */); }; export default bootstrap;

The plugin has to implement the following interfaces:

export interface MashroomStorage { /** * Get (or create) the MashroomStorageCollection with given name. */ getCollection<T extends StorageRecord>( name: string, ): Promise<MashroomStorageCollection<T>>; }


Subscribe to our newsletter

Get open source security insights delivered straight into your inbox. Be the first to learn about new features and product updates.

  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc