@mateosuarezdev/brpc 1.0.54 → 1.0.56

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,4 @@
1
+ // @bun
2
+ class E{entries;accessOrder;maxSize;defaultTTL;cleanupTimer=null;accessCounter=0;constructor(b={}){if(this.entries=new Map,this.accessOrder=new Map,this.maxSize=b.maxSize??1/0,this.defaultTTL=b.ttl??null,b.cleanupInterval)this.cleanupTimer=setInterval(()=>this.cleanup(),b.cleanupInterval)}set(b,j,q){let z=q??this.defaultTTL,B=z?Date.now()+z:null;if(this.entries.size>=this.maxSize&&!this.entries.has(b))this.evictLRU();this.entries.set(b,{value:j,expiresAt:B,createdAt:Date.now()}),this.trackAccess(b)}get(b){let j=this.entries.get(b);if(!j)return null;if(j.expiresAt&&Date.now()>j.expiresAt)return this.entries.delete(b),this.accessOrder.delete(b),null;return this.trackAccess(b),j.value}has(b){return this.get(b)!==null}delete(b){return this.accessOrder.delete(b),this.entries.delete(b)}clear(){this.entries.clear(),this.accessOrder.clear(),this.accessCounter=0}keys(){return Array.from(this.entries.keys())}validKeys(){let b=Date.now();return Array.from(this.entries.entries()).filter(([j,q])=>!q.expiresAt||q.expiresAt>b).map(([j])=>j)}size(){return this.entries.size}async getOrSet(b,j,q){let z=this.get(b);if(z!==null)return z;let B=await j();return this.set(b,B,q),B}setWithExpiry(b,j,q){let z=Math.max(0,q-Date.now());this.set(b,j,z)}ttl(b){let j=this.entries.get(b);if(!j)return null;if(!j.expiresAt)return-1;let q=j.expiresAt-Date.now();return q>0?q:0}expire(b,j){let q=this.entries.get(b);if(!q)return!1;return q.expiresAt=Date.now()+j,!0}persist(b){let j=this.entries.get(b);if(!j)return!1;return j.expiresAt=null,!0}deletePattern(b){let j=new RegExp("^"+b.replace(/\*/g,".*").replace(/\?/g,".")+"$"),q=0;for(let z of this.entries.keys())if(j.test(z))this.delete(z),q++;return q}mget(b){return b.map((j)=>this.get(j))}mset(b,j){for(let[q,z]of Object.entries(b))this.set(q,z,j)}incr(b,j=1){let q=this.get(b),z=(typeof q==="number"?q:0)+j;return this.set(b,z),z}decr(b,j=1){return this.incr(b,-j)}stats(){let b=Date.now(),j=Array.from(this.entries.entries()),q=j.filter(([B,D])=>D.expiresAt&&D.expiresAt<=b).length,z=j.length-q;return{size:this.entries.size,valid:z,expired:q,maxSize:this.maxSize,defaultTTL:this.defaultTTL,entries:j.map(([B,D])=>({key:B,expiresIn:D.expiresAt?Math.max(0,D.expiresAt-b):null,age:b-D.createdAt}))}}cleanup(){let b=Date.now(),j=0;for(let[q,z]of this.entries.entries())if(z.expiresAt&&z.expiresAt<=b)this.entries.delete(q),this.accessOrder.delete(q),j++;return j}trackAccess(b){this.accessOrder.set(b,++this.accessCounter)}evictLRU(){let b=null,j=1/0;for(let[q,z]of this.accessOrder.entries())if(z<j)j=z,b=q;if(b)this.entries.delete(b),this.accessOrder.delete(b)}destroy(){if(this.cleanupTimer)clearInterval(this.cleanupTimer),this.cleanupTimer=null;this.clear()}}export{E as CacheService};
3
+
4
+ //# debugId=E599AB3EA78545B764756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["..\\src\\cache\\index.ts"],
4
+ "sourcesContent": [
5
+ "type CacheEntry = {\r\n value: any;\r\n expiresAt: number | null; // null means no expiration\r\n createdAt: number;\r\n};\r\n\r\ntype CacheOptions = {\r\n ttl?: number; // Time to live in milliseconds\r\n maxSize?: number; // Maximum number of entries (LRU eviction)\r\n cleanupInterval?: number; // How often to clean up expired entries (ms)\r\n};\r\n\r\nexport class CacheService {\r\n private entries: Map<string, CacheEntry>;\r\n private accessOrder: Map<string, number>; // For LRU tracking\r\n private readonly maxSize: number;\r\n private readonly defaultTTL: number | null;\r\n private cleanupTimer: Timer | null = null;\r\n private accessCounter = 0;\r\n\r\n constructor(options: CacheOptions = {}) {\r\n this.entries = new Map();\r\n this.accessOrder = new Map();\r\n this.maxSize = options.maxSize ?? Infinity;\r\n this.defaultTTL = options.ttl ?? null;\r\n\r\n // Start automatic cleanup if interval specified\r\n if (options.cleanupInterval) {\r\n this.cleanupTimer = setInterval(\r\n () => this.cleanup(),\r\n options.cleanupInterval,\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Set a value in cache with optional TTL\r\n */\r\n set(key: string, value: any, ttl?: number): void {\r\n const timeToLive = ttl ?? this.defaultTTL;\r\n const expiresAt = timeToLive ? Date.now() + timeToLive : null;\r\n\r\n // Evict LRU if at max size\r\n if (this.entries.size >= this.maxSize && !this.entries.has(key)) {\r\n this.evictLRU();\r\n }\r\n\r\n this.entries.set(key, {\r\n value,\r\n expiresAt,\r\n createdAt: Date.now(),\r\n });\r\n\r\n this.trackAccess(key);\r\n }\r\n\r\n /**\r\n * Get a value from cache (returns null if expired or not found)\r\n */\r\n get<T = any>(key: string): T | null {\r\n const entry = this.entries.get(key);\r\n\r\n if (!entry) {\r\n return null;\r\n }\r\n\r\n // Check expiration\r\n if (entry.expiresAt && Date.now() > entry.expiresAt) {\r\n this.entries.delete(key);\r\n this.accessOrder.delete(key);\r\n return null;\r\n }\r\n\r\n this.trackAccess(key);\r\n return entry.value;\r\n }\r\n\r\n /**\r\n * Check if key exists and is not expired\r\n */\r\n has(key: string): boolean {\r\n return this.get(key) !== null;\r\n }\r\n\r\n /**\r\n * Delete a specific key\r\n */\r\n delete(key: string): boolean {\r\n this.accessOrder.delete(key);\r\n return this.entries.delete(key);\r\n }\r\n\r\n /**\r\n * Clear all cache entries\r\n */\r\n clear(): void {\r\n this.entries.clear();\r\n this.accessOrder.clear();\r\n this.accessCounter = 0;\r\n }\r\n\r\n /**\r\n * Get all keys (including expired ones)\r\n */\r\n keys(): string[] {\r\n return Array.from(this.entries.keys());\r\n }\r\n\r\n /**\r\n * Get all valid (non-expired) keys\r\n */\r\n validKeys(): string[] {\r\n const now = Date.now();\r\n return Array.from(this.entries.entries())\r\n .filter(([_, entry]) => !entry.expiresAt || entry.expiresAt > now)\r\n .map(([key]) => key);\r\n }\r\n\r\n /**\r\n * Get cache size\r\n */\r\n size(): number {\r\n return this.entries.size;\r\n }\r\n\r\n /**\r\n * Get or set pattern (lazy evaluation)\r\n */\r\n async getOrSet<T = any>(\r\n key: string,\r\n factory: () => T | Promise<T>,\r\n ttl?: number,\r\n ): Promise<T> {\r\n const cached = this.get<T>(key);\r\n if (cached !== null) {\r\n return cached;\r\n }\r\n\r\n const value = await factory();\r\n this.set(key, value, ttl);\r\n return value;\r\n }\r\n\r\n /**\r\n * Set value with expiration timestamp (instead of TTL)\r\n */\r\n setWithExpiry(key: string, value: any, expiresAt: number): void {\r\n const ttl = Math.max(0, expiresAt - Date.now());\r\n this.set(key, value, ttl);\r\n }\r\n\r\n /**\r\n * Get remaining TTL for a key (in milliseconds)\r\n */\r\n ttl(key: string): number | null {\r\n const entry = this.entries.get(key);\r\n if (!entry) return null;\r\n if (!entry.expiresAt) return -1; // -1 means no expiration\r\n\r\n const remaining = entry.expiresAt - Date.now();\r\n return remaining > 0 ? remaining : 0;\r\n }\r\n\r\n /**\r\n * Update TTL for existing key\r\n */\r\n expire(key: string, ttl: number): boolean {\r\n const entry = this.entries.get(key);\r\n if (!entry) return false;\r\n\r\n entry.expiresAt = Date.now() + ttl;\r\n return true;\r\n }\r\n\r\n /**\r\n * Remove expiration from key\r\n */\r\n persist(key: string): boolean {\r\n const entry = this.entries.get(key);\r\n if (!entry) return false;\r\n\r\n entry.expiresAt = null;\r\n return true;\r\n }\r\n\r\n /**\r\n * Delete keys matching a pattern (simple wildcard support)\r\n */\r\n deletePattern(pattern: string): number {\r\n const regex = new RegExp(\r\n \"^\" + pattern.replace(/\\*/g, \".*\").replace(/\\?/g, \".\") + \"$\",\r\n );\r\n\r\n let deleted = 0;\r\n for (const key of this.entries.keys()) {\r\n if (regex.test(key)) {\r\n this.delete(key);\r\n deleted++;\r\n }\r\n }\r\n\r\n return deleted;\r\n }\r\n\r\n /**\r\n * Get multiple keys at once\r\n */\r\n mget<T = any>(keys: string[]): (T | null)[] {\r\n return keys.map((key) => this.get(key));\r\n }\r\n\r\n /**\r\n * Set multiple keys at once\r\n */\r\n mset(entries: Record<string, any>, ttl?: number): void {\r\n for (const [key, value] of Object.entries(entries)) {\r\n this.set(key, value, ttl);\r\n }\r\n }\r\n\r\n /**\r\n * Increment a numeric value (creates if doesn't exist)\r\n */\r\n incr(key: string, amount = 1): number {\r\n const current = this.get(key);\r\n const value = (typeof current === \"number\" ? current : 0) + amount;\r\n this.set(key, value as any);\r\n return value;\r\n }\r\n\r\n /**\r\n * Decrement a numeric value\r\n */\r\n decr(key: string, amount = 1): number {\r\n return this.incr(key, -amount);\r\n }\r\n\r\n /**\r\n * Get cache statistics\r\n */\r\n stats() {\r\n const now = Date.now();\r\n const entries = Array.from(this.entries.entries());\r\n\r\n const expired = entries.filter(\r\n ([_, entry]) => entry.expiresAt && entry.expiresAt <= now,\r\n ).length;\r\n\r\n const valid = entries.length - expired;\r\n\r\n return {\r\n size: this.entries.size,\r\n valid,\r\n expired,\r\n maxSize: this.maxSize,\r\n defaultTTL: this.defaultTTL,\r\n entries: entries.map(([key, entry]) => ({\r\n key,\r\n expiresIn: entry.expiresAt ? Math.max(0, entry.expiresAt - now) : null,\r\n age: now - entry.createdAt,\r\n })),\r\n };\r\n }\r\n\r\n /**\r\n * Clean up expired entries\r\n */\r\n cleanup(): number {\r\n const now = Date.now();\r\n let cleaned = 0;\r\n\r\n for (const [key, entry] of this.entries.entries()) {\r\n if (entry.expiresAt && entry.expiresAt <= now) {\r\n this.entries.delete(key);\r\n this.accessOrder.delete(key);\r\n cleaned++;\r\n }\r\n }\r\n\r\n return cleaned;\r\n }\r\n\r\n /**\r\n * Track access for LRU\r\n */\r\n private trackAccess(key: string): void {\r\n this.accessOrder.set(key, ++this.accessCounter);\r\n }\r\n\r\n /**\r\n * Evict least recently used entry\r\n */\r\n private evictLRU(): void {\r\n let lruKey: string | null = null;\r\n let lruAccess = Infinity;\r\n\r\n for (const [key, accessTime] of this.accessOrder.entries()) {\r\n if (accessTime < lruAccess) {\r\n lruAccess = accessTime;\r\n lruKey = key;\r\n }\r\n }\r\n\r\n if (lruKey) {\r\n this.entries.delete(lruKey);\r\n this.accessOrder.delete(lruKey);\r\n }\r\n }\r\n\r\n /**\r\n * Destroy cache and cleanup timers\r\n */\r\n destroy(): void {\r\n if (this.cleanupTimer) {\r\n clearInterval(this.cleanupTimer);\r\n this.cleanupTimer = null;\r\n }\r\n this.clear();\r\n }\r\n}\r\n\r\n// Export singleton instances for common use cases\r\n// export const cache = new CacheService({\r\n// maxSize: 1000,\r\n// cleanupInterval: 60000, // Clean every minute\r\n// });\r\n"
6
+ ],
7
+ "mappings": "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",
8
+ "debugId": "E599AB3EA78545B764756E2164756E21",
9
+ "names": []
10
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mateosuarezdev/brpc",
3
- "version": "1.0.54",
3
+ "version": "1.0.56",
4
4
  "description": "A Type-Safe, Flexible Web application framework for Bun",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -26,6 +26,11 @@
