memorio 3.0.0 → 3.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CODE_OF_CONDUCT.md +1 -1
- package/README.md +202 -332
- package/SECURITY.md +48 -3
- package/docs/README.md +202 -332
- package/examples/basic.ts +22 -22
- package/examples/browser-vanilla.html +2 -2
- package/examples/cache.ts +9 -9
- package/examples/idb.ts +8 -8
- package/examples/node-server.ts +39 -39
- package/examples/observer.ts +5 -5
- package/examples/platform.ts +37 -37
- package/examples/react-app.tsx +3 -3
- package/examples/session-advanced.ts +8 -8
- package/examples/state-advanced.ts +10 -10
- package/examples/store-advanced.ts +9 -9
- package/examples/useObserver.tsx +1 -1
- package/index.cjs +27 -26
- package/index.js +25 -26
- package/package.json +3 -3
- package/types/cache.d.ts +1 -1
- package/types/idb.d.ts +1 -1
- package/types/observer.d.ts +1 -1
- package/types/store.d.ts +10 -10
- package/types/useObserver.d.ts +1 -1
package/examples/basic.ts
CHANGED
|
@@ -16,23 +16,23 @@ import 'memorio'
|
|
|
16
16
|
// PLATFORM DETECTION
|
|
17
17
|
// ============================================
|
|
18
18
|
|
|
19
|
-
console.
|
|
20
|
-
console.
|
|
19
|
+
console.debug('=== Platform Detection ===')
|
|
20
|
+
console.debug('Memorio version:', memorio.version)
|
|
21
21
|
|
|
22
22
|
// Check platform
|
|
23
23
|
if (memorio.isBrowser()) {
|
|
24
|
-
console.
|
|
24
|
+
console.debug('Platform: Browser')
|
|
25
25
|
} else if (memorio.isNode()) {
|
|
26
|
-
console.
|
|
26
|
+
console.debug('Platform: Node.js')
|
|
27
27
|
} else if (memorio.isDeno()) {
|
|
28
|
-
console.
|
|
28
|
+
console.debug('Platform: Deno')
|
|
29
29
|
} else if (memorio.isEdge()) {
|
|
30
|
-
console.
|
|
30
|
+
console.debug('Platform: Edge Worker')
|
|
31
31
|
}
|
|
32
32
|
|
|
33
33
|
// Get capabilities
|
|
34
34
|
const caps = memorio.getCapabilities()
|
|
35
|
-
console.
|
|
35
|
+
console.debug('Capabilities:', {
|
|
36
36
|
platform: caps.platform,
|
|
37
37
|
hasLocalStorage: caps.hasLocalStorage,
|
|
38
38
|
hasSessionStorage: caps.hasSessionStorage,
|
|
@@ -43,7 +43,7 @@ console.log('Capabilities:', {
|
|
|
43
43
|
// STATE - In-memory reactive state
|
|
44
44
|
// ============================================
|
|
45
45
|
|
|
46
|
-
console.
|
|
46
|
+
console.debug('\n=== State Management ===')
|
|
47
47
|
|
|
48
48
|
// Set some state values
|
|
49
49
|
state.name = 'Mario'
|
|
@@ -55,21 +55,21 @@ state.profile = {
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
// Get state values
|
|
58
|
-
console.
|
|
59
|
-
console.
|
|
60
|
-
console.
|
|
58
|
+
console.debug('Name:', state.name)
|
|
59
|
+
console.debug('Age:', state.age)
|
|
60
|
+
console.debug('Profile:', state.profile)
|
|
61
61
|
|
|
62
62
|
// List all states
|
|
63
|
-
console.
|
|
63
|
+
console.debug('All states:', state.list)
|
|
64
64
|
|
|
65
65
|
// ============================================
|
|
66
66
|
// STORE - Persistent localStorage
|
|
67
67
|
// ============================================
|
|
68
68
|
|
|
69
|
-
console.
|
|
69
|
+
console.debug('\n=== Store (Persistent Storage) ===')
|
|
70
70
|
|
|
71
71
|
// Check persistence
|
|
72
|
-
console.
|
|
72
|
+
console.debug('Is persistent:', store.isPersistent) // true in browser, false in Node.js/Deno
|
|
73
73
|
|
|
74
74
|
// Save to localStorage
|
|
75
75
|
store.set('username', 'mario')
|
|
@@ -77,28 +77,28 @@ store.set('preferences', { theme: 'dark', language: 'en' })
|
|
|
77
77
|
store.set('lastLogin', Date.now())
|
|
78
78
|
|
|
79
79
|
// Read from localStorage
|
|
80
|
-
console.
|
|
81
|
-
console.
|
|
80
|
+
console.debug('Username:', store.get('username'))
|
|
81
|
+
console.debug('Preferences:', store.get('preferences'))
|
|
82
82
|
|
|
83
83
|
// Get storage size
|
|
84
|
-
console.
|
|
84
|
+
console.debug('Storage size:', store.size(), 'bytes')
|
|
85
85
|
|
|
86
86
|
// ============================================
|
|
87
87
|
// SESSION - Temporary session storage
|
|
88
88
|
// ============================================
|
|
89
89
|
|
|
90
|
-
console.
|
|
90
|
+
console.debug('\n=== Session (Temporary Storage) ===')
|
|
91
91
|
|
|
92
92
|
// Check persistence
|
|
93
|
-
console.
|
|
93
|
+
console.debug('Is persistent:', session.isPersistent) // true in browser, false in Node.js/Deno
|
|
94
94
|
|
|
95
95
|
// Save session data (cleared when tab closes)
|
|
96
96
|
session.set('token', 'abc123xyz')
|
|
97
97
|
session.set('userId', 42)
|
|
98
98
|
|
|
99
99
|
// Read session data
|
|
100
|
-
console.
|
|
101
|
-
console.
|
|
100
|
+
console.debug('Token:', session.get('token'))
|
|
101
|
+
console.debug('User ID:', session.get('userId'))
|
|
102
102
|
|
|
103
103
|
// ============================================
|
|
104
104
|
// CLEANUP
|
|
@@ -112,4 +112,4 @@ session.remove('token')
|
|
|
112
112
|
store.removeAll()
|
|
113
113
|
session.removeAll()
|
|
114
114
|
|
|
115
|
-
console.
|
|
115
|
+
console.debug('\nExample complete!')
|
|
@@ -350,8 +350,8 @@ Session ID: ${memorio.getCapabilities().sessionId.substring(0, 8)}...
|
|
|
350
350
|
`.trim()
|
|
351
351
|
|
|
352
352
|
// Log welcome
|
|
353
|
-
console.
|
|
354
|
-
console.
|
|
353
|
+
console.debug('🧠 Memorio loaded!')
|
|
354
|
+
console.debug('Platform:', memorio.getCapabilities().platform)
|
|
355
355
|
</script>
|
|
356
356
|
</body>
|
|
357
357
|
|
package/examples/cache.ts
CHANGED
|
@@ -19,13 +19,13 @@ cache.set('score', 1500)
|
|
|
19
19
|
cache.set('player', { name: 'Mario', level: 5 })
|
|
20
20
|
|
|
21
21
|
// Get values
|
|
22
|
-
console.
|
|
23
|
-
console.
|
|
24
|
-
console.
|
|
22
|
+
console.debug('Username:', cache.get('username'))
|
|
23
|
+
console.debug('Score:', cache.get('score'))
|
|
24
|
+
console.debug('Player:', cache.get('player'))
|
|
25
25
|
|
|
26
26
|
// Direct property access
|
|
27
27
|
cache.tempData = 'Hello'
|
|
28
|
-
console.
|
|
28
|
+
console.debug('Temp data:', cache.tempData)
|
|
29
29
|
|
|
30
30
|
// ============================================
|
|
31
31
|
// CACHE WITH OBJECTS
|
|
@@ -40,8 +40,8 @@ cache.set('gameState', {
|
|
|
40
40
|
})
|
|
41
41
|
|
|
42
42
|
const gameState = cache.get('gameState')
|
|
43
|
-
console.
|
|
44
|
-
console.
|
|
43
|
+
console.debug('Game level:', gameState?.level)
|
|
44
|
+
console.debug('Inventory:', gameState?.inventory)
|
|
45
45
|
|
|
46
46
|
// ============================================
|
|
47
47
|
// CACHE SIZE
|
|
@@ -52,7 +52,7 @@ for (let i = 0; i < 10; i++) {
|
|
|
52
52
|
cache.set(`item_${i}`, { id: i, data: `item-${i}` })
|
|
53
53
|
}
|
|
54
54
|
|
|
55
|
-
console.
|
|
55
|
+
console.debug('Cache keys:', Object.keys(cache))
|
|
56
56
|
|
|
57
57
|
// ============================================
|
|
58
58
|
// CLEANUP
|
|
@@ -67,6 +67,6 @@ cache.removeAll()
|
|
|
67
67
|
// Or use clearAll alias
|
|
68
68
|
// cache.clearAll()
|
|
69
69
|
|
|
70
|
-
console.
|
|
70
|
+
console.debug('Cache after clear:', cache.get('score'))
|
|
71
71
|
|
|
72
|
-
console.
|
|
72
|
+
console.debug('Cache example complete!')
|
package/examples/idb.ts
CHANGED
|
@@ -14,7 +14,7 @@ import 'memorio'
|
|
|
14
14
|
// ============================================
|
|
15
15
|
|
|
16
16
|
if (!idb.db.support()) {
|
|
17
|
-
console.
|
|
17
|
+
console.debug('IndexedDB not supported')
|
|
18
18
|
process.exit(0)
|
|
19
19
|
}
|
|
20
20
|
|
|
@@ -68,10 +68,10 @@ idb.data.set('myApp', 'products', {
|
|
|
68
68
|
// ============================================
|
|
69
69
|
|
|
70
70
|
const user1 = idb.data.get('myApp', 'users', 1)
|
|
71
|
-
console.
|
|
71
|
+
console.debug('User 1:', user1)
|
|
72
72
|
|
|
73
73
|
const product1 = idb.data.get('myApp', 'products', 1)
|
|
74
|
-
console.
|
|
74
|
+
console.debug('Product 1:', product1)
|
|
75
75
|
|
|
76
76
|
// ============================================
|
|
77
77
|
// DATABASE INFO
|
|
@@ -79,19 +79,19 @@ console.log('Product 1:', product1)
|
|
|
79
79
|
|
|
80
80
|
// List all databases
|
|
81
81
|
const databases = idb.db.list()
|
|
82
|
-
console.
|
|
82
|
+
console.debug('Databases:', databases)
|
|
83
83
|
|
|
84
84
|
// Check if database exists
|
|
85
85
|
const exists = idb.db.exist('myApp')
|
|
86
|
-
console.
|
|
86
|
+
console.debug('myApp exists:', exists)
|
|
87
87
|
|
|
88
88
|
// Get database version
|
|
89
89
|
const version = idb.db.version('myApp')
|
|
90
|
-
console.
|
|
90
|
+
console.debug('myApp version:', version)
|
|
91
91
|
|
|
92
92
|
// Get database size
|
|
93
93
|
const size = idb.db.size('myApp')
|
|
94
|
-
console.
|
|
94
|
+
console.debug('myApp size:', size, 'bytes')
|
|
95
95
|
|
|
96
96
|
// ============================================
|
|
97
97
|
// DELETE DATA
|
|
@@ -106,4 +106,4 @@ idb.data.delete('myApp', 'users', 1)
|
|
|
106
106
|
// Delete entire database
|
|
107
107
|
// idb.db.delete('myApp');
|
|
108
108
|
|
|
109
|
-
console.
|
|
109
|
+
console.debug('IDB example complete!')
|
package/examples/node-server.ts
CHANGED
|
@@ -13,14 +13,14 @@ import 'memorio'
|
|
|
13
13
|
// 1. BASIC USAGE
|
|
14
14
|
// ============================================
|
|
15
15
|
|
|
16
|
-
console.
|
|
16
|
+
console.debug('=== 1. Basic Node.js Usage ===')
|
|
17
17
|
|
|
18
18
|
// Check platform
|
|
19
|
-
console.
|
|
19
|
+
console.debug('Platform:', memorio.isNode() ? 'Node.js ✅' : 'Other')
|
|
20
20
|
|
|
21
21
|
// Check persistence (false in Node.js - uses memory fallback)
|
|
22
|
-
console.
|
|
23
|
-
console.
|
|
22
|
+
console.debug('Store persistent:', store.isPersistent) // false
|
|
23
|
+
console.debug('Session persistent:', session.isPersistent) // false
|
|
24
24
|
|
|
25
25
|
// State works exactly like in browser
|
|
26
26
|
state.appName = 'My Server App'
|
|
@@ -30,21 +30,21 @@ state.config = {
|
|
|
30
30
|
env: 'production'
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
console.
|
|
34
|
-
console.
|
|
33
|
+
console.debug('App name:', state.appName)
|
|
34
|
+
console.debug('Config:', state.config)
|
|
35
35
|
|
|
36
36
|
// ============================================
|
|
37
37
|
// 2. CACHE (In-Memory - Perfect for Server)
|
|
38
38
|
// ============================================
|
|
39
39
|
|
|
40
|
-
console.
|
|
40
|
+
console.debug('\n=== 2. Cache (In-Memory) ===')
|
|
41
41
|
|
|
42
42
|
// Cache is perfect for temporary server data
|
|
43
43
|
cache.set('apiResponse', { data: 'cached value' })
|
|
44
44
|
cache.set('userCount', 42)
|
|
45
45
|
|
|
46
|
-
console.
|
|
47
|
-
console.
|
|
46
|
+
console.debug('Cached API response:', cache.get('apiResponse'))
|
|
47
|
+
console.debug('User count:', cache.get('userCount'))
|
|
48
48
|
|
|
49
49
|
// Clear cache when needed
|
|
50
50
|
cache.remove('apiResponse')
|
|
@@ -54,14 +54,14 @@ cache.remove('apiResponse')
|
|
|
54
54
|
// 3. STORE & SESSION (Memory Fallback in Node.js)
|
|
55
55
|
// ============================================
|
|
56
56
|
|
|
57
|
-
console.
|
|
57
|
+
console.debug('\n=== 3. Store & Session (Memory Fallback) ===')
|
|
58
58
|
|
|
59
59
|
// Store and session work but don't persist (no localStorage in Node.js)
|
|
60
60
|
store.set('serverConfig', { debug: true })
|
|
61
61
|
session.set('requestData', { path: '/api/users' })
|
|
62
62
|
|
|
63
|
-
console.
|
|
64
|
-
console.
|
|
63
|
+
console.debug('Server config:', store.get('serverConfig'))
|
|
64
|
+
console.debug('Request data:', session.get('requestData'))
|
|
65
65
|
|
|
66
66
|
// ⚠️ Data is lost on process restart!
|
|
67
67
|
// For persistence in Node.js, use a database
|
|
@@ -70,7 +70,7 @@ console.log('Request data:', session.get('requestData'))
|
|
|
70
70
|
// 4. CONTEXT ISOLATION (Multi-Tenant)
|
|
71
71
|
// ============================================
|
|
72
72
|
|
|
73
|
-
console.
|
|
73
|
+
console.debug('\n=== 4. Context Isolation (Multi-Tenant) ===')
|
|
74
74
|
|
|
75
75
|
// Create isolated contexts for different tenants/requests
|
|
76
76
|
const userAContext = memorio.createContext('tenant-A')
|
|
@@ -86,19 +86,19 @@ userBContext.state.secret = 'Bob secret data'
|
|
|
86
86
|
userBContext.cache.set('temp', 'B temp data')
|
|
87
87
|
|
|
88
88
|
// Verify isolation
|
|
89
|
-
console.
|
|
90
|
-
console.
|
|
89
|
+
console.debug('User A name:', userAContext.state.user.name) // Alice
|
|
90
|
+
console.debug('User B name:', userBContext.state.user.name) // Bob
|
|
91
91
|
|
|
92
92
|
// Global state is separate
|
|
93
|
-
console.
|
|
94
|
-
console.
|
|
95
|
-
console.
|
|
93
|
+
console.debug('Global state:', state.appName) // 'My Server App'
|
|
94
|
+
console.debug('User A global secret:', userAContext.state.secret) // 'Alice secret data'
|
|
95
|
+
console.debug('User B global secret:', userBContext.state.secret) // 'Bob secret data'
|
|
96
96
|
|
|
97
97
|
// ============================================
|
|
98
98
|
// 5. EXPRESS.JS MIDDLEWARE EXAMPLE
|
|
99
99
|
// ============================================
|
|
100
100
|
|
|
101
|
-
console.
|
|
101
|
+
console.debug('\n=== 5. Express.js Middleware Example ===')
|
|
102
102
|
|
|
103
103
|
/*
|
|
104
104
|
// In a real Express app:
|
|
@@ -146,13 +146,13 @@ app.get('/api/user', (req, res) => {
|
|
|
146
146
|
app.listen(3000)
|
|
147
147
|
*/
|
|
148
148
|
|
|
149
|
-
console.
|
|
149
|
+
console.debug('See code comments for Express.js integration')
|
|
150
150
|
|
|
151
151
|
// ============================================
|
|
152
152
|
// 6. WEBSOCKET EXAMPLE
|
|
153
153
|
// ============================================
|
|
154
154
|
|
|
155
|
-
console.
|
|
155
|
+
console.debug('\n=== 6. WebSocket Example ===')
|
|
156
156
|
|
|
157
157
|
/*
|
|
158
158
|
// For WebSocket connections:
|
|
@@ -185,13 +185,13 @@ function handleConnection(ws, userId) {
|
|
|
185
185
|
}
|
|
186
186
|
*/
|
|
187
187
|
|
|
188
|
-
console.
|
|
188
|
+
console.debug('See code comments for WebSocket integration')
|
|
189
189
|
|
|
190
190
|
// ============================================
|
|
191
191
|
// 7. JOB QUEUE / WORKER EXAMPLE
|
|
192
192
|
// ============================================
|
|
193
193
|
|
|
194
|
-
console.
|
|
194
|
+
console.debug('\n=== 7. Job Queue Example ===')
|
|
195
195
|
|
|
196
196
|
/*
|
|
197
197
|
// For background jobs:
|
|
@@ -230,13 +230,13 @@ async function processJob(jobId, jobData) {
|
|
|
230
230
|
}
|
|
231
231
|
*/
|
|
232
232
|
|
|
233
|
-
console.
|
|
233
|
+
console.debug('See code comments for Job Queue integration')
|
|
234
234
|
|
|
235
235
|
// ============================================
|
|
236
236
|
// 8. CLI APPLICATION EXAMPLE
|
|
237
237
|
// ============================================
|
|
238
238
|
|
|
239
|
-
console.
|
|
239
|
+
console.debug('\n=== 8. CLI Application ===')
|
|
240
240
|
|
|
241
241
|
// Memorio works great in CLI apps too
|
|
242
242
|
state.command = 'build'
|
|
@@ -245,43 +245,43 @@ state.options = {
|
|
|
245
245
|
sourceMap: false
|
|
246
246
|
}
|
|
247
247
|
|
|
248
|
-
console.
|
|
249
|
-
console.
|
|
248
|
+
console.debug('Command:', state.command)
|
|
249
|
+
console.debug('Options:', state.options)
|
|
250
250
|
|
|
251
251
|
// ============================================
|
|
252
252
|
// 9. PLATFORM DETECTION
|
|
253
253
|
// ============================================
|
|
254
254
|
|
|
255
|
-
console.
|
|
255
|
+
console.debug('\n=== 9. Platform Detection ===')
|
|
256
256
|
|
|
257
257
|
const caps = memorio.getCapabilities()
|
|
258
|
-
console.
|
|
259
|
-
console.
|
|
260
|
-
console.
|
|
261
|
-
console.
|
|
262
|
-
console.
|
|
258
|
+
console.debug('Platform:', caps.platform)
|
|
259
|
+
console.debug('localStorage:', caps.hasLocalStorage ? '✅' : '❌')
|
|
260
|
+
console.debug('sessionStorage:', caps.hasSessionStorage ? '✅' : '❌')
|
|
261
|
+
console.debug('IndexedDB:', caps.hasIndexedDB ? '✅' : '❌')
|
|
262
|
+
console.debug('Session ID:', caps.sessionId.substring(0, 8) + '...')
|
|
263
263
|
|
|
264
264
|
// ============================================
|
|
265
265
|
// 10. CLEANUP
|
|
266
266
|
// ============================================
|
|
267
267
|
|
|
268
|
-
console.
|
|
268
|
+
console.debug('\n=== 10. Cleanup ===')
|
|
269
269
|
|
|
270
270
|
// List all contexts
|
|
271
|
-
console.
|
|
271
|
+
console.debug('Active contexts:', memorio.listContexts())
|
|
272
272
|
|
|
273
273
|
// Clean up when done
|
|
274
274
|
memorio.deleteContext('tenant-A')
|
|
275
275
|
memorio.deleteContext('tenant-B')
|
|
276
276
|
|
|
277
|
-
console.
|
|
277
|
+
console.debug('After cleanup:', memorio.listContexts())
|
|
278
278
|
|
|
279
279
|
// ============================================
|
|
280
280
|
// SUMMARY
|
|
281
281
|
// ============================================
|
|
282
282
|
|
|
283
|
-
console.
|
|
284
|
-
console.
|
|
283
|
+
console.debug('\n=== Summary ===')
|
|
284
|
+
console.debug(`
|
|
285
285
|
MEMORIO NODE.JS USAGE:
|
|
286
286
|
|
|
287
287
|
✅ WORKS:
|
|
@@ -305,4 +305,4 @@ MEMORIO NODE.JS USAGE:
|
|
|
305
305
|
5. Check isPersistent before relying on persistence
|
|
306
306
|
`)
|
|
307
307
|
|
|
308
|
-
console.
|
|
308
|
+
console.debug('\nNode.js example complete!')
|
package/examples/observer.ts
CHANGED
|
@@ -15,7 +15,7 @@ import 'memorio'
|
|
|
15
15
|
|
|
16
16
|
// Watch a single value
|
|
17
17
|
observer('state.counter', (newValue, oldValue) => {
|
|
18
|
-
console.
|
|
18
|
+
console.debug(`Counter: ${oldValue} → ${newValue}`)
|
|
19
19
|
})
|
|
20
20
|
|
|
21
21
|
state.counter = 0
|
|
@@ -28,7 +28,7 @@ state.counter = 2
|
|
|
28
28
|
|
|
29
29
|
// Watch entire objects
|
|
30
30
|
observer('state.user', (newUser, oldUser) => {
|
|
31
|
-
console.
|
|
31
|
+
console.debug(`User changed: ${oldUser?.name} → ${newUser?.name}`)
|
|
32
32
|
})
|
|
33
33
|
|
|
34
34
|
state.user = { name: 'Mario', level: 1 }
|
|
@@ -40,11 +40,11 @@ state.user = { name: 'Luigi', level: 2 }
|
|
|
40
40
|
|
|
41
41
|
// Multiple observers on same path
|
|
42
42
|
observer('state.notifications', (count) => {
|
|
43
|
-
console.
|
|
43
|
+
console.debug(`New notification count: ${count}`)
|
|
44
44
|
})
|
|
45
45
|
|
|
46
46
|
// List all observers
|
|
47
|
-
console.
|
|
47
|
+
console.debug('Active observers:', observer.list)
|
|
48
48
|
|
|
49
49
|
// ============================================
|
|
50
50
|
// CLEANUP
|
|
@@ -57,4 +57,4 @@ observer.remove('state.counter')
|
|
|
57
57
|
// observer.remove('state.counter')
|
|
58
58
|
// observer.remove('state.notifications')
|
|
59
59
|
|
|
60
|
-
console.
|
|
60
|
+
console.debug('Observer example complete!')
|
package/examples/platform.ts
CHANGED
|
@@ -15,43 +15,43 @@ import 'memorio'
|
|
|
15
15
|
// PLATFORM DETECTION
|
|
16
16
|
// ============================================
|
|
17
17
|
|
|
18
|
-
console.
|
|
19
|
-
console.
|
|
18
|
+
console.debug('=== Platform Detection ===')
|
|
19
|
+
console.debug('Memorio version:', memorio.version)
|
|
20
20
|
|
|
21
21
|
// Check which platform we're on
|
|
22
22
|
if (memorio.isBrowser()) {
|
|
23
|
-
console.
|
|
24
|
-
console.
|
|
25
|
-
console.
|
|
23
|
+
console.debug('Running in: Browser')
|
|
24
|
+
console.debug('store.isPersistent:', store.isPersistent) // true
|
|
25
|
+
console.debug('session.isPersistent:', session.isPersistent) // true
|
|
26
26
|
} else if (memorio.isNode()) {
|
|
27
|
-
console.
|
|
28
|
-
console.
|
|
29
|
-
console.
|
|
27
|
+
console.debug('Running in: Node.js')
|
|
28
|
+
console.debug('store.isPersistent:', store.isPersistent) // false (memory fallback)
|
|
29
|
+
console.debug('session.isPersistent:', session.isPersistent) // false (memory fallback)
|
|
30
30
|
} else if (memorio.isDeno()) {
|
|
31
|
-
console.
|
|
32
|
-
console.
|
|
33
|
-
console.
|
|
31
|
+
console.debug('Running in: Deno')
|
|
32
|
+
console.debug('store.isPersistent:', store.isPersistent) // false (memory fallback)
|
|
33
|
+
console.debug('session.isPersistent:', session.isPersistent) // false (memory fallback)
|
|
34
34
|
} else if (memorio.isEdge()) {
|
|
35
|
-
console.
|
|
36
|
-
console.
|
|
37
|
-
console.
|
|
35
|
+
console.debug('Running in: Edge Worker')
|
|
36
|
+
console.debug('store.isPersistent:', store.isPersistent) // true
|
|
37
|
+
console.debug('session.isPersistent:', session.isPersistent) // true
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
// Get detailed capabilities
|
|
41
41
|
const caps = memorio.getCapabilities()
|
|
42
|
-
console.
|
|
43
|
-
console.
|
|
44
|
-
console.
|
|
45
|
-
console.
|
|
46
|
-
console.
|
|
47
|
-
console.
|
|
42
|
+
console.debug('\nCapabilities:')
|
|
43
|
+
console.debug(' Platform:', caps.platform)
|
|
44
|
+
console.debug(' localStorage:', caps.hasLocalStorage ? '✅' : '❌')
|
|
45
|
+
console.debug(' sessionStorage:', caps.hasSessionStorage ? '✅' : '❌')
|
|
46
|
+
console.debug(' IndexedDB:', caps.hasIndexedDB ? '✅' : '❌')
|
|
47
|
+
console.debug(' Session ID:', caps.sessionId)
|
|
48
48
|
|
|
49
49
|
// ============================================
|
|
50
50
|
// CONTEXT ISOLATION (Server-Side)
|
|
51
51
|
// ============================================
|
|
52
52
|
|
|
53
|
-
console.
|
|
54
|
-
console.
|
|
53
|
+
console.debug('\n=== Context Isolation ===')
|
|
54
|
+
console.debug('Use memorio.createContext() for multi-tenant server applications')
|
|
55
55
|
|
|
56
56
|
// Example: Simulating different users/requests
|
|
57
57
|
// In a real app, you'd create a context per HTTP request
|
|
@@ -69,33 +69,33 @@ userBContext.store.set('preferences', { theme: 'light' })
|
|
|
69
69
|
userBContext.session.set('token', 'user-B-token')
|
|
70
70
|
|
|
71
71
|
// Verify isolation - each context has its own data
|
|
72
|
-
console.
|
|
73
|
-
console.
|
|
74
|
-
console.
|
|
75
|
-
console.
|
|
72
|
+
console.debug('\nUser A context:')
|
|
73
|
+
console.debug(' state.name:', userAContext.state.name) // 'Mario'
|
|
74
|
+
console.debug(' store.preferences:', userAContext.store.get('preferences')) // { theme: 'dark' }
|
|
75
|
+
console.debug(' session.token:', userAContext.session.get('token')) // 'user-A-token'
|
|
76
76
|
|
|
77
|
-
console.
|
|
78
|
-
console.
|
|
79
|
-
console.
|
|
80
|
-
console.
|
|
77
|
+
console.debug('\nUser B context:')
|
|
78
|
+
console.debug(' state.name:', userBContext.state.name) // 'Luigi'
|
|
79
|
+
console.debug(' store.preferences:', userBContext.store.get('preferences')) // { theme: 'light' }
|
|
80
|
+
console.debug(' session.token:', userBContext.session.get('token')) // 'user-B-token'
|
|
81
81
|
|
|
82
82
|
// Global state is separate from contexts
|
|
83
|
-
console.
|
|
84
|
-
console.
|
|
83
|
+
console.debug('\nGlobal state (not affected by contexts):')
|
|
84
|
+
console.debug(' state.name:', state.name) // undefined
|
|
85
85
|
|
|
86
86
|
// List all contexts
|
|
87
|
-
console.
|
|
87
|
+
console.debug('\nActive contexts:', memorio.listContexts()) // ['user-A', 'user-B']
|
|
88
88
|
|
|
89
89
|
// Cleanup - delete a context when done
|
|
90
90
|
memorio.deleteContext('user-A')
|
|
91
|
-
console.
|
|
91
|
+
console.debug('After deleting user-A:', memorio.listContexts()) // ['user-B']
|
|
92
92
|
|
|
93
93
|
// ============================================
|
|
94
94
|
// USE CASE: EXPRESS/FASTIFY MIDDLEWARE EXAMPLE
|
|
95
95
|
// ============================================
|
|
96
96
|
|
|
97
|
-
console.
|
|
98
|
-
console.
|
|
97
|
+
console.debug('\n=== Server Use Case ===')
|
|
98
|
+
console.debug(`
|
|
99
99
|
// Example: Express middleware for request isolation
|
|
100
100
|
app.use((req, res, next) => {
|
|
101
101
|
// Create isolated context per request
|
|
@@ -112,4 +112,4 @@ app.get('/user', (req, res) => {
|
|
|
112
112
|
})
|
|
113
113
|
`)
|
|
114
114
|
|
|
115
|
-
console.
|
|
115
|
+
console.debug('\nPlatform & Context example complete!')
|
package/examples/react-app.tsx
CHANGED
|
@@ -281,7 +281,7 @@ function App() {
|
|
|
281
281
|
// Check for returning user
|
|
282
282
|
const lastUser = store.get('lastUser')
|
|
283
283
|
if (lastUser) {
|
|
284
|
-
console.
|
|
284
|
+
console.debug('Welcome back,', lastUser)
|
|
285
285
|
}
|
|
286
286
|
}, [])
|
|
287
287
|
|
|
@@ -334,12 +334,12 @@ MEMORIO REACT USAGE GUIDE:
|
|
|
334
334
|
|
|
335
335
|
4. REACT TO CHANGES:
|
|
336
336
|
useObserver(() => {
|
|
337
|
-
console.
|
|
337
|
+
console.debug('State changed!')
|
|
338
338
|
}, [state.user])
|
|
339
339
|
|
|
340
340
|
5. AUTO-DISCOVERY (watch all):
|
|
341
341
|
useObserver(() => {
|
|
342
|
-
console.
|
|
342
|
+
console.debug(state.user, state.theme)
|
|
343
343
|
})
|
|
344
344
|
|
|
345
345
|
6. PERSIST DATA:
|