[{"data":1,"prerenderedAt":9221},["ShallowReactive",2],{"navigation":3,"docs-path-index":152,"-docs-modules-storage-drivers":198,"-docs-modules-storage-drivers-surround":9216},[4],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":52},"Docs","i-lucide-book-marked","\u002Fdocs","docs",[10,26,53,138],{"title":11,"path":12,"stem":13,"children":14,"icon":25},"Getting Started","\u002Fdocs\u002Fgetting-started","docs\u002F1.getting-started\u002F1.index",[15,17,21],{"title":16,"path":12,"stem":13},"Introduction",{"title":18,"path":19,"stem":20},"Installation","\u002Fdocs\u002Fgetting-started\u002Finstallation","docs\u002F1.getting-started\u002F2.installation",{"title":22,"path":23,"stem":24},"Examples","\u002Fdocs\u002Fgetting-started\u002Fexamples","docs\u002F1.getting-started\u002F3.examples","i-lucide-rocket",{"title":27,"icon":28,"path":29,"stem":30,"children":31,"page":52},"Core features","i-lucide-square-function","\u002Fdocs\u002Fcore-features","docs\u002F2.core-features",[32,36,40,44,48],{"title":33,"path":34,"stem":35},"Configuration","\u002Fdocs\u002Fcore-features\u002Fconfiguration","docs\u002F2.core-features\u002F0.configuration",{"title":37,"path":38,"stem":39},"Dependency Injection","\u002Fdocs\u002Fcore-features\u002Fcontainer","docs\u002F2.core-features\u002F1.container",{"title":41,"path":42,"stem":43},"Controllers","\u002Fdocs\u002Fcore-features\u002Fcontrollers","docs\u002F2.core-features\u002F2.controllers",{"title":45,"path":46,"stem":47},"Middlewares","\u002Fdocs\u002Fcore-features\u002Fmiddlewares","docs\u002F2.core-features\u002F3.middlewares",{"title":49,"path":50,"stem":51},"Validation","\u002Fdocs\u002Fcore-features\u002Fvalidation","docs\u002F2.core-features\u002F4.validation",false,{"title":54,"icon":55,"defaultOpen":56,"path":57,"stem":58,"children":59,"page":52},"Modules","i-lucide-boxes",true,"\u002Fdocs\u002Fmodules","docs\u002F3.modules",[60,77,93,109,123,134],{"title":61,"icon":52,"defaultOpen":52,"path":62,"stem":63,"children":64,"page":52},"Auth","\u002Fdocs\u002Fmodules\u002Fauth","docs\u002F3.modules\u002F1.auth",[65,69,73],{"title":66,"path":67,"stem":68},"Overview","\u002Fdocs\u002Fmodules\u002Fauth\u002Foverview","docs\u002F3.modules\u002F1.auth\u002F0.overview",{"title":70,"path":71,"stem":72},"Decorators","\u002Fdocs\u002Fmodules\u002Fauth\u002Fdecorators","docs\u002F3.modules\u002F1.auth\u002F1.decorators",{"title":74,"path":75,"stem":76},"API Reference","\u002Fdocs\u002Fmodules\u002Fauth\u002Fapi","docs\u002F3.modules\u002F1.auth\u002F2.api",{"title":78,"icon":52,"defaultOpen":52,"path":79,"stem":80,"children":81,"page":52},"Logger","\u002Fdocs\u002Fmodules\u002Flogger","docs\u002F3.modules\u002F2.logger",[82,85,89],{"title":66,"path":83,"stem":84},"\u002Fdocs\u002Fmodules\u002Flogger\u002Foverview","docs\u002F3.modules\u002F2.logger\u002F0.overview",{"title":86,"path":87,"stem":88},"Drivers","\u002Fdocs\u002Fmodules\u002Flogger\u002Fdrivers","docs\u002F3.modules\u002F2.logger\u002F1.drivers",{"title":90,"path":91,"stem":92},"API","\u002Fdocs\u002Fmodules\u002Flogger\u002Fapi","docs\u002F3.modules\u002F2.logger\u002F2.api",{"title":94,"icon":52,"defaultOpen":52,"path":95,"stem":96,"children":97,"page":52},"Serverless","\u002Fdocs\u002Fmodules\u002Fserverless","docs\u002F3.modules\u002F3.serverless",[98,101,105],{"title":66,"path":99,"stem":100},"\u002Fdocs\u002Fmodules\u002Fserverless\u002Foverview","docs\u002F3.modules\u002F3.serverless\u002F0.overview",{"title":102,"path":103,"stem":104},"AWS Lambda","\u002Fdocs\u002Fmodules\u002Fserverless\u002Faws-lambda","docs\u002F3.modules\u002F3.serverless\u002F1.aws-lambda",{"title":106,"path":107,"stem":108},"Azure Functions","\u002Fdocs\u002Fmodules\u002Fserverless\u002Fazure-functions","docs\u002F3.modules\u002F3.serverless\u002F2.azure-functions",{"title":110,"icon":52,"defaultOpen":52,"path":111,"stem":112,"children":113,"page":52},"Storage","\u002Fdocs\u002Fmodules\u002Fstorage","docs\u002F3.modules\u002F4.storage",[114,117,120],{"title":66,"path":115,"stem":116},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Foverview","docs\u002F3.modules\u002F4.storage\u002F0.overview",{"title":86,"path":118,"stem":119},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Fdrivers","docs\u002F3.modules\u002F4.storage\u002F1.drivers",{"title":90,"path":121,"stem":122},"\u002Fdocs\u002Fmodules\u002Fstorage\u002Fapi","docs\u002F3.modules\u002F4.storage\u002F2.api",{"title":124,"icon":52,"defaultOpen":52,"path":125,"stem":126,"children":127,"page":52},"Web Sockets","\u002Fdocs\u002Fmodules\u002Fweb-sockets","docs\u002F3.modules\u002F5.web-sockets",[128,131],{"title":66,"path":129,"stem":130},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Foverview","docs\u002F3.modules\u002F5.web-sockets\u002F0.overview",{"title":90,"path":132,"stem":133},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002Fapi","docs\u002F3.modules\u002F5.web-sockets\u002F1.api",{"title":135,"path":136,"stem":137},"MCP","\u002Fdocs\u002Fmodules\u002Fmcp","docs\u002F3.modules\u002F6.mcp",{"title":139,"icon":140,"defaultOpen":52,"path":141,"stem":142,"children":143,"page":52},"Advanced","i-lucide-brain","\u002Fdocs\u002Fadvanced","docs\u002F99.advanced",[144,148],{"title":145,"path":146,"stem":147},"Custom Decorator","\u002Fdocs\u002Fadvanced\u002Fcustom-decorator","docs\u002F99.advanced\u002F1.custom-decorator",{"title":149,"path":150,"stem":151},"Custom Plugin","\u002Fdocs\u002Fadvanced\u002Fcustom-plugin","docs\u002F99.advanced\u002F2.custom-plugin",[153,155,157,158,159,160,162,163,164,165,166,167,169,171,172,173,174,176,177,178,179,181,182,183,184,186,187,188,189,191,192,193,194,196,197],{"path":154},"\u002Fdocs\u002F.navigation",{"path":156},"\u002Fdocs\u002Fgetting-started\u002F.navigation",{"path":12},{"path":19},{"path":23},{"path":161},"\u002Fdocs\u002Fcore-features\u002F.navigation",{"path":34},{"path":38},{"path":42},{"path":46},{"path":50},{"path":168},"\u002Fdocs\u002Fmodules\u002F.navigation",{"path":170},"\u002Fdocs\u002Fmodules\u002Fauth\u002F.navigation",{"path":67},{"path":71},{"path":75},{"path":175},"\u002Fdocs\u002Fmodules\u002Flogger\u002F.navigation",{"path":83},{"path":87},{"path":91},{"path":180},"\u002Fdocs\u002Fmodules\u002Fserverless\u002F.navigation",{"path":99},{"path":103},{"path":107},{"path":185},"\u002Fdocs\u002Fmodules\u002Fstorage\u002F.navigation",{"path":115},{"path":118},{"path":121},{"path":190},"\u002Fdocs\u002Fmodules\u002Fweb-sockets\u002F.navigation",{"path":129},{"path":132},{"path":136},{"path":195},"\u002Fdocs\u002Fadvanced\u002F.navigation",{"path":146},{"path":150},{"id":199,"title":86,"body":200,"description":9210,"extension":9211,"links":9212,"meta":9213,"navigation":56,"path":118,"seo":9214,"stem":119,"__hash__":9215},"docs\u002Fdocs\u002F3.modules\u002F4.storage\u002F1.drivers.md",{"type":201,"value":202,"toc":9186},"minimark",[203,207,212,217,220,226,597,602,654,659,675,678,682,685,690,693,754,759,1196,1201,1212,1315,1324,1352,1357,1869,1873,1914,1919,1922,1927,1930,2027,2032,2043,2048,2070,2074,2077,2468,2473,2487,2491,2494,2935,2940,2954,2958,2961,3119,3133,3138,3141,3585,3589,3657,3659,3663,3666,3670,4423,4427,4430,4523,4525,4529,4532,5569,5573,5849,5851,5855,5858,7013,7017,7170,7172,7176,7180,7183,7376,7380,7383,7872,7876,7879,8015,8017,8021,8024,8438,8440,8444,8448,8462,8467,8472,8546,8551,8682,8686,8691,8695,8704,8785,8790,8808,8813,8892,8896,8901,8907,9024,9028,9036,9044,9182],[204,205,206],"p",{},"Storage providers (also called drivers) are responsible for storing and retrieving data from various backends. Vercube includes built-in providers and makes it easy to create custom ones for any storage backend.",[208,209,211],"h2",{"id":210},"built-in-providers","Built-in Providers",[213,214,216],"h3",{"id":215},"memorystorage","MemoryStorage",[204,218,219],{},"The MemoryStorage provider stores data in memory. It's fast and ideal for caching and temporary data storage.",[204,221,222],{},[223,224,225],"strong",{},"Usage:",[227,228,233],"pre",{"className":229,"code":230,"language":231,"meta":232,"style":232},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { StorageManager } from '@vercube\u002Fstorage';\nimport { MemoryStorage } from '@vercube\u002Fstorage\u002Fdrivers\u002FMemoryStorage';\n\ncontainer.bind(StorageManager);\n\nconst storageManager = container.get(StorageManager);\nstorageManager.mount({\n  name: 'cache',\n  storage: MemoryStorage\n});\n\n\u002F\u002F Store data\nawait storageManager.setItem({\n  storage: 'cache',\n  key: 'mykey',\n  value: { foo: 'bar' }\n});\n\n\u002F\u002F Retrieve data\nconst value = await storageManager.getItem({\n  storage: 'cache',\n  key: 'mykey'\n});\nconsole.log(value); \u002F\u002F { foo: 'bar' }\n","ts","",[234,235,236,272,295,301,319,324,349,366,386,397,408,413,420,438,453,470,495,504,509,515,539,554,568,577],"code",{"__ignoreMap":232},[237,238,241,245,249,253,256,259,262,266,269],"span",{"class":239,"line":240},"line",1,[237,242,244],{"class":243},"s7zQu","import",[237,246,248],{"class":247},"sMK4o"," {",[237,250,252],{"class":251},"sTEyZ"," StorageManager",[237,254,255],{"class":247}," }",[237,257,258],{"class":243}," from",[237,260,261],{"class":247}," '",[237,263,265],{"class":264},"sfazB","@vercube\u002Fstorage",[237,267,268],{"class":247},"'",[237,270,271],{"class":247},";\n",[237,273,275,277,279,282,284,286,288,291,293],{"class":239,"line":274},2,[237,276,244],{"class":243},[237,278,248],{"class":247},[237,280,281],{"class":251}," MemoryStorage",[237,283,255],{"class":247},[237,285,258],{"class":243},[237,287,261],{"class":247},[237,289,290],{"class":264},"@vercube\u002Fstorage\u002Fdrivers\u002FMemoryStorage",[237,292,268],{"class":247},[237,294,271],{"class":247},[237,296,298],{"class":239,"line":297},3,[237,299,300],{"emptyLinePlaceholder":56},"\n",[237,302,304,307,310,314,317],{"class":239,"line":303},4,[237,305,306],{"class":251},"container",[237,308,309],{"class":247},".",[237,311,313],{"class":312},"s2Zo4","bind",[237,315,316],{"class":251},"(StorageManager)",[237,318,271],{"class":247},[237,320,322],{"class":239,"line":321},5,[237,323,300],{"emptyLinePlaceholder":56},[237,325,327,331,334,337,340,342,345,347],{"class":239,"line":326},6,[237,328,330],{"class":329},"spNyl","const",[237,332,333],{"class":251}," storageManager ",[237,335,336],{"class":247},"=",[237,338,339],{"class":251}," container",[237,341,309],{"class":247},[237,343,344],{"class":312},"get",[237,346,316],{"class":251},[237,348,271],{"class":247},[237,350,352,355,357,360,363],{"class":239,"line":351},7,[237,353,354],{"class":251},"storageManager",[237,356,309],{"class":247},[237,358,359],{"class":312},"mount",[237,361,362],{"class":251},"(",[237,364,365],{"class":247},"{\n",[237,367,369,373,376,378,381,383],{"class":239,"line":368},8,[237,370,372],{"class":371},"swJcz","  name",[237,374,375],{"class":247},":",[237,377,261],{"class":247},[237,379,380],{"class":264},"cache",[237,382,268],{"class":247},[237,384,385],{"class":247},",\n",[237,387,389,392,394],{"class":239,"line":388},9,[237,390,391],{"class":371},"  storage",[237,393,375],{"class":247},[237,395,396],{"class":251}," MemoryStorage\n",[237,398,400,403,406],{"class":239,"line":399},10,[237,401,402],{"class":247},"}",[237,404,405],{"class":251},")",[237,407,271],{"class":247},[237,409,411],{"class":239,"line":410},11,[237,412,300],{"emptyLinePlaceholder":56},[237,414,416],{"class":239,"line":415},12,[237,417,419],{"class":418},"sHwdD","\u002F\u002F Store data\n",[237,421,423,426,429,431,434,436],{"class":239,"line":422},13,[237,424,425],{"class":243},"await",[237,427,428],{"class":251}," storageManager",[237,430,309],{"class":247},[237,432,433],{"class":312},"setItem",[237,435,362],{"class":251},[237,437,365],{"class":247},[237,439,441,443,445,447,449,451],{"class":239,"line":440},14,[237,442,391],{"class":371},[237,444,375],{"class":247},[237,446,261],{"class":247},[237,448,380],{"class":264},[237,450,268],{"class":247},[237,452,385],{"class":247},[237,454,456,459,461,463,466,468],{"class":239,"line":455},15,[237,457,458],{"class":371},"  key",[237,460,375],{"class":247},[237,462,261],{"class":247},[237,464,465],{"class":264},"mykey",[237,467,268],{"class":247},[237,469,385],{"class":247},[237,471,473,476,478,480,483,485,487,490,492],{"class":239,"line":472},16,[237,474,475],{"class":371},"  value",[237,477,375],{"class":247},[237,479,248],{"class":247},[237,481,482],{"class":371}," foo",[237,484,375],{"class":247},[237,486,261],{"class":247},[237,488,489],{"class":264},"bar",[237,491,268],{"class":247},[237,493,494],{"class":247}," }\n",[237,496,498,500,502],{"class":239,"line":497},17,[237,499,402],{"class":247},[237,501,405],{"class":251},[237,503,271],{"class":247},[237,505,507],{"class":239,"line":506},18,[237,508,300],{"emptyLinePlaceholder":56},[237,510,512],{"class":239,"line":511},19,[237,513,514],{"class":418},"\u002F\u002F Retrieve data\n",[237,516,518,520,523,525,528,530,532,535,537],{"class":239,"line":517},20,[237,519,330],{"class":329},[237,521,522],{"class":251}," value ",[237,524,336],{"class":247},[237,526,527],{"class":243}," await",[237,529,428],{"class":251},[237,531,309],{"class":247},[237,533,534],{"class":312},"getItem",[237,536,362],{"class":251},[237,538,365],{"class":247},[237,540,542,544,546,548,550,552],{"class":239,"line":541},21,[237,543,391],{"class":371},[237,545,375],{"class":247},[237,547,261],{"class":247},[237,549,380],{"class":264},[237,551,268],{"class":247},[237,553,385],{"class":247},[237,555,557,559,561,563,565],{"class":239,"line":556},22,[237,558,458],{"class":371},[237,560,375],{"class":247},[237,562,261],{"class":247},[237,564,465],{"class":264},[237,566,567],{"class":247},"'\n",[237,569,571,573,575],{"class":239,"line":570},23,[237,572,402],{"class":247},[237,574,405],{"class":251},[237,576,271],{"class":247},[237,578,580,583,585,588,591,594],{"class":239,"line":579},24,[237,581,582],{"class":251},"console",[237,584,309],{"class":247},[237,586,587],{"class":312},"log",[237,589,590],{"class":251},"(value)",[237,592,593],{"class":247},";",[237,595,596],{"class":418}," \u002F\u002F { foo: 'bar' }\n",[204,598,599],{},[223,600,601],{},"Characteristics:",[603,604,605,618],"table",{},[606,607,608],"thead",{},[609,610,611,615],"tr",{},[612,613,614],"th",{},"Feature",[612,616,617],{},"Description",[619,620,621,630,638,646],"tbody",{},[609,622,623,627],{},[624,625,626],"td",{},"Persistence",[624,628,629],{},"None - data is lost on restart",[609,631,632,635],{},[624,633,634],{},"Speed",[624,636,637],{},"Extremely fast",[609,639,640,643],{},[624,641,642],{},"Memory Usage",[624,644,645],{},"Grows with stored data",[609,647,648,651],{},[624,649,650],{},"Use Cases",[624,652,653],{},"Caching, temporary data, development",[204,655,656],{},[223,657,658],{},"Best Practices:",[660,661,662,666,669,672],"ul",{},[663,664,665],"li",{},"Use for caching frequently accessed data",[663,667,668],{},"Ideal for development and testing",[663,670,671],{},"Clear periodically to prevent memory leaks",[663,673,674],{},"Consider size limits for production use",[676,677],"hr",{},[213,679,681],{"id":680},"s3storage","S3Storage",[204,683,684],{},"The S3Storage provider stores data in AWS S3 (or S3-compatible services like MinIO, DigitalOcean Spaces, etc.). It's ideal for distributed applications, serverless environments, and persistent cloud storage.",[204,686,687],{},[223,688,689],{},"Installation:",[204,691,692],{},"You need to install the AWS SDK for S3:",[694,695,696,719,737],"code-group",{},[227,697,702],{"className":698,"code":699,"filename":700,"language":701,"meta":232,"style":232},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","$ pnpm add @aws-sdk\u002Fclient-s3\n","pnpm","bash",[234,703,704],{"__ignoreMap":232},[237,705,706,710,713,716],{"class":239,"line":240},[237,707,709],{"class":708},"sBMFI","$",[237,711,712],{"class":264}," pnpm",[237,714,715],{"class":264}," add",[237,717,718],{"class":264}," @aws-sdk\u002Fclient-s3\n",[227,720,723],{"className":698,"code":721,"filename":722,"language":701,"meta":232,"style":232},"$ npm install @aws-sdk\u002Fclient-s3\n","npm",[234,724,725],{"__ignoreMap":232},[237,726,727,729,732,735],{"class":239,"line":240},[237,728,709],{"class":708},[237,730,731],{"class":264}," npm",[237,733,734],{"class":264}," install",[237,736,718],{"class":264},[227,738,741],{"className":698,"code":739,"filename":740,"language":701,"meta":232,"style":232},"$ bun install @aws-sdk\u002Fclient-s3\n","bun",[234,742,743],{"__ignoreMap":232},[237,744,745,747,750,752],{"class":239,"line":240},[237,746,709],{"class":708},[237,748,749],{"class":264}," bun",[237,751,734],{"class":264},[237,753,718],{"class":264},[204,755,756],{},[223,757,758],{},"Basic Usage:",[227,760,762],{"className":229,"code":761,"language":231,"meta":232,"style":232},"import { StorageManager } from '@vercube\u002Fstorage';\nimport { S3Storage } from '@vercube\u002Fstorage\u002Fdrivers\u002FS3Storage';\n\ncontainer.bind(StorageManager);\n\nconst storageManager = container.get(StorageManager);\n\n\u002F\u002F Recommended: Use IAM roles (no credentials needed)\nstorageManager.mount({\n  name: 's3',\n  storage: S3Storage,\n  initOptions: {\n    bucket: 'my-app-bucket',\n    region: 'us-east-1'\n    \u002F\u002F Credentials are optional - IAM role is used if available\n  }\n});\n\n\u002F\u002F Alternative: Use explicit credentials for local development\n\u002F\u002F storageManager.mount({\n\u002F\u002F   name: 's3',\n\u002F\u002F   storage: S3Storage,\n\u002F\u002F   initOptions: {\n\u002F\u002F     bucket: 'my-app-bucket',\n\u002F\u002F     region: 'us-east-1',\n\u002F\u002F     credentials: {\n\u002F\u002F       accessKeyId: process.env.AWS_ACCESS_KEY_ID!,\n\u002F\u002F       secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!\n\u002F\u002F     }\n\u002F\u002F   }\n\u002F\u002F });\n\n\u002F\u002F Store data\nawait storageManager.setItem({\n  storage: 's3',\n  key: 'user:123',\n  value: { id: '123', name: 'John' }\n});\n\n\u002F\u002F Retrieve data\nconst user = await storageManager.getItem({\n  storage: 's3',\n  key: 'user:123'\n});\n",[234,763,764,784,806,810,822,826,844,848,853,865,880,890,900,916,930,935,940,948,952,957,962,967,972,977,982,988,994,1000,1006,1012,1018,1024,1029,1034,1049,1064,1080,1118,1127,1132,1137,1159,1174,1187],{"__ignoreMap":232},[237,765,766,768,770,772,774,776,778,780,782],{"class":239,"line":240},[237,767,244],{"class":243},[237,769,248],{"class":247},[237,771,252],{"class":251},[237,773,255],{"class":247},[237,775,258],{"class":243},[237,777,261],{"class":247},[237,779,265],{"class":264},[237,781,268],{"class":247},[237,783,271],{"class":247},[237,785,786,788,790,793,795,797,799,802,804],{"class":239,"line":274},[237,787,244],{"class":243},[237,789,248],{"class":247},[237,791,792],{"class":251}," S3Storage",[237,794,255],{"class":247},[237,796,258],{"class":243},[237,798,261],{"class":247},[237,800,801],{"class":264},"@vercube\u002Fstorage\u002Fdrivers\u002FS3Storage",[237,803,268],{"class":247},[237,805,271],{"class":247},[237,807,808],{"class":239,"line":297},[237,809,300],{"emptyLinePlaceholder":56},[237,811,812,814,816,818,820],{"class":239,"line":303},[237,813,306],{"class":251},[237,815,309],{"class":247},[237,817,313],{"class":312},[237,819,316],{"class":251},[237,821,271],{"class":247},[237,823,824],{"class":239,"line":321},[237,825,300],{"emptyLinePlaceholder":56},[237,827,828,830,832,834,836,838,840,842],{"class":239,"line":326},[237,829,330],{"class":329},[237,831,333],{"class":251},[237,833,336],{"class":247},[237,835,339],{"class":251},[237,837,309],{"class":247},[237,839,344],{"class":312},[237,841,316],{"class":251},[237,843,271],{"class":247},[237,845,846],{"class":239,"line":351},[237,847,300],{"emptyLinePlaceholder":56},[237,849,850],{"class":239,"line":368},[237,851,852],{"class":418},"\u002F\u002F Recommended: Use IAM roles (no credentials needed)\n",[237,854,855,857,859,861,863],{"class":239,"line":388},[237,856,354],{"class":251},[237,858,309],{"class":247},[237,860,359],{"class":312},[237,862,362],{"class":251},[237,864,365],{"class":247},[237,866,867,869,871,873,876,878],{"class":239,"line":399},[237,868,372],{"class":371},[237,870,375],{"class":247},[237,872,261],{"class":247},[237,874,875],{"class":264},"s3",[237,877,268],{"class":247},[237,879,385],{"class":247},[237,881,882,884,886,888],{"class":239,"line":410},[237,883,391],{"class":371},[237,885,375],{"class":247},[237,887,792],{"class":251},[237,889,385],{"class":247},[237,891,892,895,897],{"class":239,"line":415},[237,893,894],{"class":371},"  initOptions",[237,896,375],{"class":247},[237,898,899],{"class":247}," {\n",[237,901,902,905,907,909,912,914],{"class":239,"line":422},[237,903,904],{"class":371},"    bucket",[237,906,375],{"class":247},[237,908,261],{"class":247},[237,910,911],{"class":264},"my-app-bucket",[237,913,268],{"class":247},[237,915,385],{"class":247},[237,917,918,921,923,925,928],{"class":239,"line":440},[237,919,920],{"class":371},"    region",[237,922,375],{"class":247},[237,924,261],{"class":247},[237,926,927],{"class":264},"us-east-1",[237,929,567],{"class":247},[237,931,932],{"class":239,"line":455},[237,933,934],{"class":418},"    \u002F\u002F Credentials are optional - IAM role is used if available\n",[237,936,937],{"class":239,"line":472},[237,938,939],{"class":247},"  }\n",[237,941,942,944,946],{"class":239,"line":497},[237,943,402],{"class":247},[237,945,405],{"class":251},[237,947,271],{"class":247},[237,949,950],{"class":239,"line":506},[237,951,300],{"emptyLinePlaceholder":56},[237,953,954],{"class":239,"line":511},[237,955,956],{"class":418},"\u002F\u002F Alternative: Use explicit credentials for local development\n",[237,958,959],{"class":239,"line":517},[237,960,961],{"class":418},"\u002F\u002F storageManager.mount({\n",[237,963,964],{"class":239,"line":541},[237,965,966],{"class":418},"\u002F\u002F   name: 's3',\n",[237,968,969],{"class":239,"line":556},[237,970,971],{"class":418},"\u002F\u002F   storage: S3Storage,\n",[237,973,974],{"class":239,"line":570},[237,975,976],{"class":418},"\u002F\u002F   initOptions: {\n",[237,978,979],{"class":239,"line":579},[237,980,981],{"class":418},"\u002F\u002F     bucket: 'my-app-bucket',\n",[237,983,985],{"class":239,"line":984},25,[237,986,987],{"class":418},"\u002F\u002F     region: 'us-east-1',\n",[237,989,991],{"class":239,"line":990},26,[237,992,993],{"class":418},"\u002F\u002F     credentials: {\n",[237,995,997],{"class":239,"line":996},27,[237,998,999],{"class":418},"\u002F\u002F       accessKeyId: process.env.AWS_ACCESS_KEY_ID!,\n",[237,1001,1003],{"class":239,"line":1002},28,[237,1004,1005],{"class":418},"\u002F\u002F       secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!\n",[237,1007,1009],{"class":239,"line":1008},29,[237,1010,1011],{"class":418},"\u002F\u002F     }\n",[237,1013,1015],{"class":239,"line":1014},30,[237,1016,1017],{"class":418},"\u002F\u002F   }\n",[237,1019,1021],{"class":239,"line":1020},31,[237,1022,1023],{"class":418},"\u002F\u002F });\n",[237,1025,1027],{"class":239,"line":1026},32,[237,1028,300],{"emptyLinePlaceholder":56},[237,1030,1032],{"class":239,"line":1031},33,[237,1033,419],{"class":418},[237,1035,1037,1039,1041,1043,1045,1047],{"class":239,"line":1036},34,[237,1038,425],{"class":243},[237,1040,428],{"class":251},[237,1042,309],{"class":247},[237,1044,433],{"class":312},[237,1046,362],{"class":251},[237,1048,365],{"class":247},[237,1050,1052,1054,1056,1058,1060,1062],{"class":239,"line":1051},35,[237,1053,391],{"class":371},[237,1055,375],{"class":247},[237,1057,261],{"class":247},[237,1059,875],{"class":264},[237,1061,268],{"class":247},[237,1063,385],{"class":247},[237,1065,1067,1069,1071,1073,1076,1078],{"class":239,"line":1066},36,[237,1068,458],{"class":371},[237,1070,375],{"class":247},[237,1072,261],{"class":247},[237,1074,1075],{"class":264},"user:123",[237,1077,268],{"class":247},[237,1079,385],{"class":247},[237,1081,1083,1085,1087,1089,1092,1094,1096,1099,1101,1104,1107,1109,1111,1114,1116],{"class":239,"line":1082},37,[237,1084,475],{"class":371},[237,1086,375],{"class":247},[237,1088,248],{"class":247},[237,1090,1091],{"class":371}," id",[237,1093,375],{"class":247},[237,1095,261],{"class":247},[237,1097,1098],{"class":264},"123",[237,1100,268],{"class":247},[237,1102,1103],{"class":247},",",[237,1105,1106],{"class":371}," name",[237,1108,375],{"class":247},[237,1110,261],{"class":247},[237,1112,1113],{"class":264},"John",[237,1115,268],{"class":247},[237,1117,494],{"class":247},[237,1119,1121,1123,1125],{"class":239,"line":1120},38,[237,1122,402],{"class":247},[237,1124,405],{"class":251},[237,1126,271],{"class":247},[237,1128,1130],{"class":239,"line":1129},39,[237,1131,300],{"emptyLinePlaceholder":56},[237,1133,1135],{"class":239,"line":1134},40,[237,1136,514],{"class":418},[237,1138,1140,1142,1145,1147,1149,1151,1153,1155,1157],{"class":239,"line":1139},41,[237,1141,330],{"class":329},[237,1143,1144],{"class":251}," user ",[237,1146,336],{"class":247},[237,1148,527],{"class":243},[237,1150,428],{"class":251},[237,1152,309],{"class":247},[237,1154,534],{"class":312},[237,1156,362],{"class":251},[237,1158,365],{"class":247},[237,1160,1162,1164,1166,1168,1170,1172],{"class":239,"line":1161},42,[237,1163,391],{"class":371},[237,1165,375],{"class":247},[237,1167,261],{"class":247},[237,1169,875],{"class":264},[237,1171,268],{"class":247},[237,1173,385],{"class":247},[237,1175,1177,1179,1181,1183,1185],{"class":239,"line":1176},43,[237,1178,458],{"class":371},[237,1180,375],{"class":247},[237,1182,261],{"class":247},[237,1184,1075],{"class":264},[237,1186,567],{"class":247},[237,1188,1190,1192,1194],{"class":239,"line":1189},44,[237,1191,402],{"class":247},[237,1193,405],{"class":251},[237,1195,271],{"class":247},[204,1197,1198],{},[223,1199,1200],{},"Configuration Options:",[204,1202,1203,1204,1207,1208,1211],{},"The ",[234,1205,1206],{},"initOptions"," extends AWS S3ClientConfig with an additional ",[234,1209,1210],{},"bucket"," property:",[603,1213,1214,1229],{},[606,1215,1216],{},[609,1217,1218,1221,1224,1227],{},[612,1219,1220],{},"Option",[612,1222,1223],{},"Type",[612,1225,1226],{},"Required",[612,1228,617],{},[619,1230,1231,1248,1264,1282,1298],{},[609,1232,1233,1237,1242,1245],{},[624,1234,1235],{},[234,1236,1210],{},[624,1238,1239],{},[234,1240,1241],{},"string",[624,1243,1244],{},"Yes",[624,1246,1247],{},"S3 bucket name",[609,1249,1250,1255,1259,1261],{},[624,1251,1252],{},[234,1253,1254],{},"region",[624,1256,1257],{},[234,1258,1241],{},[624,1260,1244],{},[624,1262,1263],{},"AWS region (e.g., 'us-east-1')",[609,1265,1266,1271,1276,1279],{},[624,1267,1268],{},[234,1269,1270],{},"credentials",[624,1272,1273],{},[234,1274,1275],{},"object",[624,1277,1278],{},"No",[624,1280,1281],{},"AWS credentials (accessKeyId, secretAccessKey, sessionToken). If omitted, AWS SDK uses the default credential provider chain (IAM roles, environment variables, config files)",[609,1283,1284,1289,1293,1295],{},[624,1285,1286],{},[234,1287,1288],{},"endpoint",[624,1290,1291],{},[234,1292,1241],{},[624,1294,1278],{},[624,1296,1297],{},"Custom endpoint for S3-compatible services",[609,1299,1300,1305,1310,1312],{},[624,1301,1302],{},[234,1303,1304],{},"forcePathStyle",[624,1306,1307],{},[234,1308,1309],{},"boolean",[624,1311,1278],{},[624,1313,1314],{},"Use path-style URLs (required for some S3-compatible services like MinIO)",[204,1316,1317,1320,1321,1323],{},[223,1318,1319],{},"Note:"," When ",[234,1322,1270],{}," is omitted, the AWS SDK automatically attempts to load credentials from:",[1325,1326,1327,1330,1340,1346,1349],"ol",{},[663,1328,1329],{},"IAM roles (Lambda execution role, EC2 instance profile, ECS task role)",[663,1331,1332,1333,1336,1337,405],{},"Environment variables (",[234,1334,1335],{},"AWS_ACCESS_KEY_ID",", ",[234,1338,1339],{},"AWS_SECRET_ACCESS_KEY",[663,1341,1342,1343,405],{},"Shared credentials file (",[234,1344,1345],{},"~\u002F.aws\u002Fcredentials",[663,1347,1348],{},"ECS container credentials",[663,1350,1351],{},"EC2 instance metadata service",[204,1353,1354],{},[223,1355,1356],{},"Using with S3-Compatible Services:",[227,1358,1360],{"className":229,"code":1359,"language":231,"meta":232,"style":232},"\u002F\u002F MinIO\nstorageManager.mount({\n  name: 'minio',\n  storage: S3Storage,\n  initOptions: {\n    bucket: 'my-bucket',\n    region: 'us-east-1',\n    endpoint: 'http:\u002F\u002Flocalhost:9000',\n    credentials: {\n      accessKeyId: 'minioadmin',\n      secretAccessKey: 'minioadmin'\n    },\n    forcePathStyle: true \u002F\u002F Required for MinIO\n  }\n});\n\n\u002F\u002F DigitalOcean Spaces\nstorageManager.mount({\n  name: 'spaces',\n  storage: S3Storage,\n  initOptions: {\n    bucket: 'my-space',\n    region: 'nyc3',\n    endpoint: 'https:\u002F\u002Fnyc3.digitaloceanspaces.com',\n    credentials: {\n      accessKeyId: process.env.DO_SPACES_KEY,\n      secretAccessKey: process.env.DO_SPACES_SECRET\n    }\n  }\n});\n\n\u002F\u002F Cloudflare R2\nstorageManager.mount({\n  name: 'r2',\n  storage: S3Storage,\n  initOptions: {\n    bucket: 'my-bucket',\n    region: 'auto',\n    endpoint: `https:\u002F\u002F${process.env.CF_ACCOUNT_ID}.r2.cloudflarestorage.com`,\n    credentials: {\n      accessKeyId: process.env.R2_ACCESS_KEY_ID,\n      secretAccessKey: process.env.R2_SECRET_ACCESS_KEY\n    }\n  }\n});\n",[234,1361,1362,1367,1379,1394,1404,1412,1427,1441,1457,1466,1482,1495,1500,1514,1518,1526,1530,1535,1547,1562,1572,1580,1595,1610,1625,1633,1654,1671,1676,1680,1688,1692,1697,1709,1724,1734,1742,1756,1771,1808,1816,1835,1852,1856,1860],{"__ignoreMap":232},[237,1363,1364],{"class":239,"line":240},[237,1365,1366],{"class":418},"\u002F\u002F MinIO\n",[237,1368,1369,1371,1373,1375,1377],{"class":239,"line":274},[237,1370,354],{"class":251},[237,1372,309],{"class":247},[237,1374,359],{"class":312},[237,1376,362],{"class":251},[237,1378,365],{"class":247},[237,1380,1381,1383,1385,1387,1390,1392],{"class":239,"line":297},[237,1382,372],{"class":371},[237,1384,375],{"class":247},[237,1386,261],{"class":247},[237,1388,1389],{"class":264},"minio",[237,1391,268],{"class":247},[237,1393,385],{"class":247},[237,1395,1396,1398,1400,1402],{"class":239,"line":303},[237,1397,391],{"class":371},[237,1399,375],{"class":247},[237,1401,792],{"class":251},[237,1403,385],{"class":247},[237,1405,1406,1408,1410],{"class":239,"line":321},[237,1407,894],{"class":371},[237,1409,375],{"class":247},[237,1411,899],{"class":247},[237,1413,1414,1416,1418,1420,1423,1425],{"class":239,"line":326},[237,1415,904],{"class":371},[237,1417,375],{"class":247},[237,1419,261],{"class":247},[237,1421,1422],{"class":264},"my-bucket",[237,1424,268],{"class":247},[237,1426,385],{"class":247},[237,1428,1429,1431,1433,1435,1437,1439],{"class":239,"line":351},[237,1430,920],{"class":371},[237,1432,375],{"class":247},[237,1434,261],{"class":247},[237,1436,927],{"class":264},[237,1438,268],{"class":247},[237,1440,385],{"class":247},[237,1442,1443,1446,1448,1450,1453,1455],{"class":239,"line":368},[237,1444,1445],{"class":371},"    endpoint",[237,1447,375],{"class":247},[237,1449,261],{"class":247},[237,1451,1452],{"class":264},"http:\u002F\u002Flocalhost:9000",[237,1454,268],{"class":247},[237,1456,385],{"class":247},[237,1458,1459,1462,1464],{"class":239,"line":388},[237,1460,1461],{"class":371},"    credentials",[237,1463,375],{"class":247},[237,1465,899],{"class":247},[237,1467,1468,1471,1473,1475,1478,1480],{"class":239,"line":399},[237,1469,1470],{"class":371},"      accessKeyId",[237,1472,375],{"class":247},[237,1474,261],{"class":247},[237,1476,1477],{"class":264},"minioadmin",[237,1479,268],{"class":247},[237,1481,385],{"class":247},[237,1483,1484,1487,1489,1491,1493],{"class":239,"line":410},[237,1485,1486],{"class":371},"      secretAccessKey",[237,1488,375],{"class":247},[237,1490,261],{"class":247},[237,1492,1477],{"class":264},[237,1494,567],{"class":247},[237,1496,1497],{"class":239,"line":415},[237,1498,1499],{"class":247},"    },\n",[237,1501,1502,1505,1507,1511],{"class":239,"line":422},[237,1503,1504],{"class":371},"    forcePathStyle",[237,1506,375],{"class":247},[237,1508,1510],{"class":1509},"sfNiH"," true",[237,1512,1513],{"class":418}," \u002F\u002F Required for MinIO\n",[237,1515,1516],{"class":239,"line":440},[237,1517,939],{"class":247},[237,1519,1520,1522,1524],{"class":239,"line":455},[237,1521,402],{"class":247},[237,1523,405],{"class":251},[237,1525,271],{"class":247},[237,1527,1528],{"class":239,"line":472},[237,1529,300],{"emptyLinePlaceholder":56},[237,1531,1532],{"class":239,"line":497},[237,1533,1534],{"class":418},"\u002F\u002F DigitalOcean Spaces\n",[237,1536,1537,1539,1541,1543,1545],{"class":239,"line":506},[237,1538,354],{"class":251},[237,1540,309],{"class":247},[237,1542,359],{"class":312},[237,1544,362],{"class":251},[237,1546,365],{"class":247},[237,1548,1549,1551,1553,1555,1558,1560],{"class":239,"line":511},[237,1550,372],{"class":371},[237,1552,375],{"class":247},[237,1554,261],{"class":247},[237,1556,1557],{"class":264},"spaces",[237,1559,268],{"class":247},[237,1561,385],{"class":247},[237,1563,1564,1566,1568,1570],{"class":239,"line":517},[237,1565,391],{"class":371},[237,1567,375],{"class":247},[237,1569,792],{"class":251},[237,1571,385],{"class":247},[237,1573,1574,1576,1578],{"class":239,"line":541},[237,1575,894],{"class":371},[237,1577,375],{"class":247},[237,1579,899],{"class":247},[237,1581,1582,1584,1586,1588,1591,1593],{"class":239,"line":556},[237,1583,904],{"class":371},[237,1585,375],{"class":247},[237,1587,261],{"class":247},[237,1589,1590],{"class":264},"my-space",[237,1592,268],{"class":247},[237,1594,385],{"class":247},[237,1596,1597,1599,1601,1603,1606,1608],{"class":239,"line":570},[237,1598,920],{"class":371},[237,1600,375],{"class":247},[237,1602,261],{"class":247},[237,1604,1605],{"class":264},"nyc3",[237,1607,268],{"class":247},[237,1609,385],{"class":247},[237,1611,1612,1614,1616,1618,1621,1623],{"class":239,"line":579},[237,1613,1445],{"class":371},[237,1615,375],{"class":247},[237,1617,261],{"class":247},[237,1619,1620],{"class":264},"https:\u002F\u002Fnyc3.digitaloceanspaces.com",[237,1622,268],{"class":247},[237,1624,385],{"class":247},[237,1626,1627,1629,1631],{"class":239,"line":984},[237,1628,1461],{"class":371},[237,1630,375],{"class":247},[237,1632,899],{"class":247},[237,1634,1635,1637,1639,1642,1644,1647,1649,1652],{"class":239,"line":990},[237,1636,1470],{"class":371},[237,1638,375],{"class":247},[237,1640,1641],{"class":251}," process",[237,1643,309],{"class":247},[237,1645,1646],{"class":251},"env",[237,1648,309],{"class":247},[237,1650,1651],{"class":251},"DO_SPACES_KEY",[237,1653,385],{"class":247},[237,1655,1656,1658,1660,1662,1664,1666,1668],{"class":239,"line":996},[237,1657,1486],{"class":371},[237,1659,375],{"class":247},[237,1661,1641],{"class":251},[237,1663,309],{"class":247},[237,1665,1646],{"class":251},[237,1667,309],{"class":247},[237,1669,1670],{"class":251},"DO_SPACES_SECRET\n",[237,1672,1673],{"class":239,"line":1002},[237,1674,1675],{"class":247},"    }\n",[237,1677,1678],{"class":239,"line":1008},[237,1679,939],{"class":247},[237,1681,1682,1684,1686],{"class":239,"line":1014},[237,1683,402],{"class":247},[237,1685,405],{"class":251},[237,1687,271],{"class":247},[237,1689,1690],{"class":239,"line":1020},[237,1691,300],{"emptyLinePlaceholder":56},[237,1693,1694],{"class":239,"line":1026},[237,1695,1696],{"class":418},"\u002F\u002F Cloudflare R2\n",[237,1698,1699,1701,1703,1705,1707],{"class":239,"line":1031},[237,1700,354],{"class":251},[237,1702,309],{"class":247},[237,1704,359],{"class":312},[237,1706,362],{"class":251},[237,1708,365],{"class":247},[237,1710,1711,1713,1715,1717,1720,1722],{"class":239,"line":1036},[237,1712,372],{"class":371},[237,1714,375],{"class":247},[237,1716,261],{"class":247},[237,1718,1719],{"class":264},"r2",[237,1721,268],{"class":247},[237,1723,385],{"class":247},[237,1725,1726,1728,1730,1732],{"class":239,"line":1051},[237,1727,391],{"class":371},[237,1729,375],{"class":247},[237,1731,792],{"class":251},[237,1733,385],{"class":247},[237,1735,1736,1738,1740],{"class":239,"line":1066},[237,1737,894],{"class":371},[237,1739,375],{"class":247},[237,1741,899],{"class":247},[237,1743,1744,1746,1748,1750,1752,1754],{"class":239,"line":1082},[237,1745,904],{"class":371},[237,1747,375],{"class":247},[237,1749,261],{"class":247},[237,1751,1422],{"class":264},[237,1753,268],{"class":247},[237,1755,385],{"class":247},[237,1757,1758,1760,1762,1764,1767,1769],{"class":239,"line":1120},[237,1759,920],{"class":371},[237,1761,375],{"class":247},[237,1763,261],{"class":247},[237,1765,1766],{"class":264},"auto",[237,1768,268],{"class":247},[237,1770,385],{"class":247},[237,1772,1773,1775,1777,1780,1783,1786,1789,1791,1793,1795,1798,1800,1803,1806],{"class":239,"line":1129},[237,1774,1445],{"class":371},[237,1776,375],{"class":247},[237,1778,1779],{"class":247}," `",[237,1781,1782],{"class":264},"https:\u002F\u002F",[237,1784,1785],{"class":247},"${",[237,1787,1788],{"class":251},"process",[237,1790,309],{"class":247},[237,1792,1646],{"class":251},[237,1794,309],{"class":247},[237,1796,1797],{"class":251},"CF_ACCOUNT_ID",[237,1799,402],{"class":247},[237,1801,1802],{"class":264},".r2.cloudflarestorage.com",[237,1804,1805],{"class":247},"`",[237,1807,385],{"class":247},[237,1809,1810,1812,1814],{"class":239,"line":1134},[237,1811,1461],{"class":371},[237,1813,375],{"class":247},[237,1815,899],{"class":247},[237,1817,1818,1820,1822,1824,1826,1828,1830,1833],{"class":239,"line":1139},[237,1819,1470],{"class":371},[237,1821,375],{"class":247},[237,1823,1641],{"class":251},[237,1825,309],{"class":247},[237,1827,1646],{"class":251},[237,1829,309],{"class":247},[237,1831,1832],{"class":251},"R2_ACCESS_KEY_ID",[237,1834,385],{"class":247},[237,1836,1837,1839,1841,1843,1845,1847,1849],{"class":239,"line":1161},[237,1838,1486],{"class":371},[237,1840,375],{"class":247},[237,1842,1641],{"class":251},[237,1844,309],{"class":247},[237,1846,1646],{"class":251},[237,1848,309],{"class":247},[237,1850,1851],{"class":251},"R2_SECRET_ACCESS_KEY\n",[237,1853,1854],{"class":239,"line":1176},[237,1855,1675],{"class":247},[237,1857,1858],{"class":239,"line":1189},[237,1859,939],{"class":247},[237,1861,1863,1865,1867],{"class":239,"line":1862},45,[237,1864,402],{"class":247},[237,1866,405],{"class":251},[237,1868,271],{"class":247},[204,1870,1871],{},[223,1872,601],{},[603,1874,1875,1883],{},[606,1876,1877],{},[609,1878,1879,1881],{},[612,1880,614],{},[612,1882,617],{},[619,1884,1885,1892,1899,1907],{},[609,1886,1887,1889],{},[624,1888,626],{},[624,1890,1891],{},"Yes - data persists across restarts",[609,1893,1894,1896],{},[624,1895,634],{},[624,1897,1898],{},"Network-dependent (slower than memory)",[609,1900,1901,1904],{},[624,1902,1903],{},"Scalability",[624,1905,1906],{},"Highly scalable, distributed",[609,1908,1909,1911],{},[624,1910,650],{},[624,1912,1913],{},"Production storage, file storage, distributed apps",[204,1915,1916],{},[223,1917,1918],{},"Authentication Methods:",[204,1920,1921],{},"The S3Storage driver supports multiple authentication methods, with different security characteristics suitable for various environments.",[1923,1924,1926],"h5",{"id":1925},"_1-iam-roles-recommended-for-aws-environments","1. IAM Roles (Recommended for AWS Environments)",[204,1928,1929],{},"When running in AWS environments (Lambda, EC2, ECS, etc.), IAM roles provide the most secure authentication method. Credentials are automatically managed by AWS without manual handling.",[227,1931,1933],{"className":229,"code":1932,"language":231,"meta":232,"style":232},"\u002F\u002F AWS Lambda - No credentials needed!\nstorageManager.mount({\n  name: 's3',\n  storage: S3Storage,\n  initOptions: {\n    bucket: 'my-app-bucket',\n    region: 'us-east-1'\n    \u002F\u002F No credentials field - IAM role is used automatically\n  }\n});\n",[234,1934,1935,1940,1952,1966,1976,1984,1998,2010,2015,2019],{"__ignoreMap":232},[237,1936,1937],{"class":239,"line":240},[237,1938,1939],{"class":418},"\u002F\u002F AWS Lambda - No credentials needed!\n",[237,1941,1942,1944,1946,1948,1950],{"class":239,"line":274},[237,1943,354],{"class":251},[237,1945,309],{"class":247},[237,1947,359],{"class":312},[237,1949,362],{"class":251},[237,1951,365],{"class":247},[237,1953,1954,1956,1958,1960,1962,1964],{"class":239,"line":297},[237,1955,372],{"class":371},[237,1957,375],{"class":247},[237,1959,261],{"class":247},[237,1961,875],{"class":264},[237,1963,268],{"class":247},[237,1965,385],{"class":247},[237,1967,1968,1970,1972,1974],{"class":239,"line":303},[237,1969,391],{"class":371},[237,1971,375],{"class":247},[237,1973,792],{"class":251},[237,1975,385],{"class":247},[237,1977,1978,1980,1982],{"class":239,"line":321},[237,1979,894],{"class":371},[237,1981,375],{"class":247},[237,1983,899],{"class":247},[237,1985,1986,1988,1990,1992,1994,1996],{"class":239,"line":326},[237,1987,904],{"class":371},[237,1989,375],{"class":247},[237,1991,261],{"class":247},[237,1993,911],{"class":264},[237,1995,268],{"class":247},[237,1997,385],{"class":247},[237,1999,2000,2002,2004,2006,2008],{"class":239,"line":351},[237,2001,920],{"class":371},[237,2003,375],{"class":247},[237,2005,261],{"class":247},[237,2007,927],{"class":264},[237,2009,567],{"class":247},[237,2011,2012],{"class":239,"line":368},[237,2013,2014],{"class":418},"    \u002F\u002F No credentials field - IAM role is used automatically\n",[237,2016,2017],{"class":239,"line":388},[237,2018,939],{"class":247},[237,2020,2021,2023,2025],{"class":239,"line":399},[237,2022,402],{"class":247},[237,2024,405],{"class":251},[237,2026,271],{"class":247},[204,2028,2029],{},[223,2030,2031],{},"How it works:",[660,2033,2034,2037,2040],{},[663,2035,2036],{},"AWS SDK automatically uses the IAM role attached to your Lambda function, EC2 instance, or ECS task",[663,2038,2039],{},"Credentials are temporary and automatically rotated by AWS",[663,2041,2042],{},"No secrets to manage or risk exposing in code",[204,2044,2045],{},[223,2046,2047],{},"Setup:",[1325,2049,2050,2053,2062],{},[663,2051,2052],{},"Attach an IAM role to your AWS resource (Lambda function, EC2 instance, etc.)",[663,2054,2055,2056,1336,2059,405],{},"Grant the role S3 permissions (e.g., ",[234,2057,2058],{},"s3:GetObject",[234,2060,2061],{},"s3:PutObject",[663,2063,2064,2065,2067,2068],{},"Omit the ",[234,2066,1270],{}," field in ",[234,2069,1206],{},[1923,2071,2073],{"id":2072},"_2-aws-secrets-manager-recommended-for-secure-credential-storage","2. AWS Secrets Manager (Recommended for Secure Credential Storage)",[204,2075,2076],{},"For applications that require explicit credentials, use AWS Secrets Manager to store and retrieve them securely.",[227,2078,2080],{"className":229,"code":2079,"language":231,"meta":232,"style":232},"import { SecretsManagerClient, GetSecretValueCommand } from '@aws-sdk\u002Fclient-secrets-manager';\n\nasync function getS3Credentials() {\n  const client = new SecretsManagerClient({ region: 'us-east-1' });\n  const response = await client.send(\n    new GetSecretValueCommand({ SecretId: 'my-app\u002Fs3-credentials' })\n  );\n  \n  if (!response.SecretString) {\n    throw new Error('Secret not found or uses SecretBinary');\n  }\n  \n  return JSON.parse(response.SecretString);\n}\n\n\u002F\u002F In your container setup\nconst credentials = await getS3Credentials();\n\nstorageManager.mount({\n  name: 's3',\n  storage: S3Storage,\n  initOptions: {\n    bucket: 'my-app-bucket',\n    region: 'us-east-1',\n    credentials: {\n      accessKeyId: credentials.accessKeyId,\n      secretAccessKey: credentials.secretAccessKey\n    }\n  }\n});\n",[234,2081,2082,2109,2113,2129,2167,2188,2216,2223,2228,2252,2275,2279,2283,2308,2313,2317,2322,2339,2343,2355,2369,2379,2387,2401,2415,2423,2439,2452,2456,2460],{"__ignoreMap":232},[237,2083,2084,2086,2088,2091,2093,2096,2098,2100,2102,2105,2107],{"class":239,"line":240},[237,2085,244],{"class":243},[237,2087,248],{"class":247},[237,2089,2090],{"class":251}," SecretsManagerClient",[237,2092,1103],{"class":247},[237,2094,2095],{"class":251}," GetSecretValueCommand",[237,2097,255],{"class":247},[237,2099,258],{"class":243},[237,2101,261],{"class":247},[237,2103,2104],{"class":264},"@aws-sdk\u002Fclient-secrets-manager",[237,2106,268],{"class":247},[237,2108,271],{"class":247},[237,2110,2111],{"class":239,"line":274},[237,2112,300],{"emptyLinePlaceholder":56},[237,2114,2115,2118,2121,2124,2127],{"class":239,"line":297},[237,2116,2117],{"class":329},"async",[237,2119,2120],{"class":329}," function",[237,2122,2123],{"class":312}," getS3Credentials",[237,2125,2126],{"class":247},"()",[237,2128,899],{"class":247},[237,2130,2131,2134,2137,2140,2143,2145,2147,2150,2153,2155,2157,2159,2161,2163,2165],{"class":239,"line":303},[237,2132,2133],{"class":329},"  const",[237,2135,2136],{"class":251}," client",[237,2138,2139],{"class":247}," =",[237,2141,2142],{"class":247}," new",[237,2144,2090],{"class":312},[237,2146,362],{"class":371},[237,2148,2149],{"class":247},"{",[237,2151,2152],{"class":371}," region",[237,2154,375],{"class":247},[237,2156,261],{"class":247},[237,2158,927],{"class":264},[237,2160,268],{"class":247},[237,2162,255],{"class":247},[237,2164,405],{"class":371},[237,2166,271],{"class":247},[237,2168,2169,2171,2174,2176,2178,2180,2182,2185],{"class":239,"line":321},[237,2170,2133],{"class":329},[237,2172,2173],{"class":251}," response",[237,2175,2139],{"class":247},[237,2177,527],{"class":243},[237,2179,2136],{"class":251},[237,2181,309],{"class":247},[237,2183,2184],{"class":312},"send",[237,2186,2187],{"class":371},"(\n",[237,2189,2190,2193,2195,2197,2199,2202,2204,2206,2209,2211,2213],{"class":239,"line":326},[237,2191,2192],{"class":247},"    new",[237,2194,2095],{"class":312},[237,2196,362],{"class":371},[237,2198,2149],{"class":247},[237,2200,2201],{"class":371}," SecretId",[237,2203,375],{"class":247},[237,2205,261],{"class":247},[237,2207,2208],{"class":264},"my-app\u002Fs3-credentials",[237,2210,268],{"class":247},[237,2212,255],{"class":247},[237,2214,2215],{"class":371},")\n",[237,2217,2218,2221],{"class":239,"line":351},[237,2219,2220],{"class":371},"  )",[237,2222,271],{"class":247},[237,2224,2225],{"class":239,"line":368},[237,2226,2227],{"class":371},"  \n",[237,2229,2230,2233,2236,2239,2242,2244,2247,2250],{"class":239,"line":388},[237,2231,2232],{"class":243},"  if",[237,2234,2235],{"class":371}," (",[237,2237,2238],{"class":247},"!",[237,2240,2241],{"class":251},"response",[237,2243,309],{"class":247},[237,2245,2246],{"class":251},"SecretString",[237,2248,2249],{"class":371},") ",[237,2251,365],{"class":247},[237,2253,2254,2257,2259,2262,2264,2266,2269,2271,2273],{"class":239,"line":399},[237,2255,2256],{"class":243},"    throw",[237,2258,2142],{"class":247},[237,2260,2261],{"class":312}," Error",[237,2263,362],{"class":371},[237,2265,268],{"class":247},[237,2267,2268],{"class":264},"Secret not found or uses SecretBinary",[237,2270,268],{"class":247},[237,2272,405],{"class":371},[237,2274,271],{"class":247},[237,2276,2277],{"class":239,"line":410},[237,2278,939],{"class":247},[237,2280,2281],{"class":239,"line":415},[237,2282,2227],{"class":371},[237,2284,2285,2288,2291,2293,2296,2298,2300,2302,2304,2306],{"class":239,"line":422},[237,2286,2287],{"class":243},"  return",[237,2289,2290],{"class":251}," JSON",[237,2292,309],{"class":247},[237,2294,2295],{"class":312},"parse",[237,2297,362],{"class":371},[237,2299,2241],{"class":251},[237,2301,309],{"class":247},[237,2303,2246],{"class":251},[237,2305,405],{"class":371},[237,2307,271],{"class":247},[237,2309,2310],{"class":239,"line":440},[237,2311,2312],{"class":247},"}\n",[237,2314,2315],{"class":239,"line":455},[237,2316,300],{"emptyLinePlaceholder":56},[237,2318,2319],{"class":239,"line":472},[237,2320,2321],{"class":418},"\u002F\u002F In your container setup\n",[237,2323,2324,2326,2329,2331,2333,2335,2337],{"class":239,"line":497},[237,2325,330],{"class":329},[237,2327,2328],{"class":251}," credentials ",[237,2330,336],{"class":247},[237,2332,527],{"class":243},[237,2334,2123],{"class":312},[237,2336,2126],{"class":251},[237,2338,271],{"class":247},[237,2340,2341],{"class":239,"line":506},[237,2342,300],{"emptyLinePlaceholder":56},[237,2344,2345,2347,2349,2351,2353],{"class":239,"line":511},[237,2346,354],{"class":251},[237,2348,309],{"class":247},[237,2350,359],{"class":312},[237,2352,362],{"class":251},[237,2354,365],{"class":247},[237,2356,2357,2359,2361,2363,2365,2367],{"class":239,"line":517},[237,2358,372],{"class":371},[237,2360,375],{"class":247},[237,2362,261],{"class":247},[237,2364,875],{"class":264},[237,2366,268],{"class":247},[237,2368,385],{"class":247},[237,2370,2371,2373,2375,2377],{"class":239,"line":541},[237,2372,391],{"class":371},[237,2374,375],{"class":247},[237,2376,792],{"class":251},[237,2378,385],{"class":247},[237,2380,2381,2383,2385],{"class":239,"line":556},[237,2382,894],{"class":371},[237,2384,375],{"class":247},[237,2386,899],{"class":247},[237,2388,2389,2391,2393,2395,2397,2399],{"class":239,"line":570},[237,2390,904],{"class":371},[237,2392,375],{"class":247},[237,2394,261],{"class":247},[237,2396,911],{"class":264},[237,2398,268],{"class":247},[237,2400,385],{"class":247},[237,2402,2403,2405,2407,2409,2411,2413],{"class":239,"line":579},[237,2404,920],{"class":371},[237,2406,375],{"class":247},[237,2408,261],{"class":247},[237,2410,927],{"class":264},[237,2412,268],{"class":247},[237,2414,385],{"class":247},[237,2416,2417,2419,2421],{"class":239,"line":984},[237,2418,1461],{"class":371},[237,2420,375],{"class":247},[237,2422,899],{"class":247},[237,2424,2425,2427,2429,2432,2434,2437],{"class":239,"line":990},[237,2426,1470],{"class":371},[237,2428,375],{"class":247},[237,2430,2431],{"class":251}," credentials",[237,2433,309],{"class":247},[237,2435,2436],{"class":251},"accessKeyId",[237,2438,385],{"class":247},[237,2440,2441,2443,2445,2447,2449],{"class":239,"line":996},[237,2442,1486],{"class":371},[237,2444,375],{"class":247},[237,2446,2431],{"class":251},[237,2448,309],{"class":247},[237,2450,2451],{"class":251},"secretAccessKey\n",[237,2453,2454],{"class":239,"line":1002},[237,2455,1675],{"class":247},[237,2457,2458],{"class":239,"line":1008},[237,2459,939],{"class":247},[237,2461,2462,2464,2466],{"class":239,"line":1014},[237,2463,402],{"class":247},[237,2465,405],{"class":251},[237,2467,271],{"class":247},[204,2469,2470],{},[223,2471,2472],{},"Benefits:",[660,2474,2475,2478,2481,2484],{},[663,2476,2477],{},"Credentials are encrypted at rest and in transit",[663,2479,2480],{},"Centralized secret management",[663,2482,2483],{},"Automatic rotation capabilities",[663,2485,2486],{},"Audit logging of secret access",[1923,2488,2490],{"id":2489},"_3-sts-temporary-credentials-for-cross-account-or-federated-access","3. STS Temporary Credentials (For Cross-Account or Federated Access)",[204,2492,2493],{},"Use AWS Security Token Service (STS) to assume roles and obtain temporary credentials.",[227,2495,2497],{"className":229,"code":2496,"language":231,"meta":232,"style":232},"import { STSClient, AssumeRoleCommand } from '@aws-sdk\u002Fclient-sts';\n\nasync function assumeRole() {\n  const stsClient = new STSClient({ region: 'us-east-1' });\n  const response = await stsClient.send(\n    new AssumeRoleCommand({\n      RoleArn: 'arn:aws:iam::123456789012:role\u002FS3AccessRole',\n      RoleSessionName: 'vercube-s3-session',\n      DurationSeconds: 3600 \u002F\u002F 1 hour\n    })\n  );\n  \n  const { Credentials } = response;\n  if (!Credentials?.AccessKeyId || !Credentials?.SecretAccessKey || !Credentials?.SessionToken) {\n    throw new Error('Failed to assume role - incomplete credentials returned');\n  }\n  \n  return {\n    accessKeyId: Credentials.AccessKeyId,\n    secretAccessKey: Credentials.SecretAccessKey,\n    sessionToken: Credentials.SessionToken\n  };\n}\n\n\u002F\u002F Get temporary credentials\nconst credentials = await assumeRole();\n\nstorageManager.mount({\n  name: 's3',\n  storage: S3Storage,\n  initOptions: {\n    bucket: 'my-app-bucket',\n    region: 'us-east-1',\n    credentials\n  }\n});\n",[234,2498,2499,2526,2530,2543,2576,2594,2604,2620,2636,2650,2657,2663,2667,2684,2729,2750,2754,2758,2764,2779,2794,2808,2813,2817,2821,2826,2842,2846,2858,2872,2882,2890,2904,2918,2923,2927],{"__ignoreMap":232},[237,2500,2501,2503,2505,2508,2510,2513,2515,2517,2519,2522,2524],{"class":239,"line":240},[237,2502,244],{"class":243},[237,2504,248],{"class":247},[237,2506,2507],{"class":251}," STSClient",[237,2509,1103],{"class":247},[237,2511,2512],{"class":251}," AssumeRoleCommand",[237,2514,255],{"class":247},[237,2516,258],{"class":243},[237,2518,261],{"class":247},[237,2520,2521],{"class":264},"@aws-sdk\u002Fclient-sts",[237,2523,268],{"class":247},[237,2525,271],{"class":247},[237,2527,2528],{"class":239,"line":274},[237,2529,300],{"emptyLinePlaceholder":56},[237,2531,2532,2534,2536,2539,2541],{"class":239,"line":297},[237,2533,2117],{"class":329},[237,2535,2120],{"class":329},[237,2537,2538],{"class":312}," assumeRole",[237,2540,2126],{"class":247},[237,2542,899],{"class":247},[237,2544,2545,2547,2550,2552,2554,2556,2558,2560,2562,2564,2566,2568,2570,2572,2574],{"class":239,"line":303},[237,2546,2133],{"class":329},[237,2548,2549],{"class":251}," stsClient",[237,2551,2139],{"class":247},[237,2553,2142],{"class":247},[237,2555,2507],{"class":312},[237,2557,362],{"class":371},[237,2559,2149],{"class":247},[237,2561,2152],{"class":371},[237,2563,375],{"class":247},[237,2565,261],{"class":247},[237,2567,927],{"class":264},[237,2569,268],{"class":247},[237,2571,255],{"class":247},[237,2573,405],{"class":371},[237,2575,271],{"class":247},[237,2577,2578,2580,2582,2584,2586,2588,2590,2592],{"class":239,"line":321},[237,2579,2133],{"class":329},[237,2581,2173],{"class":251},[237,2583,2139],{"class":247},[237,2585,527],{"class":243},[237,2587,2549],{"class":251},[237,2589,309],{"class":247},[237,2591,2184],{"class":312},[237,2593,2187],{"class":371},[237,2595,2596,2598,2600,2602],{"class":239,"line":326},[237,2597,2192],{"class":247},[237,2599,2512],{"class":312},[237,2601,362],{"class":371},[237,2603,365],{"class":247},[237,2605,2606,2609,2611,2613,2616,2618],{"class":239,"line":351},[237,2607,2608],{"class":371},"      RoleArn",[237,2610,375],{"class":247},[237,2612,261],{"class":247},[237,2614,2615],{"class":264},"arn:aws:iam::123456789012:role\u002FS3AccessRole",[237,2617,268],{"class":247},[237,2619,385],{"class":247},[237,2621,2622,2625,2627,2629,2632,2634],{"class":239,"line":368},[237,2623,2624],{"class":371},"      RoleSessionName",[237,2626,375],{"class":247},[237,2628,261],{"class":247},[237,2630,2631],{"class":264},"vercube-s3-session",[237,2633,268],{"class":247},[237,2635,385],{"class":247},[237,2637,2638,2641,2643,2647],{"class":239,"line":388},[237,2639,2640],{"class":371},"      DurationSeconds",[237,2642,375],{"class":247},[237,2644,2646],{"class":2645},"sbssI"," 3600",[237,2648,2649],{"class":418}," \u002F\u002F 1 hour\n",[237,2651,2652,2655],{"class":239,"line":399},[237,2653,2654],{"class":247},"    }",[237,2656,2215],{"class":371},[237,2658,2659,2661],{"class":239,"line":410},[237,2660,2220],{"class":371},[237,2662,271],{"class":247},[237,2664,2665],{"class":239,"line":415},[237,2666,2227],{"class":371},[237,2668,2669,2671,2673,2676,2678,2680,2682],{"class":239,"line":422},[237,2670,2133],{"class":329},[237,2672,248],{"class":247},[237,2674,2675],{"class":251}," Credentials",[237,2677,255],{"class":247},[237,2679,2139],{"class":247},[237,2681,2173],{"class":251},[237,2683,271],{"class":247},[237,2685,2686,2688,2690,2692,2695,2698,2701,2704,2707,2709,2711,2714,2716,2718,2720,2722,2725,2727],{"class":239,"line":440},[237,2687,2232],{"class":243},[237,2689,2235],{"class":371},[237,2691,2238],{"class":247},[237,2693,2694],{"class":251},"Credentials",[237,2696,2697],{"class":247},"?.",[237,2699,2700],{"class":251},"AccessKeyId",[237,2702,2703],{"class":247}," ||",[237,2705,2706],{"class":247}," !",[237,2708,2694],{"class":251},[237,2710,2697],{"class":247},[237,2712,2713],{"class":251},"SecretAccessKey",[237,2715,2703],{"class":247},[237,2717,2706],{"class":247},[237,2719,2694],{"class":251},[237,2721,2697],{"class":247},[237,2723,2724],{"class":251},"SessionToken",[237,2726,2249],{"class":371},[237,2728,365],{"class":247},[237,2730,2731,2733,2735,2737,2739,2741,2744,2746,2748],{"class":239,"line":455},[237,2732,2256],{"class":243},[237,2734,2142],{"class":247},[237,2736,2261],{"class":312},[237,2738,362],{"class":371},[237,2740,268],{"class":247},[237,2742,2743],{"class":264},"Failed to assume role - incomplete credentials returned",[237,2745,268],{"class":247},[237,2747,405],{"class":371},[237,2749,271],{"class":247},[237,2751,2752],{"class":239,"line":472},[237,2753,939],{"class":247},[237,2755,2756],{"class":239,"line":497},[237,2757,2227],{"class":371},[237,2759,2760,2762],{"class":239,"line":506},[237,2761,2287],{"class":243},[237,2763,899],{"class":247},[237,2765,2766,2769,2771,2773,2775,2777],{"class":239,"line":511},[237,2767,2768],{"class":371},"    accessKeyId",[237,2770,375],{"class":247},[237,2772,2675],{"class":251},[237,2774,309],{"class":247},[237,2776,2700],{"class":251},[237,2778,385],{"class":247},[237,2780,2781,2784,2786,2788,2790,2792],{"class":239,"line":517},[237,2782,2783],{"class":371},"    secretAccessKey",[237,2785,375],{"class":247},[237,2787,2675],{"class":251},[237,2789,309],{"class":247},[237,2791,2713],{"class":251},[237,2793,385],{"class":247},[237,2795,2796,2799,2801,2803,2805],{"class":239,"line":541},[237,2797,2798],{"class":371},"    sessionToken",[237,2800,375],{"class":247},[237,2802,2675],{"class":251},[237,2804,309],{"class":247},[237,2806,2807],{"class":251},"SessionToken\n",[237,2809,2810],{"class":239,"line":556},[237,2811,2812],{"class":247},"  };\n",[237,2814,2815],{"class":239,"line":570},[237,2816,2312],{"class":247},[237,2818,2819],{"class":239,"line":579},[237,2820,300],{"emptyLinePlaceholder":56},[237,2822,2823],{"class":239,"line":984},[237,2824,2825],{"class":418},"\u002F\u002F Get temporary credentials\n",[237,2827,2828,2830,2832,2834,2836,2838,2840],{"class":239,"line":990},[237,2829,330],{"class":329},[237,2831,2328],{"class":251},[237,2833,336],{"class":247},[237,2835,527],{"class":243},[237,2837,2538],{"class":312},[237,2839,2126],{"class":251},[237,2841,271],{"class":247},[237,2843,2844],{"class":239,"line":996},[237,2845,300],{"emptyLinePlaceholder":56},[237,2847,2848,2850,2852,2854,2856],{"class":239,"line":1002},[237,2849,354],{"class":251},[237,2851,309],{"class":247},[237,2853,359],{"class":312},[237,2855,362],{"class":251},[237,2857,365],{"class":247},[237,2859,2860,2862,2864,2866,2868,2870],{"class":239,"line":1008},[237,2861,372],{"class":371},[237,2863,375],{"class":247},[237,2865,261],{"class":247},[237,2867,875],{"class":264},[237,2869,268],{"class":247},[237,2871,385],{"class":247},[237,2873,2874,2876,2878,2880],{"class":239,"line":1014},[237,2875,391],{"class":371},[237,2877,375],{"class":247},[237,2879,792],{"class":251},[237,2881,385],{"class":247},[237,2883,2884,2886,2888],{"class":239,"line":1020},[237,2885,894],{"class":371},[237,2887,375],{"class":247},[237,2889,899],{"class":247},[237,2891,2892,2894,2896,2898,2900,2902],{"class":239,"line":1026},[237,2893,904],{"class":371},[237,2895,375],{"class":247},[237,2897,261],{"class":247},[237,2899,911],{"class":264},[237,2901,268],{"class":247},[237,2903,385],{"class":247},[237,2905,2906,2908,2910,2912,2914,2916],{"class":239,"line":1031},[237,2907,920],{"class":371},[237,2909,375],{"class":247},[237,2911,261],{"class":247},[237,2913,927],{"class":264},[237,2915,268],{"class":247},[237,2917,385],{"class":247},[237,2919,2920],{"class":239,"line":1036},[237,2921,2922],{"class":251},"    credentials\n",[237,2924,2925],{"class":239,"line":1051},[237,2926,939],{"class":247},[237,2928,2929,2931,2933],{"class":239,"line":1066},[237,2930,402],{"class":247},[237,2932,405],{"class":251},[237,2934,271],{"class":247},[204,2936,2937],{},[223,2938,2939],{},"Use cases:",[660,2941,2942,2945,2948,2951],{},[663,2943,2944],{},"Cross-account S3 access",[663,2946,2947],{},"Federated user access",[663,2949,2950],{},"Time-limited access requirements",[663,2952,2953],{},"Enhanced security through temporary credentials",[1923,2955,2957],{"id":2956},"_4-environment-variables-for-development","4. Environment Variables (For Development)",[204,2959,2960],{},"For local development, you can use environment variables. However, this method should be avoided in production.",[227,2962,2964],{"className":229,"code":2963,"language":231,"meta":232,"style":232},"\u002F\u002F .env file\n\u002F\u002F AWS_ACCESS_KEY_ID=your-access-key\n\u002F\u002F AWS_SECRET_ACCESS_KEY=your-secret-key\n\nstorageManager.mount({\n  name: 's3',\n  storage: S3Storage,\n  initOptions: {\n    bucket: 'my-app-bucket',\n    region: 'us-east-1',\n    credentials: {\n      accessKeyId: process.env.AWS_ACCESS_KEY_ID!,\n      secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!\n    }\n  }\n});\n",[234,2965,2966,2971,2976,2981,2985,2997,3011,3021,3029,3043,3057,3065,3084,3103,3107,3111],{"__ignoreMap":232},[237,2967,2968],{"class":239,"line":240},[237,2969,2970],{"class":418},"\u002F\u002F .env file\n",[237,2972,2973],{"class":239,"line":274},[237,2974,2975],{"class":418},"\u002F\u002F AWS_ACCESS_KEY_ID=your-access-key\n",[237,2977,2978],{"class":239,"line":297},[237,2979,2980],{"class":418},"\u002F\u002F AWS_SECRET_ACCESS_KEY=your-secret-key\n",[237,2982,2983],{"class":239,"line":303},[237,2984,300],{"emptyLinePlaceholder":56},[237,2986,2987,2989,2991,2993,2995],{"class":239,"line":321},[237,2988,354],{"class":251},[237,2990,309],{"class":247},[237,2992,359],{"class":312},[237,2994,362],{"class":251},[237,2996,365],{"class":247},[237,2998,2999,3001,3003,3005,3007,3009],{"class":239,"line":326},[237,3000,372],{"class":371},[237,3002,375],{"class":247},[237,3004,261],{"class":247},[237,3006,875],{"class":264},[237,3008,268],{"class":247},[237,3010,385],{"class":247},[237,3012,3013,3015,3017,3019],{"class":239,"line":351},[237,3014,391],{"class":371},[237,3016,375],{"class":247},[237,3018,792],{"class":251},[237,3020,385],{"class":247},[237,3022,3023,3025,3027],{"class":239,"line":368},[237,3024,894],{"class":371},[237,3026,375],{"class":247},[237,3028,899],{"class":247},[237,3030,3031,3033,3035,3037,3039,3041],{"class":239,"line":388},[237,3032,904],{"class":371},[237,3034,375],{"class":247},[237,3036,261],{"class":247},[237,3038,911],{"class":264},[237,3040,268],{"class":247},[237,3042,385],{"class":247},[237,3044,3045,3047,3049,3051,3053,3055],{"class":239,"line":399},[237,3046,920],{"class":371},[237,3048,375],{"class":247},[237,3050,261],{"class":247},[237,3052,927],{"class":264},[237,3054,268],{"class":247},[237,3056,385],{"class":247},[237,3058,3059,3061,3063],{"class":239,"line":410},[237,3060,1461],{"class":371},[237,3062,375],{"class":247},[237,3064,899],{"class":247},[237,3066,3067,3069,3071,3073,3075,3077,3079,3081],{"class":239,"line":415},[237,3068,1470],{"class":371},[237,3070,375],{"class":247},[237,3072,1641],{"class":251},[237,3074,309],{"class":247},[237,3076,1646],{"class":251},[237,3078,309],{"class":247},[237,3080,1335],{"class":251},[237,3082,3083],{"class":247},"!,\n",[237,3085,3086,3088,3090,3092,3094,3096,3098,3100],{"class":239,"line":422},[237,3087,1486],{"class":371},[237,3089,375],{"class":247},[237,3091,1641],{"class":251},[237,3093,309],{"class":247},[237,3095,1646],{"class":251},[237,3097,309],{"class":247},[237,3099,1339],{"class":251},[237,3101,3102],{"class":247},"!\n",[237,3104,3105],{"class":239,"line":440},[237,3106,1675],{"class":247},[237,3108,3109],{"class":239,"line":455},[237,3110,939],{"class":247},[237,3112,3113,3115,3117],{"class":239,"line":472},[237,3114,402],{"class":247},[237,3116,405],{"class":251},[237,3118,271],{"class":247},[204,3120,3121,3124,3125,3128,3129,3132],{},[223,3122,3123],{},"Important:"," Never commit credentials to source control. Use ",[234,3126,3127],{},".gitignore"," to exclude ",[234,3130,3131],{},".env"," files.",[204,3134,3135],{},[223,3136,3137],{},"Environment-Specific Configuration:",[204,3139,3140],{},"Configure different authentication methods based on your environment:",[227,3142,3144],{"className":229,"code":3143,"language":231,"meta":232,"style":232},"import { StorageManager } from '@vercube\u002Fstorage';\nimport { S3Storage } from '@vercube\u002Fstorage\u002Fdrivers\u002FS3Storage';\n\nconst isProduction = process.env.NODE_ENV === 'production';\nconst isLambda = !!process.env.AWS_LAMBDA_FUNCTION_NAME;\n\nconst storageManager = container.get(StorageManager);\n\nif (isLambda || isProduction) {\n  \u002F\u002F Production: Use IAM roles (no credentials needed)\n  storageManager.mount({\n    name: 's3',\n    storage: S3Storage,\n    initOptions: {\n      bucket: process.env.S3_BUCKET!,\n      region: process.env.AWS_REGION || 'us-east-1'\n      \u002F\u002F IAM role provides credentials automatically\n    }\n  });\n} else {\n  \u002F\u002F Development: Use local credentials\n  storageManager.mount({\n    name: 's3',\n    storage: S3Storage,\n    initOptions: {\n      bucket: process.env.S3_BUCKET || 'dev-bucket',\n      region: process.env.AWS_REGION || 'us-east-1',\n      credentials: {\n        accessKeyId: process.env.AWS_ACCESS_KEY_ID!,\n        secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!\n      }\n    }\n  });\n}\n",[234,3145,3146,3166,3186,3190,3222,3247,3251,3269,3273,3289,3294,3307,3322,3333,3342,3362,3388,3393,3397,3406,3415,3420,3432,3446,3456,3464,3491,3517,3526,3545,3564,3569,3573,3581],{"__ignoreMap":232},[237,3147,3148,3150,3152,3154,3156,3158,3160,3162,3164],{"class":239,"line":240},[237,3149,244],{"class":243},[237,3151,248],{"class":247},[237,3153,252],{"class":251},[237,3155,255],{"class":247},[237,3157,258],{"class":243},[237,3159,261],{"class":247},[237,3161,265],{"class":264},[237,3163,268],{"class":247},[237,3165,271],{"class":247},[237,3167,3168,3170,3172,3174,3176,3178,3180,3182,3184],{"class":239,"line":274},[237,3169,244],{"class":243},[237,3171,248],{"class":247},[237,3173,792],{"class":251},[237,3175,255],{"class":247},[237,3177,258],{"class":243},[237,3179,261],{"class":247},[237,3181,801],{"class":264},[237,3183,268],{"class":247},[237,3185,271],{"class":247},[237,3187,3188],{"class":239,"line":297},[237,3189,300],{"emptyLinePlaceholder":56},[237,3191,3192,3194,3197,3199,3201,3203,3205,3207,3210,3213,3215,3218,3220],{"class":239,"line":303},[237,3193,330],{"class":329},[237,3195,3196],{"class":251}," isProduction ",[237,3198,336],{"class":247},[237,3200,1641],{"class":251},[237,3202,309],{"class":247},[237,3204,1646],{"class":251},[237,3206,309],{"class":247},[237,3208,3209],{"class":251},"NODE_ENV ",[237,3211,3212],{"class":247},"===",[237,3214,261],{"class":247},[237,3216,3217],{"class":264},"production",[237,3219,268],{"class":247},[237,3221,271],{"class":247},[237,3223,3224,3226,3229,3231,3234,3236,3238,3240,3242,3245],{"class":239,"line":321},[237,3225,330],{"class":329},[237,3227,3228],{"class":251}," isLambda ",[237,3230,336],{"class":247},[237,3232,3233],{"class":247}," !!",[237,3235,1788],{"class":251},[237,3237,309],{"class":247},[237,3239,1646],{"class":251},[237,3241,309],{"class":247},[237,3243,3244],{"class":251},"AWS_LAMBDA_FUNCTION_NAME",[237,3246,271],{"class":247},[237,3248,3249],{"class":239,"line":326},[237,3250,300],{"emptyLinePlaceholder":56},[237,3252,3253,3255,3257,3259,3261,3263,3265,3267],{"class":239,"line":351},[237,3254,330],{"class":329},[237,3256,333],{"class":251},[237,3258,336],{"class":247},[237,3260,339],{"class":251},[237,3262,309],{"class":247},[237,3264,344],{"class":312},[237,3266,316],{"class":251},[237,3268,271],{"class":247},[237,3270,3271],{"class":239,"line":368},[237,3272,300],{"emptyLinePlaceholder":56},[237,3274,3275,3278,3281,3284,3287],{"class":239,"line":388},[237,3276,3277],{"class":243},"if",[237,3279,3280],{"class":251}," (isLambda ",[237,3282,3283],{"class":247},"||",[237,3285,3286],{"class":251}," isProduction) ",[237,3288,365],{"class":247},[237,3290,3291],{"class":239,"line":399},[237,3292,3293],{"class":418},"  \u002F\u002F Production: Use IAM roles (no credentials needed)\n",[237,3295,3296,3299,3301,3303,3305],{"class":239,"line":410},[237,3297,3298],{"class":251},"  storageManager",[237,3300,309],{"class":247},[237,3302,359],{"class":312},[237,3304,362],{"class":371},[237,3306,365],{"class":247},[237,3308,3309,3312,3314,3316,3318,3320],{"class":239,"line":415},[237,3310,3311],{"class":371},"    name",[237,3313,375],{"class":247},[237,3315,261],{"class":247},[237,3317,875],{"class":264},[237,3319,268],{"class":247},[237,3321,385],{"class":247},[237,3323,3324,3327,3329,3331],{"class":239,"line":422},[237,3325,3326],{"class":371},"    storage",[237,3328,375],{"class":247},[237,3330,792],{"class":251},[237,3332,385],{"class":247},[237,3334,3335,3338,3340],{"class":239,"line":440},[237,3336,3337],{"class":371},"    initOptions",[237,3339,375],{"class":247},[237,3341,899],{"class":247},[237,3343,3344,3347,3349,3351,3353,3355,3357,3360],{"class":239,"line":455},[237,3345,3346],{"class":371},"      bucket",[237,3348,375],{"class":247},[237,3350,1641],{"class":251},[237,3352,309],{"class":247},[237,3354,1646],{"class":251},[237,3356,309],{"class":247},[237,3358,3359],{"class":251},"S3_BUCKET",[237,3361,3083],{"class":247},[237,3363,3364,3367,3369,3371,3373,3375,3377,3380,3382,3384,3386],{"class":239,"line":472},[237,3365,3366],{"class":371},"      region",[237,3368,375],{"class":247},[237,3370,1641],{"class":251},[237,3372,309],{"class":247},[237,3374,1646],{"class":251},[237,3376,309],{"class":247},[237,3378,3379],{"class":251},"AWS_REGION",[237,3381,2703],{"class":247},[237,3383,261],{"class":247},[237,3385,927],{"class":264},[237,3387,567],{"class":247},[237,3389,3390],{"class":239,"line":497},[237,3391,3392],{"class":418},"      \u002F\u002F IAM role provides credentials automatically\n",[237,3394,3395],{"class":239,"line":506},[237,3396,1675],{"class":247},[237,3398,3399,3402,3404],{"class":239,"line":511},[237,3400,3401],{"class":247},"  }",[237,3403,405],{"class":371},[237,3405,271],{"class":247},[237,3407,3408,3410,3413],{"class":239,"line":517},[237,3409,402],{"class":247},[237,3411,3412],{"class":243}," else",[237,3414,899],{"class":247},[237,3416,3417],{"class":239,"line":541},[237,3418,3419],{"class":418},"  \u002F\u002F Development: Use local credentials\n",[237,3421,3422,3424,3426,3428,3430],{"class":239,"line":556},[237,3423,3298],{"class":251},[237,3425,309],{"class":247},[237,3427,359],{"class":312},[237,3429,362],{"class":371},[237,3431,365],{"class":247},[237,3433,3434,3436,3438,3440,3442,3444],{"class":239,"line":570},[237,3435,3311],{"class":371},[237,3437,375],{"class":247},[237,3439,261],{"class":247},[237,3441,875],{"class":264},[237,3443,268],{"class":247},[237,3445,385],{"class":247},[237,3447,3448,3450,3452,3454],{"class":239,"line":579},[237,3449,3326],{"class":371},[237,3451,375],{"class":247},[237,3453,792],{"class":251},[237,3455,385],{"class":247},[237,3457,3458,3460,3462],{"class":239,"line":984},[237,3459,3337],{"class":371},[237,3461,375],{"class":247},[237,3463,899],{"class":247},[237,3465,3466,3468,3470,3472,3474,3476,3478,3480,3482,3484,3487,3489],{"class":239,"line":990},[237,3467,3346],{"class":371},[237,3469,375],{"class":247},[237,3471,1641],{"class":251},[237,3473,309],{"class":247},[237,3475,1646],{"class":251},[237,3477,309],{"class":247},[237,3479,3359],{"class":251},[237,3481,2703],{"class":247},[237,3483,261],{"class":247},[237,3485,3486],{"class":264},"dev-bucket",[237,3488,268],{"class":247},[237,3490,385],{"class":247},[237,3492,3493,3495,3497,3499,3501,3503,3505,3507,3509,3511,3513,3515],{"class":239,"line":996},[237,3494,3366],{"class":371},[237,3496,375],{"class":247},[237,3498,1641],{"class":251},[237,3500,309],{"class":247},[237,3502,1646],{"class":251},[237,3504,309],{"class":247},[237,3506,3379],{"class":251},[237,3508,2703],{"class":247},[237,3510,261],{"class":247},[237,3512,927],{"class":264},[237,3514,268],{"class":247},[237,3516,385],{"class":247},[237,3518,3519,3522,3524],{"class":239,"line":1002},[237,3520,3521],{"class":371},"      credentials",[237,3523,375],{"class":247},[237,3525,899],{"class":247},[237,3527,3528,3531,3533,3535,3537,3539,3541,3543],{"class":239,"line":1008},[237,3529,3530],{"class":371},"        accessKeyId",[237,3532,375],{"class":247},[237,3534,1641],{"class":251},[237,3536,309],{"class":247},[237,3538,1646],{"class":251},[237,3540,309],{"class":247},[237,3542,1335],{"class":251},[237,3544,3083],{"class":247},[237,3546,3547,3550,3552,3554,3556,3558,3560,3562],{"class":239,"line":1014},[237,3548,3549],{"class":371},"        secretAccessKey",[237,3551,375],{"class":247},[237,3553,1641],{"class":251},[237,3555,309],{"class":247},[237,3557,1646],{"class":251},[237,3559,309],{"class":247},[237,3561,1339],{"class":251},[237,3563,3102],{"class":247},[237,3565,3566],{"class":239,"line":1020},[237,3567,3568],{"class":247},"      }\n",[237,3570,3571],{"class":239,"line":1026},[237,3572,1675],{"class":247},[237,3574,3575,3577,3579],{"class":239,"line":1031},[237,3576,3401],{"class":247},[237,3578,405],{"class":371},[237,3580,271],{"class":247},[237,3582,3583],{"class":239,"line":1036},[237,3584,2312],{"class":247},[204,3586,3587],{},[223,3588,658],{},[660,3590,3591,3597,3603,3609,3615,3621,3627,3633,3639,3645,3651],{},[663,3592,3593,3596],{},[223,3594,3595],{},"Use IAM roles in production"," - Most secure method for AWS environments",[663,3598,3599,3602],{},[223,3600,3601],{},"Never hardcode credentials"," - Always use environment variables, Secrets Manager, or IAM roles",[663,3604,3605,3608],{},[223,3606,3607],{},"Use Secrets Manager"," - For storing credentials that can't use IAM roles",[663,3610,3611,3614],{},[223,3612,3613],{},"Rotate credentials regularly"," - If using static credentials, rotate them periodically",[663,3616,3617,3620],{},[223,3618,3619],{},"Apply least privilege"," - Grant only the S3 permissions your application needs",[663,3622,3623,3626],{},[223,3624,3625],{},"Enable S3 bucket encryption"," - Encrypt data at rest using S3-managed or KMS keys",[663,3628,3629,3632],{},[223,3630,3631],{},"Use VPC endpoints"," - For enhanced security when accessing S3 from within AWS VPC",[663,3634,3635,3638],{},[223,3636,3637],{},"Implement caching layer"," - Use MemoryStorage for frequently accessed data to reduce S3 calls",[663,3640,3641,3644],{},[223,3642,3643],{},"Use appropriate S3 bucket policies"," - Restrict access to authorized principals only",[663,3646,3647,3650],{},[223,3648,3649],{},"Consider S3 storage classes"," - Optimize costs based on access patterns",[663,3652,3653,3656],{},[223,3654,3655],{},"Monitor access logs"," - Enable S3 access logging for security auditing",[676,3658],{},[208,3660,3662],{"id":3661},"creating-custom-providers","Creating Custom Providers",[204,3664,3665],{},"Creating a custom provider allows you to store data in any backend: databases, cloud storage, external services, etc.",[213,3667,3669],{"id":3668},"basic-provider-template","Basic Provider Template",[227,3671,3673],{"className":229,"code":3672,"language":231,"meta":232,"style":232},"import { Storage } from '@vercube\u002Fstorage';\nimport type { StorageTypes } from '@vercube\u002Fstorage';\n\nexport class CustomStorage extends Storage {\n  private client: any; \u002F\u002F Your storage client\n  \n  \u002F**\n   * Initialize the storage with options\n   *\u002F\n  public async initialize(options?: StorageTypes.Options): Promise\u003Cvoid> {\n    \u002F\u002F Setup code: connect to service, initialize client, etc.\n    this.client = await connectToService(options);\n  }\n  \n  \u002F**\n   * Retrieve a value by key\n   *\u002F\n  public async getItem\u003CT>(key: string): Promise\u003CT | null> {\n    const data = await this.client.get(key);\n    return data ? JSON.parse(data) : null;\n  }\n  \n  \u002F**\n   * Store a value with a key\n   *\u002F\n  public async setItem\u003CT>(key: string, value: T): Promise\u003Cvoid> {\n    await this.client.set(key, JSON.stringify(value));\n  }\n  \n  \u002F**\n   * Check if a key exists\n   *\u002F\n  public async hasItem(key: string): Promise\u003Cboolean> {\n    return this.client.has(key);\n  }\n  \n  \u002F**\n   * Remove a value by key\n   *\u002F\n  public async deleteItem(key: string): Promise\u003Cvoid> {\n    await this.client.delete(key);\n  }\n  \n  \u002F**\n   * Get all keys\n   *\u002F\n  public async getKeys(): Promise\u003Cstring[]> {\n    return this.client.keys();\n  }\n  \n  \u002F**\n   * Remove all items\n   *\u002F\n  public async clear(): Promise\u003Cvoid> {\n    await this.client.clear();\n  }\n  \n  \u002F**\n   * Get the number of stored items\n   *\u002F\n  public async size(): Promise\u003Cnumber> {\n    return this.client.size();\n  }\n}\n",[234,3674,3675,3696,3720,3724,3742,3759,3763,3768,3773,3778,3822,3827,3850,3854,3858,3862,3867,3871,3914,3943,3971,3975,3979,3983,3988,3992,4035,4072,4076,4080,4084,4089,4093,4122,4143,4147,4151,4155,4160,4164,4193,4214,4218,4222,4226,4231,4236,4262,4280,4285,4290,4295,4301,4306,4328,4346,4351,4356,4361,4367,4372,4395,4413,4418],{"__ignoreMap":232},[237,3676,3677,3679,3681,3684,3686,3688,3690,3692,3694],{"class":239,"line":240},[237,3678,244],{"class":243},[237,3680,248],{"class":247},[237,3682,3683],{"class":251}," Storage",[237,3685,255],{"class":247},[237,3687,258],{"class":243},[237,3689,261],{"class":247},[237,3691,265],{"class":264},[237,3693,268],{"class":247},[237,3695,271],{"class":247},[237,3697,3698,3700,3703,3705,3708,3710,3712,3714,3716,3718],{"class":239,"line":274},[237,3699,244],{"class":243},[237,3701,3702],{"class":243}," type",[237,3704,248],{"class":247},[237,3706,3707],{"class":251}," StorageTypes",[237,3709,255],{"class":247},[237,3711,258],{"class":243},[237,3713,261],{"class":247},[237,3715,265],{"class":264},[237,3717,268],{"class":247},[237,3719,271],{"class":247},[237,3721,3722],{"class":239,"line":297},[237,3723,300],{"emptyLinePlaceholder":56},[237,3725,3726,3729,3732,3735,3738,3740],{"class":239,"line":303},[237,3727,3728],{"class":243},"export",[237,3730,3731],{"class":329}," class",[237,3733,3734],{"class":708}," CustomStorage",[237,3736,3737],{"class":329}," extends",[237,3739,3683],{"class":708},[237,3741,899],{"class":247},[237,3743,3744,3747,3749,3751,3754,3756],{"class":239,"line":321},[237,3745,3746],{"class":329},"  private",[237,3748,2136],{"class":371},[237,3750,375],{"class":247},[237,3752,3753],{"class":708}," any",[237,3755,593],{"class":247},[237,3757,3758],{"class":418}," \u002F\u002F Your storage client\n",[237,3760,3761],{"class":239,"line":326},[237,3762,2227],{"class":251},[237,3764,3765],{"class":239,"line":351},[237,3766,3767],{"class":418},"  \u002F**\n",[237,3769,3770],{"class":239,"line":368},[237,3771,3772],{"class":418},"   * Initialize the storage with options\n",[237,3774,3775],{"class":239,"line":388},[237,3776,3777],{"class":418},"   *\u002F\n",[237,3779,3780,3783,3786,3789,3791,3795,3798,3800,3802,3805,3808,3811,3814,3817,3820],{"class":239,"line":399},[237,3781,3782],{"class":329},"  public",[237,3784,3785],{"class":329}," async",[237,3787,3788],{"class":371}," initialize",[237,3790,362],{"class":247},[237,3792,3794],{"class":3793},"sHdIc","options",[237,3796,3797],{"class":247},"?:",[237,3799,3707],{"class":708},[237,3801,309],{"class":247},[237,3803,3804],{"class":708},"Options",[237,3806,3807],{"class":247},"):",[237,3809,3810],{"class":708}," Promise",[237,3812,3813],{"class":247},"\u003C",[237,3815,3816],{"class":708},"void",[237,3818,3819],{"class":247},">",[237,3821,899],{"class":247},[237,3823,3824],{"class":239,"line":410},[237,3825,3826],{"class":418},"    \u002F\u002F Setup code: connect to service, initialize client, etc.\n",[237,3828,3829,3832,3835,3837,3839,3842,3844,3846,3848],{"class":239,"line":415},[237,3830,3831],{"class":247},"    this.",[237,3833,3834],{"class":251},"client",[237,3836,2139],{"class":247},[237,3838,527],{"class":243},[237,3840,3841],{"class":312}," connectToService",[237,3843,362],{"class":371},[237,3845,3794],{"class":251},[237,3847,405],{"class":371},[237,3849,271],{"class":247},[237,3851,3852],{"class":239,"line":422},[237,3853,939],{"class":247},[237,3855,3856],{"class":239,"line":440},[237,3857,2227],{"class":251},[237,3859,3860],{"class":239,"line":455},[237,3861,3767],{"class":418},[237,3863,3864],{"class":239,"line":472},[237,3865,3866],{"class":418},"   * Retrieve a value by key\n",[237,3868,3869],{"class":239,"line":497},[237,3870,3777],{"class":418},[237,3872,3873,3875,3877,3880,3882,3885,3888,3891,3893,3896,3898,3900,3902,3904,3907,3910,3912],{"class":239,"line":506},[237,3874,3782],{"class":329},[237,3876,3785],{"class":329},[237,3878,3879],{"class":371}," getItem",[237,3881,3813],{"class":247},[237,3883,3884],{"class":708},"T",[237,3886,3887],{"class":247},">(",[237,3889,3890],{"class":3793},"key",[237,3892,375],{"class":247},[237,3894,3895],{"class":708}," string",[237,3897,3807],{"class":247},[237,3899,3810],{"class":708},[237,3901,3813],{"class":247},[237,3903,3884],{"class":708},[237,3905,3906],{"class":247}," |",[237,3908,3909],{"class":708}," null",[237,3911,3819],{"class":247},[237,3913,899],{"class":247},[237,3915,3916,3919,3922,3924,3926,3929,3931,3933,3935,3937,3939,3941],{"class":239,"line":511},[237,3917,3918],{"class":329},"    const",[237,3920,3921],{"class":251}," data",[237,3923,2139],{"class":247},[237,3925,527],{"class":243},[237,3927,3928],{"class":247}," this.",[237,3930,3834],{"class":251},[237,3932,309],{"class":247},[237,3934,344],{"class":312},[237,3936,362],{"class":371},[237,3938,3890],{"class":251},[237,3940,405],{"class":371},[237,3942,271],{"class":247},[237,3944,3945,3948,3950,3953,3955,3957,3959,3961,3964,3966,3968],{"class":239,"line":517},[237,3946,3947],{"class":243},"    return",[237,3949,3921],{"class":251},[237,3951,3952],{"class":247}," ?",[237,3954,2290],{"class":251},[237,3956,309],{"class":247},[237,3958,2295],{"class":312},[237,3960,362],{"class":371},[237,3962,3963],{"class":251},"data",[237,3965,2249],{"class":371},[237,3967,375],{"class":247},[237,3969,3970],{"class":247}," null;\n",[237,3972,3973],{"class":239,"line":541},[237,3974,939],{"class":247},[237,3976,3977],{"class":239,"line":556},[237,3978,2227],{"class":251},[237,3980,3981],{"class":239,"line":570},[237,3982,3767],{"class":418},[237,3984,3985],{"class":239,"line":579},[237,3986,3987],{"class":418},"   * Store a value with a key\n",[237,3989,3990],{"class":239,"line":984},[237,3991,3777],{"class":418},[237,3993,3994,3996,3998,4001,4003,4005,4007,4009,4011,4013,4015,4018,4020,4023,4025,4027,4029,4031,4033],{"class":239,"line":990},[237,3995,3782],{"class":329},[237,3997,3785],{"class":329},[237,3999,4000],{"class":371}," setItem",[237,4002,3813],{"class":247},[237,4004,3884],{"class":708},[237,4006,3887],{"class":247},[237,4008,3890],{"class":3793},[237,4010,375],{"class":247},[237,4012,3895],{"class":708},[237,4014,1103],{"class":247},[237,4016,4017],{"class":3793}," value",[237,4019,375],{"class":247},[237,4021,4022],{"class":708}," T",[237,4024,3807],{"class":247},[237,4026,3810],{"class":708},[237,4028,3813],{"class":247},[237,4030,3816],{"class":708},[237,4032,3819],{"class":247},[237,4034,899],{"class":247},[237,4036,4037,4040,4042,4044,4046,4049,4051,4053,4055,4057,4059,4062,4064,4067,4070],{"class":239,"line":996},[237,4038,4039],{"class":243},"    await",[237,4041,3928],{"class":247},[237,4043,3834],{"class":251},[237,4045,309],{"class":247},[237,4047,4048],{"class":312},"set",[237,4050,362],{"class":371},[237,4052,3890],{"class":251},[237,4054,1103],{"class":247},[237,4056,2290],{"class":251},[237,4058,309],{"class":247},[237,4060,4061],{"class":312},"stringify",[237,4063,362],{"class":371},[237,4065,4066],{"class":251},"value",[237,4068,4069],{"class":371},"))",[237,4071,271],{"class":247},[237,4073,4074],{"class":239,"line":1002},[237,4075,939],{"class":247},[237,4077,4078],{"class":239,"line":1008},[237,4079,2227],{"class":251},[237,4081,4082],{"class":239,"line":1014},[237,4083,3767],{"class":418},[237,4085,4086],{"class":239,"line":1020},[237,4087,4088],{"class":418},"   * Check if a key exists\n",[237,4090,4091],{"class":239,"line":1026},[237,4092,3777],{"class":418},[237,4094,4095,4097,4099,4102,4104,4106,4108,4110,4112,4114,4116,4118,4120],{"class":239,"line":1031},[237,4096,3782],{"class":329},[237,4098,3785],{"class":329},[237,4100,4101],{"class":371}," hasItem",[237,4103,362],{"class":247},[237,4105,3890],{"class":3793},[237,4107,375],{"class":247},[237,4109,3895],{"class":708},[237,4111,3807],{"class":247},[237,4113,3810],{"class":708},[237,4115,3813],{"class":247},[237,4117,1309],{"class":708},[237,4119,3819],{"class":247},[237,4121,899],{"class":247},[237,4123,4124,4126,4128,4130,4132,4135,4137,4139,4141],{"class":239,"line":1036},[237,4125,3947],{"class":243},[237,4127,3928],{"class":247},[237,4129,3834],{"class":251},[237,4131,309],{"class":247},[237,4133,4134],{"class":312},"has",[237,4136,362],{"class":371},[237,4138,3890],{"class":251},[237,4140,405],{"class":371},[237,4142,271],{"class":247},[237,4144,4145],{"class":239,"line":1051},[237,4146,939],{"class":247},[237,4148,4149],{"class":239,"line":1066},[237,4150,2227],{"class":251},[237,4152,4153],{"class":239,"line":1082},[237,4154,3767],{"class":418},[237,4156,4157],{"class":239,"line":1120},[237,4158,4159],{"class":418},"   * Remove a value by key\n",[237,4161,4162],{"class":239,"line":1129},[237,4163,3777],{"class":418},[237,4165,4166,4168,4170,4173,4175,4177,4179,4181,4183,4185,4187,4189,4191],{"class":239,"line":1134},[237,4167,3782],{"class":329},[237,4169,3785],{"class":329},[237,4171,4172],{"class":371}," deleteItem",[237,4174,362],{"class":247},[237,4176,3890],{"class":3793},[237,4178,375],{"class":247},[237,4180,3895],{"class":708},[237,4182,3807],{"class":247},[237,4184,3810],{"class":708},[237,4186,3813],{"class":247},[237,4188,3816],{"class":708},[237,4190,3819],{"class":247},[237,4192,899],{"class":247},[237,4194,4195,4197,4199,4201,4203,4206,4208,4210,4212],{"class":239,"line":1139},[237,4196,4039],{"class":243},[237,4198,3928],{"class":247},[237,4200,3834],{"class":251},[237,4202,309],{"class":247},[237,4204,4205],{"class":312},"delete",[237,4207,362],{"class":371},[237,4209,3890],{"class":251},[237,4211,405],{"class":371},[237,4213,271],{"class":247},[237,4215,4216],{"class":239,"line":1161},[237,4217,939],{"class":247},[237,4219,4220],{"class":239,"line":1176},[237,4221,2227],{"class":251},[237,4223,4224],{"class":239,"line":1189},[237,4225,3767],{"class":418},[237,4227,4228],{"class":239,"line":1862},[237,4229,4230],{"class":418},"   * Get all keys\n",[237,4232,4234],{"class":239,"line":4233},46,[237,4235,3777],{"class":418},[237,4237,4239,4241,4243,4246,4249,4251,4253,4255,4258,4260],{"class":239,"line":4238},47,[237,4240,3782],{"class":329},[237,4242,3785],{"class":329},[237,4244,4245],{"class":371}," getKeys",[237,4247,4248],{"class":247},"():",[237,4250,3810],{"class":708},[237,4252,3813],{"class":247},[237,4254,1241],{"class":708},[237,4256,4257],{"class":251},"[]",[237,4259,3819],{"class":247},[237,4261,899],{"class":247},[237,4263,4265,4267,4269,4271,4273,4276,4278],{"class":239,"line":4264},48,[237,4266,3947],{"class":243},[237,4268,3928],{"class":247},[237,4270,3834],{"class":251},[237,4272,309],{"class":247},[237,4274,4275],{"class":312},"keys",[237,4277,2126],{"class":371},[237,4279,271],{"class":247},[237,4281,4283],{"class":239,"line":4282},49,[237,4284,939],{"class":247},[237,4286,4288],{"class":239,"line":4287},50,[237,4289,2227],{"class":251},[237,4291,4293],{"class":239,"line":4292},51,[237,4294,3767],{"class":418},[237,4296,4298],{"class":239,"line":4297},52,[237,4299,4300],{"class":418},"   * Remove all items\n",[237,4302,4304],{"class":239,"line":4303},53,[237,4305,3777],{"class":418},[237,4307,4309,4311,4313,4316,4318,4320,4322,4324,4326],{"class":239,"line":4308},54,[237,4310,3782],{"class":329},[237,4312,3785],{"class":329},[237,4314,4315],{"class":371}," clear",[237,4317,4248],{"class":247},[237,4319,3810],{"class":708},[237,4321,3813],{"class":247},[237,4323,3816],{"class":708},[237,4325,3819],{"class":247},[237,4327,899],{"class":247},[237,4329,4331,4333,4335,4337,4339,4342,4344],{"class":239,"line":4330},55,[237,4332,4039],{"class":243},[237,4334,3928],{"class":247},[237,4336,3834],{"class":251},[237,4338,309],{"class":247},[237,4340,4341],{"class":312},"clear",[237,4343,2126],{"class":371},[237,4345,271],{"class":247},[237,4347,4349],{"class":239,"line":4348},56,[237,4350,939],{"class":247},[237,4352,4354],{"class":239,"line":4353},57,[237,4355,2227],{"class":251},[237,4357,4359],{"class":239,"line":4358},58,[237,4360,3767],{"class":418},[237,4362,4364],{"class":239,"line":4363},59,[237,4365,4366],{"class":418},"   * Get the number of stored items\n",[237,4368,4370],{"class":239,"line":4369},60,[237,4371,3777],{"class":418},[237,4373,4375,4377,4379,4382,4384,4386,4388,4391,4393],{"class":239,"line":4374},61,[237,4376,3782],{"class":329},[237,4378,3785],{"class":329},[237,4380,4381],{"class":371}," size",[237,4383,4248],{"class":247},[237,4385,3810],{"class":708},[237,4387,3813],{"class":247},[237,4389,4390],{"class":708},"number",[237,4392,3819],{"class":247},[237,4394,899],{"class":247},[237,4396,4398,4400,4402,4404,4406,4409,4411],{"class":239,"line":4397},62,[237,4399,3947],{"class":243},[237,4401,3928],{"class":247},[237,4403,3834],{"class":251},[237,4405,309],{"class":247},[237,4407,4408],{"class":312},"size",[237,4410,2126],{"class":371},[237,4412,271],{"class":247},[237,4414,4416],{"class":239,"line":4415},63,[237,4417,939],{"class":247},[237,4419,4421],{"class":239,"line":4420},64,[237,4422,2312],{"class":247},[213,4424,4426],{"id":4425},"required-methods","Required Methods",[204,4428,4429],{},"Every custom storage provider must implement these methods:",[603,4431,4432,4441],{},[606,4433,4434],{},[609,4435,4436,4439],{},[612,4437,4438],{},"Method",[612,4440,617],{},[619,4442,4443,4453,4463,4473,4483,4493,4503,4513],{},[609,4444,4445,4450],{},[624,4446,4447],{},[234,4448,4449],{},"initialize(options)",[624,4451,4452],{},"Initialize the storage with configuration options",[609,4454,4455,4460],{},[624,4456,4457],{},[234,4458,4459],{},"getItem\u003CT>(key)",[624,4461,4462],{},"Retrieve a value by key",[609,4464,4465,4470],{},[624,4466,4467],{},[234,4468,4469],{},"setItem\u003CT, U>(key, value, options?)",[624,4471,4472],{},"Store a value with a key and optional options",[609,4474,4475,4480],{},[624,4476,4477],{},[234,4478,4479],{},"hasItem(key)",[624,4481,4482],{},"Check if a key exists",[609,4484,4485,4490],{},[624,4486,4487],{},[234,4488,4489],{},"deleteItem(key)",[624,4491,4492],{},"Remove a value by key",[609,4494,4495,4500],{},[624,4496,4497],{},[234,4498,4499],{},"getKeys()",[624,4501,4502],{},"Get all keys",[609,4504,4505,4510],{},[624,4506,4507],{},[234,4508,4509],{},"clear()",[624,4511,4512],{},"Remove all items",[609,4514,4515,4520],{},[624,4516,4517],{},[234,4518,4519],{},"size()",[624,4521,4522],{},"Get the number of stored items",[676,4524],{},[208,4526,4528],{"id":4527},"example-redis-storage","Example: Redis Storage",[204,4530,4531],{},"A complete example of a Redis storage provider:",[227,4533,4535],{"className":229,"code":4534,"language":231,"meta":232,"style":232},"import { Storage } from '@vercube\u002Fstorage';\nimport type { StorageTypes } from '@vercube\u002Fstorage';\nimport Redis from 'ioredis';\n\ninterface RedisStorageOptions {\n  host: string;\n  port: number;\n  password?: string;\n  db?: number;\n  keyPrefix?: string;\n}\n\nexport class RedisStorage extends Storage {\n  private redis!: Redis;\n  private prefix: string = '';\n  \n  public async initialize(options: RedisStorageOptions): Promise\u003Cvoid> {\n    this.redis = new Redis({\n      host: options.host,\n      port: options.port,\n      password: options.password,\n      db: options.db || 0\n    });\n    \n    this.prefix = options.keyPrefix || '';\n  }\n  \n  private getKey(key: string): string {\n    return this.prefix + key;\n  }\n  \n  public async getItem\u003CT>(key: string): Promise\u003CT | null> {\n    const data = await this.redis.get(this.getKey(key));\n    return data ? JSON.parse(data) : null;\n  }\n  \n  public async setItem\u003CT>(key: string, value: T): Promise\u003Cvoid> {\n    await this.redis.set(this.getKey(key), JSON.stringify(value));\n  }\n  \n  public async hasItem(key: string): Promise\u003Cboolean> {\n    const exists = await this.redis.exists(this.getKey(key));\n    return exists === 1;\n  }\n  \n  public async deleteItem(key: string): Promise\u003Cvoid> {\n    await this.redis.del(this.getKey(key));\n  }\n  \n  public async getKeys(): Promise\u003Cstring[]> {\n    const keys = await this.redis.keys(this.prefix + '*');\n    return keys.map(k => k.replace(this.prefix, ''));\n  }\n  \n  public async clear(): Promise\u003Cvoid> {\n    const keys = await this.redis.keys(this.prefix + '*');\n    if (keys.length > 0) {\n      await this.redis.del(...keys);\n    }\n  }\n  \n  public async size(): Promise\u003Cnumber> {\n    const keys = await this.redis.keys(this.prefix + '*');\n    return keys.length;\n  }\n}\n",[234,4536,4537,4557,4579,4598,4602,4612,4623,4635,4646,4657,4668,4672,4676,4691,4706,4724,4728,4756,4773,4790,4806,4822,4841,4849,4854,4876,4880,4884,4905,4921,4925,4929,4965,4999,5023,5027,5031,5071,5111,5115,5119,5147,5181,5195,5199,5203,5231,5258,5262,5266,5288,5326,5367,5371,5375,5395,5431,5455,5479,5483,5487,5491,5511,5547,5559,5564],{"__ignoreMap":232},[237,4538,4539,4541,4543,4545,4547,4549,4551,4553,4555],{"class":239,"line":240},[237,4540,244],{"class":243},[237,4542,248],{"class":247},[237,4544,3683],{"class":251},[237,4546,255],{"class":247},[237,4548,258],{"class":243},[237,4550,261],{"class":247},[237,4552,265],{"class":264},[237,4554,268],{"class":247},[237,4556,271],{"class":247},[237,4558,4559,4561,4563,4565,4567,4569,4571,4573,4575,4577],{"class":239,"line":274},[237,4560,244],{"class":243},[237,4562,3702],{"class":243},[237,4564,248],{"class":247},[237,4566,3707],{"class":251},[237,4568,255],{"class":247},[237,4570,258],{"class":243},[237,4572,261],{"class":247},[237,4574,265],{"class":264},[237,4576,268],{"class":247},[237,4578,271],{"class":247},[237,4580,4581,4583,4586,4589,4591,4594,4596],{"class":239,"line":297},[237,4582,244],{"class":243},[237,4584,4585],{"class":251}," Redis ",[237,4587,4588],{"class":243},"from",[237,4590,261],{"class":247},[237,4592,4593],{"class":264},"ioredis",[237,4595,268],{"class":247},[237,4597,271],{"class":247},[237,4599,4600],{"class":239,"line":303},[237,4601,300],{"emptyLinePlaceholder":56},[237,4603,4604,4607,4610],{"class":239,"line":321},[237,4605,4606],{"class":329},"interface",[237,4608,4609],{"class":708}," RedisStorageOptions",[237,4611,899],{"class":247},[237,4613,4614,4617,4619,4621],{"class":239,"line":326},[237,4615,4616],{"class":371},"  host",[237,4618,375],{"class":247},[237,4620,3895],{"class":708},[237,4622,271],{"class":247},[237,4624,4625,4628,4630,4633],{"class":239,"line":351},[237,4626,4627],{"class":371},"  port",[237,4629,375],{"class":247},[237,4631,4632],{"class":708}," number",[237,4634,271],{"class":247},[237,4636,4637,4640,4642,4644],{"class":239,"line":368},[237,4638,4639],{"class":371},"  password",[237,4641,3797],{"class":247},[237,4643,3895],{"class":708},[237,4645,271],{"class":247},[237,4647,4648,4651,4653,4655],{"class":239,"line":388},[237,4649,4650],{"class":371},"  db",[237,4652,3797],{"class":247},[237,4654,4632],{"class":708},[237,4656,271],{"class":247},[237,4658,4659,4662,4664,4666],{"class":239,"line":399},[237,4660,4661],{"class":371},"  keyPrefix",[237,4663,3797],{"class":247},[237,4665,3895],{"class":708},[237,4667,271],{"class":247},[237,4669,4670],{"class":239,"line":410},[237,4671,2312],{"class":247},[237,4673,4674],{"class":239,"line":415},[237,4675,300],{"emptyLinePlaceholder":56},[237,4677,4678,4680,4682,4685,4687,4689],{"class":239,"line":422},[237,4679,3728],{"class":243},[237,4681,3731],{"class":329},[237,4683,4684],{"class":708}," RedisStorage",[237,4686,3737],{"class":329},[237,4688,3683],{"class":708},[237,4690,899],{"class":247},[237,4692,4693,4695,4698,4701,4704],{"class":239,"line":440},[237,4694,3746],{"class":329},[237,4696,4697],{"class":371}," redis",[237,4699,4700],{"class":247},"!:",[237,4702,4703],{"class":708}," Redis",[237,4705,271],{"class":247},[237,4707,4708,4710,4713,4715,4717,4719,4722],{"class":239,"line":455},[237,4709,3746],{"class":329},[237,4711,4712],{"class":371}," prefix",[237,4714,375],{"class":247},[237,4716,3895],{"class":708},[237,4718,2139],{"class":247},[237,4720,4721],{"class":247}," ''",[237,4723,271],{"class":247},[237,4725,4726],{"class":239,"line":472},[237,4727,2227],{"class":251},[237,4729,4730,4732,4734,4736,4738,4740,4742,4744,4746,4748,4750,4752,4754],{"class":239,"line":497},[237,4731,3782],{"class":329},[237,4733,3785],{"class":329},[237,4735,3788],{"class":371},[237,4737,362],{"class":247},[237,4739,3794],{"class":3793},[237,4741,375],{"class":247},[237,4743,4609],{"class":708},[237,4745,3807],{"class":247},[237,4747,3810],{"class":708},[237,4749,3813],{"class":247},[237,4751,3816],{"class":708},[237,4753,3819],{"class":247},[237,4755,899],{"class":247},[237,4757,4758,4760,4763,4765,4767,4769,4771],{"class":239,"line":506},[237,4759,3831],{"class":247},[237,4761,4762],{"class":251},"redis",[237,4764,2139],{"class":247},[237,4766,2142],{"class":247},[237,4768,4703],{"class":312},[237,4770,362],{"class":371},[237,4772,365],{"class":247},[237,4774,4775,4778,4780,4783,4785,4788],{"class":239,"line":511},[237,4776,4777],{"class":371},"      host",[237,4779,375],{"class":247},[237,4781,4782],{"class":251}," options",[237,4784,309],{"class":247},[237,4786,4787],{"class":251},"host",[237,4789,385],{"class":247},[237,4791,4792,4795,4797,4799,4801,4804],{"class":239,"line":517},[237,4793,4794],{"class":371},"      port",[237,4796,375],{"class":247},[237,4798,4782],{"class":251},[237,4800,309],{"class":247},[237,4802,4803],{"class":251},"port",[237,4805,385],{"class":247},[237,4807,4808,4811,4813,4815,4817,4820],{"class":239,"line":541},[237,4809,4810],{"class":371},"      password",[237,4812,375],{"class":247},[237,4814,4782],{"class":251},[237,4816,309],{"class":247},[237,4818,4819],{"class":251},"password",[237,4821,385],{"class":247},[237,4823,4824,4827,4829,4831,4833,4836,4838],{"class":239,"line":556},[237,4825,4826],{"class":371},"      db",[237,4828,375],{"class":247},[237,4830,4782],{"class":251},[237,4832,309],{"class":247},[237,4834,4835],{"class":251},"db",[237,4837,2703],{"class":247},[237,4839,4840],{"class":2645}," 0\n",[237,4842,4843,4845,4847],{"class":239,"line":570},[237,4844,2654],{"class":247},[237,4846,405],{"class":371},[237,4848,271],{"class":247},[237,4850,4851],{"class":239,"line":579},[237,4852,4853],{"class":371},"    \n",[237,4855,4856,4858,4861,4863,4865,4867,4870,4872,4874],{"class":239,"line":984},[237,4857,3831],{"class":247},[237,4859,4860],{"class":251},"prefix",[237,4862,2139],{"class":247},[237,4864,4782],{"class":251},[237,4866,309],{"class":247},[237,4868,4869],{"class":251},"keyPrefix",[237,4871,2703],{"class":247},[237,4873,4721],{"class":247},[237,4875,271],{"class":247},[237,4877,4878],{"class":239,"line":990},[237,4879,939],{"class":247},[237,4881,4882],{"class":239,"line":996},[237,4883,2227],{"class":251},[237,4885,4886,4888,4891,4893,4895,4897,4899,4901,4903],{"class":239,"line":1002},[237,4887,3746],{"class":329},[237,4889,4890],{"class":371}," getKey",[237,4892,362],{"class":247},[237,4894,3890],{"class":3793},[237,4896,375],{"class":247},[237,4898,3895],{"class":708},[237,4900,3807],{"class":247},[237,4902,3895],{"class":708},[237,4904,899],{"class":247},[237,4906,4907,4909,4911,4913,4916,4919],{"class":239,"line":1008},[237,4908,3947],{"class":243},[237,4910,3928],{"class":247},[237,4912,4860],{"class":251},[237,4914,4915],{"class":247}," +",[237,4917,4918],{"class":251}," key",[237,4920,271],{"class":247},[237,4922,4923],{"class":239,"line":1014},[237,4924,939],{"class":247},[237,4926,4927],{"class":239,"line":1020},[237,4928,2227],{"class":251},[237,4930,4931,4933,4935,4937,4939,4941,4943,4945,4947,4949,4951,4953,4955,4957,4959,4961,4963],{"class":239,"line":1026},[237,4932,3782],{"class":329},[237,4934,3785],{"class":329},[237,4936,3879],{"class":371},[237,4938,3813],{"class":247},[237,4940,3884],{"class":708},[237,4942,3887],{"class":247},[237,4944,3890],{"class":3793},[237,4946,375],{"class":247},[237,4948,3895],{"class":708},[237,4950,3807],{"class":247},[237,4952,3810],{"class":708},[237,4954,3813],{"class":247},[237,4956,3884],{"class":708},[237,4958,3906],{"class":247},[237,4960,3909],{"class":708},[237,4962,3819],{"class":247},[237,4964,899],{"class":247},[237,4966,4967,4969,4971,4973,4975,4977,4979,4981,4983,4985,4988,4991,4993,4995,4997],{"class":239,"line":1031},[237,4968,3918],{"class":329},[237,4970,3921],{"class":251},[237,4972,2139],{"class":247},[237,4974,527],{"class":243},[237,4976,3928],{"class":247},[237,4978,4762],{"class":251},[237,4980,309],{"class":247},[237,4982,344],{"class":312},[237,4984,362],{"class":371},[237,4986,4987],{"class":247},"this.",[237,4989,4990],{"class":312},"getKey",[237,4992,362],{"class":371},[237,4994,3890],{"class":251},[237,4996,4069],{"class":371},[237,4998,271],{"class":247},[237,5000,5001,5003,5005,5007,5009,5011,5013,5015,5017,5019,5021],{"class":239,"line":1036},[237,5002,3947],{"class":243},[237,5004,3921],{"class":251},[237,5006,3952],{"class":247},[237,5008,2290],{"class":251},[237,5010,309],{"class":247},[237,5012,2295],{"class":312},[237,5014,362],{"class":371},[237,5016,3963],{"class":251},[237,5018,2249],{"class":371},[237,5020,375],{"class":247},[237,5022,3970],{"class":247},[237,5024,5025],{"class":239,"line":1051},[237,5026,939],{"class":247},[237,5028,5029],{"class":239,"line":1066},[237,5030,2227],{"class":251},[237,5032,5033,5035,5037,5039,5041,5043,5045,5047,5049,5051,5053,5055,5057,5059,5061,5063,5065,5067,5069],{"class":239,"line":1082},[237,5034,3782],{"class":329},[237,5036,3785],{"class":329},[237,5038,4000],{"class":371},[237,5040,3813],{"class":247},[237,5042,3884],{"class":708},[237,5044,3887],{"class":247},[237,5046,3890],{"class":3793},[237,5048,375],{"class":247},[237,5050,3895],{"class":708},[237,5052,1103],{"class":247},[237,5054,4017],{"class":3793},[237,5056,375],{"class":247},[237,5058,4022],{"class":708},[237,5060,3807],{"class":247},[237,5062,3810],{"class":708},[237,5064,3813],{"class":247},[237,5066,3816],{"class":708},[237,5068,3819],{"class":247},[237,5070,899],{"class":247},[237,5072,5073,5075,5077,5079,5081,5083,5085,5087,5089,5091,5093,5095,5097,5099,5101,5103,5105,5107,5109],{"class":239,"line":1120},[237,5074,4039],{"class":243},[237,5076,3928],{"class":247},[237,5078,4762],{"class":251},[237,5080,309],{"class":247},[237,5082,4048],{"class":312},[237,5084,362],{"class":371},[237,5086,4987],{"class":247},[237,5088,4990],{"class":312},[237,5090,362],{"class":371},[237,5092,3890],{"class":251},[237,5094,405],{"class":371},[237,5096,1103],{"class":247},[237,5098,2290],{"class":251},[237,5100,309],{"class":247},[237,5102,4061],{"class":312},[237,5104,362],{"class":371},[237,5106,4066],{"class":251},[237,5108,4069],{"class":371},[237,5110,271],{"class":247},[237,5112,5113],{"class":239,"line":1129},[237,5114,939],{"class":247},[237,5116,5117],{"class":239,"line":1134},[237,5118,2227],{"class":251},[237,5120,5121,5123,5125,5127,5129,5131,5133,5135,5137,5139,5141,5143,5145],{"class":239,"line":1139},[237,5122,3782],{"class":329},[237,5124,3785],{"class":329},[237,5126,4101],{"class":371},[237,5128,362],{"class":247},[237,5130,3890],{"class":3793},[237,5132,375],{"class":247},[237,5134,3895],{"class":708},[237,5136,3807],{"class":247},[237,5138,3810],{"class":708},[237,5140,3813],{"class":247},[237,5142,1309],{"class":708},[237,5144,3819],{"class":247},[237,5146,899],{"class":247},[237,5148,5149,5151,5154,5156,5158,5160,5162,5164,5167,5169,5171,5173,5175,5177,5179],{"class":239,"line":1161},[237,5150,3918],{"class":329},[237,5152,5153],{"class":251}," exists",[237,5155,2139],{"class":247},[237,5157,527],{"class":243},[237,5159,3928],{"class":247},[237,5161,4762],{"class":251},[237,5163,309],{"class":247},[237,5165,5166],{"class":312},"exists",[237,5168,362],{"class":371},[237,5170,4987],{"class":247},[237,5172,4990],{"class":312},[237,5174,362],{"class":371},[237,5176,3890],{"class":251},[237,5178,4069],{"class":371},[237,5180,271],{"class":247},[237,5182,5183,5185,5187,5190,5193],{"class":239,"line":1176},[237,5184,3947],{"class":243},[237,5186,5153],{"class":251},[237,5188,5189],{"class":247}," ===",[237,5191,5192],{"class":2645}," 1",[237,5194,271],{"class":247},[237,5196,5197],{"class":239,"line":1189},[237,5198,939],{"class":247},[237,5200,5201],{"class":239,"line":1862},[237,5202,2227],{"class":251},[237,5204,5205,5207,5209,5211,5213,5215,5217,5219,5221,5223,5225,5227,5229],{"class":239,"line":4233},[237,5206,3782],{"class":329},[237,5208,3785],{"class":329},[237,5210,4172],{"class":371},[237,5212,362],{"class":247},[237,5214,3890],{"class":3793},[237,5216,375],{"class":247},[237,5218,3895],{"class":708},[237,5220,3807],{"class":247},[237,5222,3810],{"class":708},[237,5224,3813],{"class":247},[237,5226,3816],{"class":708},[237,5228,3819],{"class":247},[237,5230,899],{"class":247},[237,5232,5233,5235,5237,5239,5241,5244,5246,5248,5250,5252,5254,5256],{"class":239,"line":4238},[237,5234,4039],{"class":243},[237,5236,3928],{"class":247},[237,5238,4762],{"class":251},[237,5240,309],{"class":247},[237,5242,5243],{"class":312},"del",[237,5245,362],{"class":371},[237,5247,4987],{"class":247},[237,5249,4990],{"class":312},[237,5251,362],{"class":371},[237,5253,3890],{"class":251},[237,5255,4069],{"class":371},[237,5257,271],{"class":247},[237,5259,5260],{"class":239,"line":4264},[237,5261,939],{"class":247},[237,5263,5264],{"class":239,"line":4282},[237,5265,2227],{"class":251},[237,5267,5268,5270,5272,5274,5276,5278,5280,5282,5284,5286],{"class":239,"line":4287},[237,5269,3782],{"class":329},[237,5271,3785],{"class":329},[237,5273,4245],{"class":371},[237,5275,4248],{"class":247},[237,5277,3810],{"class":708},[237,5279,3813],{"class":247},[237,5281,1241],{"class":708},[237,5283,4257],{"class":251},[237,5285,3819],{"class":247},[237,5287,899],{"class":247},[237,5289,5290,5292,5295,5297,5299,5301,5303,5305,5307,5309,5311,5313,5315,5317,5320,5322,5324],{"class":239,"line":4292},[237,5291,3918],{"class":329},[237,5293,5294],{"class":251}," keys",[237,5296,2139],{"class":247},[237,5298,527],{"class":243},[237,5300,3928],{"class":247},[237,5302,4762],{"class":251},[237,5304,309],{"class":247},[237,5306,4275],{"class":312},[237,5308,362],{"class":371},[237,5310,4987],{"class":247},[237,5312,4860],{"class":251},[237,5314,4915],{"class":247},[237,5316,261],{"class":247},[237,5318,5319],{"class":264},"*",[237,5321,268],{"class":247},[237,5323,405],{"class":371},[237,5325,271],{"class":247},[237,5327,5328,5330,5332,5334,5337,5339,5342,5345,5348,5350,5353,5355,5357,5359,5361,5363,5365],{"class":239,"line":4297},[237,5329,3947],{"class":243},[237,5331,5294],{"class":251},[237,5333,309],{"class":247},[237,5335,5336],{"class":312},"map",[237,5338,362],{"class":371},[237,5340,5341],{"class":3793},"k",[237,5343,5344],{"class":329}," =>",[237,5346,5347],{"class":251}," k",[237,5349,309],{"class":247},[237,5351,5352],{"class":312},"replace",[237,5354,362],{"class":371},[237,5356,4987],{"class":247},[237,5358,4860],{"class":251},[237,5360,1103],{"class":247},[237,5362,4721],{"class":247},[237,5364,4069],{"class":371},[237,5366,271],{"class":247},[237,5368,5369],{"class":239,"line":4303},[237,5370,939],{"class":247},[237,5372,5373],{"class":239,"line":4308},[237,5374,2227],{"class":251},[237,5376,5377,5379,5381,5383,5385,5387,5389,5391,5393],{"class":239,"line":4330},[237,5378,3782],{"class":329},[237,5380,3785],{"class":329},[237,5382,4315],{"class":371},[237,5384,4248],{"class":247},[237,5386,3810],{"class":708},[237,5388,3813],{"class":247},[237,5390,3816],{"class":708},[237,5392,3819],{"class":247},[237,5394,899],{"class":247},[237,5396,5397,5399,5401,5403,5405,5407,5409,5411,5413,5415,5417,5419,5421,5423,5425,5427,5429],{"class":239,"line":4348},[237,5398,3918],{"class":329},[237,5400,5294],{"class":251},[237,5402,2139],{"class":247},[237,5404,527],{"class":243},[237,5406,3928],{"class":247},[237,5408,4762],{"class":251},[237,5410,309],{"class":247},[237,5412,4275],{"class":312},[237,5414,362],{"class":371},[237,5416,4987],{"class":247},[237,5418,4860],{"class":251},[237,5420,4915],{"class":247},[237,5422,261],{"class":247},[237,5424,5319],{"class":264},[237,5426,268],{"class":247},[237,5428,405],{"class":371},[237,5430,271],{"class":247},[237,5432,5433,5436,5438,5440,5442,5445,5448,5451,5453],{"class":239,"line":4353},[237,5434,5435],{"class":243},"    if",[237,5437,2235],{"class":371},[237,5439,4275],{"class":251},[237,5441,309],{"class":247},[237,5443,5444],{"class":251},"length",[237,5446,5447],{"class":247}," >",[237,5449,5450],{"class":2645}," 0",[237,5452,2249],{"class":371},[237,5454,365],{"class":247},[237,5456,5457,5460,5462,5464,5466,5468,5470,5473,5475,5477],{"class":239,"line":4358},[237,5458,5459],{"class":243},"      await",[237,5461,3928],{"class":247},[237,5463,4762],{"class":251},[237,5465,309],{"class":247},[237,5467,5243],{"class":312},[237,5469,362],{"class":371},[237,5471,5472],{"class":247},"...",[237,5474,4275],{"class":251},[237,5476,405],{"class":371},[237,5478,271],{"class":247},[237,5480,5481],{"class":239,"line":4363},[237,5482,1675],{"class":247},[237,5484,5485],{"class":239,"line":4369},[237,5486,939],{"class":247},[237,5488,5489],{"class":239,"line":4374},[237,5490,2227],{"class":251},[237,5492,5493,5495,5497,5499,5501,5503,5505,5507,5509],{"class":239,"line":4397},[237,5494,3782],{"class":329},[237,5496,3785],{"class":329},[237,5498,4381],{"class":371},[237,5500,4248],{"class":247},[237,5502,3810],{"class":708},[237,5504,3813],{"class":247},[237,5506,4390],{"class":708},[237,5508,3819],{"class":247},[237,5510,899],{"class":247},[237,5512,5513,5515,5517,5519,5521,5523,5525,5527,5529,5531,5533,5535,5537,5539,5541,5543,5545],{"class":239,"line":4415},[237,5514,3918],{"class":329},[237,5516,5294],{"class":251},[237,5518,2139],{"class":247},[237,5520,527],{"class":243},[237,5522,3928],{"class":247},[237,5524,4762],{"class":251},[237,5526,309],{"class":247},[237,5528,4275],{"class":312},[237,5530,362],{"class":371},[237,5532,4987],{"class":247},[237,5534,4860],{"class":251},[237,5536,4915],{"class":247},[237,5538,261],{"class":247},[237,5540,5319],{"class":264},[237,5542,268],{"class":247},[237,5544,405],{"class":371},[237,5546,271],{"class":247},[237,5548,5549,5551,5553,5555,5557],{"class":239,"line":4420},[237,5550,3947],{"class":243},[237,5552,5294],{"class":251},[237,5554,309],{"class":247},[237,5556,5444],{"class":251},[237,5558,271],{"class":247},[237,5560,5562],{"class":239,"line":5561},65,[237,5563,939],{"class":247},[237,5565,5567],{"class":239,"line":5566},66,[237,5568,2312],{"class":247},[204,5570,5571],{},[223,5572,225],{},[227,5574,5576],{"className":229,"code":5575,"language":231,"meta":232,"style":232},"import { StorageManager } from '@vercube\u002Fstorage';\nimport { RedisStorage } from '.\u002Fstorages\u002FRedisStorage';\n\n\u002F\u002F Register custom storage in container\ncontainer.bind(RedisStorage);\n\nconst storageManager = container.get(StorageManager);\n\n\u002F\u002F Mount custom storage\nstorageManager.mount({\n  name: 'redis',\n  storage: RedisStorage,\n  initOptions: {\n    host: 'localhost',\n    port: 6379,\n    keyPrefix: 'myapp:'\n  }\n});\n\n\u002F\u002F Use it like any other storage\nawait storageManager.setItem({\n  storage: 'redis',\n  key: 'user:123',\n  value: { name: 'John' }\n});\n",[234,5577,5578,5598,5619,5623,5628,5641,5645,5663,5667,5672,5684,5698,5708,5716,5732,5744,5758,5762,5770,5774,5779,5793,5807,5821,5841],{"__ignoreMap":232},[237,5579,5580,5582,5584,5586,5588,5590,5592,5594,5596],{"class":239,"line":240},[237,5581,244],{"class":243},[237,5583,248],{"class":247},[237,5585,252],{"class":251},[237,5587,255],{"class":247},[237,5589,258],{"class":243},[237,5591,261],{"class":247},[237,5593,265],{"class":264},[237,5595,268],{"class":247},[237,5597,271],{"class":247},[237,5599,5600,5602,5604,5606,5608,5610,5612,5615,5617],{"class":239,"line":274},[237,5601,244],{"class":243},[237,5603,248],{"class":247},[237,5605,4684],{"class":251},[237,5607,255],{"class":247},[237,5609,258],{"class":243},[237,5611,261],{"class":247},[237,5613,5614],{"class":264},".\u002Fstorages\u002FRedisStorage",[237,5616,268],{"class":247},[237,5618,271],{"class":247},[237,5620,5621],{"class":239,"line":297},[237,5622,300],{"emptyLinePlaceholder":56},[237,5624,5625],{"class":239,"line":303},[237,5626,5627],{"class":418},"\u002F\u002F Register custom storage in container\n",[237,5629,5630,5632,5634,5636,5639],{"class":239,"line":321},[237,5631,306],{"class":251},[237,5633,309],{"class":247},[237,5635,313],{"class":312},[237,5637,5638],{"class":251},"(RedisStorage)",[237,5640,271],{"class":247},[237,5642,5643],{"class":239,"line":326},[237,5644,300],{"emptyLinePlaceholder":56},[237,5646,5647,5649,5651,5653,5655,5657,5659,5661],{"class":239,"line":351},[237,5648,330],{"class":329},[237,5650,333],{"class":251},[237,5652,336],{"class":247},[237,5654,339],{"class":251},[237,5656,309],{"class":247},[237,5658,344],{"class":312},[237,5660,316],{"class":251},[237,5662,271],{"class":247},[237,5664,5665],{"class":239,"line":368},[237,5666,300],{"emptyLinePlaceholder":56},[237,5668,5669],{"class":239,"line":388},[237,5670,5671],{"class":418},"\u002F\u002F Mount custom storage\n",[237,5673,5674,5676,5678,5680,5682],{"class":239,"line":399},[237,5675,354],{"class":251},[237,5677,309],{"class":247},[237,5679,359],{"class":312},[237,5681,362],{"class":251},[237,5683,365],{"class":247},[237,5685,5686,5688,5690,5692,5694,5696],{"class":239,"line":410},[237,5687,372],{"class":371},[237,5689,375],{"class":247},[237,5691,261],{"class":247},[237,5693,4762],{"class":264},[237,5695,268],{"class":247},[237,5697,385],{"class":247},[237,5699,5700,5702,5704,5706],{"class":239,"line":415},[237,5701,391],{"class":371},[237,5703,375],{"class":247},[237,5705,4684],{"class":251},[237,5707,385],{"class":247},[237,5709,5710,5712,5714],{"class":239,"line":422},[237,5711,894],{"class":371},[237,5713,375],{"class":247},[237,5715,899],{"class":247},[237,5717,5718,5721,5723,5725,5728,5730],{"class":239,"line":440},[237,5719,5720],{"class":371},"    host",[237,5722,375],{"class":247},[237,5724,261],{"class":247},[237,5726,5727],{"class":264},"localhost",[237,5729,268],{"class":247},[237,5731,385],{"class":247},[237,5733,5734,5737,5739,5742],{"class":239,"line":455},[237,5735,5736],{"class":371},"    port",[237,5738,375],{"class":247},[237,5740,5741],{"class":2645}," 6379",[237,5743,385],{"class":247},[237,5745,5746,5749,5751,5753,5756],{"class":239,"line":472},[237,5747,5748],{"class":371},"    keyPrefix",[237,5750,375],{"class":247},[237,5752,261],{"class":247},[237,5754,5755],{"class":264},"myapp:",[237,5757,567],{"class":247},[237,5759,5760],{"class":239,"line":497},[237,5761,939],{"class":247},[237,5763,5764,5766,5768],{"class":239,"line":506},[237,5765,402],{"class":247},[237,5767,405],{"class":251},[237,5769,271],{"class":247},[237,5771,5772],{"class":239,"line":511},[237,5773,300],{"emptyLinePlaceholder":56},[237,5775,5776],{"class":239,"line":517},[237,5777,5778],{"class":418},"\u002F\u002F Use it like any other storage\n",[237,5780,5781,5783,5785,5787,5789,5791],{"class":239,"line":541},[237,5782,425],{"class":243},[237,5784,428],{"class":251},[237,5786,309],{"class":247},[237,5788,433],{"class":312},[237,5790,362],{"class":251},[237,5792,365],{"class":247},[237,5794,5795,5797,5799,5801,5803,5805],{"class":239,"line":556},[237,5796,391],{"class":371},[237,5798,375],{"class":247},[237,5800,261],{"class":247},[237,5802,4762],{"class":264},[237,5804,268],{"class":247},[237,5806,385],{"class":247},[237,5808,5809,5811,5813,5815,5817,5819],{"class":239,"line":570},[237,5810,458],{"class":371},[237,5812,375],{"class":247},[237,5814,261],{"class":247},[237,5816,1075],{"class":264},[237,5818,268],{"class":247},[237,5820,385],{"class":247},[237,5822,5823,5825,5827,5829,5831,5833,5835,5837,5839],{"class":239,"line":579},[237,5824,475],{"class":371},[237,5826,375],{"class":247},[237,5828,248],{"class":247},[237,5830,1106],{"class":371},[237,5832,375],{"class":247},[237,5834,261],{"class":247},[237,5836,1113],{"class":264},[237,5838,268],{"class":247},[237,5840,494],{"class":247},[237,5842,5843,5845,5847],{"class":239,"line":984},[237,5844,402],{"class":247},[237,5846,405],{"class":251},[237,5848,271],{"class":247},[676,5850],{},[208,5852,5854],{"id":5853},"example-file-system-storage","Example: File System Storage",[204,5856,5857],{},"A storage provider that persists data to the file system:",[227,5859,5861],{"className":229,"code":5860,"language":231,"meta":232,"style":232},"import { Storage } from '@vercube\u002Fstorage';\nimport type { StorageTypes } from '@vercube\u002Fstorage';\nimport * as fs from 'fs\u002Fpromises';\nimport * as path from 'path';\n\ninterface FileStorageOptions {\n  directory: string;\n}\n\nexport class FileStorage extends Storage {\n  private directory!: string;\n  \n  public async initialize(options: FileStorageOptions): Promise\u003Cvoid> {\n    this.directory = options.directory;\n    \n    \u002F\u002F Ensure directory exists\n    await fs.mkdir(this.directory, { recursive: true });\n  }\n  \n  private getFilePath(key: string): string {\n    \u002F\u002F Sanitize key for use as filename\n    const safeKey = key.replace(\u002F[^a-zA-Z0-9-_:]\u002Fg, '_');\n    return path.join(this.directory, `${safeKey}.json`);\n  }\n  \n  public async getItem\u003CT>(key: string): Promise\u003CT | null> {\n    try {\n      const filePath = this.getFilePath(key);\n      const data = await fs.readFile(filePath, 'utf-8');\n      return JSON.parse(data);\n    } catch (error) {\n      return null;\n    }\n  }\n  \n  public async setItem\u003CT>(key: string, value: T): Promise\u003Cvoid> {\n    const filePath = this.getFilePath(key);\n    await fs.writeFile(filePath, JSON.stringify(value, null, 2));\n  }\n  \n  public async hasItem(key: string): Promise\u003Cboolean> {\n    try {\n      await fs.access(this.getFilePath(key));\n      return true;\n    } catch {\n      return false;\n    }\n  }\n  \n  public async deleteItem(key: string): Promise\u003Cvoid> {\n    try {\n      await fs.unlink(this.getFilePath(key));\n    } catch {\n      \u002F\u002F Ignore if file doesn't exist\n    }\n  }\n  \n  public async getKeys(): Promise\u003Cstring[]> {\n    const files = await fs.readdir(this.directory);\n    return files\n      .filter(f => f.endsWith('.json'))\n      .map(f => f.replace('.json', ''));\n  }\n  \n  public async clear(): Promise\u003Cvoid> {\n    const files = await fs.readdir(this.directory);\n    for (const file of files) {\n      if (file.endsWith('.json')) {\n        await fs.unlink(path.join(this.directory, file));\n      }\n    }\n  }\n  \n  public async size(): Promise\u003Cnumber> {\n    const keys = await this.getKeys();\n    return keys.length;\n  }\n}\n",[234,5862,5863,5883,5905,5929,5951,5955,5964,5975,5979,5983,5998,6011,6015,6043,6060,6064,6069,6104,6108,6112,6133,6138,6180,6217,6221,6225,6261,6268,6291,6326,6345,6361,6367,6371,6375,6379,6419,6439,6478,6482,6486,6514,6520,6545,6553,6561,6570,6574,6578,6582,6610,6616,6641,6649,6654,6658,6662,6666,6688,6716,6723,6757,6791,6795,6799,6819,6845,6867,6895,6929,6934,6939,6944,6949,6970,6990,7003,7008],{"__ignoreMap":232},[237,5864,5865,5867,5869,5871,5873,5875,5877,5879,5881],{"class":239,"line":240},[237,5866,244],{"class":243},[237,5868,248],{"class":247},[237,5870,3683],{"class":251},[237,5872,255],{"class":247},[237,5874,258],{"class":243},[237,5876,261],{"class":247},[237,5878,265],{"class":264},[237,5880,268],{"class":247},[237,5882,271],{"class":247},[237,5884,5885,5887,5889,5891,5893,5895,5897,5899,5901,5903],{"class":239,"line":274},[237,5886,244],{"class":243},[237,5888,3702],{"class":243},[237,5890,248],{"class":247},[237,5892,3707],{"class":251},[237,5894,255],{"class":247},[237,5896,258],{"class":243},[237,5898,261],{"class":247},[237,5900,265],{"class":264},[237,5902,268],{"class":247},[237,5904,271],{"class":247},[237,5906,5907,5909,5912,5915,5918,5920,5922,5925,5927],{"class":239,"line":297},[237,5908,244],{"class":243},[237,5910,5911],{"class":247}," *",[237,5913,5914],{"class":243}," as",[237,5916,5917],{"class":251}," fs ",[237,5919,4588],{"class":243},[237,5921,261],{"class":247},[237,5923,5924],{"class":264},"fs\u002Fpromises",[237,5926,268],{"class":247},[237,5928,271],{"class":247},[237,5930,5931,5933,5935,5937,5940,5942,5944,5947,5949],{"class":239,"line":303},[237,5932,244],{"class":243},[237,5934,5911],{"class":247},[237,5936,5914],{"class":243},[237,5938,5939],{"class":251}," path ",[237,5941,4588],{"class":243},[237,5943,261],{"class":247},[237,5945,5946],{"class":264},"path",[237,5948,268],{"class":247},[237,5950,271],{"class":247},[237,5952,5953],{"class":239,"line":321},[237,5954,300],{"emptyLinePlaceholder":56},[237,5956,5957,5959,5962],{"class":239,"line":326},[237,5958,4606],{"class":329},[237,5960,5961],{"class":708}," FileStorageOptions",[237,5963,899],{"class":247},[237,5965,5966,5969,5971,5973],{"class":239,"line":351},[237,5967,5968],{"class":371},"  directory",[237,5970,375],{"class":247},[237,5972,3895],{"class":708},[237,5974,271],{"class":247},[237,5976,5977],{"class":239,"line":368},[237,5978,2312],{"class":247},[237,5980,5981],{"class":239,"line":388},[237,5982,300],{"emptyLinePlaceholder":56},[237,5984,5985,5987,5989,5992,5994,5996],{"class":239,"line":399},[237,5986,3728],{"class":243},[237,5988,3731],{"class":329},[237,5990,5991],{"class":708}," FileStorage",[237,5993,3737],{"class":329},[237,5995,3683],{"class":708},[237,5997,899],{"class":247},[237,5999,6000,6002,6005,6007,6009],{"class":239,"line":410},[237,6001,3746],{"class":329},[237,6003,6004],{"class":371}," directory",[237,6006,4700],{"class":247},[237,6008,3895],{"class":708},[237,6010,271],{"class":247},[237,6012,6013],{"class":239,"line":415},[237,6014,2227],{"class":251},[237,6016,6017,6019,6021,6023,6025,6027,6029,6031,6033,6035,6037,6039,6041],{"class":239,"line":422},[237,6018,3782],{"class":329},[237,6020,3785],{"class":329},[237,6022,3788],{"class":371},[237,6024,362],{"class":247},[237,6026,3794],{"class":3793},[237,6028,375],{"class":247},[237,6030,5961],{"class":708},[237,6032,3807],{"class":247},[237,6034,3810],{"class":708},[237,6036,3813],{"class":247},[237,6038,3816],{"class":708},[237,6040,3819],{"class":247},[237,6042,899],{"class":247},[237,6044,6045,6047,6050,6052,6054,6056,6058],{"class":239,"line":440},[237,6046,3831],{"class":247},[237,6048,6049],{"class":251},"directory",[237,6051,2139],{"class":247},[237,6053,4782],{"class":251},[237,6055,309],{"class":247},[237,6057,6049],{"class":251},[237,6059,271],{"class":247},[237,6061,6062],{"class":239,"line":455},[237,6063,4853],{"class":371},[237,6065,6066],{"class":239,"line":472},[237,6067,6068],{"class":418},"    \u002F\u002F Ensure directory exists\n",[237,6070,6071,6073,6076,6078,6081,6083,6085,6087,6089,6091,6094,6096,6098,6100,6102],{"class":239,"line":497},[237,6072,4039],{"class":243},[237,6074,6075],{"class":251}," fs",[237,6077,309],{"class":247},[237,6079,6080],{"class":312},"mkdir",[237,6082,362],{"class":371},[237,6084,4987],{"class":247},[237,6086,6049],{"class":251},[237,6088,1103],{"class":247},[237,6090,248],{"class":247},[237,6092,6093],{"class":371}," recursive",[237,6095,375],{"class":247},[237,6097,1510],{"class":1509},[237,6099,255],{"class":247},[237,6101,405],{"class":371},[237,6103,271],{"class":247},[237,6105,6106],{"class":239,"line":506},[237,6107,939],{"class":247},[237,6109,6110],{"class":239,"line":511},[237,6111,2227],{"class":251},[237,6113,6114,6116,6119,6121,6123,6125,6127,6129,6131],{"class":239,"line":517},[237,6115,3746],{"class":329},[237,6117,6118],{"class":371}," getFilePath",[237,6120,362],{"class":247},[237,6122,3890],{"class":3793},[237,6124,375],{"class":247},[237,6126,3895],{"class":708},[237,6128,3807],{"class":247},[237,6130,3895],{"class":708},[237,6132,899],{"class":247},[237,6134,6135],{"class":239,"line":541},[237,6136,6137],{"class":418},"    \u002F\u002F Sanitize key for use as filename\n",[237,6139,6140,6142,6145,6147,6149,6151,6153,6155,6158,6161,6164,6167,6169,6171,6174,6176,6178],{"class":239,"line":556},[237,6141,3918],{"class":329},[237,6143,6144],{"class":251}," safeKey",[237,6146,2139],{"class":247},[237,6148,4918],{"class":251},[237,6150,309],{"class":247},[237,6152,5352],{"class":312},[237,6154,362],{"class":371},[237,6156,6157],{"class":247},"\u002F[^",[237,6159,6160],{"class":264},"a-zA-Z0-9-_:",[237,6162,6163],{"class":247},"]\u002F",[237,6165,6166],{"class":2645},"g",[237,6168,1103],{"class":247},[237,6170,261],{"class":247},[237,6172,6173],{"class":264},"_",[237,6175,268],{"class":247},[237,6177,405],{"class":371},[237,6179,271],{"class":247},[237,6181,6182,6184,6187,6189,6192,6194,6196,6198,6200,6203,6206,6208,6211,6213,6215],{"class":239,"line":570},[237,6183,3947],{"class":243},[237,6185,6186],{"class":251}," path",[237,6188,309],{"class":247},[237,6190,6191],{"class":312},"join",[237,6193,362],{"class":371},[237,6195,4987],{"class":247},[237,6197,6049],{"class":251},[237,6199,1103],{"class":247},[237,6201,6202],{"class":247}," `${",[237,6204,6205],{"class":251},"safeKey",[237,6207,402],{"class":247},[237,6209,6210],{"class":264},".json",[237,6212,1805],{"class":247},[237,6214,405],{"class":371},[237,6216,271],{"class":247},[237,6218,6219],{"class":239,"line":579},[237,6220,939],{"class":247},[237,6222,6223],{"class":239,"line":984},[237,6224,2227],{"class":251},[237,6226,6227,6229,6231,6233,6235,6237,6239,6241,6243,6245,6247,6249,6251,6253,6255,6257,6259],{"class":239,"line":990},[237,6228,3782],{"class":329},[237,6230,3785],{"class":329},[237,6232,3879],{"class":371},[237,6234,3813],{"class":247},[237,6236,3884],{"class":708},[237,6238,3887],{"class":247},[237,6240,3890],{"class":3793},[237,6242,375],{"class":247},[237,6244,3895],{"class":708},[237,6246,3807],{"class":247},[237,6248,3810],{"class":708},[237,6250,3813],{"class":247},[237,6252,3884],{"class":708},[237,6254,3906],{"class":247},[237,6256,3909],{"class":708},[237,6258,3819],{"class":247},[237,6260,899],{"class":247},[237,6262,6263,6266],{"class":239,"line":996},[237,6264,6265],{"class":243},"    try",[237,6267,899],{"class":247},[237,6269,6270,6273,6276,6278,6280,6283,6285,6287,6289],{"class":239,"line":1002},[237,6271,6272],{"class":329},"      const",[237,6274,6275],{"class":251}," filePath",[237,6277,2139],{"class":247},[237,6279,3928],{"class":247},[237,6281,6282],{"class":312},"getFilePath",[237,6284,362],{"class":371},[237,6286,3890],{"class":251},[237,6288,405],{"class":371},[237,6290,271],{"class":247},[237,6292,6293,6295,6297,6299,6301,6303,6305,6308,6310,6313,6315,6317,6320,6322,6324],{"class":239,"line":1008},[237,6294,6272],{"class":329},[237,6296,3921],{"class":251},[237,6298,2139],{"class":247},[237,6300,527],{"class":243},[237,6302,6075],{"class":251},[237,6304,309],{"class":247},[237,6306,6307],{"class":312},"readFile",[237,6309,362],{"class":371},[237,6311,6312],{"class":251},"filePath",[237,6314,1103],{"class":247},[237,6316,261],{"class":247},[237,6318,6319],{"class":264},"utf-8",[237,6321,268],{"class":247},[237,6323,405],{"class":371},[237,6325,271],{"class":247},[237,6327,6328,6331,6333,6335,6337,6339,6341,6343],{"class":239,"line":1014},[237,6329,6330],{"class":243},"      return",[237,6332,2290],{"class":251},[237,6334,309],{"class":247},[237,6336,2295],{"class":312},[237,6338,362],{"class":371},[237,6340,3963],{"class":251},[237,6342,405],{"class":371},[237,6344,271],{"class":247},[237,6346,6347,6349,6352,6354,6357,6359],{"class":239,"line":1020},[237,6348,2654],{"class":247},[237,6350,6351],{"class":243}," catch",[237,6353,2235],{"class":371},[237,6355,6356],{"class":251},"error",[237,6358,2249],{"class":371},[237,6360,365],{"class":247},[237,6362,6363,6365],{"class":239,"line":1026},[237,6364,6330],{"class":243},[237,6366,3970],{"class":247},[237,6368,6369],{"class":239,"line":1031},[237,6370,1675],{"class":247},[237,6372,6373],{"class":239,"line":1036},[237,6374,939],{"class":247},[237,6376,6377],{"class":239,"line":1051},[237,6378,2227],{"class":251},[237,6380,6381,6383,6385,6387,6389,6391,6393,6395,6397,6399,6401,6403,6405,6407,6409,6411,6413,6415,6417],{"class":239,"line":1066},[237,6382,3782],{"class":329},[237,6384,3785],{"class":329},[237,6386,4000],{"class":371},[237,6388,3813],{"class":247},[237,6390,3884],{"class":708},[237,6392,3887],{"class":247},[237,6394,3890],{"class":3793},[237,6396,375],{"class":247},[237,6398,3895],{"class":708},[237,6400,1103],{"class":247},[237,6402,4017],{"class":3793},[237,6404,375],{"class":247},[237,6406,4022],{"class":708},[237,6408,3807],{"class":247},[237,6410,3810],{"class":708},[237,6412,3813],{"class":247},[237,6414,3816],{"class":708},[237,6416,3819],{"class":247},[237,6418,899],{"class":247},[237,6420,6421,6423,6425,6427,6429,6431,6433,6435,6437],{"class":239,"line":1082},[237,6422,3918],{"class":329},[237,6424,6275],{"class":251},[237,6426,2139],{"class":247},[237,6428,3928],{"class":247},[237,6430,6282],{"class":312},[237,6432,362],{"class":371},[237,6434,3890],{"class":251},[237,6436,405],{"class":371},[237,6438,271],{"class":247},[237,6440,6441,6443,6445,6447,6450,6452,6454,6456,6458,6460,6462,6464,6466,6468,6471,6474,6476],{"class":239,"line":1120},[237,6442,4039],{"class":243},[237,6444,6075],{"class":251},[237,6446,309],{"class":247},[237,6448,6449],{"class":312},"writeFile",[237,6451,362],{"class":371},[237,6453,6312],{"class":251},[237,6455,1103],{"class":247},[237,6457,2290],{"class":251},[237,6459,309],{"class":247},[237,6461,4061],{"class":312},[237,6463,362],{"class":371},[237,6465,4066],{"class":251},[237,6467,1103],{"class":247},[237,6469,6470],{"class":247}," null,",[237,6472,6473],{"class":2645}," 2",[237,6475,4069],{"class":371},[237,6477,271],{"class":247},[237,6479,6480],{"class":239,"line":1129},[237,6481,939],{"class":247},[237,6483,6484],{"class":239,"line":1134},[237,6485,2227],{"class":251},[237,6487,6488,6490,6492,6494,6496,6498,6500,6502,6504,6506,6508,6510,6512],{"class":239,"line":1139},[237,6489,3782],{"class":329},[237,6491,3785],{"class":329},[237,6493,4101],{"class":371},[237,6495,362],{"class":247},[237,6497,3890],{"class":3793},[237,6499,375],{"class":247},[237,6501,3895],{"class":708},[237,6503,3807],{"class":247},[237,6505,3810],{"class":708},[237,6507,3813],{"class":247},[237,6509,1309],{"class":708},[237,6511,3819],{"class":247},[237,6513,899],{"class":247},[237,6515,6516,6518],{"class":239,"line":1161},[237,6517,6265],{"class":243},[237,6519,899],{"class":247},[237,6521,6522,6524,6526,6528,6531,6533,6535,6537,6539,6541,6543],{"class":239,"line":1176},[237,6523,5459],{"class":243},[237,6525,6075],{"class":251},[237,6527,309],{"class":247},[237,6529,6530],{"class":312},"access",[237,6532,362],{"class":371},[237,6534,4987],{"class":247},[237,6536,6282],{"class":312},[237,6538,362],{"class":371},[237,6540,3890],{"class":251},[237,6542,4069],{"class":371},[237,6544,271],{"class":247},[237,6546,6547,6549,6551],{"class":239,"line":1189},[237,6548,6330],{"class":243},[237,6550,1510],{"class":1509},[237,6552,271],{"class":247},[237,6554,6555,6557,6559],{"class":239,"line":1862},[237,6556,2654],{"class":247},[237,6558,6351],{"class":243},[237,6560,899],{"class":247},[237,6562,6563,6565,6568],{"class":239,"line":4233},[237,6564,6330],{"class":243},[237,6566,6567],{"class":1509}," false",[237,6569,271],{"class":247},[237,6571,6572],{"class":239,"line":4238},[237,6573,1675],{"class":247},[237,6575,6576],{"class":239,"line":4264},[237,6577,939],{"class":247},[237,6579,6580],{"class":239,"line":4282},[237,6581,2227],{"class":251},[237,6583,6584,6586,6588,6590,6592,6594,6596,6598,6600,6602,6604,6606,6608],{"class":239,"line":4287},[237,6585,3782],{"class":329},[237,6587,3785],{"class":329},[237,6589,4172],{"class":371},[237,6591,362],{"class":247},[237,6593,3890],{"class":3793},[237,6595,375],{"class":247},[237,6597,3895],{"class":708},[237,6599,3807],{"class":247},[237,6601,3810],{"class":708},[237,6603,3813],{"class":247},[237,6605,3816],{"class":708},[237,6607,3819],{"class":247},[237,6609,899],{"class":247},[237,6611,6612,6614],{"class":239,"line":4292},[237,6613,6265],{"class":243},[237,6615,899],{"class":247},[237,6617,6618,6620,6622,6624,6627,6629,6631,6633,6635,6637,6639],{"class":239,"line":4297},[237,6619,5459],{"class":243},[237,6621,6075],{"class":251},[237,6623,309],{"class":247},[237,6625,6626],{"class":312},"unlink",[237,6628,362],{"class":371},[237,6630,4987],{"class":247},[237,6632,6282],{"class":312},[237,6634,362],{"class":371},[237,6636,3890],{"class":251},[237,6638,4069],{"class":371},[237,6640,271],{"class":247},[237,6642,6643,6645,6647],{"class":239,"line":4303},[237,6644,2654],{"class":247},[237,6646,6351],{"class":243},[237,6648,899],{"class":247},[237,6650,6651],{"class":239,"line":4308},[237,6652,6653],{"class":418},"      \u002F\u002F Ignore if file doesn't exist\n",[237,6655,6656],{"class":239,"line":4330},[237,6657,1675],{"class":247},[237,6659,6660],{"class":239,"line":4348},[237,6661,939],{"class":247},[237,6663,6664],{"class":239,"line":4353},[237,6665,2227],{"class":251},[237,6667,6668,6670,6672,6674,6676,6678,6680,6682,6684,6686],{"class":239,"line":4358},[237,6669,3782],{"class":329},[237,6671,3785],{"class":329},[237,6673,4245],{"class":371},[237,6675,4248],{"class":247},[237,6677,3810],{"class":708},[237,6679,3813],{"class":247},[237,6681,1241],{"class":708},[237,6683,4257],{"class":251},[237,6685,3819],{"class":247},[237,6687,899],{"class":247},[237,6689,6690,6692,6695,6697,6699,6701,6703,6706,6708,6710,6712,6714],{"class":239,"line":4363},[237,6691,3918],{"class":329},[237,6693,6694],{"class":251}," files",[237,6696,2139],{"class":247},[237,6698,527],{"class":243},[237,6700,6075],{"class":251},[237,6702,309],{"class":247},[237,6704,6705],{"class":312},"readdir",[237,6707,362],{"class":371},[237,6709,4987],{"class":247},[237,6711,6049],{"class":251},[237,6713,405],{"class":371},[237,6715,271],{"class":247},[237,6717,6718,6720],{"class":239,"line":4369},[237,6719,3947],{"class":243},[237,6721,6722],{"class":251}," files\n",[237,6724,6725,6728,6731,6733,6736,6738,6741,6743,6746,6748,6750,6752,6754],{"class":239,"line":4374},[237,6726,6727],{"class":247},"      .",[237,6729,6730],{"class":312},"filter",[237,6732,362],{"class":371},[237,6734,6735],{"class":3793},"f",[237,6737,5344],{"class":329},[237,6739,6740],{"class":251}," f",[237,6742,309],{"class":247},[237,6744,6745],{"class":312},"endsWith",[237,6747,362],{"class":371},[237,6749,268],{"class":247},[237,6751,6210],{"class":264},[237,6753,268],{"class":247},[237,6755,6756],{"class":371},"))\n",[237,6758,6759,6761,6763,6765,6767,6769,6771,6773,6775,6777,6779,6781,6783,6785,6787,6789],{"class":239,"line":4397},[237,6760,6727],{"class":247},[237,6762,5336],{"class":312},[237,6764,362],{"class":371},[237,6766,6735],{"class":3793},[237,6768,5344],{"class":329},[237,6770,6740],{"class":251},[237,6772,309],{"class":247},[237,6774,5352],{"class":312},[237,6776,362],{"class":371},[237,6778,268],{"class":247},[237,6780,6210],{"class":264},[237,6782,268],{"class":247},[237,6784,1103],{"class":247},[237,6786,4721],{"class":247},[237,6788,4069],{"class":371},[237,6790,271],{"class":247},[237,6792,6793],{"class":239,"line":4415},[237,6794,939],{"class":247},[237,6796,6797],{"class":239,"line":4420},[237,6798,2227],{"class":251},[237,6800,6801,6803,6805,6807,6809,6811,6813,6815,6817],{"class":239,"line":5561},[237,6802,3782],{"class":329},[237,6804,3785],{"class":329},[237,6806,4315],{"class":371},[237,6808,4248],{"class":247},[237,6810,3810],{"class":708},[237,6812,3813],{"class":247},[237,6814,3816],{"class":708},[237,6816,3819],{"class":247},[237,6818,899],{"class":247},[237,6820,6821,6823,6825,6827,6829,6831,6833,6835,6837,6839,6841,6843],{"class":239,"line":5566},[237,6822,3918],{"class":329},[237,6824,6694],{"class":251},[237,6826,2139],{"class":247},[237,6828,527],{"class":243},[237,6830,6075],{"class":251},[237,6832,309],{"class":247},[237,6834,6705],{"class":312},[237,6836,362],{"class":371},[237,6838,4987],{"class":247},[237,6840,6049],{"class":251},[237,6842,405],{"class":371},[237,6844,271],{"class":247},[237,6846,6848,6851,6853,6855,6858,6861,6863,6865],{"class":239,"line":6847},67,[237,6849,6850],{"class":243},"    for",[237,6852,2235],{"class":371},[237,6854,330],{"class":329},[237,6856,6857],{"class":251}," file",[237,6859,6860],{"class":247}," of",[237,6862,6694],{"class":251},[237,6864,2249],{"class":371},[237,6866,365],{"class":247},[237,6868,6870,6873,6875,6878,6880,6882,6884,6886,6888,6890,6893],{"class":239,"line":6869},68,[237,6871,6872],{"class":243},"      if",[237,6874,2235],{"class":371},[237,6876,6877],{"class":251},"file",[237,6879,309],{"class":247},[237,6881,6745],{"class":312},[237,6883,362],{"class":371},[237,6885,268],{"class":247},[237,6887,6210],{"class":264},[237,6889,268],{"class":247},[237,6891,6892],{"class":371},")) ",[237,6894,365],{"class":247},[237,6896,6898,6901,6903,6905,6907,6909,6911,6913,6915,6917,6919,6921,6923,6925,6927],{"class":239,"line":6897},69,[237,6899,6900],{"class":243},"        await",[237,6902,6075],{"class":251},[237,6904,309],{"class":247},[237,6906,6626],{"class":312},[237,6908,362],{"class":371},[237,6910,5946],{"class":251},[237,6912,309],{"class":247},[237,6914,6191],{"class":312},[237,6916,362],{"class":371},[237,6918,4987],{"class":247},[237,6920,6049],{"class":251},[237,6922,1103],{"class":247},[237,6924,6857],{"class":251},[237,6926,4069],{"class":371},[237,6928,271],{"class":247},[237,6930,6932],{"class":239,"line":6931},70,[237,6933,3568],{"class":247},[237,6935,6937],{"class":239,"line":6936},71,[237,6938,1675],{"class":247},[237,6940,6942],{"class":239,"line":6941},72,[237,6943,939],{"class":247},[237,6945,6947],{"class":239,"line":6946},73,[237,6948,2227],{"class":251},[237,6950,6952,6954,6956,6958,6960,6962,6964,6966,6968],{"class":239,"line":6951},74,[237,6953,3782],{"class":329},[237,6955,3785],{"class":329},[237,6957,4381],{"class":371},[237,6959,4248],{"class":247},[237,6961,3810],{"class":708},[237,6963,3813],{"class":247},[237,6965,4390],{"class":708},[237,6967,3819],{"class":247},[237,6969,899],{"class":247},[237,6971,6973,6975,6977,6979,6981,6983,6986,6988],{"class":239,"line":6972},75,[237,6974,3918],{"class":329},[237,6976,5294],{"class":251},[237,6978,2139],{"class":247},[237,6980,527],{"class":243},[237,6982,3928],{"class":247},[237,6984,6985],{"class":312},"getKeys",[237,6987,2126],{"class":371},[237,6989,271],{"class":247},[237,6991,6993,6995,6997,6999,7001],{"class":239,"line":6992},76,[237,6994,3947],{"class":243},[237,6996,5294],{"class":251},[237,6998,309],{"class":247},[237,7000,5444],{"class":251},[237,7002,271],{"class":247},[237,7004,7006],{"class":239,"line":7005},77,[237,7007,939],{"class":247},[237,7009,7011],{"class":239,"line":7010},78,[237,7012,2312],{"class":247},[204,7014,7015],{},[223,7016,225],{},[227,7018,7020],{"className":229,"code":7019,"language":231,"meta":232,"style":232},"storageManager.mount({\n  name: 'files',\n  storage: FileStorage,\n  initOptions: {\n    directory: '.\u002Fdata\u002Fstorage'\n  }\n});\n\nawait storageManager.setItem({\n  storage: 'files',\n  key: 'config',\n  value: { theme: 'dark' }\n});\n",[234,7021,7022,7034,7049,7059,7067,7081,7085,7093,7097,7111,7125,7140,7162],{"__ignoreMap":232},[237,7023,7024,7026,7028,7030,7032],{"class":239,"line":240},[237,7025,354],{"class":251},[237,7027,309],{"class":247},[237,7029,359],{"class":312},[237,7031,362],{"class":251},[237,7033,365],{"class":247},[237,7035,7036,7038,7040,7042,7045,7047],{"class":239,"line":274},[237,7037,372],{"class":371},[237,7039,375],{"class":247},[237,7041,261],{"class":247},[237,7043,7044],{"class":264},"files",[237,7046,268],{"class":247},[237,7048,385],{"class":247},[237,7050,7051,7053,7055,7057],{"class":239,"line":297},[237,7052,391],{"class":371},[237,7054,375],{"class":247},[237,7056,5991],{"class":251},[237,7058,385],{"class":247},[237,7060,7061,7063,7065],{"class":239,"line":303},[237,7062,894],{"class":371},[237,7064,375],{"class":247},[237,7066,899],{"class":247},[237,7068,7069,7072,7074,7076,7079],{"class":239,"line":321},[237,7070,7071],{"class":371},"    directory",[237,7073,375],{"class":247},[237,7075,261],{"class":247},[237,7077,7078],{"class":264},".\u002Fdata\u002Fstorage",[237,7080,567],{"class":247},[237,7082,7083],{"class":239,"line":326},[237,7084,939],{"class":247},[237,7086,7087,7089,7091],{"class":239,"line":351},[237,7088,402],{"class":247},[237,7090,405],{"class":251},[237,7092,271],{"class":247},[237,7094,7095],{"class":239,"line":368},[237,7096,300],{"emptyLinePlaceholder":56},[237,7098,7099,7101,7103,7105,7107,7109],{"class":239,"line":388},[237,7100,425],{"class":243},[237,7102,428],{"class":251},[237,7104,309],{"class":247},[237,7106,433],{"class":312},[237,7108,362],{"class":251},[237,7110,365],{"class":247},[237,7112,7113,7115,7117,7119,7121,7123],{"class":239,"line":399},[237,7114,391],{"class":371},[237,7116,375],{"class":247},[237,7118,261],{"class":247},[237,7120,7044],{"class":264},[237,7122,268],{"class":247},[237,7124,385],{"class":247},[237,7126,7127,7129,7131,7133,7136,7138],{"class":239,"line":410},[237,7128,458],{"class":371},[237,7130,375],{"class":247},[237,7132,261],{"class":247},[237,7134,7135],{"class":264},"config",[237,7137,268],{"class":247},[237,7139,385],{"class":247},[237,7141,7142,7144,7146,7148,7151,7153,7155,7158,7160],{"class":239,"line":415},[237,7143,475],{"class":371},[237,7145,375],{"class":247},[237,7147,248],{"class":247},[237,7149,7150],{"class":371}," theme",[237,7152,375],{"class":247},[237,7154,261],{"class":247},[237,7156,7157],{"class":264},"dark",[237,7159,268],{"class":247},[237,7161,494],{"class":247},[237,7163,7164,7166,7168],{"class":239,"line":422},[237,7165,402],{"class":247},[237,7167,405],{"class":251},[237,7169,271],{"class":247},[676,7171],{},[208,7173,7175],{"id":7174},"provider-configuration","Provider Configuration",[213,7177,7179],{"id":7178},"register-provider-in-container","Register Provider in Container",[204,7181,7182],{},"If your provider has dependencies, register it in the container:",[227,7184,7186],{"className":229,"code":7185,"language":231,"meta":232,"style":232},"import { Container } from '@vercube\u002Fdi';\nimport { CustomStorage } from '.\u002Fstorages\u002FCustomStorage';\n\nexport function setupContainer(container: Container): void {\n  \u002F\u002F Register provider\n  container.bind(CustomStorage);\n  \n  \u002F\u002F Configure storage manager to use it\n  const storageManager = container.get(StorageManager);\n  storageManager.mount({\n    name: 'custom',\n    storage: CustomStorage,\n    initOptions: { ... }\n  });\n}\n",[234,7187,7188,7210,7231,7235,7259,7264,7282,7286,7291,7314,7326,7341,7351,7364,7372],{"__ignoreMap":232},[237,7189,7190,7192,7194,7197,7199,7201,7203,7206,7208],{"class":239,"line":240},[237,7191,244],{"class":243},[237,7193,248],{"class":247},[237,7195,7196],{"class":251}," Container",[237,7198,255],{"class":247},[237,7200,258],{"class":243},[237,7202,261],{"class":247},[237,7204,7205],{"class":264},"@vercube\u002Fdi",[237,7207,268],{"class":247},[237,7209,271],{"class":247},[237,7211,7212,7214,7216,7218,7220,7222,7224,7227,7229],{"class":239,"line":274},[237,7213,244],{"class":243},[237,7215,248],{"class":247},[237,7217,3734],{"class":251},[237,7219,255],{"class":247},[237,7221,258],{"class":243},[237,7223,261],{"class":247},[237,7225,7226],{"class":264},".\u002Fstorages\u002FCustomStorage",[237,7228,268],{"class":247},[237,7230,271],{"class":247},[237,7232,7233],{"class":239,"line":297},[237,7234,300],{"emptyLinePlaceholder":56},[237,7236,7237,7239,7241,7244,7246,7248,7250,7252,7254,7257],{"class":239,"line":303},[237,7238,3728],{"class":243},[237,7240,2120],{"class":329},[237,7242,7243],{"class":312}," setupContainer",[237,7245,362],{"class":247},[237,7247,306],{"class":3793},[237,7249,375],{"class":247},[237,7251,7196],{"class":708},[237,7253,3807],{"class":247},[237,7255,7256],{"class":708}," void",[237,7258,899],{"class":247},[237,7260,7261],{"class":239,"line":321},[237,7262,7263],{"class":418},"  \u002F\u002F Register provider\n",[237,7265,7266,7269,7271,7273,7275,7278,7280],{"class":239,"line":326},[237,7267,7268],{"class":251},"  container",[237,7270,309],{"class":247},[237,7272,313],{"class":312},[237,7274,362],{"class":371},[237,7276,7277],{"class":251},"CustomStorage",[237,7279,405],{"class":371},[237,7281,271],{"class":247},[237,7283,7284],{"class":239,"line":351},[237,7285,2227],{"class":371},[237,7287,7288],{"class":239,"line":368},[237,7289,7290],{"class":418},"  \u002F\u002F Configure storage manager to use it\n",[237,7292,7293,7295,7297,7299,7301,7303,7305,7307,7310,7312],{"class":239,"line":388},[237,7294,2133],{"class":329},[237,7296,428],{"class":251},[237,7298,2139],{"class":247},[237,7300,339],{"class":251},[237,7302,309],{"class":247},[237,7304,344],{"class":312},[237,7306,362],{"class":371},[237,7308,7309],{"class":251},"StorageManager",[237,7311,405],{"class":371},[237,7313,271],{"class":247},[237,7315,7316,7318,7320,7322,7324],{"class":239,"line":399},[237,7317,3298],{"class":251},[237,7319,309],{"class":247},[237,7321,359],{"class":312},[237,7323,362],{"class":371},[237,7325,365],{"class":247},[237,7327,7328,7330,7332,7334,7337,7339],{"class":239,"line":410},[237,7329,3311],{"class":371},[237,7331,375],{"class":247},[237,7333,261],{"class":247},[237,7335,7336],{"class":264},"custom",[237,7338,268],{"class":247},[237,7340,385],{"class":247},[237,7342,7343,7345,7347,7349],{"class":239,"line":415},[237,7344,3326],{"class":371},[237,7346,375],{"class":247},[237,7348,3734],{"class":251},[237,7350,385],{"class":247},[237,7352,7353,7355,7357,7359,7362],{"class":239,"line":422},[237,7354,3337],{"class":371},[237,7356,375],{"class":247},[237,7358,248],{"class":247},[237,7360,7361],{"class":247}," ...",[237,7363,494],{"class":247},[237,7365,7366,7368,7370],{"class":239,"line":440},[237,7367,3401],{"class":247},[237,7369,405],{"class":371},[237,7371,271],{"class":247},[237,7373,7374],{"class":239,"line":455},[237,7375,2312],{"class":247},[213,7377,7379],{"id":7378},"provider-with-dependencies","Provider with Dependencies",[204,7381,7382],{},"If your provider needs other services:",[227,7384,7386],{"className":229,"code":7385,"language":231,"meta":232,"style":232},"import { Inject } from '@vercube\u002Fdi';\nimport { Storage } from '@vercube\u002Fstorage';\nimport { Logger } from '@vercube\u002Flogger';\n\nexport class LoggingStorage extends Storage {\n  @Inject(Logger)\n  private logger!: Logger;\n  \n  private innerStorage!: Storage;\n  \n  public async initialize(options: { storage: Storage }): Promise\u003Cvoid> {\n    this.innerStorage = options.storage;\n  }\n  \n  public async getItem\u003CT>(key: string): Promise\u003CT | null> {\n    this.logger.debug(`Getting item: ${key}`);\n    const value = await this.innerStorage.getItem\u003CT>(key);\n    this.logger.debug(`Got item: ${key}`, { found: value !== null });\n    return value;\n  }\n  \n  public async setItem\u003CT>(key: string, value: T): Promise\u003Cvoid> {\n    this.logger.debug(`Setting item: ${key}`);\n    await this.innerStorage.setItem(key, value);\n    this.logger.info(`Item set: ${key}`);\n  }\n  \n  \u002F\u002F ... implement other methods with logging\n}\n",[234,7387,7388,7409,7429,7451,7455,7470,7481,7494,7498,7511,7515,7551,7569,7573,7577,7613,7643,7675,7720,7728,7732,7736,7776,7803,7827,7855,7859,7863,7868],{"__ignoreMap":232},[237,7389,7390,7392,7394,7397,7399,7401,7403,7405,7407],{"class":239,"line":240},[237,7391,244],{"class":243},[237,7393,248],{"class":247},[237,7395,7396],{"class":251}," Inject",[237,7398,255],{"class":247},[237,7400,258],{"class":243},[237,7402,261],{"class":247},[237,7404,7205],{"class":264},[237,7406,268],{"class":247},[237,7408,271],{"class":247},[237,7410,7411,7413,7415,7417,7419,7421,7423,7425,7427],{"class":239,"line":274},[237,7412,244],{"class":243},[237,7414,248],{"class":247},[237,7416,3683],{"class":251},[237,7418,255],{"class":247},[237,7420,258],{"class":243},[237,7422,261],{"class":247},[237,7424,265],{"class":264},[237,7426,268],{"class":247},[237,7428,271],{"class":247},[237,7430,7431,7433,7435,7438,7440,7442,7444,7447,7449],{"class":239,"line":297},[237,7432,244],{"class":243},[237,7434,248],{"class":247},[237,7436,7437],{"class":251}," Logger",[237,7439,255],{"class":247},[237,7441,258],{"class":243},[237,7443,261],{"class":247},[237,7445,7446],{"class":264},"@vercube\u002Flogger",[237,7448,268],{"class":247},[237,7450,271],{"class":247},[237,7452,7453],{"class":239,"line":303},[237,7454,300],{"emptyLinePlaceholder":56},[237,7456,7457,7459,7461,7464,7466,7468],{"class":239,"line":321},[237,7458,3728],{"class":243},[237,7460,3731],{"class":329},[237,7462,7463],{"class":708}," LoggingStorage",[237,7465,3737],{"class":329},[237,7467,3683],{"class":708},[237,7469,899],{"class":247},[237,7471,7472,7475,7478],{"class":239,"line":326},[237,7473,7474],{"class":247},"  @",[237,7476,7477],{"class":312},"Inject",[237,7479,7480],{"class":251},"(Logger)\n",[237,7482,7483,7485,7488,7490,7492],{"class":239,"line":351},[237,7484,3746],{"class":329},[237,7486,7487],{"class":371}," logger",[237,7489,4700],{"class":247},[237,7491,7437],{"class":708},[237,7493,271],{"class":247},[237,7495,7496],{"class":239,"line":368},[237,7497,2227],{"class":251},[237,7499,7500,7502,7505,7507,7509],{"class":239,"line":388},[237,7501,3746],{"class":329},[237,7503,7504],{"class":371}," innerStorage",[237,7506,4700],{"class":247},[237,7508,3683],{"class":708},[237,7510,271],{"class":247},[237,7512,7513],{"class":239,"line":399},[237,7514,2227],{"class":251},[237,7516,7517,7519,7521,7523,7525,7527,7529,7531,7534,7536,7538,7541,7543,7545,7547,7549],{"class":239,"line":410},[237,7518,3782],{"class":329},[237,7520,3785],{"class":329},[237,7522,3788],{"class":371},[237,7524,362],{"class":247},[237,7526,3794],{"class":3793},[237,7528,375],{"class":247},[237,7530,248],{"class":247},[237,7532,7533],{"class":371}," storage",[237,7535,375],{"class":247},[237,7537,3683],{"class":708},[237,7539,7540],{"class":247}," }):",[237,7542,3810],{"class":708},[237,7544,3813],{"class":247},[237,7546,3816],{"class":708},[237,7548,3819],{"class":247},[237,7550,899],{"class":247},[237,7552,7553,7555,7558,7560,7562,7564,7567],{"class":239,"line":415},[237,7554,3831],{"class":247},[237,7556,7557],{"class":251},"innerStorage",[237,7559,2139],{"class":247},[237,7561,4782],{"class":251},[237,7563,309],{"class":247},[237,7565,7566],{"class":251},"storage",[237,7568,271],{"class":247},[237,7570,7571],{"class":239,"line":422},[237,7572,939],{"class":247},[237,7574,7575],{"class":239,"line":440},[237,7576,2227],{"class":251},[237,7578,7579,7581,7583,7585,7587,7589,7591,7593,7595,7597,7599,7601,7603,7605,7607,7609,7611],{"class":239,"line":455},[237,7580,3782],{"class":329},[237,7582,3785],{"class":329},[237,7584,3879],{"class":371},[237,7586,3813],{"class":247},[237,7588,3884],{"class":708},[237,7590,3887],{"class":247},[237,7592,3890],{"class":3793},[237,7594,375],{"class":247},[237,7596,3895],{"class":708},[237,7598,3807],{"class":247},[237,7600,3810],{"class":708},[237,7602,3813],{"class":247},[237,7604,3884],{"class":708},[237,7606,3906],{"class":247},[237,7608,3909],{"class":708},[237,7610,3819],{"class":247},[237,7612,899],{"class":247},[237,7614,7615,7617,7620,7622,7625,7627,7629,7632,7634,7636,7639,7641],{"class":239,"line":472},[237,7616,3831],{"class":247},[237,7618,7619],{"class":251},"logger",[237,7621,309],{"class":247},[237,7623,7624],{"class":312},"debug",[237,7626,362],{"class":371},[237,7628,1805],{"class":247},[237,7630,7631],{"class":264},"Getting item: ",[237,7633,1785],{"class":247},[237,7635,3890],{"class":251},[237,7637,7638],{"class":247},"}`",[237,7640,405],{"class":371},[237,7642,271],{"class":247},[237,7644,7645,7647,7649,7651,7653,7655,7657,7659,7661,7663,7665,7667,7669,7671,7673],{"class":239,"line":497},[237,7646,3918],{"class":329},[237,7648,4017],{"class":251},[237,7650,2139],{"class":247},[237,7652,527],{"class":243},[237,7654,3928],{"class":247},[237,7656,7557],{"class":251},[237,7658,309],{"class":247},[237,7660,534],{"class":312},[237,7662,3813],{"class":247},[237,7664,3884],{"class":708},[237,7666,3819],{"class":247},[237,7668,362],{"class":371},[237,7670,3890],{"class":251},[237,7672,405],{"class":371},[237,7674,271],{"class":247},[237,7676,7677,7679,7681,7683,7685,7687,7689,7692,7694,7696,7698,7700,7702,7705,7707,7709,7712,7714,7716,7718],{"class":239,"line":506},[237,7678,3831],{"class":247},[237,7680,7619],{"class":251},[237,7682,309],{"class":247},[237,7684,7624],{"class":312},[237,7686,362],{"class":371},[237,7688,1805],{"class":247},[237,7690,7691],{"class":264},"Got item: ",[237,7693,1785],{"class":247},[237,7695,3890],{"class":251},[237,7697,7638],{"class":247},[237,7699,1103],{"class":247},[237,7701,248],{"class":247},[237,7703,7704],{"class":371}," found",[237,7706,375],{"class":247},[237,7708,4017],{"class":251},[237,7710,7711],{"class":247}," !==",[237,7713,3909],{"class":247},[237,7715,255],{"class":247},[237,7717,405],{"class":371},[237,7719,271],{"class":247},[237,7721,7722,7724,7726],{"class":239,"line":511},[237,7723,3947],{"class":243},[237,7725,4017],{"class":251},[237,7727,271],{"class":247},[237,7729,7730],{"class":239,"line":517},[237,7731,939],{"class":247},[237,7733,7734],{"class":239,"line":541},[237,7735,2227],{"class":251},[237,7737,7738,7740,7742,7744,7746,7748,7750,7752,7754,7756,7758,7760,7762,7764,7766,7768,7770,7772,7774],{"class":239,"line":556},[237,7739,3782],{"class":329},[237,7741,3785],{"class":329},[237,7743,4000],{"class":371},[237,7745,3813],{"class":247},[237,7747,3884],{"class":708},[237,7749,3887],{"class":247},[237,7751,3890],{"class":3793},[237,7753,375],{"class":247},[237,7755,3895],{"class":708},[237,7757,1103],{"class":247},[237,7759,4017],{"class":3793},[237,7761,375],{"class":247},[237,7763,4022],{"class":708},[237,7765,3807],{"class":247},[237,7767,3810],{"class":708},[237,7769,3813],{"class":247},[237,7771,3816],{"class":708},[237,7773,3819],{"class":247},[237,7775,899],{"class":247},[237,7777,7778,7780,7782,7784,7786,7788,7790,7793,7795,7797,7799,7801],{"class":239,"line":570},[237,7779,3831],{"class":247},[237,7781,7619],{"class":251},[237,7783,309],{"class":247},[237,7785,7624],{"class":312},[237,7787,362],{"class":371},[237,7789,1805],{"class":247},[237,7791,7792],{"class":264},"Setting item: ",[237,7794,1785],{"class":247},[237,7796,3890],{"class":251},[237,7798,7638],{"class":247},[237,7800,405],{"class":371},[237,7802,271],{"class":247},[237,7804,7805,7807,7809,7811,7813,7815,7817,7819,7821,7823,7825],{"class":239,"line":579},[237,7806,4039],{"class":243},[237,7808,3928],{"class":247},[237,7810,7557],{"class":251},[237,7812,309],{"class":247},[237,7814,433],{"class":312},[237,7816,362],{"class":371},[237,7818,3890],{"class":251},[237,7820,1103],{"class":247},[237,7822,4017],{"class":251},[237,7824,405],{"class":371},[237,7826,271],{"class":247},[237,7828,7829,7831,7833,7835,7838,7840,7842,7845,7847,7849,7851,7853],{"class":239,"line":984},[237,7830,3831],{"class":247},[237,7832,7619],{"class":251},[237,7834,309],{"class":247},[237,7836,7837],{"class":312},"info",[237,7839,362],{"class":371},[237,7841,1805],{"class":247},[237,7843,7844],{"class":264},"Item set: ",[237,7846,1785],{"class":247},[237,7848,3890],{"class":251},[237,7850,7638],{"class":247},[237,7852,405],{"class":371},[237,7854,271],{"class":247},[237,7856,7857],{"class":239,"line":990},[237,7858,939],{"class":247},[237,7860,7861],{"class":239,"line":996},[237,7862,2227],{"class":251},[237,7864,7865],{"class":239,"line":1002},[237,7866,7867],{"class":418},"  \u002F\u002F ... implement other methods with logging\n",[237,7869,7870],{"class":239,"line":1008},[237,7871,2312],{"class":247},[213,7873,7875],{"id":7874},"async-initialization","Async Initialization",[204,7877,7878],{},"If your provider needs async initialization:",[227,7880,7882],{"className":229,"code":7881,"language":231,"meta":232,"style":232},"export class AsyncStorage extends Storage {\n  private connection: Connection;\n  \n  public async initialize(options: ConnectionOptions): Promise\u003Cvoid> {\n    \u002F\u002F Async initialization is fully supported\n    this.connection = await connectToService(options);\n    \n    \u002F\u002F Wait for connection to be ready\n    await this.connection.ready();\n  }\n  \n  \u002F\u002F ... implement other methods\n}\n",[234,7883,7884,7899,7913,7917,7946,7951,7972,7976,7981,7998,8002,8006,8011],{"__ignoreMap":232},[237,7885,7886,7888,7890,7893,7895,7897],{"class":239,"line":240},[237,7887,3728],{"class":243},[237,7889,3731],{"class":329},[237,7891,7892],{"class":708}," AsyncStorage",[237,7894,3737],{"class":329},[237,7896,3683],{"class":708},[237,7898,899],{"class":247},[237,7900,7901,7903,7906,7908,7911],{"class":239,"line":274},[237,7902,3746],{"class":329},[237,7904,7905],{"class":371}," connection",[237,7907,375],{"class":247},[237,7909,7910],{"class":708}," Connection",[237,7912,271],{"class":247},[237,7914,7915],{"class":239,"line":297},[237,7916,2227],{"class":251},[237,7918,7919,7921,7923,7925,7927,7929,7931,7934,7936,7938,7940,7942,7944],{"class":239,"line":303},[237,7920,3782],{"class":329},[237,7922,3785],{"class":329},[237,7924,3788],{"class":371},[237,7926,362],{"class":247},[237,7928,3794],{"class":3793},[237,7930,375],{"class":247},[237,7932,7933],{"class":708}," ConnectionOptions",[237,7935,3807],{"class":247},[237,7937,3810],{"class":708},[237,7939,3813],{"class":247},[237,7941,3816],{"class":708},[237,7943,3819],{"class":247},[237,7945,899],{"class":247},[237,7947,7948],{"class":239,"line":321},[237,7949,7950],{"class":418},"    \u002F\u002F Async initialization is fully supported\n",[237,7952,7953,7955,7958,7960,7962,7964,7966,7968,7970],{"class":239,"line":326},[237,7954,3831],{"class":247},[237,7956,7957],{"class":251},"connection",[237,7959,2139],{"class":247},[237,7961,527],{"class":243},[237,7963,3841],{"class":312},[237,7965,362],{"class":371},[237,7967,3794],{"class":251},[237,7969,405],{"class":371},[237,7971,271],{"class":247},[237,7973,7974],{"class":239,"line":351},[237,7975,4853],{"class":371},[237,7977,7978],{"class":239,"line":368},[237,7979,7980],{"class":418},"    \u002F\u002F Wait for connection to be ready\n",[237,7982,7983,7985,7987,7989,7991,7994,7996],{"class":239,"line":388},[237,7984,4039],{"class":243},[237,7986,3928],{"class":247},[237,7988,7957],{"class":251},[237,7990,309],{"class":247},[237,7992,7993],{"class":312},"ready",[237,7995,2126],{"class":371},[237,7997,271],{"class":247},[237,7999,8000],{"class":239,"line":399},[237,8001,939],{"class":247},[237,8003,8004],{"class":239,"line":410},[237,8005,2227],{"class":251},[237,8007,8008],{"class":239,"line":415},[237,8009,8010],{"class":418},"  \u002F\u002F ... implement other methods\n",[237,8012,8013],{"class":239,"line":422},[237,8014,2312],{"class":247},[676,8016],{},[208,8018,8020],{"id":8019},"using-multiple-providers","Using Multiple Providers",[204,8022,8023],{},"Configure multiple providers for different use cases:",[227,8025,8027],{"className":229,"code":8026,"language":231,"meta":232,"style":232},"import { StorageManager } from '@vercube\u002Fstorage';\nimport { MemoryStorage } from '@vercube\u002Fstorage\u002Fdrivers\u002FMemoryStorage';\nimport { S3Storage } from '@vercube\u002Fstorage\u002Fdrivers\u002FS3Storage';\nimport { RedisStorage } from '.\u002Fstorages\u002FRedisStorage';\n\nconst storageManager = container.get(StorageManager);\n\n\u002F\u002F Memory for fast local cache\nstorageManager.mount({\n  name: 'cache',\n  storage: MemoryStorage\n});\n\n\u002F\u002F S3 for persistent cloud storage\nstorageManager.mount({\n  name: 's3',\n  storage: S3Storage,\n  initOptions: {\n    bucket: process.env.S3_BUCKET,\n    region: process.env.AWS_REGION,\n    credentials: {\n      accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n      secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY\n    }\n  }\n});\n\n\u002F\u002F Redis for distributed cache\nstorageManager.mount({\n  name: 'distributed',\n  storage: RedisStorage,\n  initOptions: {\n    host: process.env.REDIS_HOST,\n    port: 6379,\n    keyPrefix: 'app:'\n  }\n});\n\n",[234,8028,8029,8049,8069,8089,8109,8113,8131,8135,8140,8152,8166,8174,8182,8186,8191,8203,8217,8227,8235,8253,8271,8279,8297,8314,8318,8322,8330,8334,8339,8351,8366,8376,8384,8403,8413,8426,8430],{"__ignoreMap":232},[237,8030,8031,8033,8035,8037,8039,8041,8043,8045,8047],{"class":239,"line":240},[237,8032,244],{"class":243},[237,8034,248],{"class":247},[237,8036,252],{"class":251},[237,8038,255],{"class":247},[237,8040,258],{"class":243},[237,8042,261],{"class":247},[237,8044,265],{"class":264},[237,8046,268],{"class":247},[237,8048,271],{"class":247},[237,8050,8051,8053,8055,8057,8059,8061,8063,8065,8067],{"class":239,"line":274},[237,8052,244],{"class":243},[237,8054,248],{"class":247},[237,8056,281],{"class":251},[237,8058,255],{"class":247},[237,8060,258],{"class":243},[237,8062,261],{"class":247},[237,8064,290],{"class":264},[237,8066,268],{"class":247},[237,8068,271],{"class":247},[237,8070,8071,8073,8075,8077,8079,8081,8083,8085,8087],{"class":239,"line":297},[237,8072,244],{"class":243},[237,8074,248],{"class":247},[237,8076,792],{"class":251},[237,8078,255],{"class":247},[237,8080,258],{"class":243},[237,8082,261],{"class":247},[237,8084,801],{"class":264},[237,8086,268],{"class":247},[237,8088,271],{"class":247},[237,8090,8091,8093,8095,8097,8099,8101,8103,8105,8107],{"class":239,"line":303},[237,8092,244],{"class":243},[237,8094,248],{"class":247},[237,8096,4684],{"class":251},[237,8098,255],{"class":247},[237,8100,258],{"class":243},[237,8102,261],{"class":247},[237,8104,5614],{"class":264},[237,8106,268],{"class":247},[237,8108,271],{"class":247},[237,8110,8111],{"class":239,"line":321},[237,8112,300],{"emptyLinePlaceholder":56},[237,8114,8115,8117,8119,8121,8123,8125,8127,8129],{"class":239,"line":326},[237,8116,330],{"class":329},[237,8118,333],{"class":251},[237,8120,336],{"class":247},[237,8122,339],{"class":251},[237,8124,309],{"class":247},[237,8126,344],{"class":312},[237,8128,316],{"class":251},[237,8130,271],{"class":247},[237,8132,8133],{"class":239,"line":351},[237,8134,300],{"emptyLinePlaceholder":56},[237,8136,8137],{"class":239,"line":368},[237,8138,8139],{"class":418},"\u002F\u002F Memory for fast local cache\n",[237,8141,8142,8144,8146,8148,8150],{"class":239,"line":388},[237,8143,354],{"class":251},[237,8145,309],{"class":247},[237,8147,359],{"class":312},[237,8149,362],{"class":251},[237,8151,365],{"class":247},[237,8153,8154,8156,8158,8160,8162,8164],{"class":239,"line":399},[237,8155,372],{"class":371},[237,8157,375],{"class":247},[237,8159,261],{"class":247},[237,8161,380],{"class":264},[237,8163,268],{"class":247},[237,8165,385],{"class":247},[237,8167,8168,8170,8172],{"class":239,"line":410},[237,8169,391],{"class":371},[237,8171,375],{"class":247},[237,8173,396],{"class":251},[237,8175,8176,8178,8180],{"class":239,"line":415},[237,8177,402],{"class":247},[237,8179,405],{"class":251},[237,8181,271],{"class":247},[237,8183,8184],{"class":239,"line":422},[237,8185,300],{"emptyLinePlaceholder":56},[237,8187,8188],{"class":239,"line":440},[237,8189,8190],{"class":418},"\u002F\u002F S3 for persistent cloud storage\n",[237,8192,8193,8195,8197,8199,8201],{"class":239,"line":455},[237,8194,354],{"class":251},[237,8196,309],{"class":247},[237,8198,359],{"class":312},[237,8200,362],{"class":251},[237,8202,365],{"class":247},[237,8204,8205,8207,8209,8211,8213,8215],{"class":239,"line":472},[237,8206,372],{"class":371},[237,8208,375],{"class":247},[237,8210,261],{"class":247},[237,8212,875],{"class":264},[237,8214,268],{"class":247},[237,8216,385],{"class":247},[237,8218,8219,8221,8223,8225],{"class":239,"line":497},[237,8220,391],{"class":371},[237,8222,375],{"class":247},[237,8224,792],{"class":251},[237,8226,385],{"class":247},[237,8228,8229,8231,8233],{"class":239,"line":506},[237,8230,894],{"class":371},[237,8232,375],{"class":247},[237,8234,899],{"class":247},[237,8236,8237,8239,8241,8243,8245,8247,8249,8251],{"class":239,"line":511},[237,8238,904],{"class":371},[237,8240,375],{"class":247},[237,8242,1641],{"class":251},[237,8244,309],{"class":247},[237,8246,1646],{"class":251},[237,8248,309],{"class":247},[237,8250,3359],{"class":251},[237,8252,385],{"class":247},[237,8254,8255,8257,8259,8261,8263,8265,8267,8269],{"class":239,"line":517},[237,8256,920],{"class":371},[237,8258,375],{"class":247},[237,8260,1641],{"class":251},[237,8262,309],{"class":247},[237,8264,1646],{"class":251},[237,8266,309],{"class":247},[237,8268,3379],{"class":251},[237,8270,385],{"class":247},[237,8272,8273,8275,8277],{"class":239,"line":541},[237,8274,1461],{"class":371},[237,8276,375],{"class":247},[237,8278,899],{"class":247},[237,8280,8281,8283,8285,8287,8289,8291,8293,8295],{"class":239,"line":556},[237,8282,1470],{"class":371},[237,8284,375],{"class":247},[237,8286,1641],{"class":251},[237,8288,309],{"class":247},[237,8290,1646],{"class":251},[237,8292,309],{"class":247},[237,8294,1335],{"class":251},[237,8296,385],{"class":247},[237,8298,8299,8301,8303,8305,8307,8309,8311],{"class":239,"line":570},[237,8300,1486],{"class":371},[237,8302,375],{"class":247},[237,8304,1641],{"class":251},[237,8306,309],{"class":247},[237,8308,1646],{"class":251},[237,8310,309],{"class":247},[237,8312,8313],{"class":251},"AWS_SECRET_ACCESS_KEY\n",[237,8315,8316],{"class":239,"line":579},[237,8317,1675],{"class":247},[237,8319,8320],{"class":239,"line":984},[237,8321,939],{"class":247},[237,8323,8324,8326,8328],{"class":239,"line":990},[237,8325,402],{"class":247},[237,8327,405],{"class":251},[237,8329,271],{"class":247},[237,8331,8332],{"class":239,"line":996},[237,8333,300],{"emptyLinePlaceholder":56},[237,8335,8336],{"class":239,"line":1002},[237,8337,8338],{"class":418},"\u002F\u002F Redis for distributed cache\n",[237,8340,8341,8343,8345,8347,8349],{"class":239,"line":1008},[237,8342,354],{"class":251},[237,8344,309],{"class":247},[237,8346,359],{"class":312},[237,8348,362],{"class":251},[237,8350,365],{"class":247},[237,8352,8353,8355,8357,8359,8362,8364],{"class":239,"line":1014},[237,8354,372],{"class":371},[237,8356,375],{"class":247},[237,8358,261],{"class":247},[237,8360,8361],{"class":264},"distributed",[237,8363,268],{"class":247},[237,8365,385],{"class":247},[237,8367,8368,8370,8372,8374],{"class":239,"line":1020},[237,8369,391],{"class":371},[237,8371,375],{"class":247},[237,8373,4684],{"class":251},[237,8375,385],{"class":247},[237,8377,8378,8380,8382],{"class":239,"line":1026},[237,8379,894],{"class":371},[237,8381,375],{"class":247},[237,8383,899],{"class":247},[237,8385,8386,8388,8390,8392,8394,8396,8398,8401],{"class":239,"line":1031},[237,8387,5720],{"class":371},[237,8389,375],{"class":247},[237,8391,1641],{"class":251},[237,8393,309],{"class":247},[237,8395,1646],{"class":251},[237,8397,309],{"class":247},[237,8399,8400],{"class":251},"REDIS_HOST",[237,8402,385],{"class":247},[237,8404,8405,8407,8409,8411],{"class":239,"line":1036},[237,8406,5736],{"class":371},[237,8408,375],{"class":247},[237,8410,5741],{"class":2645},[237,8412,385],{"class":247},[237,8414,8415,8417,8419,8421,8424],{"class":239,"line":1051},[237,8416,5748],{"class":371},[237,8418,375],{"class":247},[237,8420,261],{"class":247},[237,8422,8423],{"class":264},"app:",[237,8425,567],{"class":247},[237,8427,8428],{"class":239,"line":1066},[237,8429,939],{"class":247},[237,8431,8432,8434,8436],{"class":239,"line":1082},[237,8433,402],{"class":247},[237,8435,405],{"class":251},[237,8437,271],{"class":247},[676,8439],{},[208,8441,8443],{"id":8442},"troubleshooting","Troubleshooting",[213,8445,8447],{"id":8446},"provider-not-storing-data","Provider Not Storing Data",[204,8449,8450,8453,8454,8457,8458,8461],{},[223,8451,8452],{},"Problem:"," ",[234,8455,8456],{},"setItem()"," works but ",[234,8459,8460],{},"getItem()"," returns null",[204,8463,8464],{},[223,8465,8466],{},"Solutions:",[1325,8468,8469],{},[663,8470,8471],{},"Check serialization\u002Fdeserialization:",[227,8473,8475],{"className":229,"code":8474,"language":231,"meta":232,"style":232},"\u002F\u002F Make sure data can be serialized\nawait storage.setItem('key', {\n  date: new Date().toISOString(), \u002F\u002F ✅ Serialize dates as strings\n  \u002F\u002F date: new Date(), \u002F\u002F ❌ May not deserialize correctly\n});\n",[234,8476,8477,8482,8504,8530,8538],{"__ignoreMap":232},[237,8478,8479],{"class":239,"line":240},[237,8480,8481],{"class":418},"\u002F\u002F Make sure data can be serialized\n",[237,8483,8484,8486,8488,8490,8492,8494,8496,8498,8500,8502],{"class":239,"line":274},[237,8485,425],{"class":243},[237,8487,7533],{"class":251},[237,8489,309],{"class":247},[237,8491,433],{"class":312},[237,8493,362],{"class":251},[237,8495,268],{"class":247},[237,8497,3890],{"class":264},[237,8499,268],{"class":247},[237,8501,1103],{"class":247},[237,8503,899],{"class":247},[237,8505,8506,8509,8511,8513,8516,8518,8520,8523,8525,8527],{"class":239,"line":297},[237,8507,8508],{"class":371},"  date",[237,8510,375],{"class":247},[237,8512,2142],{"class":247},[237,8514,8515],{"class":312}," Date",[237,8517,2126],{"class":251},[237,8519,309],{"class":247},[237,8521,8522],{"class":312},"toISOString",[237,8524,2126],{"class":251},[237,8526,1103],{"class":247},[237,8528,8529],{"class":418}," \u002F\u002F ✅ Serialize dates as strings\n",[237,8531,8532,8535],{"class":239,"line":303},[237,8533,8534],{"class":418},"  \u002F\u002F date: new Date(),",[237,8536,8537],{"class":418}," \u002F\u002F ❌ May not deserialize correctly\n",[237,8539,8540,8542,8544],{"class":239,"line":321},[237,8541,402],{"class":247},[237,8543,405],{"class":251},[237,8545,271],{"class":247},[1325,8547,8548],{"start":274},[663,8549,8550],{},"Verify key format is consistent:",[227,8552,8554],{"className":229,"code":8553,"language":231,"meta":232,"style":232},"\u002F\u002F Use consistent key formatting\nawait storage.setItem('user:123', data);\nconst value = await storage.getItem('user:123'); \u002F\u002F ✅ Same key\n\n\u002F\u002F Not this:\nawait storage.setItem('user:123', data);\nconst value = await storage.getItem('user-123'); \u002F\u002F ❌ Different key\n",[234,8555,8556,8561,8586,8617,8621,8626,8650],{"__ignoreMap":232},[237,8557,8558],{"class":239,"line":240},[237,8559,8560],{"class":418},"\u002F\u002F Use consistent key formatting\n",[237,8562,8563,8565,8567,8569,8571,8573,8575,8577,8579,8581,8584],{"class":239,"line":274},[237,8564,425],{"class":243},[237,8566,7533],{"class":251},[237,8568,309],{"class":247},[237,8570,433],{"class":312},[237,8572,362],{"class":251},[237,8574,268],{"class":247},[237,8576,1075],{"class":264},[237,8578,268],{"class":247},[237,8580,1103],{"class":247},[237,8582,8583],{"class":251}," data)",[237,8585,271],{"class":247},[237,8587,8588,8590,8592,8594,8596,8598,8600,8602,8604,8606,8608,8610,8612,8614],{"class":239,"line":297},[237,8589,330],{"class":329},[237,8591,522],{"class":251},[237,8593,336],{"class":247},[237,8595,527],{"class":243},[237,8597,7533],{"class":251},[237,8599,309],{"class":247},[237,8601,534],{"class":312},[237,8603,362],{"class":251},[237,8605,268],{"class":247},[237,8607,1075],{"class":264},[237,8609,268],{"class":247},[237,8611,405],{"class":251},[237,8613,593],{"class":247},[237,8615,8616],{"class":418}," \u002F\u002F ✅ Same key\n",[237,8618,8619],{"class":239,"line":303},[237,8620,300],{"emptyLinePlaceholder":56},[237,8622,8623],{"class":239,"line":321},[237,8624,8625],{"class":418},"\u002F\u002F Not this:\n",[237,8627,8628,8630,8632,8634,8636,8638,8640,8642,8644,8646,8648],{"class":239,"line":326},[237,8629,425],{"class":243},[237,8631,7533],{"class":251},[237,8633,309],{"class":247},[237,8635,433],{"class":312},[237,8637,362],{"class":251},[237,8639,268],{"class":247},[237,8641,1075],{"class":264},[237,8643,268],{"class":247},[237,8645,1103],{"class":247},[237,8647,8583],{"class":251},[237,8649,271],{"class":247},[237,8651,8652,8654,8656,8658,8660,8662,8664,8666,8668,8670,8673,8675,8677,8679],{"class":239,"line":351},[237,8653,330],{"class":329},[237,8655,522],{"class":251},[237,8657,336],{"class":247},[237,8659,527],{"class":243},[237,8661,7533],{"class":251},[237,8663,309],{"class":247},[237,8665,534],{"class":312},[237,8667,362],{"class":251},[237,8669,268],{"class":247},[237,8671,8672],{"class":264},"user-123",[237,8674,268],{"class":247},[237,8676,405],{"class":251},[237,8678,593],{"class":247},[237,8680,8681],{"class":418}," \u002F\u002F ❌ Different key\n",[213,8683,8685],{"id":8684},"provider-initialization-error","Provider Initialization Error",[204,8687,8688,8690],{},[223,8689,8452],{}," \"Failed to initialize storage provider\"",[204,8692,8693],{},[223,8694,8466],{},[1325,8696,8697],{},[663,8698,8699,8700,8703],{},"Check ",[234,8701,8702],{},"initialize()"," method doesn't throw:",[227,8705,8707],{"className":229,"code":8706,"language":231,"meta":232,"style":232},"public async initialize(options: any): Promise\u003Cvoid> {\n  try {\n    \u002F\u002F initialization code\n  } catch (error) {\n    console.error('Storage init failed:', error);\n    \u002F\u002F Don't throw - handle gracefully\n  }\n}\n",[234,8708,8709,8728,8735,8740,8747,8772,8777,8781],{"__ignoreMap":232},[237,8710,8711,8714,8717,8720,8723,8726],{"class":239,"line":240},[237,8712,8713],{"class":251},"public async ",[237,8715,8716],{"class":312},"initialize",[237,8718,8719],{"class":251},"(options: any): ",[237,8721,8722],{"class":708},"Promise",[237,8724,8725],{"class":247},"\u003Cvoid>",[237,8727,899],{"class":247},[237,8729,8730,8733],{"class":239,"line":274},[237,8731,8732],{"class":251},"  try ",[237,8734,365],{"class":247},[237,8736,8737],{"class":239,"line":297},[237,8738,8739],{"class":418},"    \u002F\u002F initialization code\n",[237,8741,8742,8744],{"class":239,"line":303},[237,8743,3401],{"class":247},[237,8745,8746],{"class":251}," catch (error) {\n",[237,8748,8749,8752,8754,8756,8758,8761,8763,8765,8768,8770],{"class":239,"line":321},[237,8750,8751],{"class":251},"    console.",[237,8753,6356],{"class":371},[237,8755,362],{"class":247},[237,8757,268],{"class":247},[237,8759,8760],{"class":264},"Storage init failed:",[237,8762,268],{"class":247},[237,8764,1103],{"class":247},[237,8766,8767],{"class":3793}," error",[237,8769,405],{"class":247},[237,8771,271],{"class":251},[237,8773,8774],{"class":239,"line":326},[237,8775,8776],{"class":418},"    \u002F\u002F Don't throw - handle gracefully\n",[237,8778,8779],{"class":239,"line":351},[237,8780,939],{"class":247},[237,8782,8783],{"class":239,"line":368},[237,8784,2312],{"class":251},[1325,8786,8787],{"start":274},[663,8788,8789],{},"Verify provider is bound in container:",[227,8791,8793],{"className":229,"code":8792,"language":231,"meta":232,"style":232},"container.bind(CustomStorage);\n",[234,8794,8795],{"__ignoreMap":232},[237,8796,8797,8799,8801,8803,8806],{"class":239,"line":240},[237,8798,306],{"class":251},[237,8800,309],{"class":247},[237,8802,313],{"class":312},[237,8804,8805],{"class":251},"(CustomStorage)",[237,8807,271],{"class":247},[1325,8809,8810],{"start":297},[663,8811,8812],{},"Check provider initOptions:",[227,8814,8816],{"className":229,"code":8815,"language":231,"meta":232,"style":232},"storageManager.mount({\n  name: 'custom',\n  storage: CustomStorage,\n  initOptions: {\n    \u002F\u002F Make sure all required options are provided\n    requiredOption: 'value'\n  }\n});\n",[234,8817,8818,8830,8844,8854,8862,8867,8880,8884],{"__ignoreMap":232},[237,8819,8820,8822,8824,8826,8828],{"class":239,"line":240},[237,8821,354],{"class":251},[237,8823,309],{"class":247},[237,8825,359],{"class":312},[237,8827,362],{"class":251},[237,8829,365],{"class":247},[237,8831,8832,8834,8836,8838,8840,8842],{"class":239,"line":274},[237,8833,372],{"class":371},[237,8835,375],{"class":247},[237,8837,261],{"class":247},[237,8839,7336],{"class":264},[237,8841,268],{"class":247},[237,8843,385],{"class":247},[237,8845,8846,8848,8850,8852],{"class":239,"line":297},[237,8847,391],{"class":371},[237,8849,375],{"class":247},[237,8851,3734],{"class":251},[237,8853,385],{"class":247},[237,8855,8856,8858,8860],{"class":239,"line":303},[237,8857,894],{"class":371},[237,8859,375],{"class":247},[237,8861,899],{"class":247},[237,8863,8864],{"class":239,"line":321},[237,8865,8866],{"class":418},"    \u002F\u002F Make sure all required options are provided\n",[237,8868,8869,8872,8874,8876,8878],{"class":239,"line":326},[237,8870,8871],{"class":371},"    requiredOption",[237,8873,375],{"class":247},[237,8875,261],{"class":247},[237,8877,4066],{"class":264},[237,8879,567],{"class":247},[237,8881,8882],{"class":239,"line":351},[237,8883,939],{"class":247},[237,8885,8886,8888,8890],{"class":239,"line":368},[237,8887,402],{"class":247},[237,8889,405],{"class":251},[237,8891,271],{"class":247},[213,8893,8895],{"id":8894},"provider-missing-dependency","Provider Missing Dependency",[204,8897,8898,8900],{},[223,8899,8452],{}," Injected dependency is undefined",[204,8902,8903,8906],{},[223,8904,8905],{},"Solution:"," Make sure dependency is registered before storage configuration:",[227,8908,8910],{"className":229,"code":8909,"language":231,"meta":232,"style":232},"\u002F\u002F Register dependencies first\ncontainer.bind(Logger);\ncontainer.bind(CustomStorage);\n\n\u002F\u002F Then configure storage\ncontainer.bind(StorageManager);\nconst storageManager = container.get(StorageManager);\nstorageManager.mount({\n  name: 'custom',\n  storage: CustomStorage\n});\n",[234,8911,8912,8917,8930,8942,8946,8951,8963,8981,8993,9007,9016],{"__ignoreMap":232},[237,8913,8914],{"class":239,"line":240},[237,8915,8916],{"class":418},"\u002F\u002F Register dependencies first\n",[237,8918,8919,8921,8923,8925,8928],{"class":239,"line":274},[237,8920,306],{"class":251},[237,8922,309],{"class":247},[237,8924,313],{"class":312},[237,8926,8927],{"class":251},"(Logger)",[237,8929,271],{"class":247},[237,8931,8932,8934,8936,8938,8940],{"class":239,"line":297},[237,8933,306],{"class":251},[237,8935,309],{"class":247},[237,8937,313],{"class":312},[237,8939,8805],{"class":251},[237,8941,271],{"class":247},[237,8943,8944],{"class":239,"line":303},[237,8945,300],{"emptyLinePlaceholder":56},[237,8947,8948],{"class":239,"line":321},[237,8949,8950],{"class":418},"\u002F\u002F Then configure storage\n",[237,8952,8953,8955,8957,8959,8961],{"class":239,"line":326},[237,8954,306],{"class":251},[237,8956,309],{"class":247},[237,8958,313],{"class":312},[237,8960,316],{"class":251},[237,8962,271],{"class":247},[237,8964,8965,8967,8969,8971,8973,8975,8977,8979],{"class":239,"line":351},[237,8966,330],{"class":329},[237,8968,333],{"class":251},[237,8970,336],{"class":247},[237,8972,339],{"class":251},[237,8974,309],{"class":247},[237,8976,344],{"class":312},[237,8978,316],{"class":251},[237,8980,271],{"class":247},[237,8982,8983,8985,8987,8989,8991],{"class":239,"line":368},[237,8984,354],{"class":251},[237,8986,309],{"class":247},[237,8988,359],{"class":312},[237,8990,362],{"class":251},[237,8992,365],{"class":247},[237,8994,8995,8997,8999,9001,9003,9005],{"class":239,"line":388},[237,8996,372],{"class":371},[237,8998,375],{"class":247},[237,9000,261],{"class":247},[237,9002,7336],{"class":264},[237,9004,268],{"class":247},[237,9006,385],{"class":247},[237,9008,9009,9011,9013],{"class":239,"line":399},[237,9010,391],{"class":371},[237,9012,375],{"class":247},[237,9014,9015],{"class":251}," CustomStorage\n",[237,9017,9018,9020,9022],{"class":239,"line":410},[237,9019,402],{"class":247},[237,9021,405],{"class":251},[237,9023,271],{"class":247},[213,9025,9027],{"id":9026},"async-provider-not-working","Async Provider Not Working",[204,9029,9030,9032,9033,9035],{},[223,9031,8452],{}," Async ",[234,9034,8702],{}," doesn't complete before use",[204,9037,9038,9040,9041,9043],{},[223,9039,8905],{}," StorageManager handles async initialization automatically. Make sure you're using ",[234,9042,425],{}," when needed:",[227,9045,9047],{"className":229,"code":9046,"language":231,"meta":232,"style":232},"\u002F\u002F Initialize is called automatically when mounting\nstorageManager.mount({\n  name: 'async',\n  storage: AsyncStorage,\n  initOptions: { ... }\n});\n\n\u002F\u002F Storage is ready to use after mount\nawait storageManager.setItem({\n  storage: 'async',\n  key: 'mykey',\n  value: 'myvalue'\n});\n",[234,9048,9049,9054,9066,9080,9090,9102,9110,9114,9119,9133,9147,9161,9174],{"__ignoreMap":232},[237,9050,9051],{"class":239,"line":240},[237,9052,9053],{"class":418},"\u002F\u002F Initialize is called automatically when mounting\n",[237,9055,9056,9058,9060,9062,9064],{"class":239,"line":274},[237,9057,354],{"class":251},[237,9059,309],{"class":247},[237,9061,359],{"class":312},[237,9063,362],{"class":251},[237,9065,365],{"class":247},[237,9067,9068,9070,9072,9074,9076,9078],{"class":239,"line":297},[237,9069,372],{"class":371},[237,9071,375],{"class":247},[237,9073,261],{"class":247},[237,9075,2117],{"class":264},[237,9077,268],{"class":247},[237,9079,385],{"class":247},[237,9081,9082,9084,9086,9088],{"class":239,"line":303},[237,9083,391],{"class":371},[237,9085,375],{"class":247},[237,9087,7892],{"class":251},[237,9089,385],{"class":247},[237,9091,9092,9094,9096,9098,9100],{"class":239,"line":321},[237,9093,894],{"class":371},[237,9095,375],{"class":247},[237,9097,248],{"class":247},[237,9099,7361],{"class":247},[237,9101,494],{"class":247},[237,9103,9104,9106,9108],{"class":239,"line":326},[237,9105,402],{"class":247},[237,9107,405],{"class":251},[237,9109,271],{"class":247},[237,9111,9112],{"class":239,"line":351},[237,9113,300],{"emptyLinePlaceholder":56},[237,9115,9116],{"class":239,"line":368},[237,9117,9118],{"class":418},"\u002F\u002F Storage is ready to use after mount\n",[237,9120,9121,9123,9125,9127,9129,9131],{"class":239,"line":388},[237,9122,425],{"class":243},[237,9124,428],{"class":251},[237,9126,309],{"class":247},[237,9128,433],{"class":312},[237,9130,362],{"class":251},[237,9132,365],{"class":247},[237,9134,9135,9137,9139,9141,9143,9145],{"class":239,"line":399},[237,9136,391],{"class":371},[237,9138,375],{"class":247},[237,9140,261],{"class":247},[237,9142,2117],{"class":264},[237,9144,268],{"class":247},[237,9146,385],{"class":247},[237,9148,9149,9151,9153,9155,9157,9159],{"class":239,"line":410},[237,9150,458],{"class":371},[237,9152,375],{"class":247},[237,9154,261],{"class":247},[237,9156,465],{"class":264},[237,9158,268],{"class":247},[237,9160,385],{"class":247},[237,9162,9163,9165,9167,9169,9172],{"class":239,"line":415},[237,9164,475],{"class":371},[237,9166,375],{"class":247},[237,9168,261],{"class":247},[237,9170,9171],{"class":264},"myvalue",[237,9173,567],{"class":247},[237,9175,9176,9178,9180],{"class":239,"line":422},[237,9177,402],{"class":247},[237,9179,405],{"class":251},[237,9181,271],{"class":247},[9183,9184,9185],"style",{},"html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfNiH, html code.shiki .sfNiH{--shiki-light:#FF5370;--shiki-default:#FF9CAC;--shiki-dark:#FF9CAC}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}",{"title":232,"searchDepth":240,"depth":274,"links":9187},[9188,9192,9196,9197,9198,9203,9204],{"id":210,"depth":274,"text":211,"children":9189},[9190,9191],{"id":215,"depth":297,"text":216},{"id":680,"depth":297,"text":681},{"id":3661,"depth":274,"text":3662,"children":9193},[9194,9195],{"id":3668,"depth":297,"text":3669},{"id":4425,"depth":297,"text":4426},{"id":4527,"depth":274,"text":4528},{"id":5853,"depth":274,"text":5854},{"id":7174,"depth":274,"text":7175,"children":9199},[9200,9201,9202],{"id":7178,"depth":297,"text":7179},{"id":7378,"depth":297,"text":7379},{"id":7874,"depth":297,"text":7875},{"id":8019,"depth":274,"text":8020},{"id":8442,"depth":274,"text":8443,"children":9205},[9206,9207,9208,9209],{"id":8446,"depth":297,"text":8447},{"id":8684,"depth":297,"text":8685},{"id":8894,"depth":297,"text":8895},{"id":9026,"depth":297,"text":9027},"Built-in storage providers and guide to creating custom drivers","md",null,{},{"title":86,"description":9210},"WQyH1oSK0_MxZaUTd9dxkBEAk5bJfgU8Au5p5Nihyy8",[9217,9219],{"title":66,"path":115,"stem":116,"description":9218,"children":-1},"Flexible and extensible storage system for Vercube applications",{"title":90,"path":121,"stem":122,"description":9220,"children":-1},"Complete API reference for Storage module",1775552783341]