angular2-service-worker
Advanced tools
Comparing version 0.1.3 to 0.1.4
{ | ||
"name": "angular2-service-worker", | ||
"version": "0.1.3", | ||
"version": "0.1.4", | ||
"description": "Experimental service worker by the Angular Mobile team", | ||
@@ -5,0 +5,0 @@ "main": "dist/generator/index.js", |
import 'reflect-metadata'; | ||
import {Injectable, Injector, provide} from 'angular2/core'; | ||
import {Injectable, Injector, provide} from 'angular2/src/core/di'; | ||
import {SW_PROVIDERS, WorkerScope, WorkerAdapter} from './index'; | ||
import {ServiceWorker} from './worker'; | ||
import './rxjs'; | ||
@@ -22,4 +23,2 @@ | ||
console.log('ngsw: initializing...'); | ||
Injector.resolveAndCreate([ | ||
@@ -29,4 +28,2 @@ SW_PROVIDERS, | ||
provide(WorkerScope, {useValue: (typeof self !== 'undefined') ? self : global}) | ||
]).get(ServiceWorker); | ||
console.log('ngsw: worker created.'); | ||
]).get(ServiceWorker); |
@@ -1,3 +0,3 @@ | ||
import {Injectable} from 'angular2/core'; | ||
import {Observable} from 'rxjs/Rx'; | ||
import {Injectable} from 'angular2/src/core/di'; | ||
import {Observable} from 'rxjs/Observable'; | ||
@@ -4,0 +4,0 @@ import {WorkerScope, WorkerAdapter} from './context'; |
@@ -1,3 +0,3 @@ | ||
import {Injectable} from 'angular2/core'; | ||
import {Observable} from 'rxjs/Rx'; | ||
import {Injectable} from 'angular2/src/core/di'; | ||
import {Observable} from 'rxjs/Observable'; | ||
@@ -4,0 +4,0 @@ /** |
@@ -1,3 +0,3 @@ | ||
import {Injectable} from 'angular2/core'; | ||
import {Observable} from 'rxjs/Rx'; | ||
import {Injectable} from 'angular2/src/core/di'; | ||
import {Observable} from 'rxjs/Observable'; | ||
import {WorkerScope, WorkerAdapter} from './context'; | ||
@@ -12,3 +12,2 @@ import {timeoutTo} from './operator'; | ||
request(req: Request, timeout: number = null): Observable<Response> { | ||
console.log(`ngsw: outgoing fetch(${req.method}, ${req.url})`); | ||
let result: Observable<Response> = Observable.defer(() => Observable | ||
@@ -15,0 +14,0 @@ .fromPromise<Response>(this |
@@ -1,3 +0,1 @@ | ||
import {provide} from 'angular2/core'; | ||
import {WorkerScope, Events} from './context'; | ||
@@ -9,2 +7,4 @@ import {ManifestParser} from './manifest'; | ||
import './rxjs'; | ||
export * from './cache'; | ||
@@ -11,0 +11,0 @@ export * from './context'; |
import 'reflect-metadata'; | ||
import {ManifestParser, ManifestEntry} from '../src/manifest'; | ||
/* | ||
import {ManifestParser, ManifestEntry, ManifestEntryMap} from '../src/manifest'; | ||
const SIMPLE_MANIFEST = `CACHE MANIFEST | ||
@@ -27,12 +27,6 @@ /test/url/alpha | ||
function urls(entries: ManifestEntry[]): string[] { | ||
return entries.map(entry => entry.url); | ||
function urls(entries: ManifestEntryMap): string[] { | ||
return Object.keys(entries); | ||
} | ||
function grouped(name: string, entries: ManifestEntry[]): ManifestEntry[] { | ||
return entries.filter(entry => | ||
entry.groupMetadata.hasOwnProperty('group') && | ||
entry.groupMetadata['group'] == name); | ||
} | ||
describe('ManifestParser', () => { | ||
@@ -45,3 +39,3 @@ let parser: ManifestParser; | ||
let manifest = parser.parse(SIMPLE_MANIFEST); | ||
expect(urls(manifest.cache)).toEqual([ | ||
expect(urls(manifest.group['default'].cache)).toEqual([ | ||
'/test/url/alpha', | ||
@@ -53,19 +47,19 @@ '/test/url/beta' | ||
let manifest = parser.parse(FULL_MANIFEST); | ||
expect(urls(manifest.cache)).toEqual([ | ||
let defaultGroup = manifest.group['default']; | ||
expect(urls(defaultGroup.cache)).toEqual([ | ||
'/default', | ||
'/cached' | ||
]); | ||
expect(urls(manifest.network)).toEqual(['*']); | ||
expect(urls(manifest.fallback)).toEqual(['/from']); | ||
expect(manifest.fallback.map(entry => entry.fallbackTo)).toEqual(['/to']); | ||
expect(urls(defaultGroup.network)).toEqual(['*']); | ||
expect(urls(defaultGroup.fallback)).toEqual(['/from']); | ||
expect(Object.keys(defaultGroup.fallback).map(url => defaultGroup.fallback[url].fallbackTo)).toEqual(['/to']); | ||
}); | ||
it('splits files into groups when requested', () => { | ||
let manifest = parser.parse(BUNDLED_MANIFEST); | ||
let alphaEntries = grouped('alpha', manifest.cache); | ||
let betaEntries = grouped('beta', manifest.cache); | ||
expect(urls(alphaEntries)).toEqual([ | ||
let defaultGroup = manifest.group['default']; | ||
expect(urls(manifest.group['alpha'].cache)).toEqual([ | ||
'/alpha/a', | ||
'/alpha/b' | ||
]); | ||
expect(urls(betaEntries)).toEqual([ | ||
expect(urls(manifest.group['beta'].cache)).toEqual([ | ||
'/beta/a', | ||
@@ -76,2 +70,1 @@ '/beta/b' | ||
}); | ||
*/ |
@@ -1,2 +0,2 @@ | ||
import {Injectable} from 'angular2/core'; | ||
import {Injectable} from 'angular2/src/core/di'; | ||
import {stringStartsWith} from './builtins'; | ||
@@ -108,3 +108,3 @@ import {SHA1} from 'jshashes'; | ||
files.sort(); | ||
group.version = (new SHA1()).hex(files.join('::')); | ||
@@ -111,0 +111,0 @@ } |
@@ -1,2 +0,2 @@ | ||
import {Observable} from 'rxjs/Rx'; | ||
import {Observable} from 'rxjs/Observable'; | ||
@@ -3,0 +3,0 @@ export function extractBody(obs: Observable<Response>): Observable<string> { |
@@ -1,2 +0,2 @@ | ||
import {Observable} from 'rxjs/Rx'; | ||
import {Observable} from 'rxjs/Observable'; | ||
@@ -125,3 +125,3 @@ import {Manifest, ManifestEntry, ManifestParser, ManifestDelta, GroupDelta, ManifestGroup} from './manifest'; | ||
.map((key: string) => delta.current.group[key]) | ||
.flatMap<any>((group: ManifestGroup) => { | ||
.mergeMap<any>((group: ManifestGroup) => { | ||
// Process groups individually, in parallel. | ||
@@ -136,3 +136,3 @@ // Check whether this specific group has an entry in the previous manifest. | ||
.map((key: string) => group.cache[key]) | ||
.flatMap<SetupInstruction>(entry => { | ||
.mergeMap<SetupInstruction>(entry => { | ||
// Default is to fetch from the network. | ||
@@ -149,6 +149,6 @@ let action: SetupInstruction = new FetchFromNetworkInstruction(entry.url, cacheFor(group)); | ||
} | ||
// Return instructions, which will be flatMap'd and executed. | ||
// Return instructions, which will be mergeMap'd and executed. | ||
return Observable.of<SetupInstruction>(action); | ||
}) | ||
.flatMap<any>(action => action.execute(cache, fetch)); | ||
.mergeMap<any>(action => action.execute(cache, fetch)); | ||
}) | ||
@@ -160,7 +160,6 @@ )) | ||
export function cleanupCaches(cache: CacheManager): any { | ||
/* | ||
return ((obs: Observable<ManifestDelta>): Observable<ManifestDelta> => obs | ||
.let<ManifestDelta>(doAsync((delta: ManifestDelta) => Observable | ||
.from(Object.keys(delta.previous.group)) | ||
.map((name: string) => { | ||
.mergeMap((name: string) => { | ||
let prevCache = cacheFor(delta.previous.group[name]); | ||
@@ -176,5 +175,4 @@ let currCache = ''; | ||
}) | ||
.ignoreElements() | ||
))); | ||
*/ | ||
return () => Observable.empty(); | ||
} | ||
} |
@@ -33,4 +33,22 @@ import {ServiceWorker, CACHE_INSTALLING, CACHE_ACTIVE, MANIFEST_URL} from './worker'; | ||
/hello.txt | ||
` | ||
`; | ||
const BUNDLE_MANIFEST_1 = `CACHE MANIFEST | ||
# sw.group: hello | ||
# sw.group.version: 12345 | ||
/hello.txt | ||
# sw.group: goodbye | ||
# sw.group.version: 67890 | ||
/goodbye.txt | ||
`; | ||
const BUNDLE_MANIFEST_2 = `CACHE MANIFEST | ||
# sw.group: hello | ||
# sw.group.version: 54321 | ||
/hello.txt | ||
# sw.group: goodbye | ||
# sw.group.version: 67890 | ||
/goodbye.txt | ||
`; | ||
function errored(err, done) { | ||
@@ -150,3 +168,47 @@ fail(err); | ||
.then(done, err => errored(err, done))); | ||
then('deletes old caches', done => Promise | ||
.resolve(null) | ||
.then(() => driver.caches.keys()) | ||
.then(keys => expect(keys.length).toBe(3)) | ||
.then(done, err => errored(err, done))); | ||
}); | ||
sequence('upgrade without hashes', () => { | ||
let driver: TestWorkerDriver = new TestWorkerDriver(ServiceWorker); | ||
beforeAll(done => { | ||
driver.mockUrl(MANIFEST_URL, BUNDLE_MANIFEST_1); | ||
driver.mockUrl('/hello.txt', 'Hello world!'); | ||
driver.mockUrl('/goodbye.txt', 'Goodbye world!'); | ||
driver | ||
.triggerInstall() | ||
.then(() => driver.unmockAll()) | ||
.then(() => driver.triggerActivate()) | ||
.then(done, err => errored(err, done)); | ||
}); | ||
it('successfully activates', done => Promise | ||
.resolve(null) | ||
.then(() => expectServed(driver, '/hello.txt', 'Hello world!')) | ||
.then(() => expectServed(driver, '/goodbye.txt', 'Goodbye world!')) | ||
.then(done, err => errored(err, done))); | ||
then('upgrades to new manifest', done => { | ||
driver.refresh(); | ||
driver.mockUrl(MANIFEST_URL, BUNDLE_MANIFEST_2); | ||
driver.mockUrl('/hello.txt', 'Hola mundo!'); | ||
driver.mockUrl('/goodbye.txt', 'Should not be reloaded from the server'); | ||
driver | ||
.triggerInstall() | ||
.then(() => driver.unmockAll()) | ||
.then(() => driver.triggerActivate()) | ||
.then(done, err => errored(err, done)); | ||
}); | ||
then('refreshes only the hello page', done => Promise | ||
.resolve(null) | ||
.then(() => expectServed(driver, '/hello.txt', 'Hola mundo!')) | ||
.then(() => expectServed(driver, '/goodbye.txt', 'Goodbye world!')) | ||
.then(done, err => errored(err, done))); | ||
then('deletes old caches', done => Promise | ||
.resolve(null) | ||
.then(() => driver.caches.keys()) | ||
.then(keys => expect(keys.length).toBe(4)) | ||
.then(done, err => errored(err, done))); | ||
}) | ||
sequence('dev mode', () => { | ||
@@ -153,0 +215,0 @@ let driver: TestWorkerDriver = new TestWorkerDriver(ServiceWorker); |
@@ -1,3 +0,3 @@ | ||
import {Injectable} from 'angular2/core'; | ||
import {Observable} from 'rxjs/Rx'; | ||
import {Injectable} from 'angular2/src/core/di'; | ||
import {Observable} from 'rxjs/Observable'; | ||
import {Events, InstallEvent, FetchEvent, WorkerAdapter} from './context'; | ||
@@ -30,4 +30,3 @@ import {Manifest, ManifestEntry, FallbackManifestEntry, ManifestGroup, ManifestParser, ManifestDelta} from './manifest'; | ||
execute(sw: ServiceWorker): Observable<Response> { | ||
return sw.cache.load(this.cache, this.request) | ||
.do(resp => console.log(`ngsw: fetch from cache: ${this.cache} got ${resp}`)); | ||
return sw.cache.load(this.cache, this.request); | ||
} | ||
@@ -160,3 +159,3 @@ | ||
.checkDiffs(ManifestSource.INSTALLING) | ||
//.let(cleanupCaches(cache)) | ||
.let(cleanupCaches(cache)) | ||
.let(doAsync((delta: ManifestDelta) => cache.store(CACHE_ACTIVE, MANIFEST_URL, adapter.newResponse(delta.currentStr)))) | ||
@@ -169,3 +168,2 @@ .map((delta: ManifestDelta) => delta.current); | ||
let request = ev.request; | ||
console.log(`ngsw: Event - fetch(${request.method}, ${request.url})`); | ||
ev.respondWith(this.handleFetch(request, {}).toPromise()); | ||
@@ -208,3 +206,2 @@ }); | ||
case ManifestSource.NETWORK: | ||
console.log('ngsw - loadFreshManifest(NETWORK)'); | ||
respSource = this | ||
@@ -215,3 +212,2 @@ .fetch | ||
case ManifestSource.INSTALLING: | ||
console.log('ngsw - loadFreshManifest(INSTALLING)'); | ||
respSource = this | ||
@@ -222,3 +218,2 @@ .cache | ||
case ManifestSource.ACTIVE: | ||
console.log('ngsw - loadFreshManifest(ACTIVE)'); | ||
respSource = this | ||
@@ -225,0 +220,0 @@ .cache |
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Uses eval
Supply chain riskPackage uses dynamic code execution (e.g., eval()), which is a dangerous practice. This can prevent the code from running in certain environments and increases the risk that the code may contain exploits or malicious behavior.
Found 1 instance in 1 package
32
8
412718
11751