1 var __wpo
= {"assets":{"main":["/packs/base_polyfills.js","/packs/extra_polyfills.js","/packs/features/compose.js","/packs/modals/onboarding_modal.js","/packs/emoji_picker.js","/packs/features/notifications.js","/packs/features/account_timeline.js","/packs/features/home_timeline.js","/packs/features/public_timeline.js","/packs/features/community_timeline.js","/packs/features/favourited_statuses.js","/packs/features/list_timeline.js","/packs/features/following.js","/packs/features/followers.js","/packs/features/hashtag_timeline.js","/packs/features/status.js","/packs/features/account_gallery.js","/packs/features/blocks.js","/packs/features/follow_requests.js","/packs/features/reblogs.js","/packs/features/favourites.js","/packs/features/getting_started.js","/packs/features/keyboard_shortcuts.js","/packs/features/generic_not_found.js","/packs/features/list_editor.js","/packs/status/media_gallery.js","/packs/share.js","/packs/application.js","/packs/about.js","/packs/public.js","/packs/mailer.js","/packs/default.js","/packs/admin.js","/packs/common.js","/packs/common.css","/packs/mailer.css","/packs/default.css","/packs/manifest.json"],"additional":["/emoji/1f602.svg","/emoji/sheet.png"],"optional":["/packs/locale_zh-TW.js","/packs/locale_zh-HK.js","/packs/locale_zh-CN.js","/packs/locale_uk.js","/packs/locale_tr.js","/packs/locale_th.js","/packs/locale_sv.js","/packs/locale_sr.js","/packs/locale_sr-Latn.js","/packs/locale_sk.js","/packs/locale_ru.js","/packs/locale_pt.js","/packs/locale_pt-BR.js","/packs/locale_pl.js","/packs/locale_oc.js","/packs/locale_no.js","/packs/locale_nl.js","/packs/locale_ko.js","/packs/locale_ja.js","/packs/locale_it.js","/packs/locale_io.js","/packs/locale_id.js","/packs/locale_hy.js","/packs/locale_hu.js","/packs/locale_hr.js","/packs/locale_he.js","/packs/locale_gl.js","/packs/locale_fr.js","/packs/locale_fi.js","/packs/locale_fa.js","/packs/locale_es.js","/packs/locale_eo.js","/packs/locale_en.js","/packs/locale_de.js","/packs/locale_ca.js","/packs/locale_bg.js","/packs/locale_ar.js","/packs/roboto-italic-webfont-50efdad8c62f5f279e3f4f1f63a4f9bc.woff2","/packs/roboto-bold-webfont-f633cb5c651ba4d50791e1adf55d3c18.woff2","/packs/roboto-medium-webfont-69c55fc2fe77d38934ea98dc31642ce6.woff2","/packs/roboto-regular-webfont-3ec24f953ed5e859a6402cb3c030ea8b.woff2","/packs/fontawesome-webfont-af7ae505a9eed503f8b8e6982036873e.woff2","/packs/robotomono-regular-webfont-6c1ce30b90ee993b22618ec489585594.woff2","/packs/Montserrat-Regular-080422d4c1328f3407818d25c86cce51.woff2","/packs/void-65dfe5bd31335a5b308d36964d320574.png","/packs/reticle-7d7ce959271e5ff1193fb32cff90ea56.png","/packs/elephant-fren-d16fd77f9a9387e7d146b5f9d4dc1e7f.png","/packs/icon_cached-98a757f1d9e93652742be43c22f46287.png","/packs/icon_done-12b87c12f915597dccbd2ca4d7167ba4.png","/packs/icon_email-738c89662d6640f5e6539151023d049a.png","/packs/icon_file_download-e5c29678f3a639e1e62374911d85e1d0.png","/packs/icon_grade-3ec67253b37908d2ab783f7225f20682.png","/packs/icon_lock_open-0bfd71a52eb3f34934edd59088b559fb.png","/packs/icon_person_add-e2c6b660f6e1c95785d8d2bfa7a823af.png","/packs/icon_reply-4f6ada7a0b886b084706a484753a0ff0.png","/packs/logo_full-5c51cffe1fcb8225ae02400d6a7e7077.png","/packs/logo_transparent-6f79eeb2c38ec2d12ed4d978322457d6.png","/packs/preview-9a17d32fc48369e8ccd910a75260e67d.jpg","/packs/elephant_ui_plane-e3f2d57c12c376e189c274cbe81af8dd.svg","/packs/elephant_ui_disappointed-8864342480c3612e3061702851d3a798.svg","/packs/elephant_ui_greeting-475430963d0b00fe82b07b17857ebf6c.svg","/packs/elephant_ui_working-2e653cc278c2ac871c23aeb10de1c0e2.svg","/packs/icon_cached-108e30d96e1d5152be7fe2978bcdfe14.svg","/packs/icon_done-dba357bfbba455428787fefc655ce120.svg","/packs/icon_email-1346985c7aaceb601b0d4257133254f4.svg","/packs/icon_file_download-4b5c054e76b0df3cbbc851854cd10c3c.svg","/packs/icon_grade-8e81b8e88c2b5834347a2a226c65d440.svg","/packs/icon_lock_open-c9627928caaaa505ac7de2a64bd065ec.svg","/packs/icon_person_add-5c56ef10b9e99e77a44d89041f4b77b5.svg","/packs/icon_reply-b5e28e1fe6acd4ec003e643e947f1c4a.svg","/packs/logo-fe5141d38a25f50068b4c69b77ca1ec8.svg","/packs/logo_alt-6090911445f54a587465e41da77a6969.svg","/packs/logo_full-96e7a97fe469f75a23a74852b2478fa3.svg","/packs/logo_transparent-6900bab180aa3a46c34425e5367a218f.svg"]},"externals":["/emoji/1f602.svg","/emoji/sheet.png"],"hashesMap":{"8aadd54157395376ea8c22827bde88e67f31358e":"/packs/roboto-italic-webfont-50efdad8c62f5f279e3f4f1f63a4f9bc.woff2","e2fc71044647b6edf7a3ba41429d5d626e63710a":"/packs/roboto-bold-webfont-f633cb5c651ba4d50791e1adf55d3c18.woff2","b66f9a200f8671202198f0238b4729e127bc0dac":"/packs/roboto-medium-webfont-69c55fc2fe77d38934ea98dc31642ce6.woff2","74f352b40a57789750d3c738c710a82cdb0f254a":"/packs/roboto-regular-webfont-3ec24f953ed5e859a6402cb3c030ea8b.woff2","d6f48cba7d076fb6f2fd6ba993a75b9dc1ecbf0c":"/packs/fontawesome-webfont-af7ae505a9eed503f8b8e6982036873e.woff2","1e149b7d5f1c5a5c4971cb523450118b1d50ed47":"/packs/robotomono-regular-webfont-6c1ce30b90ee993b22618ec489585594.woff2","c6aade94b414951dc75e41b6f30fc1fa93bf89fb":"/packs/Montserrat-Regular-080422d4c1328f3407818d25c86cce51.woff2","7e2065071fefe6d54f64b821bf575a0ab49b92c0":"/packs/void-65dfe5bd31335a5b308d36964d320574.png","f7e7808e34f32df8859ac9cef991858df4fc0bba":"/packs/reticle-7d7ce959271e5ff1193fb32cff90ea56.png","8523aa7b16b029770170cc12026e7c7d172d626d":"/packs/elephant_ui_plane-e3f2d57c12c376e189c274cbe81af8dd.svg","027d2ab934afd67b404426234750c08b516ec223":"/packs/elephant-fren-d16fd77f9a9387e7d146b5f9d4dc1e7f.png","2523b7002bda93c12af3b4b7f4d7a35fd52faf41":"/packs/elephant_ui_disappointed-8864342480c3612e3061702851d3a798.svg","2dace1e38e0d159660c56d838ad2ce22c0184661":"/packs/elephant_ui_greeting-475430963d0b00fe82b07b17857ebf6c.svg","42a8fc2f0526540979583534ec331a2d28d2575e":"/packs/elephant_ui_working-2e653cc278c2ac871c23aeb10de1c0e2.svg","22fac75a796b2bd2c6872cbd8d14bd325b00bb64":"/packs/icon_cached-108e30d96e1d5152be7fe2978bcdfe14.svg","e9cea6fd6e8034f60e0358a15956490831c66b03":"/packs/icon_done-dba357bfbba455428787fefc655ce120.svg","17604ec5d343bc1aee070a2197dae8fd78bdccef":"/packs/icon_email-1346985c7aaceb601b0d4257133254f4.svg","e4a88b85b09c072041e89acaa22ec362ece97f27":"/packs/icon_file_download-4b5c054e76b0df3cbbc851854cd10c3c.svg","75a26256446662fb331fd42b9849dfff235364d5":"/packs/icon_grade-8e81b8e88c2b5834347a2a226c65d440.svg","7a534f4811adb70a796a285fb70b93c87a9f4b94":"/packs/icon_lock_open-c9627928caaaa505ac7de2a64bd065ec.svg","08ef53f9228b3d24f2801ba942fc842599c39e34":"/packs/icon_person_add-5c56ef10b9e99e77a44d89041f4b77b5.svg","ad9a0479341f3a93a83c7cadab091569e459076c":"/packs/icon_reply-b5e28e1fe6acd4ec003e643e947f1c4a.svg","aa75bce521938954706802c15e393ea05663e5e0":"/packs/logo-fe5141d38a25f50068b4c69b77ca1ec8.svg","f573db9e5698b7a3541880875c3ce88fe03ebee2":"/packs/logo_alt-6090911445f54a587465e41da77a6969.svg","3b339fcffc64574bca7cd2521e25bfbea8c3cbbf":"/packs/logo_full-96e7a97fe469f75a23a74852b2478fa3.svg","12520e03b958c73d94a1f19644ca4d0b79c6505d":"/packs/logo_transparent-6900bab180aa3a46c34425e5367a218f.svg","dc0b5a8d2d7e67f84d37635137610c6c6d937058":"/packs/icon_cached-98a757f1d9e93652742be43c22f46287.png","58f810df15baa9109f9db7f800e31c0d011e6f0d":"/packs/icon_done-12b87c12f915597dccbd2ca4d7167ba4.png","828ed8086eacb6622609e9992950998ce0a1579b":"/packs/icon_email-738c89662d6640f5e6539151023d049a.png","c60492c5ceea92a0acb138f20e0a33dd1e553f6b":"/packs/icon_file_download-e5c29678f3a639e1e62374911d85e1d0.png","b60349291b7d31e9aa78b94aed0f6ce07171096f":"/packs/icon_grade-3ec67253b37908d2ab783f7225f20682.png","d80b4dd1135df4803cddc1c1f6646dd7fc601367":"/packs/icon_lock_open-0bfd71a52eb3f34934edd59088b559fb.png","3f2c7f54c1073569de3a7312fb9a055723f68898":"/packs/icon_person_add-e2c6b660f6e1c95785d8d2bfa7a823af.png","f7717ae34919e3c88a668b5d9426b5fdc868b0de":"/packs/icon_reply-4f6ada7a0b886b084706a484753a0ff0.png","ee2ae924bf02960749696f2c66890780ca321924":"/packs/logo_full-5c51cffe1fcb8225ae02400d6a7e7077.png","2a2ed7e6889f11e00656cb952d0704f762bf05ea":"/packs/logo_transparent-6f79eeb2c38ec2d12ed4d978322457d6.png","361cf83e570038228710feb587738d6b74308e26":"/packs/preview-9a17d32fc48369e8ccd910a75260e67d.jpg","735479ceb519ada5aee125ba574c85c215fd2ac5":"/packs/base_polyfills.js","f4c102539e1713d8b3166b4957ee2a9d7cbfe543":"/packs/extra_polyfills.js","0619155baee96c839dbbbacd2a63ae2463005870":"/packs/features/compose.js","022719dc969fcd2d0fc7abd14c87d5d94f315ba1":"/packs/modals/onboarding_modal.js","1bd655d9e756f344fed6484b0b3a3382d5c97ccf":"/packs/emoji_picker.js","6a477d999ebfa7fb3598d27ded02c5f1f0512131":"/packs/features/notifications.js","7daa9ca25ab996b360a752cf3d3930a96378de0d":"/packs/features/account_timeline.js","b68df54023e0e818308c25c68ff8c2be771ad31c":"/packs/features/home_timeline.js","ed233ebaa66bb920b67c014c180854008abef292":"/packs/features/public_timeline.js","dcb64cd7cfd3e66b62f9fcb8c878e57aefa3b9ea":"/packs/features/community_timeline.js","eab5f8f94d54b18b1112f6a8f66e03121fceb763":"/packs/features/favourited_statuses.js","d24c6781d180e5f99d4e863f291c8324e0aa3a95":"/packs/features/list_timeline.js","1ad1d2af452319c50b1fb9fa2b24620da38d05f9":"/packs/features/following.js","b09dc2f491db5ad04995567b53f6960bb48b96f0":"/packs/features/followers.js","75a2d3da6ef7094eb3e5e0e38f0c90c218728c13":"/packs/features/hashtag_timeline.js","ca99ad4c9909df104d67349354613825d75ae86c":"/packs/features/status.js","caac30043dcdf1a6306d0d3d552ff945f1866d06":"/packs/features/account_gallery.js","217d498a09a1b74be617f450556f7a863f64a5d4":"/packs/features/blocks.js","a7071a9dd0a4b3d28eb3a93fc46824f9fe0db92d":"/packs/features/follow_requests.js","54a2ef93c18d05b0ad83d1db5344fde3098dedb6":"/packs/features/reblogs.js","a7cd9d438011d2b0a70c58b43d82ffe7730fadc3":"/packs/features/favourites.js","2393a92c92405baaf7c2a704628d38b4b5bed6a9":"/packs/features/getting_started.js","2b96a5605decc8afb10f27b835a60ef378c7c174":"/packs/features/keyboard_shortcuts.js","72b687375078d067ee6017346071ff47e5ba2c8e":"/packs/features/generic_not_found.js","a5174c73cdc9bb2b233091facee91a45b050a675":"/packs/features/list_editor.js","dd563d722f095cd947336c7a825a7c32aebe70da":"/packs/status/media_gallery.js","11df6eaf27e374945cf1bc3b4d6e38f5d1bea493":"/packs/share.js","391a9718742bc7b1c8479917aa5646ad58862111":"/packs/application.js","5687f202d626db2de4805ee06433ffe9b3d8d837":"/packs/about.js","2bdb3b6aa0b8a4cb6bf39112a0ed0304565d144e":"/packs/public.js","e402078e69486c97d16e19a2350cad4d2ebacd4e":"/packs/locale_zh-TW.js","990045d7e496d7c20afa29b95bb57ce3a7233381":"/packs/locale_zh-HK.js","a351f524749530c54240a20b9d287f414ac1fc8f":"/packs/locale_zh-CN.js","a49b1cb687c9db73b917a9d927cafd1b1c3870ec":"/packs/locale_uk.js","1b34cb16a8c2d6eee4d4fc86dd2edd8a93c8a0a6":"/packs/locale_tr.js","cc1753b364aa7390dedc29504398e1fd8c23d8c6":"/packs/locale_th.js","8a22093161c324516acce1bd00c3ba5ac6c8b8f1":"/packs/locale_sv.js","08cb0789a22b4a4859ae4590a59fbbd4c628026e":"/packs/locale_sr.js","a3481ef4cecce5754d600e326c3dc33c12a0c001":"/packs/locale_sr-Latn.js","94531007d4da5d46a0a1dfb87149a05a35025133":"/packs/locale_sk.js","7cea8224e81b7f57c62aeed4f1ec4c16985ae879":"/packs/locale_ru.js","31742ca10beca0986706f8147b6812e5a8a65587":"/packs/locale_pt.js","1deddd8fbe1ad64985ae923bb26a6ad3277237e0":"/packs/locale_pt-BR.js","99b9cb373814bd1906deca5f5943e3b4511ab8b9":"/packs/locale_pl.js","f95a47f22fe522ea9f19aea427eccdb92d668463":"/packs/locale_oc.js","f3a63e3a9b667af7b8aae6677cca9cd5fa544450":"/packs/locale_no.js","1617607a224891aca21dbd955f1d8d748073553c":"/packs/locale_nl.js","a678598ad80ef43bed05a11e60d6672489194d0f":"/packs/locale_ko.js","fa257a7b03017ad1976a1f6ea87df45cb5b2e6d5":"/packs/locale_ja.js","24efd78e64e34023d7fccc6ed6f9e4c9317f606d":"/packs/locale_it.js","eef1fb80c7e2d7d9d9a53fc2d2ab42c49e090973":"/packs/locale_io.js","668463bcf41ce8971dfc2e03b4760a5769608f9d":"/packs/locale_id.js","546038783532ad3a0a3d64c4f9fdec0fe274cb1b":"/packs/locale_hy.js","dcacf3d9c920b82b61e1c5c1e530b4cd89bf86d6":"/packs/locale_hu.js","e6ea9a0c39af19c23dd268dfa42d02f3ef6f5286":"/packs/locale_hr.js","d6f92ff2dc28b2b129db3b70a50916f429363d16":"/packs/locale_he.js","223fb275136e05f90330126a6c36a053c4105212":"/packs/locale_gl.js","da36e5346cec0627c1983cff4d6582ddfdea16d7":"/packs/locale_fr.js","5edfbae7843ae0deb08e842365e6b969c8e4319e":"/packs/locale_fi.js","3d548c85c7e290f736e69504a1380128c99b1527":"/packs/locale_fa.js","8eef75454b123fa84bcbd897bb0b76c8023b57c8":"/packs/locale_es.js","1b22c9a756bdf85cdf2cb24ce2bd957ab2016fcd":"/packs/locale_eo.js","3e39224e5d5c8d48814da3b2162cb97633eafc8e":"/packs/locale_en.js","36c9261b7bf3d23c4a7fe7da776a3f7c73f4cb24":"/packs/locale_de.js","37f324aeecf404d5a9054b8695680305a1e3dcc9":"/packs/locale_ca.js","60d0bb13db45157614defb53ea18733d1d2bfa02":"/packs/locale_bg.js","2002efc5f1696ad482041d03600eb8183fac5e77":"/packs/locale_ar.js","9c5b75dcad12d553d953dfa71e4a3913600ddd80":"/packs/mailer.js","bccfc356ca0d67eb35b045cd313996454ba2e9d5":"/packs/default.js","e7feae220ce18e61722b91ad5029d2c54223c763":"/packs/admin.js","7680c10c61a2991488e790b5203fd431ba9d441d":"/packs/common.js","63d5949a7f9065ed25c771b22883444dc420be1d":"/packs/common.css","2a742852e4241f6de4f33884bf01731c08a3851d":"/packs/mailer.css","b8572eff2c2faa1fff7b2a823b7b8f2b8e0e3b14":"/packs/default.css","0663f076d7e4cce086fbebc8b2aa66d29e1123d9":"/packs/manifest.json"},"strategy":"changed","responseStrategy":"cache-first","version":"2018-4-9 21:57:37","name":"webpack-offline:mastodon","pluginVersion":"4.8.4","relativePaths":false};
3 /******/ (function(modules
) { // webpackBootstrap
4 /******/ // The module cache
5 /******/ var installedModules
= {};
7 /******/ // The require function
8 /******/ function __webpack_require__(moduleId
) {
10 /******/ // Check if module is in cache
11 /******/ if(installedModules
[moduleId
]) {
12 /******/ return installedModules
[moduleId
].exports
;
14 /******/ // Create a new module (and put it into the cache)
15 /******/ var module
= installedModules
[moduleId
] = {
21 /******/ // Execute the module function
22 /******/ modules
[moduleId
].call(module
.exports
, module
, module
.exports
, __webpack_require__
);
24 /******/ // Flag the module as loaded
25 /******/ module
.l
= true;
27 /******/ // Return the exports of the module
28 /******/ return module
.exports
;
32 /******/ // expose the modules object (__webpack_modules__)
33 /******/ __webpack_require__
.m
= modules
;
35 /******/ // expose the module cache
36 /******/ __webpack_require__
.c
= installedModules
;
38 /******/ // define getter function for harmony exports
39 /******/ __webpack_require__
.d = function(exports
, name
, getter
) {
40 /******/ if(!__webpack_require__
.o(exports
, name
)) {
41 /******/ Object
.defineProperty(exports
, name
, {
42 /******/ configurable: false,
43 /******/ enumerable: true,
49 /******/ // getDefaultExport function for compatibility with non-harmony modules
50 /******/ __webpack_require__
.n = function(module
) {
51 /******/ var getter
= module
&& module
.__esModule
?
52 /******/ function getDefault() { return module
['default']; } :
53 /******/ function getModuleExports() { return module
; };
54 /******/ __webpack_require__
.d(getter
, 'a', getter
);
55 /******/ return getter
;
58 /******/ // Object.prototype.hasOwnProperty.call
59 /******/ __webpack_require__
.o = function(object
, property
) { return Object
.prototype.hasOwnProperty
.call(object
, property
); };
61 /******/ // __webpack_public_path__
62 /******/ __webpack_require__
.p
= "/packs/";
64 /******/ // Load entry module and return exports
65 /******/ return __webpack_require__(__webpack_require__
.s
= 0);
67 /************************************************************************/
70 /***/ (function(module
, exports
, __webpack_require__
) {
76 var waitUntil
= ExtendableEvent
.prototype.waitUntil
;
77 var respondWith
= FetchEvent
.prototype.respondWith
;
78 var promisesMap
= new WeakMap();
80 ExtendableEvent
.prototype.waitUntil = function (promise
) {
81 var extendableEvent
= this;
82 var promises
= promisesMap
.get(extendableEvent
);
85 promises
.push(Promise
.resolve(promise
));
89 promises
= [Promise
.resolve(promise
)];
90 promisesMap
.set(extendableEvent
, promises
);
92 // call original method
93 return waitUntil
.call(extendableEvent
, Promise
.resolve().then(function processPromises() {
94 var len
= promises
.length
;
96 // wait for all to settle
97 return Promise
.all(promises
.map(function (p
) {
98 return p
["catch"](function () {});
99 })).then(function () {
100 // have new items been added? If so, wait again
101 if (promises
.length
!= len
) return processPromises();
103 promisesMap
["delete"](extendableEvent
);
104 // reject if one of the promises rejected
105 return Promise
.all(promises
);
110 FetchEvent
.prototype.respondWith = function (promise
) {
111 this.waitUntil(promise
);
112 return respondWith
.call(this, promise
);
117 if (typeof DEBUG
=== 'undefined') {
121 function WebpackServiceWorker(params
, helpers
) {
122 var loaders
= helpers
.loaders
;
123 var cacheMaps
= helpers
.cacheMaps
;
125 var strategy
= params
.strategy
;
126 var responseStrategy
= params
.responseStrategy
;
128 var assets
= params
.assets
;
129 var loadersMap
= params
.loaders
|| {};
131 var hashesMap
= params
.hashesMap
;
132 var externals
= params
.externals
;
135 // const alwaysRevalidate = params.alwaysRevalidate;
136 // const ignoreSearch = params.ignoreSearch;
137 // const preferOnline = params.preferOnline;
139 var CACHE_PREFIX
= params
.name
;
140 var CACHE_TAG
= params
.version
;
141 var CACHE_NAME
= CACHE_PREFIX
+ ':' + CACHE_TAG
;
143 var STORED_DATA_KEY
= '__offline_webpack__data';
147 var allAssets
= [].concat(assets
.main
, assets
.additional
, assets
.optional
);
148 var navigateFallbackURL
= params
.navigateFallbackURL
;
149 var navigateFallbackForRedirects
= params
.navigateFallbackForRedirects
;
151 self
.addEventListener('install', function (event
) {
152 console
.log('[SW]:', 'Install event');
154 var installing
= undefined;
156 if (strategy
=== 'changed') {
157 installing
= cacheChanged('main');
159 installing
= cacheAssets('main');
162 event
.waitUntil(installing
);
165 self
.addEventListener('activate', function (event
) {
166 console
.log('[SW]:', 'Activate event');
168 var activation
= cacheAdditional();
170 // Delete all assets which name starts with CACHE_PREFIX and
171 // is not current cache (CACHE_NAME)
172 activation
= activation
.then(storeCacheData
);
173 activation
= activation
.then(deleteObsolete
);
174 activation
= activation
.then(function () {
175 if (self
.clients
&& self
.clients
.claim
) {
176 return self
.clients
.claim();
180 event
.waitUntil(activation
);
183 function cacheAdditional() {
184 if (!assets
.additional
.length
) {
185 return Promise
.resolve();
189 console
.log('[SW]:', 'Caching additional');
192 var operation
= undefined;
194 if (strategy
=== 'changed') {
195 operation
= cacheChanged('additional');
197 operation
= cacheAssets('additional');
200 // Ignore fail of `additional` cache section
201 return operation
['catch'](function (e
) {
202 console
.error('[SW]:', 'Cache section `additional` failed to load');
206 function cacheAssets(section
) {
207 var batch
= assets
[section
];
209 return caches
.open(CACHE_NAME
).then(function (cache
) {
210 return addAllNormalized(cache
, batch
, {
211 bust: params
.version
,
212 request: params
.prefetchRequest
214 }).then(function () {
215 logGroup('Cached assets: ' + section
, batch
);
216 })['catch'](function (e
) {
222 function cacheChanged(section
) {
223 return getLastCache().then(function (args
) {
225 return cacheAssets(section
);
228 var lastCache
= args
[0];
229 var lastKeys
= args
[1];
230 var lastData
= args
[2];
232 var lastMap
= lastData
.hashmap
;
233 var lastVersion
= lastData
.version
;
235 if (!lastData
.hashmap
|| lastVersion
=== params
.version
) {
236 return cacheAssets(section
);
239 var lastHashedAssets
= Object
.keys(lastMap
).map(function (hash
) {
240 return lastMap
[hash
];
243 var lastUrls
= lastKeys
.map(function (req
) {
244 var url
= new URL(req
.url
);
248 return url
.toString();
251 var sectionAssets
= assets
[section
];
253 var changed
= sectionAssets
.filter(function (url
) {
254 if (lastUrls
.indexOf(url
) === -1 || lastHashedAssets
.indexOf(url
) === -1) {
261 Object
.keys(hashesMap
).forEach(function (hash
) {
262 var asset
= hashesMap
[hash
];
264 // Return if not in sectionAssets or in changed or moved array
265 if (sectionAssets
.indexOf(asset
) === -1 || changed
.indexOf(asset
) !== -1 || moved
.indexOf(asset
) !== -1) return;
267 var lastAsset
= lastMap
[hash
];
269 if (lastAsset
&& lastUrls
.indexOf(lastAsset
) !== -1) {
270 moved
.push([lastAsset
, asset
]);
276 logGroup('Changed assets: ' + section
, changed
);
277 logGroup('Moved assets: ' + section
, moved
);
279 var movedResponses
= Promise
.all(moved
.map(function (pair
) {
280 return lastCache
.match(pair
[0]).then(function (response
) {
281 return [pair
[1], response
];
285 return caches
.open(CACHE_NAME
).then(function (cache
) {
286 var move = movedResponses
.then(function (responses
) {
287 return Promise
.all(responses
.map(function (pair
) {
288 return cache
.put(pair
[0], pair
[1]);
292 return Promise
.all([move, addAllNormalized(cache
, changed
, {
293 bust: params
.version
,
294 request: params
.prefetchRequest
300 function deleteObsolete() {
301 return caches
.keys().then(function (keys
) {
302 var all
= keys
.map(function (key
) {
303 if (key
.indexOf(CACHE_PREFIX
) !== 0 || key
.indexOf(CACHE_NAME
) === 0) return;
305 console
.log('[SW]:', 'Delete cache:', key
);
306 return caches
['delete'](key
);
309 return Promise
.all(all
);
313 function getLastCache() {
314 return caches
.keys().then(function (keys
) {
315 var index
= keys
.length
;
321 if (key
.indexOf(CACHE_PREFIX
) === 0) {
328 var cache
= undefined;
330 return caches
.open(key
).then(function (_cache
) {
332 return _cache
.match(new URL(STORED_DATA_KEY
, location
).toString());
333 }).then(function (response
) {
334 if (!response
) return;
336 return Promise
.all([cache
, cache
.keys(), response
.json()]);
341 function storeCacheData() {
342 return caches
.open(CACHE_NAME
).then(function (cache
) {
343 var data
= new Response(JSON
.stringify({
344 version: params
.version
,
348 return cache
.put(new URL(STORED_DATA_KEY
, location
).toString(), data
);
352 self
.addEventListener('fetch', function (event
) {
353 var url
= new URL(event
.request
.url
);
356 var urlString
= url
.toString();
358 // Not external, so search part of the URL should be stripped,
359 // if it's external URL, the search part should be kept
360 if (externals
.indexOf(urlString
) === -1) {
362 urlString
= url
.toString();
365 // Handle only GET requests
366 var isGET
= event
.request
.method
=== 'GET';
367 var assetMatches
= allAssets
.indexOf(urlString
) !== -1;
368 var cacheUrl
= urlString
;
371 var cacheRewrite
= matchCacheMap(event
.request
);
374 cacheUrl
= cacheRewrite
;
379 if (!assetMatches
&& isGET
) {
380 // If isn't a cached asset and is a navigation request,
381 // fallback to navigateFallbackURL if available
382 if (navigateFallbackURL
&& isNavigateRequest(event
.request
)) {
383 event
.respondWith(handleNavigateFallback(fetch(event
.request
)));
389 if (!assetMatches
|| !isGET
) {
390 // Fix for https://twitter.com/wanderview/status/696819243262873600
391 if (url
.origin
!== location
.origin
&& navigator
.userAgent
.indexOf('Firefox/44.') !== -1) {
392 event
.respondWith(fetch(event
.request
));
398 // Logic of caching / fetching is here
399 // * urlString -- url to match from the CACHE_NAME
400 // * event.request -- original Request to perform fetch() if necessary
401 var resource
= undefined;
403 if (responseStrategy
=== 'network-first') {
404 resource
= networkFirstResponse(event
, urlString
, cacheUrl
);
407 // (responseStrategy has been validated before)
409 resource
= cacheFirstResponse(event
, urlString
, cacheUrl
);
412 if (navigateFallbackURL
&& isNavigateRequest(event
.request
)) {
413 resource
= handleNavigateFallback(resource
);
416 event
.respondWith(resource
);
419 self
.addEventListener('message', function (e
) {
423 switch (data
.action
) {
426 if (self
.skipWaiting
) self
.skipWaiting();
431 function cacheFirstResponse(event
, urlString
, cacheUrl
) {
432 return cachesMatch(cacheUrl
, CACHE_NAME
).then(function (response
) {
435 console
.log('[SW]:', 'URL [' + cacheUrl
+ '](' + urlString
+ ') from cache');
441 // Load and cache known assets
442 var fetching
= fetch(event
.request
).then(function (response
) {
445 console
.log('[SW]:', 'URL [' + urlString
+ '] wrong response: [' + response
.status
+ '] ' + response
.type
);
452 console
.log('[SW]:', 'URL [' + urlString
+ '] from network');
455 if (cacheUrl
=== urlString
) {
457 var responseClone
= response
.clone();
458 var storing
= caches
.open(CACHE_NAME
).then(function (cache
) {
459 return cache
.put(urlString
, responseClone
);
460 }).then(function () {
461 console
.log('[SW]:', 'Cache asset: ' + urlString
);
464 event
.waitUntil(storing
);
475 function networkFirstResponse(event
, urlString
, cacheUrl
) {
476 return fetch(event
.request
).then(function (response
) {
479 console
.log('[SW]:', 'URL [' + urlString
+ '] from network');
485 // Throw to reach the code in the catch below
486 throw new Error('Response is not ok');
488 // This needs to be in a catch() and not just in the then() above
489 // cause if your network is down, the fetch() will throw
490 ['catch'](function () {
492 console
.log('[SW]:', 'URL [' + urlString
+ '] from cache if possible');
495 return cachesMatch(cacheUrl
, CACHE_NAME
);
499 function handleNavigateFallback(fetching
) {
500 return fetching
['catch'](function () {}).then(function (response
) {
501 var isOk
= response
&& response
.ok
;
502 var isRedirect
= response
&& response
.type
=== 'opaqueredirect';
504 if (isOk
|| isRedirect
&& !navigateFallbackForRedirects
) {
509 console
.log('[SW]:', 'Loading navigation fallback [' + navigateFallbackURL
+ '] from cache');
512 return cachesMatch(navigateFallbackURL
, CACHE_NAME
);
516 function mapAssets() {
517 Object
.keys(assets
).forEach(function (key
) {
518 assets
[key
] = assets
[key
].map(function (path
) {
519 var url
= new URL(path
, location
);
523 if (externals
.indexOf(path
) === -1) {
527 return url
.toString();
531 Object
.keys(loadersMap
).forEach(function (key
) {
532 loadersMap
[key
] = loadersMap
[key
].map(function (path
) {
533 var url
= new URL(path
, location
);
537 if (externals
.indexOf(path
) === -1) {
541 return url
.toString();
545 hashesMap
= Object
.keys(hashesMap
).reduce(function (result
, hash
) {
546 var url
= new URL(hashesMap
[hash
], location
);
550 result
[hash
] = url
.toString();
554 externals
= externals
.map(function (path
) {
555 var url
= new URL(path
, location
);
558 return url
.toString();
562 function addAllNormalized(cache
, requests
, options
) {
563 var allowLoaders
= options
.allowLoaders
!== false;
564 var bustValue
= options
&& options
.bust
;
565 var requestInit
= options
.request
|| {
570 return Promise
.all(requests
.map(function (request
) {
572 request
= applyCacheBust(request
, bustValue
);
575 return fetch(request
, requestInit
).then(fixRedirectedResponse
);
576 })).then(function (responses
) {
577 if (responses
.some(function (response
) {
580 return Promise
.reject(new Error('Wrong response status'));
584 var addAll
= responses
.map(function (response
, i
) {
586 extracted
.push(extractAssetsWithLoaders(requests
[i
], response
));
589 return cache
.put(requests
[i
], response
);
592 if (extracted
.length
) {
594 var newOptions
= copyObject(options
);
595 newOptions
.allowLoaders
= false;
597 var waitAll
= addAll
;
599 addAll
= Promise
.all(extracted
).then(function (all
) {
600 var extractedRequests
= [].concat
.apply([], all
);
602 if (requests
.length
) {
603 waitAll
= waitAll
.concat(addAllNormalized(cache
, extractedRequests
, newOptions
));
606 return Promise
.all(waitAll
);
610 addAll
= Promise
.all(addAll
);
617 function extractAssetsWithLoaders(request
, response
) {
618 var all
= Object
.keys(loadersMap
).map(function (key
) {
619 var loader
= loadersMap
[key
];
621 if (loader
.indexOf(request
) !== -1 && loaders
[key
]) {
622 return loaders
[key
](response
.clone());
624 }).filter(function (a
) {
628 return Promise
.all(all
).then(function (all
) {
629 return [].concat
.apply([], all
);
633 function matchCacheMap(request
) {
634 var urlString
= request
.url
;
635 var url
= new URL(urlString
);
637 var requestType
= undefined;
639 if (request
.mode
=== 'navigate') {
640 requestType
= 'navigate';
641 } else if (url
.origin
=== location
.origin
) {
642 requestType
= 'same-origin';
644 requestType
= 'cross-origin';
647 for (var i
= 0; i
< cacheMaps
.length
; i
++) {
648 var map
= cacheMaps
[i
];
651 if (map
.requestTypes
&& map
.requestTypes
.indexOf(requestType
) === -1) {
655 var newString
= undefined;
657 if (typeof map
.match
=== 'function') {
658 newString
= map
.match(url
, request
);
660 newString
= urlString
.replace(map
.match
, map
.to
);
663 if (newString
&& newString
!== urlString
) {
670 function cachesMatch(request
, cacheName
) {
671 return caches
.match(request
, {
673 }).then(function (response
) {
674 if (isNotRedirectedResponse()) {
678 // Fix already cached redirected responses
679 return fixRedirectedResponse(response
).then(function (fixedResponse
) {
680 return caches
.open(cacheName
).then(function (cache
) {
681 return cache
.put(request
, fixedResponse
);
682 }).then(function () {
683 return fixedResponse
;
687 // Return void if error happened (cache not found)
688 ['catch'](function () {});
691 function applyCacheBust(asset
, key
) {
692 var hasQuery
= asset
.indexOf('?') !== -1;
693 return asset
+ (hasQuery
? '&' : '?') + '__uncache=' + encodeURIComponent(key
);
696 function getClientsURLs() {
698 return Promise
.resolve([]);
701 return self
.clients
.matchAll({
702 includeUncontrolled: true
703 }).then(function (clients
) {
704 if (!clients
.length
) return [];
708 clients
.forEach(function (client
) {
709 var url
= new URL(client
.url
);
712 var urlString
= url
.toString();
714 if (!result
.length
|| result
.indexOf(urlString
) === -1) {
715 result
.push(urlString
);
723 function isNavigateRequest(request
) {
724 return request
.mode
=== 'navigate' || request
.headers
.get('Upgrade-Insecure-Requests') || (request
.headers
.get('Accept') || '').indexOf('text/html') !== -1;
727 function isNotRedirectedResponse(response
) {
728 return !response
|| !response
.redirected
|| !response
.ok
|| response
.type
=== 'opaqueredirect';
731 // Based on https://github.com/GoogleChrome/sw-precache/pull/241/files#diff-3ee9060dc7a312c6a822cac63a8c630bR85
732 function fixRedirectedResponse(response
) {
733 if (isNotRedirectedResponse(response
)) {
734 return Promise
.resolve(response
);
737 var body
= 'body' in response
? Promise
.resolve(response
.body
) : response
.blob();
739 return body
.then(function (data
) {
740 return new Response(data
, {
741 headers: response
.headers
,
742 status: response
.status
747 function copyObject(original
) {
748 return Object
.keys(original
).reduce(function (result
, key
) {
749 result
[key
] = original
[key
];
754 function logGroup(title
, assets
) {
755 console
.groupCollapsed('[SW]:', title
);
757 assets
.forEach(function (asset
) {
758 console
.log('Asset:', asset
);
763 WebpackServiceWorker(__wpo
, {
767 module
.exports
= __webpack_require__(1)
772 /***/ (function(module
, __webpack_exports__
, __webpack_require__
) {
775 Object
.defineProperty(__webpack_exports__
, "__esModule", { value: true });
776 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__storage_modifier__
= __webpack_require__(2);
777 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__web_push_notifications__
= __webpack_require__(4);
778 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_1__web_push_notifications___default
= __webpack_require__
.n(__WEBPACK_IMPORTED_MODULE_1__web_push_notifications__
);
779 /*** IMPORTS FROM imports-loader ***/
780 var process
= (process
|| {});
781 process
.env
= {"npm_config_cache_lock_stale":"60000","npm_config_ham_it_up":"","npm_package_dependencies_mark_loader":"^0.1.6","npm_config_legacy_bundling":"","npm_config_sign_git_tag":"","npm_package_dependencies_autoprefixer":"^7.1.6","npm_package_dependencies_mkdirp":"^0.5.1","npm_package_dependencies_node_sass":"^4.7.2","npm_package_devDependencies_jest":"^21.2.1","npm_config_user_agent":"npm/5.6.0 node/v9.11.1 linux x64","npm_config_always_auth":"","npm_package_dependencies_detect_passive_events":"^1.0.2","npm_package_dependencies_immutable":"^3.8.2","npm_package_bugs_url":"https://github.com/tootsuite/mastodon/issues","npm_config_bin_links":"true","npm_config_key":"","npm_package_dependencies_react_overlays":"^0.8.3","npm_config_allow_same_version":"","npm_config_description":"true","npm_config_fetch_retries":"2","npm_config_heading":"npm","npm_config_if_present":"","npm_config_init_version":"1.0.0","npm_config_user":"","npm_node_execpath":"/usr/bin/node","npm_package_scripts_manage_translations":"node ./config/webpack/translationRunner.js","npm_package_dependencies_babel_plugin_transform_class_properties":"^6.24.1","npm_package_dependencies_babel_plugin_transform_es2015_modules_commonjs":"^6.24.1","npm_package_dependencies_escape_html":"^1.0.3","npm_package_dependencies_imports_loader":"^0.8.0","npm_package_optionalDependencies_node_zopfli":"^2.0.2","npm_config_prefer_online":"","HOME":"/home/howl","npm_package_dependencies_postcss_loader":"^2.0.9","npm_config_force":"","npm_package_dependencies_react_redux_loading_bar":"^2.9.3","npm_package_dependencies_redis":"^2.7.1","npm_config_only":"","npm_config_read_only":"","npm_package_engines_node":">=6","npm_package_dependencies_babel_plugin_react_intl":"^2.3.1","npm_package_dependencies_npmlog":"^4.1.2","npm_package_devDependencies_enzyme_adapter_react_16":"^1.1.0","npm_config_cache_min":"10","npm_config_init_license":"ISC","npm_package_scripts_build_production":"cross-env NODE_ENV=production webpack --config config/webpack/production.js","npm_package_dependencies_glob":"^7.1.1","npm_package_dependencies_webpack_merge":"^4.1.1","npm_config_editor":"vi","npm_config_rollback":"true","npm_config_tag_version_prefix":"v","npm_package_dependencies_redux_thunk":"^2.2.0","npm_package_dependencies_webpack":"^3.9.1","npm_config_cache_max":"Infinity","npm_config_timing":"","npm_config_userconfig":"/home/howl/.npmrc","npm_package_dependencies_babel_plugin_lodash":"^3.3.2","npm_package_dependencies_dotenv":"^4.0.0","npm_package_dependencies_precss":"^2.0.0","npm_package_dependencies_react_hotkeys":"^0.10.0","npm_config_engine_strict":"","npm_config_init_author_name":"","npm_config_init_author_url":"","npm_config_tmp":"/tmp","npm_package_description":"mastodon","npm_package_dependencies_react_router_dom":"^4.1.1","npm_config_depth":"Infinity","npm_config_package_lock_only":"","npm_config_save_dev":"","npm_config_usage":"","npm_package_scripts_test_jest":"cross-env NODE_ENV=test jest --coverage","npm_package_dependencies_throng":"^4.0.0","npm_package_devDependencies_react_intl_translations_manager":"^5.0.0","npm_package_readmeFilename":"README.md","npm_package_homepage":"https://github.com/tootsuite/mastodon#readme","npm_config_metrics_registry":"https://registry.npmjs.org/","npm_config_cafile":"","npm_config_otp":"","npm_config_package_lock":"true","npm_config_progress":"true","npm_config_https_proxy":"","npm_config_save_prod":"","npm_package_scripts_dev":"cross-env NODE_ENV=development webpack-dev-server --config config/webpack/development.js --progress --color","npm_package_scripts_test_lint":"eslint -c .eslintrc.yml --ext=js app/javascript/ config/webpack/ streaming/","npm_package_dependencies_babel_plugin_transform_react_remove_prop_types":"^0.4.10","npm_package_dependencies_websocket_js":"^0.1.12","npm_config_cidr":"","npm_config_onload_script":"","npm_config_sso_type":"oauth","npm_package_dependencies_babel_plugin_syntax_dynamic_import":"^6.18.0","npm_package_dependencies_rails_ujs":"^5.1.2","npm_package_dependencies_react_immutable_pure_component":"^1.1.1","npm_package_dependencies_react_motion":"^0.5.2","npm_package_dependencies_reselect":"^3.0.1","npm_package_devDependencies_eslint_plugin_import":"^2.8.0","npm_config_rebuild_bundle":"true","npm_config_save_bundle":"","npm_config_shell":"bash","npm_package_private":"true","npm_package_dependencies_express":"^4.16.2","npm_package_dependencies_react_notification":"^6.8.2","npm_package_dependencies_sass_loader":"^6.0.6","npm_config_dry_run":"","npm_config_prefix":"/usr","npm_config_scope":"","npm_config_browser":"","npm_config_cache_lock_wait":"10000","npm_config_ignore_prepublish":"","npm_config_registry":"https://registry.npmjs.org/","npm_config_save_optional":"","npm_config_searchopts":"","npm_config_versions":"","npm_package_dependencies_font_awesome":"^4.7.0","npm_package_dependencies_postcss_object_fit_images":"^1.1.2","npm_package_dependencies_react_immutable_proptypes":"^2.1.0","npm_package_dependencies_style_loader":"^0.19.0","npm_package_dependencies_uws":"^8.14.0","npm_package_optionalDependencies_fsevents":"*","npm_config_cache":"/home/howl/.npm","npm_config_proxy":"","npm_config_send_metrics":"","npm_package_scripts_start":"node ./streaming/index.js","npm_config_global_style":"","npm_config_ignore_scripts":"","npm_config_version":"","npm_package_dependencies_axios":"~0.16.2","npm_package_dependencies_css_loader":"^0.28.4","npm_package_dependencies_marky":"^1.2.0","npm_config_local_address":"","npm_config_viewer":"man","npm_config_node_gyp":"/usr/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js","PATH":"/usr/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp-bin:/home/howl/oc/mastofe/node_modules/.bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games","npm_package_name":"mastodon","npm_package_repository_type":"git","npm_package_dependencies_babel_preset_env":"^1.6.1","npm_package_dependencies_cross_env":"^5.1.1","npm_package_dependencies_extract_text_webpack_plugin":"^3.0.2","npm_package_dependencies_substring_trie":"^1.0.2","npm_config_prefer_offline":"","NODE":"/usr/bin/node","npm_package_dependencies_babel_plugin_transform_runtime":"^6.23.0","npm_package_dependencies_react_redux":"^5.0.4","npm_package_dependencies_tiny_queue":"^0.2.1","npm_package_devDependencies_eslint_plugin_jsx_a11y":"^5.1.1","npm_config_color":"true","npm_package_scripts_build_development":"cross-env NODE_ENV=development webpack --config config/webpack/development.js","npm_package_dependencies_npm_run_all":"^4.1.2","npm_package_dependencies_stringz":"^0.3.0","npm_config_fetch_retry_mintimeout":"10000","npm_config_maxsockets":"50","npm_config_offline":"","npm_config_sso_poll_frequency":"500","npm_package_dependencies_babel_plugin_transform_react_inline_elements":"^6.22.0","npm_package_dependencies_babel_preset_react":"^6.24.1","npm_package_dependencies_object_assign":"^4.1.1","npm_package_dependencies_react_dom":"^16.2.0","npm_package_dependencies_react_textarea_autosize":"^5.2.1","npm_package_dependencies_redux":"^3.7.1","npm_package_devDependencies_eslint":"^4.15.0","npm_package_devDependencies_react_test_renderer":"^16.2.0","npm_config_umask":"0022","npm_package_dependencies_babel_plugin_transform_object_rest_spread":"^6.23.0","npm_package_dependencies_offline_plugin":"^4.8.3","npm_package_dependencies_path_complete_extname":"^0.1.0","npm_package_dependencies_postcss_smart_import":"^0.7.5","npm_package_dependencies_node_zopfli":"^2.0.2","npm_package_gitHead":"bbbb8e40f52cd05e8bbeec1901990144b87fea55","npm_config_fetch_retry_maxtimeout":"60000","npm_config_loglevel":"notice","npm_config_logs_max":"10","npm_config_message":"%s","npm_lifecycle_script":"cross-env NODE_ENV=production webpack --config config/webpack/production.js","npm_package_scripts_postversion":"git push --tags","npm_package_scripts_test":"npm-run-all test:lint test:jest","npm_package_dependencies_babel_core":"^6.25.0","npm_package_dependencies_babel_plugin_preval":"^1.6.1","npm_package_dependencies_http_link_header":"^0.8.0","npm_package_dependencies_intersection_observer":"^0.5.0","npm_package_dependencies_is_nan":"^1.2.1","npm_package_dependencies_react_intl":"^2.4.0","npm_package_dependencies_react_router_scroll_4":"^1.0.0-beta.1","npm_package_dependencies_react_swipeable_views":"^0.12.3","npm_package_dependencies_redux_immutable":"^4.0.0","npm_package_devDependencies_webpack_dev_server":"^2.9.5","npm_config_ca":"","npm_config_cert":"","npm_config_global":"","npm_config_link":"","npm_package_repository_url":"git+https://github.com/tootsuite/mastodon.git","npm_package_dependencies_webpack_bundle_analyzer":"^2.9.1","npm_package_version":"","npm_config_access":"","npm_config_also":"","npm_config_save":"true","npm_config_unicode":"","npm_lifecycle_event":"build","npm_package_scripts_build":"cross-env NODE_ENV=production webpack --config config/webpack/production.js","npm_package_dependencies_emoji_mart":"github:Gargron/emoji-mart#build","npm_package_dependencies_intl":"^1.2.5","npm_package_dependencies_js_yaml":"^3.9.0","npm_package_dependencies_uuid":"^3.1.0","npm_config_argv":"{\"remain\":[],\"cooked\":[\"run\",\"build\"],\"original\":[\"run\",\"build\"]}","npm_config_long":"","npm_config_production":"","npm_config_searchlimit":"20","npm_config_unsafe_perm":"true","npm_package_dependencies_array_includes":"^3.0.3","npm_package_dependencies_babel_plugin_transform_react_jsx_source":"^6.22.0","npm_package_dependencies_compression_webpack_plugin":"^1.0.1","npm_package_dependencies_file_loader":"^0.11.2","npm_package_dependencies_lodash":"^4.17.4","npm_config_auth_type":"legacy","npm_config_node_version":"9.11.1","npm_config_tag":"latest","npm_config_git_tag_version":"true","npm_config_commit_hooks":"true","npm_config_script_shell":"","npm_config_shrinkwrap":"true","npm_package_license":"AGPL-3.0-or-later","npm_package_dependencies_classnames":"^2.2.5","npm_package_dependencies_es6_symbol":"^3.1.1","npm_package_dependencies_intl_messageformat":"^2.2.0","npm_package_dependencies_punycode":"^2.1.0","npm_package_devDependencies_eslint_plugin_react":"^7.5.1","npm_config_fetch_retry_factor":"10","npm_config_save_exact":"","npm_config_strict_ssl":"true","npm_package_dependencies_babel_plugin_transform_react_jsx_self":"^6.22.0","npm_config_dev":"","npm_config_globalconfig":"/usr/etc/npmrc","npm_config_init_module":"/home/howl/.npm-init.js","npm_config_parseable":"","npm_package_dependencies_intl_relativeformat":"^2.1.0","npm_package_dependencies_requestidlecallback":"^0.3.0","npm_package_dependencies_webpack_manifest_plugin":"^1.2.1","npm_package_devDependencies_enzyme":"^3.2.0","npm_package_devDependencies_raf":"^3.4.0","npm_config_globalignorefile":"/usr/etc/npmignore","npm_execpath":"/usr/lib/node_modules/npm/bin/npm-cli.js","PWD":"/home/howl/oc/mastofe","npm_package_dependencies_react_toggle":"^4.0.1","npm_config_cache_lock_retries":"10","npm_config_searchstaleness":"900","npm_package_dependencies_object_values":"^1.0.4","npm_package_dependencies_prop_types":"^15.5.10","npm_package_dependencies_resolve_url_loader":"^2.2.0","npm_package_dependencies_rimraf":"^2.6.1","npm_config_node_options":"","npm_config_save_prefix":"^","npm_config_scripts_prepend_node_path":"warn-only","npm_package_devDependencies_babel_eslint":"^8.2.1","npm_package_devDependencies_yargs":"^8.0.2","npm_config_group":"1000","npm_config_init_author_email":"","npm_config_searchexclude":"","npm_package_dependencies_babel_loader":"^7.1.1","npm_package_dependencies_object_fit_images":"^3.2.3","npm_package_devDependencies_eslint_plugin_promise":"^3.7.0","npm_config_git":"git","npm_config_optional":"true","npm_package_dependencies_babel_plugin_transform_decorators_legacy":"^1.3.4","npm_package_dependencies_pg":"^6.4.0","npm_package_dependencies_react":"^16.2.0","npm_package_dependencies_fsevents":"*","npm_config_json":"","INIT_CWD":"/home/howl/oc/mastofe","NODE_ENV":"production"};
786 function openSystemCache() {
787 return caches
.open('mastodon-system');
790 function openWebCache() {
791 return caches
.open('mastodon-web');
794 function fetchRoot() {
795 return fetch('/web', { credentials: 'include' });
798 // Cause a new version of a registered Service Worker to replace an existing one
799 // that is already installed, and replace the currently active worker on open pages.
800 self
.addEventListener('install', function (event
) {
801 event
.waitUntil(Promise
.all([openWebCache(), fetchRoot()]).then(function (_ref
) {
804 return cache
.put('/web', root
);
807 self
.addEventListener('activate', function (event
) {
808 event
.waitUntil(self
.clients
.claim());
810 self
.addEventListener('fetch', function (event
) {
811 var url
= new URL(event
.request
.url
);
813 if (url
.pathname
.startsWith('/web')) {
814 // we always make /web/login go through
815 if (url
.pathname
.startsWith('/web/login')) {
818 var asyncResponse
= fetchRoot();
819 var asyncCache
= openWebCache();
821 event
.respondWith(asyncResponse
.then(async
function (response
) {
822 // response was redirected - let's actually do the request from the event
823 // and return its response
824 if (response
.redirected
|| response
.type
=== 'opaqueredirect') {
825 return await
fetch(event
.request
);
828 var cache
= await asyncCache
;
829 await cache
.put('/web', response
);
830 return response
.clone();
834 }).catch(function () {
835 return asyncCache
.then(function (cache
) {
836 return cache
.match('/web');
839 } else if (url
.pathname
=== '/auth/sign_out') {
840 var _asyncResponse
= fetch(event
.request
);
841 var _asyncCache
= openWebCache();
843 event
.respondWith(_asyncResponse
.then(async
function (response
) {
844 if (response
.ok
|| response
.type
=== 'opaqueredirect') {
845 await Promise
.all([_asyncCache
.then(function (cache
) {
846 return cache
.delete('/web');
847 }), indexedDB
.deleteDatabase('mastodon')]);
852 } else if (process
.env
.CDN_HOST
? url
.host
=== process
.env
.CDN_HOST : url
.pathname
.startsWith('/system/')) {
853 event
.respondWith(openSystemCache().then(async
function (cache
) {
854 var cached
= await cache
.match(event
.request
.url
);
856 if (cached
=== undefined) {
857 var fetched
= await
fetch(event
.request
);
861 await cache
.put(event
.request
.url
, fetched
.clone());
863 Object(__WEBPACK_IMPORTED_MODULE_0__storage_modifier__
["a" /* freeStorage */])();
878 /***/ (function(module
, __webpack_exports__
, __webpack_require__
) {
881 /* unused harmony export evictStatus */
882 /* unused harmony export evictStatuses */
883 /* unused harmony export putAccounts */
884 /* unused harmony export putStatuses */
885 /* harmony export (immutable) */ __webpack_exports__
["a"] = freeStorage
;
886 /* harmony import */ var __WEBPACK_IMPORTED_MODULE_0__db__
= __webpack_require__(3);
889 var accountAssetKeys
= ['avatar', 'avatar_static', 'header', 'header_static'];
890 var storageMargin
= 8388608;
891 var storeLimit
= 1024;
893 function openCache() {
894 // ServiceWorker and Cache API is not available on iOS 11
895 // https://webkit.org/status/#specification-service-workers
896 return self
.caches
? caches
.open('mastodon-system') : Promise
.reject();
899 function printErrorIfAvailable(error
) {
905 function put(name
, objects
, onupdate
, oncreate
) {
906 return Object(__WEBPACK_IMPORTED_MODULE_0__db__
["a" /* default */])().then(function (db
) {
907 return new Promise(function (resolve
, reject
) {
908 var putTransaction
= db
.transaction(name
, 'readwrite');
909 var putStore
= putTransaction
.objectStore(name
);
910 var putIndex
= putStore
.index('id');
912 objects
.forEach(function (object
) {
913 putIndex
.getKey(object
.id
).onsuccess = function (retrieval
) {
914 function addObject() {
915 putStore
.add(object
);
918 function deleteObject() {
919 putStore
.delete(retrieval
.target
.result
).onsuccess
= addObject
;
922 if (retrieval
.target
.result
) {
924 onupdate(object
, retrieval
.target
.result
, putStore
, deleteObject
);
930 oncreate(object
, addObject
);
938 putTransaction
.oncomplete = function () {
939 var readTransaction
= db
.transaction(name
, 'readonly');
940 var readStore
= readTransaction
.objectStore(name
);
941 var count
= readStore
.count();
943 count
.onsuccess = function () {
944 var excess
= count
.result
- storeLimit
;
947 var retrieval
= readStore
.getAll(null, excess
);
949 retrieval
.onsuccess = function () {
950 return resolve(retrieval
.result
);
952 retrieval
.onerror
= reject
;
958 count
.onerror
= reject
;
961 putTransaction
.onerror
= reject
;
962 }).then(function (resolved
) {
965 }, function (error
) {
972 function evictAccountsByRecords(records
) {
973 return Object(__WEBPACK_IMPORTED_MODULE_0__db__
["a" /* default */])().then(function (db
) {
974 var transaction
= db
.transaction(['accounts', 'statuses'], 'readwrite');
975 var accounts
= transaction
.objectStore('accounts');
976 var accountsIdIndex
= accounts
.index('id');
977 var accountsMovedIndex
= accounts
.index('moved');
978 var statuses
= transaction
.objectStore('statuses');
979 var statusesIndex
= statuses
.index('account');
981 function evict(toEvict
) {
982 toEvict
.forEach(function (record
) {
983 openCache().then(function (cache
) {
984 return accountAssetKeys
.forEach(function (key
) {
985 return cache
.delete(records
[key
]);
987 }).catch(printErrorIfAvailable
);
989 accountsMovedIndex
.getAll(record
.id
).onsuccess = function (_ref
) {
990 var target
= _ref
.target
;
991 return evict(target
.result
);
994 statusesIndex
.getAll(record
.id
).onsuccess = function (_ref2
) {
995 var target
= _ref2
.target
;
996 return evictStatusesByRecords(target
.result
);
999 accountsIdIndex
.getKey(record
.id
).onsuccess = function (_ref3
) {
1000 var target
= _ref3
.target
;
1001 return target
.result
&& accounts
.delete(target
.result
);
1009 }).catch(printErrorIfAvailable
);
1012 function evictStatus(id
) {
1013 evictStatuses([id
]);
1016 function evictStatuses(ids
) {
1017 return Object(__WEBPACK_IMPORTED_MODULE_0__db__
["a" /* default */])().then(function (db
) {
1018 var transaction
= db
.transaction('statuses', 'readwrite');
1019 var store
= transaction
.objectStore('statuses');
1020 var idIndex
= store
.index('id');
1021 var reblogIndex
= store
.index('reblog');
1023 ids
.forEach(function (id
) {
1024 reblogIndex
.getAllKeys(id
).onsuccess = function (_ref4
) {
1025 var target
= _ref4
.target
;
1026 return target
.result
.forEach(function (reblogKey
) {
1027 return store
.delete(reblogKey
);
1031 idIndex
.getKey(id
).onsuccess = function (_ref5
) {
1032 var target
= _ref5
.target
;
1033 return target
.result
&& store
.delete(target
.result
);
1038 }).catch(printErrorIfAvailable
);
1041 function evictStatusesByRecords(records
) {
1042 return evictStatuses(records
.map(function (_ref6
) {
1048 function putAccounts(records
, avatarStatic
) {
1049 var avatarKey
= avatarStatic
? 'avatar_static' : 'avatar';
1052 put('accounts', records
, function (newRecord
, oldKey
, store
, oncomplete
) {
1053 store
.get(oldKey
).onsuccess = function (_ref7
) {
1054 var target
= _ref7
.target
;
1056 accountAssetKeys
.forEach(function (key
) {
1057 var newURL
= newRecord
[key
];
1058 var oldURL
= target
.result
[key
];
1060 if (newURL
!== oldURL
) {
1061 openCache().then(function (cache
) {
1062 return cache
.delete(oldURL
);
1063 }).catch(printErrorIfAvailable
);
1067 var newURL
= newRecord
[avatarKey
];
1068 var oldURL
= target
.result
[avatarKey
];
1070 if (newURL
!== oldURL
) {
1071 newURLs
.push(newURL
);
1076 }, function (newRecord
, oncomplete
) {
1077 newURLs
.push(newRecord
[avatarKey
]);
1079 }).then(function (records
) {
1080 return Promise
.all([evictAccountsByRecords(records
), openCache().then(function (cache
) {
1081 return cache
.addAll(newURLs
);
1083 }).then(freeStorage
, function (error
) {
1086 }).catch(printErrorIfAvailable
);
1089 function putStatuses(records
) {
1090 put('statuses', records
).then(evictStatusesByRecords
).catch(printErrorIfAvailable
);
1093 function freeStorage() {
1094 return navigator
.storage
.estimate().then(function (_ref8
) {
1095 var quota
= _ref8
.quota
,
1096 usage
= _ref8
.usage
;
1098 if (usage
+ storageMargin
< quota
) {
1102 return Object(__WEBPACK_IMPORTED_MODULE_0__db__
["a" /* default */])().then(function (db
) {
1103 return new Promise(function (resolve
, reject
) {
1104 var retrieval
= db
.transaction('accounts', 'readonly').objectStore('accounts').getAll(null, 1);
1106 retrieval
.onsuccess = function () {
1107 if (retrieval
.result
.length
> 0) {
1108 resolve(evictAccountsByRecords(retrieval
.result
).then(freeStorage
));
1110 resolve(caches
.delete('mastodon-system'));
1114 retrieval
.onerror
= reject
;
1124 /***/ (function(module
, __webpack_exports__
, __webpack_require__
) {
1127 /* harmony default export */ __webpack_exports__
["a"] = (function () {
1128 return new Promise(function (resolve
, reject
) {
1129 // ServiceWorker is required to synchronize the login state.
1130 // Microsoft Edge 17 does not support getAll according to:
1131 // Catalog of standard and vendor APIs across browsers - Microsoft Edge Development
1132 // https://developer.microsoft.com/en-us/microsoft-edge/platform/catalog/?q=specName%3Aindexeddb
1133 if (!('caches' in self
&& 'getAll' in IDBObjectStore
.prototype)) {
1138 var request
= indexedDB
.open('mastodon');
1140 request
.onerror
= reject
;
1141 request
.onsuccess = function (_ref
) {
1142 var target
= _ref
.target
;
1143 return resolve(target
.result
);
1146 request
.onupgradeneeded = function (_ref2
) {
1147 var target
= _ref2
.target
;
1149 var accounts
= target
.result
.createObjectStore('accounts', { autoIncrement: true });
1150 var statuses
= target
.result
.createObjectStore('statuses', { autoIncrement: true });
1152 accounts
.createIndex('id', 'id', { unique: true });
1153 accounts
.createIndex('moved', 'moved');
1155 statuses
.createIndex('id', 'id', { unique: true });
1156 statuses
.createIndex('account', 'account');
1157 statuses
.createIndex('reblog', 'reblog');
1164 /***/ (function(module
, exports
) {
1166 var MAX_NOTIFICATIONS
= 5;
1167 var GROUP_TAG
= 'tag';
1169 // Avoid loading intl-messageformat and dealing with locales in the ServiceWorker
1170 var formatGroupTitle
= function formatGroupTitle(message
, count
) {
1171 return message
.replace('%{count}', count
);
1174 var notify
= function notify(options
) {
1175 return self
.registration
.getNotifications().then(function (notifications
) {
1176 if (notifications
.length
=== MAX_NOTIFICATIONS
) {
1177 // Reached the maximum number of notifications, proceed with grouping
1179 title: formatGroupTitle(options
.data
.message
, notifications
.length
+ 1),
1180 body: notifications
.sort(function (n1
, n2
) {
1181 return n1
.timestamp
< n2
.timestamp
;
1182 }).map(function (notification
) {
1183 return notification
.title
;
1185 badge: '/badge.png',
1186 icon: '/android-chrome-192x192.png',
1189 url: new URL('/web/notifications', self
.location
).href
,
1190 count: notifications
.length
+ 1,
1191 message: options
.data
.message
1195 notifications
.forEach(function (notification
) {
1196 return notification
.close();
1199 return self
.registration
.showNotification(group
.title
, group
);
1200 } else if (notifications
.length
=== 1 && notifications
[0].tag
=== GROUP_TAG
) {
1201 // Already grouped, proceed with appending the notification to the group
1202 var _group
= cloneNotification(notifications
[0]);
1204 _group
.title
= formatGroupTitle(_group
.data
.message
, _group
.data
.count
+ 1);
1205 _group
.body
= options
.title
+ '\n' + _group
.body
;
1206 _group
.data
= Object
.assign({}, _group
.data
, { count: _group
.data
.count
+ 1 });
1208 return self
.registration
.showNotification(_group
.title
, _group
);
1211 return self
.registration
.showNotification(options
.title
, options
);
1215 var handlePush
= function handlePush(event
) {
1216 var options
= event
.data
.json();
1218 options
.body
= options
.data
.nsfw
|| options
.data
.content
;
1219 options
.dir
= options
.data
.dir
;
1220 options
.image
= options
.image
|| undefined; // Null results in a network request (404)
1221 options
.timestamp
= options
.timestamp
&& new Date(options
.timestamp
);
1223 var expandAction
= options
.data
.actions
.find(function (action
) {
1224 return action
.todo
=== 'expand';
1228 options
.actions
= [expandAction
];
1229 options
.hiddenActions
= options
.data
.actions
.filter(function (action
) {
1230 return action
!== expandAction
;
1232 options
.data
.hiddenImage
= options
.image
;
1233 options
.image
= undefined;
1235 options
.actions
= options
.data
.actions
;
1238 event
.waitUntil(notify(options
));
1241 var cloneNotification
= function cloneNotification(notification
) {
1244 for (var k
in notification
) {
1245 clone
[k
] = notification
[k
];
1251 var expandNotification
= function expandNotification(notification
) {
1252 var nextNotification
= cloneNotification(notification
);
1254 nextNotification
.body
= notification
.data
.content
;
1255 nextNotification
.image
= notification
.data
.hiddenImage
;
1256 nextNotification
.actions
= notification
.data
.actions
.filter(function (action
) {
1257 return action
.todo
!== 'expand';
1260 return self
.registration
.showNotification(nextNotification
.title
, nextNotification
);
1263 var makeRequest
= function makeRequest(notification
, action
) {
1264 return fetch(action
.action
, {
1266 'Authorization': 'Bearer ' + notification
.data
.access_token
,
1267 'Content-Type': 'application/json'
1269 method: action
.method
,
1270 credentials: 'include'
1274 var findBestClient
= function findBestClient(clients
) {
1275 var focusedClient
= clients
.find(function (client
) {
1276 return client
.focused
;
1278 var visibleClient
= clients
.find(function (client
) {
1279 return client
.visibilityState
=== 'visible';
1282 return focusedClient
|| visibleClient
|| clients
[0];
1285 var openUrl
= function openUrl(url
) {
1286 return self
.clients
.matchAll({ type: 'window' }).then(function (clientList
) {
1287 if (clientList
.length
!== 0) {
1288 var webClients
= clientList
.filter(function (client
) {
1289 return (/\/web\//.test(client
.url
)
1293 if (webClients
.length
!== 0) {
1294 var client
= findBestClient(webClients
);
1296 var _ref
= new URL(url
),
1297 pathname
= _ref
.pathname
;
1299 if (pathname
.startsWith('/web/')) {
1300 return client
.focus().then(function (client
) {
1301 return client
.postMessage({
1303 path: pathname
.slice('/web/'.length
- 1)
1307 } else if ('navigate' in clientList
[0]) {
1308 // Chrome 42-48 does not support navigate
1309 var _client
= findBestClient(clientList
);
1311 return _client
.navigate(url
).then(function (client
) {
1312 return client
.focus();
1317 return self
.clients
.openWindow(url
);
1321 var removeActionFromNotification
= function removeActionFromNotification(notification
, action
) {
1322 var actions
= notification
.actions
.filter(function (act
) {
1323 return act
.action
!== action
.action
;
1325 var nextNotification
= cloneNotification(notification
);
1327 nextNotification
.actions
= actions
;
1329 return self
.registration
.showNotification(nextNotification
.title
, nextNotification
);
1332 var handleNotificationClick
= function handleNotificationClick(event
) {
1333 var reactToNotificationClick
= new Promise(function (resolve
, reject
) {
1335 var action
= event
.notification
.data
.actions
.find(function (_ref2
) {
1336 var action
= _ref2
.action
;
1337 return action
=== event
.action
;
1340 if (action
.todo
=== 'expand') {
1341 resolve(expandNotification(event
.notification
));
1342 } else if (action
.todo
=== 'request') {
1343 resolve(makeRequest(event
.notification
, action
).then(function () {
1344 return removeActionFromNotification(event
.notification
, action
);
1347 reject('Unknown action: ' + action
.todo
);
1350 event
.notification
.close();
1351 resolve(openUrl(event
.notification
.data
.url
));
1355 event
.waitUntil(reactToNotificationClick
);
1358 self
.addEventListener('push', handlePush
);
1359 self
.addEventListener('notificationclick', handleNotificationClick
);