26
26
  "types": "./dist/client/react/index.d.ts",
27
27
  "import": "./dist/client/react/index.js",
28
28
  "require": "./dist/client/react/index.cjs"
29
+ },
30
+ "./cache": {
31
+ "types": "./dist/cache/index.d.ts",
32
+ "import": "./dist/cache/index.js",
33
+ "require": "./dist/cache/index.cjs"
29
34
  }
30
35
  },
31
36
  "files": [
@@ -40,10 +45,10 @@
40
45
  "typecheck": "tsc --noEmit",
41
46
  "clean": "rimraf dist",
42
47
  "prepublish": "yarn typecheck && yarn build",
43
- "rel": "yarn npm publish --access public",
44
- "rel:patch": "yarn version patch && yarn npm publish --access public",
45
- "rel:minor": "yarn version minor && yarn npm publish --access public",
46
- "rel:major": "yarn version major && yarn npm publish --access public"
48
+ "rel": "npm publish --access public",
49
+ "rel:patch": "yarn run prepublish && yarn version patch && npm publish --access public",
50
+ "rel:minor": "yarn run prepublish && yarn version minor && npm publish --access public",
51
+ "rel:major": "yarn run prepublish && yarn version major && npm publish --access public"
47
52
  },
48
53
  "keywords": [
49
54
  "bun",