Skip to content

Commit

Permalink
feat: init
Browse files Browse the repository at this point in the history
  • Loading branch information
productdevbook committed Mar 6, 2023
1 parent 4d6197d commit ce7698c
Show file tree
Hide file tree
Showing 7 changed files with 614 additions and 21 deletions.
37 changes: 32 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,11 +1,24 @@
{
"name": "ts-bundle-template",
"name": "urql-storage-capacitor",
"version": "1.0.0",
"description": "add description",
"keywords": [
"add keywords"
"urql",
"graphql client",
"graphql",
"exchanges",
"capacitor",
"offline",
"storage"
],
"author": "add author",
"homepage": "https://github.com/productdevbookcom/urql-storage-capacitor",
"bugs": "https://github.com/productdevbookcom/urql-storage-capacitor/issues",
"author": "Mehmet ",
"repository": {
"type": "git",
"url": "https://github.com/productdevbookcom/urql-storage-capacitor.git"
},
"funding": "https://github.com/sponsors/productdevbook",
"engines": {
"node": ">=16"
},
Expand All @@ -21,7 +34,9 @@
"module": "./dist/index.mjs",
"types": "./dist/index.d.ts",
"files": [
"dist"
"dist",
"LICENSE",
"README.md"
],
"scripts": {
"build": "tsup --dts",
Expand All @@ -33,15 +48,27 @@
"test": "vitest",
"test:watch": "vitest --watch"
},
"license": "ISC",
"license": "MIT",
"peerDependencies": {
"@capacitor/core": ">=4.0.0",
"@capacitor/network": ">=4.0.0",
"@capacitor/preferences": ">=4.0.0",
"@urql/exchange-graphcache": ">=5.0.0"
},
"devDependencies": {
"@antfu/eslint-config": "^0.36.0",
"@capacitor/network": "^4.1.0",
"@capacitor/preferences": "^4.0.2",
"@urql/exchange-graphcache": "^5.0.9",
"@vitest/coverage-c8": "^0.29.2",
"bumpp": "^9.0.0",
"eslint": "^8.35.0",
"tsup": "^6.6.3",
"typescript": "^4.9.5",
"vite": "^4.1.4",
"vitest": "^0.29.2"
},
"publishConfig": {
"access": "public"
}
}
39 changes: 39 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 1 addition & 7 deletions src/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1 @@
export function handler(event: any, context: any, callback: any) {
console.log('Hello World')
callback(null, {
statusCode: 200,
body: 'Hello World',
})
}
export { makeAsyncStorage } from './makeAsyncStorage';
136 changes: 136 additions & 0 deletions src/makeAsyncStorage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
import { StorageAdapter } from '@urql/exchange-graphcache';
import { Preferences } from '@capacitor/preferences';
import { Network } from '@capacitor/network';

export interface StorageOptions {
dataKey?: string;
metadataKey?: string;
maxAge?: number; // Number of days
}

const parseData = (persistedData: any, fallback: any) => {
try {
if (persistedData) return JSON.parse(persistedData);
} catch (_err) {}

return fallback;
};

let disconnect: any = null;

export interface DefaultAsyncStorage extends StorageAdapter {
clear(): Promise<any>;
}

export const makeAsyncStorage: (
ops?: StorageOptions
) => DefaultAsyncStorage = ({
dataKey = 'graphcache-data',
metadataKey = 'graphcache-metadata',
maxAge = 7,
} = {}) => {
const todayDayStamp = Math.floor(
new Date().valueOf() / (1000 * 60 * 60 * 24)
);
let allData = {} as any;

return {
readData: async () => {
if (!Object.keys(allData).length) {
let persistedData: string | null = null;
try {
persistedData = (await Preferences.get({ key: dataKey })) as any;
} catch (_err) {}
const parsed = parseData(persistedData, {});

Object.assign(allData, parsed);
}

// clean up old data
let syncNeeded = false;
Object.keys(allData).forEach((dayStamp: any) => {
if (todayDayStamp - Number(dayStamp) > maxAge) {
syncNeeded = true;
delete allData[dayStamp];
}
});

if (syncNeeded) {
try {
await Preferences.set({
key: dataKey,
value: JSON.stringify(allData),
});
} catch (_err) {}
}

return Object.assign(
{},
...Object.keys(allData).map(key => allData[key])
);
},

writeData: async delta => {
if (!Object.keys(allData).length) {
let persistedData: string | null = null;
try {
persistedData = (await Preferences.get({ key: dataKey })) as any;
} catch (_err) {}
const parsed = parseData(persistedData, {});
Object.assign(allData, parsed);
}

const deletedKeys = {} as any;
Object.keys(delta).forEach(key => {
if (delta[key] === undefined) deletedKeys[key] = undefined;
});

for (const key in allData)
allData[key] = Object.assign(allData[key], deletedKeys);

allData[todayDayStamp] = Object.assign(
allData[todayDayStamp] || {},
delta
);

try {
await Preferences.set({ key: dataKey, value: JSON.stringify(allData) });
} catch (_err) {}
},

writeMetadata: async data => {
try {
await Preferences.set({
key: metadataKey,
value: JSON.stringify(data),
});
} catch (_err) {}
},

readMetadata: async () => {
let persistedData: string | null = null;
try {
persistedData = (await Preferences.get({ key: metadataKey })) as any;
} catch (_err) {}
return parseData(persistedData, []);
},

onOnline: cb => {
if (disconnect) {
disconnect();
disconnect = undefined;
}
disconnect = Network.addListener('networkStatusChange', status => {
if (status.connected) cb();
});
},

clear: async () => {
try {
allData = {};
await Preferences.remove({ key: dataKey });
await Preferences.remove({ key: metadataKey });
} catch (_err) {}
},
};
};
8 changes: 0 additions & 8 deletions test/example.test.ts

This file was deleted.

Loading

0 comments on commit ce7698c

Please sign in to comment.