Skip to content

Commit 579a2ac

Browse files
committed
Updating to version 1.5.1
1 parent 0c5c992 commit 579a2ac

File tree

8 files changed

+116
-66
lines changed

8 files changed

+116
-66
lines changed

JSDOC.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# offline-persistence-toolkit 1.4.9 #
1+
# offline-persistence-toolkit 1.5.1 #
22

33
## Introduction ##
44

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# offline-persistence-toolkit 1.4.9 #
1+
# offline-persistence-toolkit 1.5.1 #
22

33
offline-persistence-toolkit is a client-side JavaScript library that provides caching and offline support at the HTTP request layer. This support is transparent to the user and is done through the Fetch API and an XHR adapter. HTTP requests made while the client device is offline are captured for replay when connection to the server is restored. Additional capabilities include a persistent storage layer, synchronization manager, binary data support and various configuration APIs for customizing the default behavior. This framework can be used in both ServiceWorker and non-ServiceWorker contexts within web and hybrid mobile apps.
44

@@ -58,16 +58,16 @@ If your app uses [RequireJS](http://www.requirejs.org/ "RequireJS"), update the
5858
```javascript
5959
requirejs.config({
6060
paths: {
61-
'persist' : 'js/libs/persist/v1.4.9/min'
61+
'persist' : 'js/libs/persist/v1.5.1/min'
6262

6363
// Other path mappings here
6464
}
6565
```
66-
For Oracle JET apps, also open `appDir/src/js/main-release-paths.json` and add the `'persist' : 'js/libs/persist/v1.4.9/min'` entry to the list of paths.
66+
For Oracle JET apps, also open `appDir/src/js/main-release-paths.json` and add the `'persist' : 'js/libs/persist/v1.5.1/min'` entry to the list of paths.
6767
6868
You can choose the name of the paths prefix. That is, you can use a different value to the ‘persist’ value shown in the examples.
6969
70-
It is recommended to add the version number as a convention in your application build step such as `'persist' : 'js/libs/persist/v1.4.9/min'`.
70+
It is recommended to add the version number as a convention in your application build step such as `'persist' : 'js/libs/persist/v1.5.1/min'`.
7171
7272
Versions of the toolkit are also available on CDN under the latest JET release. e.g.
7373
@@ -91,7 +91,7 @@ And again, if you are using RequireJS, you will need to map paths for these pack
9191
paths: {
9292
'pouchdb': 'js/libs/pouchdb-7.0.0',
9393
'pouchfind': 'js/libs/pouchdb.find',
94-
'persist' : 'js/libs/persist/v1.4.9/min'
94+
'persist' : 'js/libs/persist/v1.5.1/min'
9595

9696
// Other path mappings here
9797
}

USAGE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# offline-persistence-toolkit 1.4.9 #
1+
# offline-persistence-toolkit 1.5.1 #
22

33
# Introduction #
44

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@oracle/offline-persistence-toolkit",
33
"title": "Offline Persistence Toolkit",
4-
"version": "1.4.9",
4+
"version": "1.5.1",
55
"description": "Offline Persistence Toolkit by Oracle Corp.",
66
"author": "oraclejet",
77
"license": "UPL-1.0",

src/impl/OfflineCache.js

Lines changed: 68 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -36,20 +36,16 @@ define(["./defaultCacheHandler", "../persistenceStoreManager", "../persistenceUt
3636

3737
this._name = name;
3838
this._storeName = storeName;
39+
// the names of all the shredded stores associated
40+
// with this cache. We need them when clear() is
41+
// called since we need to clear all the shredded
42+
// stores as well.
43+
this._shreddedNamesStoreName = this._storeName + '_OPT_INT_SHRED_STORE_NAMES_';
3944
this._store = null;
4045

4146
// in-memory cache of all the keys in the store, for quick lookup.
4247
this._cacheKeys = [];
4348
this._createStorePromise;
44-
45-
// the names of all the shredded stores associated
46-
// with this cache. We need them when clear() is
47-
// called since we need to clear all the shredded
48-
// stores as well.
49-
Object.defineProperty(this, '_STORE_NAMES_', {
50-
value: '_OPT_INT_SHRED_STORE_NAMES_',
51-
writable: false
52-
});
5349
}
5450

5551
/**
@@ -312,6 +308,29 @@ define(["./defaultCacheHandler", "../persistenceStoreManager", "../persistenceUt
312308
}
313309
}
314310

311+
/**
312+
* Return the persistent store.
313+
* @returns {Object} The persistent store.
314+
*/
315+
OfflineCache.prototype._getShreddedNamesStore = function () {
316+
var self = this;
317+
if (self._shreddedNamesStore) {
318+
return Promise.resolve(self._shreddedNamesStore);
319+
}
320+
if (self._createShreddedNamesStorePromise) {
321+
return self._createShreddedNamesStorePromise;
322+
} else {
323+
self._createShreddedNamesStorePromise = persistenceStoreManager.openStore(self._shreddedNamesStoreName, {
324+
index: ["metadata.baseUrl", "metadata.url", "metadata.created"],
325+
skipMetadata: true
326+
}).then(function (store) {
327+
self._shreddedNamesStore = store;
328+
return self._shreddedNamesStore;
329+
});
330+
return self._createShreddedNamesStorePromise;
331+
}
332+
}
333+
315334
/**
316335
* Perform vary header check and return the first match among all the
317336
* cacheEntries.
@@ -493,16 +512,18 @@ define(["./defaultCacheHandler", "../persistenceStoreManager", "../persistenceUt
493512
cacheKey = null;
494513
return;
495514
}
496-
self._updateShreddedStoreNames(shreddedPayload.map(function(entry) {
497-
return entry.name;
498-
}));
499515
var storePromises = [];
500516
requestResponsePair.value.responseData.bodyAbstract = _buildBodyAbstract(shreddedPayload);
501517
storePromises.push(cacheStore.upsert(requestResponsePair.key,
502518
requestResponsePair.metadata,
503519
requestResponsePair.value));
504520
storePromises.push(cacheHandler.cacheShreddedData(shreddedPayload));
505-
return Promise.all(storePromises);
521+
522+
return self._updateShreddedStoreNames(shreddedPayload.map(function(entry) {
523+
return entry.name;
524+
})).then(function() {
525+
return Promise.all(storePromises);
526+
});
506527
});
507528
}
508529
}).then(function() {
@@ -515,41 +536,33 @@ define(["./defaultCacheHandler", "../persistenceStoreManager", "../persistenceUt
515536
};
516537

517538
OfflineCache.prototype._updateShreddedStoreNames = function (storeNames) {
518-
if (!storeNames) {
519-
localStorage.setItem(this._STORE_NAMES_, "");
520-
return;
521-
}
522-
var storeageData = localStorage.getItem(this._STORE_NAMES_);
523-
if (!storeageData) {
524-
storeageData = JSON.stringify(storeNames);
525-
} else {
526-
var existingStoreNames;
527-
try {
528-
existingStoreNames = JSON.parse(storeageData);
529-
} catch(exc) {
530-
existingStoreNames = [];
539+
return this._getShreddedNamesStore().then(function(store) {
540+
if (!storeNames) {
541+
return store.delete();
542+
} else {
543+
return store.keys().then(function(keys) {
544+
var keysToAdd = [];
545+
storeNames.forEach(function(storeName) {
546+
if (keys.indexOf(storeName) < 0) {
547+
keysToAdd.push(storeName);
548+
}
549+
});
550+
if (keysToAdd.length > 0) {
551+
var rowsToAdd = [];
552+
keysToAdd.forEach(function(key) {
553+
rowsToAdd.push({key: key, metadata: {}, value: {}});
554+
});
555+
return store.upsertAll(rowsToAdd);
556+
}
557+
});
531558
}
532-
storeNames.forEach(function (storeName) {
533-
if (existingStoreNames.indexOf(storeName) < 0) {
534-
existingStoreNames.push(storeName);
535-
}
536-
});
537-
storeageData = JSON.stringify(existingStoreNames);
538-
}
539-
localStorage.setItem(this._STORE_NAMES_, storeageData);
559+
});
540560
};
541561

542562
OfflineCache.prototype._getShreddedStoreNames = function () {
543-
var storeNames = [];
544-
var storeageData = localStorage.getItem(this._STORE_NAMES_);
545-
if (storeageData) {
546-
try {
547-
storeNames = JSON.parse(storeageData);
548-
} catch (exc) {
549-
logger.log("error getting shredded store names from localStorage");
550-
}
551-
}
552-
return storeNames;
563+
return this._getShreddedNamesStore().then(function(store) {
564+
return store.keys();
565+
});
553566
};
554567

555568
function _buildBodyAbstract (shreddedPayload) {
@@ -796,15 +809,17 @@ define(["./defaultCacheHandler", "../persistenceStoreManager", "../persistenceUt
796809
return self._getStore().then(function(cacheStore) {
797810
var deletePromiseArray = [];
798811
deletePromiseArray.push(cacheStore.delete());
799-
var storeNames = self._getShreddedStoreNames();
800-
storeNames.forEach(function(storeName) {
801-
deletePromiseArray.push(persistenceStoreManager.deleteStore(storeName));
802-
return;
803-
});
804-
return Promise.all(deletePromiseArray).then(function(results) {
805-
self._updateShreddedStoreNames(null);
806-
self._cacheKeys = [];
807-
return true;
812+
return self._getShreddedStoreNames().then(function(storeNames) {
813+
storeNames.forEach(function(storeName) {
814+
deletePromiseArray.push(persistenceStoreManager.deleteStore(storeName));
815+
return;
816+
});
817+
return Promise.all(deletePromiseArray).then(function(results) {
818+
return self._updateShreddedStoreNames(null);
819+
}).then(function() {
820+
self._cacheKeys = [];
821+
return true;
822+
});
808823
});
809824
}).catch(function(error) {
810825
logger.log("Offline Persistence Toolkit OfflineCache: clear() error");

src/persistenceManager.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,9 @@ define(['./impl/PersistenceXMLHttpRequest', './impl/PersistenceSyncManager', './
408408
// save off the browser fetch and XHR only in browser context.
409409
// also add listeners for browser online
410410
// Don't do it for Service Workers
411-
if (_isSafari()) {
411+
if (_isSafari() &&
412+
!persistenceManager._browserRequestConstructor &&
413+
!persistenceManager._persistenceRequestConstructor) {
412414
logger.log("Offline Persistence Toolkit PersistenceManager: Replacing Safari Browser APIs");
413415
// using self to refer to both the "window" and the "self" context
414416
// of serviceworker
@@ -421,7 +423,8 @@ define(['./impl/PersistenceXMLHttpRequest', './impl/PersistenceSyncManager', './
421423
writable: false
422424
});
423425
self['Request'] = persistenceManager._persistenceRequestConstructor;
424-
if (!_isBrowserContext()) {
426+
if (!_isBrowserContext() &&
427+
!persistenceManager._browserFetchFunc) {
425428
// replace serviceWorker's fetch with this wrapper to unwrap safari request in sw
426429
Object.defineProperty(persistenceManager, '_browserFetchFunc', {
427430
value: self.fetch,

src/queryHandlers.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -329,9 +329,9 @@ define(['./persistenceManager', './persistenceStoreManager', './persistenceUtils
329329
};
330330
break;
331331
case 'LIKE':
332-
rhsOp = rhsOp.replace('%', '.+');
332+
rhsOp = rhsOp.replace(/%/g, '.*');
333333
returnExp[lhsOp] = {
334-
$regex: rhsOp
334+
$regex: RegExp(rhsOp,'i')
335335
};
336336
break;
337337
case 'BETWEEN':

test/queryHandlers/test.js

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ define(['persist/persistenceManager', 'persist/defaultResponseProxy', 'persist/q
143143
});
144144
QUnit.test('getOracleRestQueryHandler', function (assert) {
145145
var done = assert.async();
146-
assert.expect(84);
146+
assert.expect(96);
147147
mockFetch.addRequestReply('GET', '/testOracleRestQuery/556', {
148148
status: 200,
149149
body: JSON.stringify({DepartmentId: 556, DepartmentName: 'BB', establishedDate: '2010-01-01T08:30:40Z', LocationId: 200, ManagerId: 300})
@@ -254,6 +254,38 @@ define(['persist/persistenceManager', 'persist/defaultResponseProxy', 'persist/q
254254
return response.json();
255255
}).then(function (responseData) {
256256
assert.ok(responseData.items.length == 1 && responseData.items[0].DepartmentName == 'BB', 'Returned the correct department');
257+
return fetch("/testOracleRestQuery?q=DepartmentName%20LIKE%20%27BB%25%27&offset=0&limit=10");
258+
}).then(function (response) {
259+
assert.ok(true, 'Received Response when offline');
260+
return response.json();
261+
}).then(function (responseData) {
262+
assert.ok(responseData.items.length == 1 && responseData.items[0].DepartmentName == 'BB', 'Returned the correct department');
263+
return fetch("/testOracleRestQuery?q=DepartmentName%20LIKE%20%27aDmInIsTrAtIoN%25%27&offset=0&limit=10");
264+
}).then(function (response) {
265+
assert.ok(true, 'Received Response when offline');
266+
return response.json();
267+
}).then(function (responseData) {
268+
assert.ok(responseData.items.length == 1 && responseData.items[0].DepartmentName == 'Administration', 'Returned the correct department');
269+
return fetch("/testOracleRestQuery?q=DepartmentName%20LIKE%20%27rAtIoN%25%27&offset=0&limit=10");
270+
}).then(function (response) {
271+
assert.ok(true, 'Received Response when offline');
272+
return response.json();
273+
}).then(function (responseData) {
274+
assert.ok(responseData.items.length == 1 && responseData.items[0].DepartmentName == 'Administration', 'Returned the correct department');
275+
return fetch("/testOracleRestQuery?q=DepartmentName%20LIKE%20%27aDmInIs%25%27&offset=0&limit=10");
276+
}).then(function (response) {
277+
assert.ok(true, 'Received Response when offline');
278+
return response.json();
279+
}).then(function (responseData) {
280+
assert.ok(responseData.items.length == 1 && responseData.items[0].DepartmentName == 'Administration', 'Returned the correct department');
281+
return fetch("/testOracleRestQuery?q=DepartmentName%20LIKE%20%27aD%25%27&offset=0&limit=10");
282+
}).then(function (response) {
283+
assert.ok(true, 'Received Response when offline');
284+
return response.json();
285+
}).then(function (responseData) {
286+
assert.ok(responseData.items.length == 2 , 'Returned the correct department');
287+
assert.ok(responseData.items[0].DepartmentName == 'Administration' || responseData.items[1].DepartmentName == 'Administration', 'Returned the correct department');
288+
assert.ok(responseData.items[1].DepartmentName == 'ADFPM 1001 neverending' || responseData.items[0].DepartmentName == 'ADFPM 1001 neverending', 'Returned the correct department');
257289
return fetch("/testOracleRestQuery?q=DepartmentId%20BETWEEN%2010%20AND%201001&offset=0&limit=10");
258290
}).then(function (response) {
259291
assert.ok(true, 'Received Response when offline');

0 commit comments

Comments
 (0)