From b197ce2f623af336ec9812694bcf752621886cf8 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Thu, 29 Jun 2017 16:18:09 +0100 Subject: [PATCH 01/38] switch from deprecated node-uuid to uuid; add sessionTrace to api config --- lib/core/api.js | 9 +++++---- package.json | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/lib/core/api.js b/lib/core/api.js index f0c5287d34..dbc9989a34 100644 --- a/lib/core/api.js +++ b/lib/core/api.js @@ -25,7 +25,7 @@ if (md5.md5) { } var semver = require('semver'); var sundial = require('sundial'); -var uuid = require('node-uuid'); +var uuidv4 = require('uuid/v4'); var isChromeApp = (typeof chrome !== 'undefined'); var bows = require('../bows'); @@ -63,7 +63,8 @@ api.create = function(options) { }, localStore: localStore, metricsSource: 'chrome-uploader', - metricsVersion: options.version + metricsVersion: options.version, + sessionTrace: uuidv4() }); api.tidepool = tidepool; @@ -452,7 +453,7 @@ api.upload.toPlatform = function(data, sessionInfo, progress, groupId, cb, uploa var deviceRecords = _.map(data, function(item) { return _.extend({}, item, { uploadId: uploadItem.uploadId, - guid: uuid.v4() + guid: uuidv4() }); }); return deviceRecords; @@ -490,7 +491,7 @@ api.upload.toPlatform = function(data, sessionInfo, progress, groupId, cb, uploa if(uploadType === 'jellyfish') { uploadItem.with_uploadId('upid_' + md5(sessionInfo.deviceId + '_' + sessionInfo.start).slice(0, 12)); - uploadItem.with_guid(uuid.v4()); + uploadItem.with_guid(uuidv4()); uploadItem.with_byUser(tidepool.getUserId()); } uploadItem = uploadItem.done(); diff --git a/package.json b/package.json index 2a15553c2e..8fa7f57b63 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ "classnames": "2.2.3", "commander": "2.9.0", "lodash": "3.10.1", - "node-uuid": "1.4.7", "react": "0.14.7", "react-addons-update": "0.14.7", "react-dom": "0.14.7", @@ -38,7 +37,8 @@ "semver": "5.1.0", "stack-trace": "0.0.9", "sundial": "1.6.0", - "tidepool-platform-client": "0.28.0" + "tidepool-platform-client": "0.28.0", + "uuid": "3.1.0" }, "devDependencies": { "babel-core": "5.8.38", From bc877dbb3096179d2061302a49e3fa59dfe3ab29 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 5 Jul 2017 12:12:49 +0100 Subject: [PATCH 02/38] only put windows drivers in windows app --- package.json | 6 +++++- resources/installer.nsh | 2 +- resources/{windows-driver => win}/README.md | 0 .../TidepoolUSBDriver_x64.exe | Bin .../TidepoolUSBDriver_x86.exe | Bin .../Tidepool_T_Icon.png | Bin .../{windows-driver => win}/amd64/ftbusui.dll | Bin .../amd64/ftcserco.dll | Bin .../{windows-driver => win}/amd64/ftd2xx.lib | Bin .../amd64/ftd2xx64.dll | Bin .../{windows-driver => win}/amd64/ftdibus.sys | Bin .../{windows-driver => win}/amd64/ftlang.dll | Bin .../{windows-driver => win}/amd64/ftser2k.sys | Bin .../amd64/ftserui2.dll | Bin .../amd64/ser2pl64.sys | Bin .../amd64/silabser.sys | Bin .../{windows-driver => win}/amd64/tiusb.i51 | Bin .../{windows-driver => win}/amd64/tiusb.sys | Bin resources/{windows-driver => win}/dpinst.xml | 0 .../{windows-driver => win}/i386/ftbusui.dll | Bin .../{windows-driver => win}/i386/ftcserco.dll | Bin .../{windows-driver => win}/i386/ftd2xx.dll | Bin .../{windows-driver => win}/i386/ftd2xx.lib | Bin .../{windows-driver => win}/i386/ftdibus.sys | Bin .../{windows-driver => win}/i386/ftlang.dll | Bin .../{windows-driver => win}/i386/ftser2k.sys | Bin .../{windows-driver => win}/i386/ftserui2.dll | Bin .../{windows-driver => win}/i386/ser2pl.sys | Bin .../{windows-driver => win}/i386/silabser.sys | Bin .../{windows-driver => win}/i386/tiusb.i51 | Bin .../{windows-driver => win}/i386/tiusb.sys | Bin .../{windows-driver => win}/tidepoolhid.cat | Bin .../{windows-driver => win}/tidepoolhid.inf | 0 .../{windows-driver => win}/tidepoolvcp.cat | Bin .../{windows-driver => win}/tidepoolvcp.inf | 0 .../win7x64/ser2pl64.sys | Bin .../win7x86/ser2pl.sys | Bin .../x64/WdfCoInstaller01009.dll | Bin .../x64/WdfCoInstaller01011.dll | Bin .../x86/WdfCoInstaller01009.dll | Bin .../x86/WdfCoInstaller01011.dll | Bin resources/windows-driver/tidepool_licence.rtf | 18 ------------------ 42 files changed, 6 insertions(+), 20 deletions(-) rename resources/{windows-driver => win}/README.md (100%) rename resources/{windows-driver => win}/TidepoolUSBDriver_x64.exe (100%) rename resources/{windows-driver => win}/TidepoolUSBDriver_x86.exe (100%) rename resources/{windows-driver => win}/Tidepool_T_Icon.png (100%) rename resources/{windows-driver => win}/amd64/ftbusui.dll (100%) rename resources/{windows-driver => win}/amd64/ftcserco.dll (100%) rename resources/{windows-driver => win}/amd64/ftd2xx.lib (100%) rename resources/{windows-driver => win}/amd64/ftd2xx64.dll (100%) rename resources/{windows-driver => win}/amd64/ftdibus.sys (100%) rename resources/{windows-driver => win}/amd64/ftlang.dll (100%) rename resources/{windows-driver => win}/amd64/ftser2k.sys (100%) rename resources/{windows-driver => win}/amd64/ftserui2.dll (100%) rename resources/{windows-driver => win}/amd64/ser2pl64.sys (100%) rename resources/{windows-driver => win}/amd64/silabser.sys (100%) rename resources/{windows-driver => win}/amd64/tiusb.i51 (100%) rename resources/{windows-driver => win}/amd64/tiusb.sys (100%) rename resources/{windows-driver => win}/dpinst.xml (100%) rename resources/{windows-driver => win}/i386/ftbusui.dll (100%) rename resources/{windows-driver => win}/i386/ftcserco.dll (100%) rename resources/{windows-driver => win}/i386/ftd2xx.dll (100%) rename resources/{windows-driver => win}/i386/ftd2xx.lib (100%) rename resources/{windows-driver => win}/i386/ftdibus.sys (100%) rename resources/{windows-driver => win}/i386/ftlang.dll (100%) rename resources/{windows-driver => win}/i386/ftser2k.sys (100%) rename resources/{windows-driver => win}/i386/ftserui2.dll (100%) rename resources/{windows-driver => win}/i386/ser2pl.sys (100%) rename resources/{windows-driver => win}/i386/silabser.sys (100%) rename resources/{windows-driver => win}/i386/tiusb.i51 (100%) rename resources/{windows-driver => win}/i386/tiusb.sys (100%) rename resources/{windows-driver => win}/tidepoolhid.cat (100%) rename resources/{windows-driver => win}/tidepoolhid.inf (100%) rename resources/{windows-driver => win}/tidepoolvcp.cat (100%) rename resources/{windows-driver => win}/tidepoolvcp.inf (100%) rename resources/{windows-driver => win}/win7x64/ser2pl64.sys (100%) rename resources/{windows-driver => win}/win7x86/ser2pl.sys (100%) rename resources/{windows-driver => win}/x64/WdfCoInstaller01009.dll (100%) rename resources/{windows-driver => win}/x64/WdfCoInstaller01011.dll (100%) rename resources/{windows-driver => win}/x86/WdfCoInstaller01009.dll (100%) rename resources/{windows-driver => win}/x86/WdfCoInstaller01011.dll (100%) delete mode 100755 resources/windows-driver/tidepool_licence.rtf diff --git a/package.json b/package.json index ccab7765fd..0a03a9b1a5 100644 --- a/package.json +++ b/package.json @@ -101,7 +101,11 @@ "package.json" ], "extraResources": [ - "resources/windows-driver/", + { + "from": "resources/${os}", + "to": "driver/", + "filter": ["**/*", "!*.md"] + }, "sounds/" ], "win": { diff --git a/resources/installer.nsh b/resources/installer.nsh index f935585dd3..a4575c4581 100644 --- a/resources/installer.nsh +++ b/resources/installer.nsh @@ -17,7 +17,7 @@ RequestExecutionLevel admin !macro customInstall Var /GLOBAL DriverDir - StrCpy $DriverDir "$INSTDIR\resources\resources\windows-driver" + StrCpy $DriverDir "$INSTDIR\resources\driver" UserInfo::GetAccountType pop $0 diff --git a/resources/windows-driver/README.md b/resources/win/README.md similarity index 100% rename from resources/windows-driver/README.md rename to resources/win/README.md diff --git a/resources/windows-driver/TidepoolUSBDriver_x64.exe b/resources/win/TidepoolUSBDriver_x64.exe similarity index 100% rename from resources/windows-driver/TidepoolUSBDriver_x64.exe rename to resources/win/TidepoolUSBDriver_x64.exe diff --git a/resources/windows-driver/TidepoolUSBDriver_x86.exe b/resources/win/TidepoolUSBDriver_x86.exe similarity index 100% rename from resources/windows-driver/TidepoolUSBDriver_x86.exe rename to resources/win/TidepoolUSBDriver_x86.exe diff --git a/resources/windows-driver/Tidepool_T_Icon.png b/resources/win/Tidepool_T_Icon.png similarity index 100% rename from resources/windows-driver/Tidepool_T_Icon.png rename to resources/win/Tidepool_T_Icon.png diff --git a/resources/windows-driver/amd64/ftbusui.dll b/resources/win/amd64/ftbusui.dll similarity index 100% rename from resources/windows-driver/amd64/ftbusui.dll rename to resources/win/amd64/ftbusui.dll diff --git a/resources/windows-driver/amd64/ftcserco.dll b/resources/win/amd64/ftcserco.dll similarity index 100% rename from resources/windows-driver/amd64/ftcserco.dll rename to resources/win/amd64/ftcserco.dll diff --git a/resources/windows-driver/amd64/ftd2xx.lib b/resources/win/amd64/ftd2xx.lib similarity index 100% rename from resources/windows-driver/amd64/ftd2xx.lib rename to resources/win/amd64/ftd2xx.lib diff --git a/resources/windows-driver/amd64/ftd2xx64.dll b/resources/win/amd64/ftd2xx64.dll similarity index 100% rename from resources/windows-driver/amd64/ftd2xx64.dll rename to resources/win/amd64/ftd2xx64.dll diff --git a/resources/windows-driver/amd64/ftdibus.sys b/resources/win/amd64/ftdibus.sys similarity index 100% rename from resources/windows-driver/amd64/ftdibus.sys rename to resources/win/amd64/ftdibus.sys diff --git a/resources/windows-driver/amd64/ftlang.dll b/resources/win/amd64/ftlang.dll similarity index 100% rename from resources/windows-driver/amd64/ftlang.dll rename to resources/win/amd64/ftlang.dll diff --git a/resources/windows-driver/amd64/ftser2k.sys b/resources/win/amd64/ftser2k.sys similarity index 100% rename from resources/windows-driver/amd64/ftser2k.sys rename to resources/win/amd64/ftser2k.sys diff --git a/resources/windows-driver/amd64/ftserui2.dll b/resources/win/amd64/ftserui2.dll similarity index 100% rename from resources/windows-driver/amd64/ftserui2.dll rename to resources/win/amd64/ftserui2.dll diff --git a/resources/windows-driver/amd64/ser2pl64.sys b/resources/win/amd64/ser2pl64.sys similarity index 100% rename from resources/windows-driver/amd64/ser2pl64.sys rename to resources/win/amd64/ser2pl64.sys diff --git a/resources/windows-driver/amd64/silabser.sys b/resources/win/amd64/silabser.sys similarity index 100% rename from resources/windows-driver/amd64/silabser.sys rename to resources/win/amd64/silabser.sys diff --git a/resources/windows-driver/amd64/tiusb.i51 b/resources/win/amd64/tiusb.i51 similarity index 100% rename from resources/windows-driver/amd64/tiusb.i51 rename to resources/win/amd64/tiusb.i51 diff --git a/resources/windows-driver/amd64/tiusb.sys b/resources/win/amd64/tiusb.sys similarity index 100% rename from resources/windows-driver/amd64/tiusb.sys rename to resources/win/amd64/tiusb.sys diff --git a/resources/windows-driver/dpinst.xml b/resources/win/dpinst.xml similarity index 100% rename from resources/windows-driver/dpinst.xml rename to resources/win/dpinst.xml diff --git a/resources/windows-driver/i386/ftbusui.dll b/resources/win/i386/ftbusui.dll similarity index 100% rename from resources/windows-driver/i386/ftbusui.dll rename to resources/win/i386/ftbusui.dll diff --git a/resources/windows-driver/i386/ftcserco.dll b/resources/win/i386/ftcserco.dll similarity index 100% rename from resources/windows-driver/i386/ftcserco.dll rename to resources/win/i386/ftcserco.dll diff --git a/resources/windows-driver/i386/ftd2xx.dll b/resources/win/i386/ftd2xx.dll similarity index 100% rename from resources/windows-driver/i386/ftd2xx.dll rename to resources/win/i386/ftd2xx.dll diff --git a/resources/windows-driver/i386/ftd2xx.lib b/resources/win/i386/ftd2xx.lib similarity index 100% rename from resources/windows-driver/i386/ftd2xx.lib rename to resources/win/i386/ftd2xx.lib diff --git a/resources/windows-driver/i386/ftdibus.sys b/resources/win/i386/ftdibus.sys similarity index 100% rename from resources/windows-driver/i386/ftdibus.sys rename to resources/win/i386/ftdibus.sys diff --git a/resources/windows-driver/i386/ftlang.dll b/resources/win/i386/ftlang.dll similarity index 100% rename from resources/windows-driver/i386/ftlang.dll rename to resources/win/i386/ftlang.dll diff --git a/resources/windows-driver/i386/ftser2k.sys b/resources/win/i386/ftser2k.sys similarity index 100% rename from resources/windows-driver/i386/ftser2k.sys rename to resources/win/i386/ftser2k.sys diff --git a/resources/windows-driver/i386/ftserui2.dll b/resources/win/i386/ftserui2.dll similarity index 100% rename from resources/windows-driver/i386/ftserui2.dll rename to resources/win/i386/ftserui2.dll diff --git a/resources/windows-driver/i386/ser2pl.sys b/resources/win/i386/ser2pl.sys similarity index 100% rename from resources/windows-driver/i386/ser2pl.sys rename to resources/win/i386/ser2pl.sys diff --git a/resources/windows-driver/i386/silabser.sys b/resources/win/i386/silabser.sys similarity index 100% rename from resources/windows-driver/i386/silabser.sys rename to resources/win/i386/silabser.sys diff --git a/resources/windows-driver/i386/tiusb.i51 b/resources/win/i386/tiusb.i51 similarity index 100% rename from resources/windows-driver/i386/tiusb.i51 rename to resources/win/i386/tiusb.i51 diff --git a/resources/windows-driver/i386/tiusb.sys b/resources/win/i386/tiusb.sys similarity index 100% rename from resources/windows-driver/i386/tiusb.sys rename to resources/win/i386/tiusb.sys diff --git a/resources/windows-driver/tidepoolhid.cat b/resources/win/tidepoolhid.cat similarity index 100% rename from resources/windows-driver/tidepoolhid.cat rename to resources/win/tidepoolhid.cat diff --git a/resources/windows-driver/tidepoolhid.inf b/resources/win/tidepoolhid.inf similarity index 100% rename from resources/windows-driver/tidepoolhid.inf rename to resources/win/tidepoolhid.inf diff --git a/resources/windows-driver/tidepoolvcp.cat b/resources/win/tidepoolvcp.cat similarity index 100% rename from resources/windows-driver/tidepoolvcp.cat rename to resources/win/tidepoolvcp.cat diff --git a/resources/windows-driver/tidepoolvcp.inf b/resources/win/tidepoolvcp.inf similarity index 100% rename from resources/windows-driver/tidepoolvcp.inf rename to resources/win/tidepoolvcp.inf diff --git a/resources/windows-driver/win7x64/ser2pl64.sys b/resources/win/win7x64/ser2pl64.sys similarity index 100% rename from resources/windows-driver/win7x64/ser2pl64.sys rename to resources/win/win7x64/ser2pl64.sys diff --git a/resources/windows-driver/win7x86/ser2pl.sys b/resources/win/win7x86/ser2pl.sys similarity index 100% rename from resources/windows-driver/win7x86/ser2pl.sys rename to resources/win/win7x86/ser2pl.sys diff --git a/resources/windows-driver/x64/WdfCoInstaller01009.dll b/resources/win/x64/WdfCoInstaller01009.dll similarity index 100% rename from resources/windows-driver/x64/WdfCoInstaller01009.dll rename to resources/win/x64/WdfCoInstaller01009.dll diff --git a/resources/windows-driver/x64/WdfCoInstaller01011.dll b/resources/win/x64/WdfCoInstaller01011.dll similarity index 100% rename from resources/windows-driver/x64/WdfCoInstaller01011.dll rename to resources/win/x64/WdfCoInstaller01011.dll diff --git a/resources/windows-driver/x86/WdfCoInstaller01009.dll b/resources/win/x86/WdfCoInstaller01009.dll similarity index 100% rename from resources/windows-driver/x86/WdfCoInstaller01009.dll rename to resources/win/x86/WdfCoInstaller01009.dll diff --git a/resources/windows-driver/x86/WdfCoInstaller01011.dll b/resources/win/x86/WdfCoInstaller01011.dll similarity index 100% rename from resources/windows-driver/x86/WdfCoInstaller01011.dll rename to resources/win/x86/WdfCoInstaller01011.dll diff --git a/resources/windows-driver/tidepool_licence.rtf b/resources/windows-driver/tidepool_licence.rtf deleted file mode 100755 index 6f2202f550..0000000000 --- a/resources/windows-driver/tidepool_licence.rtf +++ /dev/null @@ -1,18 +0,0 @@ -{\rtf1\ansi\ansicpg1252\cocoartf1344\cocoasubrtf720 -{\fonttbl\f0\fswiss\fcharset0 Helvetica;} -{\colortbl;\red255\green255\blue255;} -\margl1440\margr1440\vieww10800\viewh8400\viewkind0 -\deftab720 -\pard\pardeftab720 - -\f0\fs24 \cf0 \expnd0\expndtw0\kerning0 -Copyright (c) 2015, Tidepool Project\ -All rights reserved.\ -\ -Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\ -\ -1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\ -\ -2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\ -\ -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.} \ No newline at end of file From e4423a694ff09e21a28876f0fc4fa1311d85ef7b Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 5 Jul 2017 13:33:57 +0100 Subject: [PATCH 03/38] update yarn.lock --- package.json | 4 ++-- yarn.lock | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 4117f08504..15bb1e74d3 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,6 @@ "is-electron": "2.0.0", "lighthouse": "2.0.0", "lodash": "3.10.1", - "uuid": "3.1.0", "react": "15.4.2", "react-addons-update": "15.4.2", "react-dom": "15.4.2", @@ -62,7 +61,8 @@ "source-map-support": "0.4.14", "stack-trace": "0.0.9", "sundial": "1.6.0", - "tidepool-platform-client": "tidepool-org/platform-client#krystophv/electron" + "tidepool-platform-client": "tidepool-org/platform-client#krystophv/electron", + "uuid": "3.1.0" }, "browserslist": "electron 1.6", "build": { diff --git a/yarn.lock b/yarn.lock index 1bb70fe33b..2222504af4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1784,8 +1784,8 @@ caniuse-db@1.0.30000626: resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000626.tgz#44363dc86857efaf758fea9faef6a15ed93d8f33" caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000624, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000696" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000696.tgz#e71f5c61e1f96c7a3af4e791ac5db55e11737604" + version "1.0.30000697" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000697.tgz#20ce6a9ceeef4ef4a15dc8e80f2e8fb9049e8d77" capture-stack-trace@^1.0.0: version "1.0.0" @@ -6007,7 +6007,7 @@ node-uuid@1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.3.tgz#319bb7a56e7cb63f00b5c0cd7851cd4b4ddf1df9" -node-uuid@1.4.8, node-uuid@~1.4.7: +node-uuid@~1.4.7: version "1.4.8" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" @@ -7866,8 +7866,8 @@ rx@^4.1.0: resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" rxjs@^5.1.1: - version "5.4.1" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.1.tgz#b62f757f279445d265a18a58fb0a70dc90e91626" + version "5.4.2" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-5.4.2.tgz#2a3236fcbf03df57bae06fd6972fd99e5c08fcf7" dependencies: symbol-observable "^1.0.1" @@ -8902,14 +8902,14 @@ uuid-1345@^0.99.6: dependencies: macaddress "^0.2.7" +uuid@3.1.0, uuid@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" + uuid@^2.0.1, uuid@^2.0.2, uuid@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" -uuid@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" - validate-npm-package-license@*, validate-npm-package-license@^3.0.1, validate-npm-package-license@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" From f6e4fc5f9aade0d54cfbfc7084fee05c2fe018da Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 5 Jul 2017 17:08:19 +0100 Subject: [PATCH 04/38] build errors and send them up correctly --- app/actions/utils.js | 1 + app/utils/errors.js | 1 + lib/core/api.js | 51 +++++++++++++++++++++++++++----------------- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/app/actions/utils.js b/app/actions/utils.js index ebcd41ac28..18639fe550 100644 --- a/app/actions/utils.js +++ b/app/actions/utils.js @@ -71,6 +71,7 @@ export function makeUploadCb(dispatch, getState, errCode, utc) { step: err.step || null, datasetId: err.datasetId || null, requestTrace: err.requestTrace || null, + sessionTrace: err.sessionTrace || null, code: err.code || errCode, version: version, data: recs diff --git a/app/utils/errors.js b/app/utils/errors.js index 1dcf8c51d9..a208882633 100644 --- a/app/utils/errors.js +++ b/app/utils/errors.js @@ -26,6 +26,7 @@ const errorProps = { step: 'Driver Step', datasetId: 'Dataset ID', requestTrace: 'Request Trace', + sessionTrace: 'Session Trace', stringifiedStack: 'Stack Trace', utc: 'UTC Time', version: 'Version' diff --git a/lib/core/api.js b/lib/core/api.js index 65649c3670..f54e2f8cc3 100644 --- a/lib/core/api.js +++ b/lib/core/api.js @@ -313,23 +313,41 @@ function getUploadFunction(uploadType) { return null; } +function buildError(dataset, datasetId) { + var err = new Error('Uploading data to platform failed.'); + err.name = 'API Error'; + var status = null; + if(dataset.error && dataset.error.text) { + api.log('Error status:', dataset.error.text); + status = JSON.parse(dataset.error.text); + } + err.status = status; + err.datasetId = datasetId; + if(status.meta) { + err.requestTrace = status.meta.trace.request; + err.sessionTrace = status.meta.trace.session; + //TODO: session ID + } + return err; +} + function createDatasetForUser(userId, info, callback) { var happy = function(dataset) { callback(null, dataset); }; - var sad = function (jqxhr, status, err) { - api.log('platform create dataset failed.'); - api.log(status); - callback(status); + var sad = function (jqxhr, err) { + api.log('platform create dataset failed:', err); + var error = buildError(jqxhr); + callback(error); }; api.log('createDataset for user id ', userId); tidepool.createDatasetForUser(userId, info, function(err, dataset) { if (err) { - return sad(err, err); + return sad(dataset, err); } return happy(dataset); }); @@ -341,17 +359,17 @@ function finalizeDataset(datasetId, callback) { callback(); }; - var sad = function (jqxhr, status, err) { - api.log('platform finalize dataset failed.'); - api.log(status); - callback(status); + var sad = function (err, datasetId) { + api.log('platform finalize dataset failed:', err); + var error = buildError(null, datasetId); + callback(error); }; api.log('finalize dataset for dataset id ', datasetId); tidepool.finalizeDataset(datasetId, function(err) { if (err) { - return sad(err, err); + return sad(err, datasetId); } return happy(); }); @@ -364,7 +382,7 @@ function addDataToDataset(data, datasetId, blockIndex, uploadType, callback) { callback(null, recCount); }; - var sad = function (jqxhr, status, err) { + var sad = function (jqxhr, err) { api.log('addDataToDataset: checking failure details'); if (jqxhr.status == 413 && data.length > 1) { // request entity too big // but we can split the request and try again @@ -384,14 +402,7 @@ function addDataToDataset(data, datasetId, blockIndex, uploadType, callback) { callback('duplicate', jqxhr.responseJSON.index); } else { api.log('platform add data to dataset failed.'); - var err = new Error('Uploading data to platform failed.'); - err.name = 'API Error'; - err.status = status; - err.datasetId = datasetId; - if(status.meta) { - err.requestTrace = status.meta.trace.request; - } - api.log(JSON.stringify(status)); + var err = buildError(jqxhr, datasetId); callback(err); } }; @@ -402,7 +413,7 @@ function addDataToDataset(data, datasetId, blockIndex, uploadType, callback) { var uploadForUser = getUploadFunction(uploadType); uploadForUser(datasetId, data, function(err, result) { if (err) { - return sad(err, err); + return sad(data, err); } return happy(result); }); From c10dcff60d927d5f8af73acd91ffe66a7ec0a12c Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Thu, 6 Jul 2017 13:38:23 +0100 Subject: [PATCH 05/38] handle empty dataset error.text and meta --- lib/core/api.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/lib/core/api.js b/lib/core/api.js index f54e2f8cc3..49ceaf47e9 100644 --- a/lib/core/api.js +++ b/lib/core/api.js @@ -316,14 +316,11 @@ function getUploadFunction(uploadType) { function buildError(dataset, datasetId) { var err = new Error('Uploading data to platform failed.'); err.name = 'API Error'; - var status = null; - if(dataset.error && dataset.error.text) { - api.log('Error status:', dataset.error.text); - status = JSON.parse(dataset.error.text); - } + var status = JSON.parse(_.get(dataset, 'error.text', null)); + api.log('Error status:', status); err.status = status; err.datasetId = datasetId; - if(status.meta) { + if (_.has(status,'meta')) { err.requestTrace = status.meta.trace.request; err.sessionTrace = status.meta.trace.session; //TODO: session ID From 71c17eb0d852222c7cd68ad15ad961990a7509e8 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Thu, 6 Jul 2017 14:28:06 +0100 Subject: [PATCH 06/38] all platform errors now surface correctly --- lib/core/api.js | 28 +++++++++---------- yarn.lock | 72 +++++++++++++++++-------------------------------- 2 files changed, 39 insertions(+), 61 deletions(-) diff --git a/lib/core/api.js b/lib/core/api.js index 49ceaf47e9..17799c91cb 100644 --- a/lib/core/api.js +++ b/lib/core/api.js @@ -334,9 +334,9 @@ function createDatasetForUser(userId, info, callback) { callback(null, dataset); }; - var sad = function (jqxhr, err) { + var sad = function (err, dataset) { api.log('platform create dataset failed:', err); - var error = buildError(jqxhr); + var error = buildError(dataset); callback(error); }; @@ -344,7 +344,7 @@ function createDatasetForUser(userId, info, callback) { tidepool.createDatasetForUser(userId, info, function(err, dataset) { if (err) { - return sad(dataset, err); + return sad(err, dataset); } return happy(dataset); }); @@ -356,17 +356,17 @@ function finalizeDataset(datasetId, callback) { callback(); }; - var sad = function (err, datasetId) { + var sad = function (err, dataset) { api.log('platform finalize dataset failed:', err); - var error = buildError(null, datasetId); + var error = buildError(dataset, datasetId); callback(error); }; api.log('finalize dataset for dataset id ', datasetId); - tidepool.finalizeDataset(datasetId, function(err) { + tidepool.finalizeDataset(datasetId, function(err, result) { if (err) { - return sad(err, datasetId); + return sad(err, result); } return happy(); }); @@ -379,9 +379,9 @@ function addDataToDataset(data, datasetId, blockIndex, uploadType, callback) { callback(null, recCount); }; - var sad = function (jqxhr, err) { + var sad = function (error, dataset) { api.log('addDataToDataset: checking failure details'); - if (jqxhr.status == 413 && data.length > 1) { // request entity too big + if (error.status == 413 && data.length > 1) { // request entity too big // but we can split the request and try again var l = Math.floor(data.length / 2); var d1 = data.slice(0, l); @@ -394,12 +394,12 @@ function addDataToDataset(data, datasetId, blockIndex, uploadType, callback) { }); return; } - if (jqxhr.responseJSON && jqxhr.responseJSON.errorCode && jqxhr.responseJSON.errorCode == 'duplicate') { - api.log(jqxhr.responseJSON); - callback('duplicate', jqxhr.responseJSON.index); + if (error.responseJSON && error.responseJSON.errorCode && error.responseJSON.errorCode == 'duplicate') { + api.log(error.responseJSON); + callback('duplicate', error.responseJSON.index); } else { api.log('platform add data to dataset failed.'); - var err = buildError(jqxhr, datasetId); + var err = buildError(dataset, datasetId); callback(err); } }; @@ -410,7 +410,7 @@ function addDataToDataset(data, datasetId, blockIndex, uploadType, callback) { var uploadForUser = getUploadFunction(uploadType); uploadForUser(datasetId, data, function(err, result) { if (err) { - return sad(data, err); + return sad(err, result); } return happy(result); }); diff --git a/yarn.lock b/yarn.lock index 2222504af4..872ec40d21 100644 --- a/yarn.lock +++ b/yarn.lock @@ -135,14 +135,14 @@ ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" -ansi-regex@*, ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - ansi-regex@^0.2.0, ansi-regex@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" @@ -363,7 +363,7 @@ async-some@~1.0.2: dependencies: dezalgo "^1.0.2" -async@0.9.0: +async@0.9.0, async@^0.9.0, async@~0.9.0: version "0.9.0" resolved "https://registry.yarnpkg.com/async/-/async-0.9.0.tgz#ac3613b1da9bed1b47510bb4651b8931e47146c7" @@ -371,10 +371,6 @@ async@1.5.2, async@^1.3.0, async@^1.4.0, async@^1.5.0: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -async@^0.9.0, async@~0.9.0: - version "0.9.2" - resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" - async@^2.0.0, async@^2.0.1: version "2.5.0" resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" @@ -2575,7 +2571,7 @@ debug@2.6.7: dependencies: ms "2.0.0" -debuglog@*, debuglog@^1.0.1: +debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -4520,7 +4516,7 @@ import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" -imurmurhash@*, imurmurhash@^0.1.4: +imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -5228,10 +5224,6 @@ lodash._baseget@^3.0.0: version "3.7.2" resolved "https://registry.yarnpkg.com/lodash._baseget/-/lodash._baseget-3.7.2.tgz#1b6ae1d5facf3c25532350a13c1197cb8bb674f4" -lodash._baseindexof@*: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" - lodash._basetostring@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" @@ -5254,25 +5246,11 @@ lodash._basevalues@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" -lodash._bindcallback@*: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" - -lodash._cacheindexof@*: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" - -lodash._createcache@*: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" - dependencies: - lodash._getnative "^3.0.0" - lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" -lodash._getnative@*, lodash._getnative@^3.0.0: +lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" @@ -5441,7 +5419,7 @@ lodash.rest@^4.0.0: version "4.0.5" resolved "https://registry.yarnpkg.com/lodash.rest/-/lodash.rest-4.0.5.tgz#954ef75049262038c96d1fc98b28fdaf9f0772aa" -lodash.restparam@*, lodash.restparam@^3.0.0: +lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" @@ -5831,11 +5809,11 @@ multipipe@^0.1.2: dependencies: duplexer2 "0.0.2" -mute-stream@0.0.5: +mute-stream@0.0.5, mute-stream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" -mute-stream@0.0.7, mute-stream@~0.0.4: +mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" @@ -6309,17 +6287,17 @@ npmi@1.0.1: npm "^2.1.12" semver "^4.1.0" -"npmlog@0 || 1 || 2", "npmlog@0.1 || 1 || 2", npmlog@~2.0.0, "npmlog@~2.0.0 || ~3.1.0", npmlog@~2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692" +"npmlog@0 || 1 || 2", "npmlog@0 || 1 || 2 || 3 || 4", npmlog@2.0.3, npmlog@~2.0.0, npmlog@~2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.3.tgz#020f99351f0c02e399c674ba256e7c4d3b3dd298" dependencies: ansi "~0.3.1" are-we-there-yet "~1.1.2" gauge "~1.2.5" -"npmlog@0 || 1 || 2 || 3 || 4", npmlog@2.0.3, npmlog@~2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.3.tgz#020f99351f0c02e399c674ba256e7c4d3b3dd298" +"npmlog@0.1 || 1 || 2", "npmlog@~2.0.0 || ~3.1.0", npmlog@~2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-2.0.4.tgz#98b52530f2514ca90d09ec5b22c8846722375692" dependencies: ansi "~0.3.1" are-we-there-yet "~1.1.2" @@ -7443,7 +7421,7 @@ readable-stream@~2.1.5: string_decoder "~0.10.x" util-deprecate "~1.0.1" -readdir-scoped-modules@*, readdir-scoped-modules@^1.0.0: +readdir-scoped-modules@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" dependencies: @@ -8327,12 +8305,6 @@ stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" -strip-ansi@*, strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - dependencies: - ansi-regex "^3.0.0" - strip-ansi@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" @@ -8345,6 +8317,12 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1, strip-ansi@~3.0.1: dependencies: ansi-regex "^2.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -8910,7 +8888,7 @@ uuid@^2.0.1, uuid@^2.0.2, uuid@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" -validate-npm-package-license@*, validate-npm-package-license@^3.0.1, validate-npm-package-license@~3.0.1: +validate-npm-package-license@^3.0.1, validate-npm-package-license@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" dependencies: From 98ab32802888c5bbb0d13822568dd0550b36fd79 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Fri, 7 Jul 2017 11:02:54 +0100 Subject: [PATCH 07/38] add session token to error message --- app/actions/utils.js | 1 + app/utils/errors.js | 1 + lib/core/api.js | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app/actions/utils.js b/app/actions/utils.js index 18639fe550..80983ddd87 100644 --- a/app/actions/utils.js +++ b/app/actions/utils.js @@ -72,6 +72,7 @@ export function makeUploadCb(dispatch, getState, errCode, utc) { datasetId: err.datasetId || null, requestTrace: err.requestTrace || null, sessionTrace: err.sessionTrace || null, + sessionToken: err.sessionToken || null, code: err.code || errCode, version: version, data: recs diff --git a/app/utils/errors.js b/app/utils/errors.js index a208882633..debb7700e3 100644 --- a/app/utils/errors.js +++ b/app/utils/errors.js @@ -26,6 +26,7 @@ const errorProps = { step: 'Driver Step', datasetId: 'Dataset ID', requestTrace: 'Request Trace', + sessionToken: 'Session Token', sessionTrace: 'Session Trace', stringifiedStack: 'Stack Trace', utc: 'UTC Time', diff --git a/lib/core/api.js b/lib/core/api.js index 17799c91cb..327bd2fe16 100644 --- a/lib/core/api.js +++ b/lib/core/api.js @@ -320,10 +320,10 @@ function buildError(dataset, datasetId) { api.log('Error status:', status); err.status = status; err.datasetId = datasetId; + err.sessionToken = dataset.sessionToken; //TODO: calculate MD5 hash if (_.has(status,'meta')) { err.requestTrace = status.meta.trace.request; err.sessionTrace = status.meta.trace.session; - //TODO: session ID } return err; } From a3b3ee4e28ade743cdad476d274467cf04aec696 Mon Sep 17 00:00:00 2001 From: Dorian Scholz Date: Fri, 7 Jul 2017 12:24:42 +0200 Subject: [PATCH 08/38] fixed filename of tidepool logo --- app/components/Header.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/components/Header.js b/app/components/Header.js index b7c4ebe038..d16fb262ab 100644 --- a/app/components/Header.js +++ b/app/components/Header.js @@ -30,7 +30,7 @@ import * as actionSources from '../constants/actionSources'; import { pages, pagesMap } from '../constants/otherConstants'; import styles from '../../styles/components/Header.module.less'; -import logo from '../../images/Tidepool_Logo_light x2.png'; +import logo from '../../images/Tidepool_Logo_Light x2.png'; export class Header extends Component { static propTypes = { From 069d699ec99afad7294c04b04485ef70bd48237f Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Fri, 7 Jul 2017 15:38:08 +0100 Subject: [PATCH 09/38] response will be in error object, so not necessary to pass on dataset --- lib/core/api.js | 29 ++++++++++++++--------------- 1 file changed, 14 insertions(+), 15 deletions(-) diff --git a/lib/core/api.js b/lib/core/api.js index 327bd2fe16..91cbdb5f43 100644 --- a/lib/core/api.js +++ b/lib/core/api.js @@ -313,17 +313,16 @@ function getUploadFunction(uploadType) { return null; } -function buildError(dataset, datasetId) { +function buildError(error, datasetId) { var err = new Error('Uploading data to platform failed.'); err.name = 'API Error'; - var status = JSON.parse(_.get(dataset, 'error.text', null)); - api.log('Error status:', status); - err.status = status; + err.status = error.status; err.datasetId = datasetId; - err.sessionToken = dataset.sessionToken; //TODO: calculate MD5 hash - if (_.has(status,'meta')) { - err.requestTrace = status.meta.trace.request; - err.sessionTrace = status.meta.trace.session; + var errText = JSON.parse(_.get(error, 'response.error.text', null)); + if (_.has(errText,'meta')) { + err.requestTrace = errText.meta.trace.request; + err.sessionTrace = errText.meta.trace.session; + err.sessionToken = md5(errText.meta.trace.token); } return err; } @@ -334,9 +333,9 @@ function createDatasetForUser(userId, info, callback) { callback(null, dataset); }; - var sad = function (err, dataset) { + var sad = function (err) { api.log('platform create dataset failed:', err); - var error = buildError(dataset); + var error = buildError(err); callback(error); }; @@ -344,7 +343,7 @@ function createDatasetForUser(userId, info, callback) { tidepool.createDatasetForUser(userId, info, function(err, dataset) { if (err) { - return sad(err, dataset); + return sad(err); } return happy(dataset); }); @@ -358,7 +357,7 @@ function finalizeDataset(datasetId, callback) { var sad = function (err, dataset) { api.log('platform finalize dataset failed:', err); - var error = buildError(dataset, datasetId); + var error = buildError(err, datasetId); callback(error); }; @@ -379,7 +378,7 @@ function addDataToDataset(data, datasetId, blockIndex, uploadType, callback) { callback(null, recCount); }; - var sad = function (error, dataset) { + var sad = function (error) { api.log('addDataToDataset: checking failure details'); if (error.status == 413 && data.length > 1) { // request entity too big // but we can split the request and try again @@ -399,7 +398,7 @@ function addDataToDataset(data, datasetId, blockIndex, uploadType, callback) { callback('duplicate', error.responseJSON.index); } else { api.log('platform add data to dataset failed.'); - var err = buildError(dataset, datasetId); + var err = buildError(error, datasetId); callback(err); } }; @@ -410,7 +409,7 @@ function addDataToDataset(data, datasetId, blockIndex, uploadType, callback) { var uploadForUser = getUploadFunction(uploadType); uploadForUser(datasetId, data, function(err, result) { if (err) { - return sad(err, result); + return sad(err); } return happy(result); }); From ef716df13475d178eeaf13b6cdfd464551b88a74 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Fri, 7 Jul 2017 17:26:44 +0100 Subject: [PATCH 10/38] started adding more CBG types that increment time --- lib/drivers/medtronic/cli/compare_json.js | 7 ++++++- lib/drivers/medtronic/processData.js | 13 +++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/lib/drivers/medtronic/cli/compare_json.js b/lib/drivers/medtronic/cli/compare_json.js index 48e07b0718..dd081b7142 100755 --- a/lib/drivers/medtronic/cli/compare_json.js +++ b/lib/drivers/medtronic/cli/compare_json.js @@ -8,7 +8,9 @@ var difflet = require('difflet')({ indent : 2, comment: true }); var intro = 'Compare JSON CLI:'; var file1, file2; -var EXCLUDES = ['index','source','previous','payload','deviceId','annotations']; +var EXCLUDES = ['index','source','previous','payload','deviceId','annotations', +'_deduplicator', 'createdUserId', 'guid', 'id', 'uploadId','deviceSerialNumber', 'modifiedUserId' +]; /* reasons for exclusion: index - always different between CareLink and Medtronic drivers source - not used in Medtronic driver @@ -46,6 +48,9 @@ function cleanup(record) { // CareLink driver records zero bg values delete record.bgInput; } + if(record.type === 'cbg') { + record.value -= record.value % 2; + } if(record.type === 'basal') { // CareLink driver always uses expectedDuration as duration (which then gets modified by Jellyfish) // so we can't compare durations diff --git a/lib/drivers/medtronic/processData.js b/lib/drivers/medtronic/processData.js index 3418705348..a5c45a963b 100644 --- a/lib/drivers/medtronic/processData.js +++ b/lib/drivers/medtronic/processData.js @@ -536,9 +536,18 @@ function buildCGMRecords(events) { postrecords.push(record); } } else { - if (descriptor === 2 && event.body[offset] === 0x02) { + var type = getType(event.body[offset],CBG_RECORD_TYPES); + // TODO: determine when CBG type is valid (), e.g. + // SENSOR_CALIBRATION_EVENT with descrptor 238 is valid, + // but with 0x22 is not + if(descriptor === 0 || descriptor === 2 || type === CBG_RECORD_TYPES.SENSOR_PACKET_EVENT) { + if(__DEBUG__) { + debug('CBG type:', type.name); + } recordsSinceTimestamp += 1; - } + } /* else { + console.log("DESCRIPTOR:", descriptor, "TYPE:",getType(event.body[offset],CBG_RECORD_TYPES).name) + } */ } offset -= 1; From bfb88b7bfa85204db28f4817fc9df02b74e03277 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Mon, 10 Jul 2017 11:33:55 +0100 Subject: [PATCH 11/38] increment time when descriptor is <20 or >200 and we have a valid type --- lib/drivers/medtronic/cli/compare_json.js | 5 ++++- lib/drivers/medtronic/processData.js | 9 ++------- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/drivers/medtronic/cli/compare_json.js b/lib/drivers/medtronic/cli/compare_json.js index dd081b7142..cd6aefeb5a 100755 --- a/lib/drivers/medtronic/cli/compare_json.js +++ b/lib/drivers/medtronic/cli/compare_json.js @@ -49,7 +49,10 @@ function cleanup(record) { delete record.bgInput; } if(record.type === 'cbg') { - record.value -= record.value % 2; + record.value -= record.value % 2; // CareLink only reports even values (!) + if(record.value === 40) { + record.value = 38; // difference between CL and TP implementation for BG low + } } if(record.type === 'basal') { // CareLink driver always uses expectedDuration as duration (which then gets modified by Jellyfish) diff --git a/lib/drivers/medtronic/processData.js b/lib/drivers/medtronic/processData.js index a5c45a963b..4ee075a6cc 100644 --- a/lib/drivers/medtronic/processData.js +++ b/lib/drivers/medtronic/processData.js @@ -537,17 +537,12 @@ function buildCGMRecords(events) { } } else { var type = getType(event.body[offset],CBG_RECORD_TYPES); - // TODO: determine when CBG type is valid (), e.g. - // SENSOR_CALIBRATION_EVENT with descrptor 238 is valid, - // but with 0x22 is not - if(descriptor === 0 || descriptor === 2 || type === CBG_RECORD_TYPES.SENSOR_PACKET_EVENT) { + if( (descriptor < 20 || descriptor > 200) && type != null) { if(__DEBUG__) { debug('CBG type:', type.name); } recordsSinceTimestamp += 1; - } /* else { - console.log("DESCRIPTOR:", descriptor, "TYPE:",getType(event.body[offset],CBG_RECORD_TYPES).name) - } */ + } } offset -= 1; From 25e1f4cdf89e2ab02ff00fa1674101fe10b8b0ac Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Mon, 10 Jul 2017 14:02:59 +0100 Subject: [PATCH 12/38] v0.306.6 --- manifest.json | 2 +- npm-shrinkwrap.json | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/manifest.json b/manifest.json index 58ea1ef50c..8f24559c85 100644 --- a/manifest.json +++ b/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "Tidepool Uploader", "short_name": "Uploader", - "version": "0.306.5", + "version": "0.306.6", "description": "The Tidepool Uploader helps you get your data from insulin pumps, CGMs and BG meters into Tidepool’s secure cloud platform.", "minimum_chrome_version": "38", "icons": { diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 96dcc49f28..cc3cbcfe58 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -10,5 +10,5 @@ } } }, - "version": "0.306.5" + "version": "0.306.6" } diff --git a/package.json b/package.json index a351451657..442d6d0304 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "0.306.5", + "version": "0.306.6", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.js", From 8037987d10de720ac6d4dae2bab65b201a767525 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Mon, 10 Jul 2017 14:55:24 +0100 Subject: [PATCH 13/38] update travis config --- .travis.yml | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index 0ff068d400..ee60dafe0c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,17 +2,16 @@ sudo: false language: node_js node_js: - - "0.12.7" + - "6.3.0" - "stable" -before_install: if [[ `npm -v` != 3* ]]; then npm i -g npm@3; fi +install: +- yarn install --frozen-lockfile script: -- npm run lint -- npm test +- yarn lint +- yarn test matrix: allow_failures: - node_js: "stable" - - From 3217b4eeb02f0873d566486bfcf28f244f53dc01 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Mon, 10 Jul 2017 15:03:20 +0100 Subject: [PATCH 14/38] fix lockfile; remove npm-shrinkwrap --- npm-shrinkwrap.json | 14 ------------ yarn.lock | 55 +++++++++++++++++++++------------------------ 2 files changed, 25 insertions(+), 44 deletions(-) delete mode 100644 npm-shrinkwrap.json diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json deleted file mode 100644 index cc3cbcfe58..0000000000 --- a/npm-shrinkwrap.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "dependencies": { - "difflet": { - "version": "1.0.1", - "from": "difflet@1.0.1", - "dependencies": { - "charm": { - "version": "1.0.1" - } - } - } - }, - "version": "0.306.6" -} diff --git a/yarn.lock b/yarn.lock index 70fcceb01a..a1f6580038 100644 --- a/yarn.lock +++ b/yarn.lock @@ -217,10 +217,6 @@ ast-types@0.8.12: version "0.8.12" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.12.tgz#a0d90e4351bb887716c83fd637ebf818af4adfcc" -ast-types@0.8.15: - version "0.8.15" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.15.tgz#8eef0827f04dff0ec8857ba925abe3fea6194e52" - ast-types@0.9.6: version "0.9.6" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" @@ -746,6 +742,10 @@ char-spinner@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/char-spinner/-/char-spinner-1.0.1.tgz#e6ea67bd247e107112983b7ab0479ed362800081" +charm@0.1.x: + version "0.1.2" + resolved "https://registry.yarnpkg.com/charm/-/charm-0.1.2.tgz#06c21eed1a1b06aeb67553cdc53e23274bac2296" + chmodr@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/chmodr/-/chmodr-1.0.2.tgz#04662b932d0f02ec66deaa2b0ea42811968e3eb9" @@ -1234,7 +1234,7 @@ deep-extend@~0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" -deep-is@~0.1.3: +deep-is@0.1.x, deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" @@ -1325,6 +1325,14 @@ diff@1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/diff/-/diff-1.4.0.tgz#7f28d2eb9ee7b15a97efd89ce63dcfdaa3ccbabf" +difflet@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/difflet/-/difflet-1.0.1.tgz#189f8f9039e4ee4ac3ea943d4de66d259965b13c" + dependencies: + charm "0.1.x" + deep-is "0.1.x" + traverse "0.6.x" + doctrine@^0.7.1: version "0.7.2" resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523" @@ -3257,7 +3265,7 @@ minimatch@~0.2.11: lru-cache "2" sigmund "~1.0.0" -minimist@0.0.8: +minimist@0.0.8, minimist@~0.0.1: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -3265,10 +3273,6 @@ minimist@^1.1.0, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" -minimist@~0.0.1: - version "0.0.10" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" - mkdirp@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.3.0.tgz#1bbf5ab1ba827af23575143490426455f481fe1e" @@ -3325,14 +3329,10 @@ ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" -mute-stream@0.0.5: +mute-stream@0.0.5, mute-stream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0" -mute-stream@~0.0.4: - version "0.0.7" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" - nan@^2.3.0: version "2.6.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" @@ -4454,7 +4454,7 @@ realize-package-specifier@~3.0.1: dezalgo "^1.0.1" npm-package-arg "^4.1.1" -recast@0.10.33: +recast@0.10.33, recast@^0.10.10: version "0.10.33" resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.33.tgz#942808f7aa016f1fa7142c461d7e5704aaa8d697" dependencies: @@ -4463,15 +4463,6 @@ recast@0.10.33: private "~0.1.5" source-map "~0.5.0" -recast@^0.10.10: - version "0.10.43" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.10.43.tgz#b95d50f6d60761a5f6252e15d80678168491ce7f" - dependencies: - ast-types "0.8.15" - esprima-fb "~15001.1001.0-dev-harmony-fb" - private "~0.1.5" - source-map "~0.5.0" - recast@^0.11.17: version "0.11.23" resolved "https://registry.yarnpkg.com/recast/-/recast-0.11.23.tgz#451fd3004ab1e4df9b4e4b66376b2a21912462d3" @@ -5108,14 +5099,14 @@ stack-trace@0.0.9: version "0.0.9" resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.9.tgz#a8f6eaeca90674c333e7c43953f275b451510695" -statuses@1, "statuses@>= 1.3.1 < 2", statuses@~1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" - -statuses@~1.2.1: +statuses@1, statuses@~1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.2.1.tgz#dded45cc18256d51ed40aec142489d5c61026d28" +"statuses@>= 1.3.1 < 2", statuses@~1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" + stream-browserify@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db" @@ -5334,6 +5325,10 @@ tough-cookie@~2.2.0: version "2.2.2" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.2.2.tgz#c83a1830f4e5ef0b93ef2a3488e724f8de016ac7" +traverse@0.6.x: + version "0.6.6" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" + trim-right@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003" From 6f16ac5204240bc644a6d027c3cc9beb45100692 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Mon, 10 Jul 2017 15:31:33 +0100 Subject: [PATCH 15/38] bump patch version in phantomjs-prebuilt to try and get travis running --- package.json | 2 +- yarn.lock | 61 +++++++++++++++++++++++++++------------------------- 2 files changed, 33 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index 442d6d0304..0af56077cd 100644 --- a/package.json +++ b/package.json @@ -69,7 +69,7 @@ "merge-stream": "1.0.0", "mocha": "2.4.5", "object-invariant-test-helper": "0.1.1", - "phantomjs-prebuilt": "2.1.7", + "phantomjs-prebuilt": "2.1.8", "proxyquire": "1.7.4", "react-addons-test-utils": "0.14.7", "react-hot-loader": "1.3.0", diff --git a/yarn.lock b/yarn.lock index a1f6580038..5f30976508 100644 --- a/yarn.lock +++ b/yarn.lock @@ -552,6 +552,12 @@ bl@~1.0.0: dependencies: readable-stream "~2.0.5" +bl@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" + dependencies: + readable-stream "~2.0.5" + blob@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/blob/-/blob-0.0.4.tgz#bcf13052ca54463f30f9fc7e95b9a47630a94921" @@ -1869,7 +1875,7 @@ form-data@0.1.3: combined-stream "~0.0.4" mime "~1.2.11" -form-data@~1.0.0-rc1, form-data@~1.0.0-rc3: +form-data@~1.0.0-rc1, form-data@~1.0.0-rc4: version "1.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-1.0.1.tgz#ae315db9a4907fa065502304a66d7733475ee37c" dependencies: @@ -1918,9 +1924,9 @@ fs-extra@0.24.0: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@~0.26.4: - version "0.26.7" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" +fs-extra@~0.30.0: + version "0.30.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.30.0.tgz#f233ffcc08d4da7d432daa449776989db1df93f0" dependencies: graceful-fs "^4.1.2" jsonfile "^2.1.0" @@ -2169,7 +2175,7 @@ har-validator@^1.6.1: commander "^2.8.1" is-my-json-valid "^2.12.0" -har-validator@~2.0.2: +har-validator@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" dependencies: @@ -3832,18 +3838,18 @@ performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" -phantomjs-prebuilt@2.1.7: - version "2.1.7" - resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.7.tgz#c90bf1b9772fa197994331fcf3f67099a96853ca" +phantomjs-prebuilt@2.1.8: + version "2.1.8" + resolved "https://registry.yarnpkg.com/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.8.tgz#96cdac3e453765f143f8a58406021bd741ad062d" dependencies: extract-zip "~1.5.0" - fs-extra "~0.26.4" + fs-extra "~0.30.0" hasha "^2.2.0" kew "~0.7.0" progress "~1.1.8" - request "~2.67.0" + request "~2.74.0" request-progress "~2.0.1" - which "~1.2.2" + which "~1.2.10" pify@^2.0.0: version "2.3.0" @@ -4202,9 +4208,9 @@ qs@~5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/qs/-/qs-5.1.0.tgz#4d932e5c7ea411cca76a312d39a606200fd50cd9" -qs@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/qs/-/qs-5.2.1.tgz#801fee030e0b9450d6385adc48a4cc55b44aedfc" +qs@~6.2.0: + version "6.2.3" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe" query-string@^4.1.0: version "4.3.4" @@ -4683,29 +4689,30 @@ request@~2.64.0: tough-cookie ">=0.12.0" tunnel-agent "~0.4.0" -request@~2.67.0: - version "2.67.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.67.0.tgz#8af74780e2bf11ea0ae9aa965c11f11afd272742" +request@~2.74.0: + version "2.74.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.74.0.tgz#7693ca768bbb0ea5c8ce08c084a45efa05b892ab" dependencies: aws-sign2 "~0.6.0" - bl "~1.0.0" + aws4 "^1.2.1" + bl "~1.1.2" caseless "~0.11.0" combined-stream "~1.0.5" extend "~3.0.0" forever-agent "~0.6.1" - form-data "~1.0.0-rc3" - har-validator "~2.0.2" - hawk "~3.1.0" + form-data "~1.0.0-rc4" + har-validator "~2.0.6" + hawk "~3.1.3" http-signature "~1.1.0" is-typedarray "~1.0.0" isstream "~0.1.2" json-stringify-safe "~5.0.1" mime-types "~2.1.7" node-uuid "~1.4.7" - oauth-sign "~0.8.0" - qs "~5.2.0" + oauth-sign "~0.8.1" + qs "~6.2.0" stringstream "~0.0.4" - tough-cookie "~2.2.0" + tough-cookie "~2.3.0" tunnel-agent "~0.4.1" requires-port@1.0.x, requires-port@1.x.x: @@ -5321,10 +5328,6 @@ tough-cookie@>=0.12.0, tough-cookie@~2.3.0: dependencies: punycode "^1.4.1" -tough-cookie@~2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.2.2.tgz#c83a1830f4e5ef0b93ef2a3488e724f8de016ac7" - traverse@0.6.x: version "0.6.6" resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.6.tgz#cbdf560fd7b9af632502fed40f918c157ea97137" @@ -5635,7 +5638,7 @@ whet.extend@~0.9.9: version "0.9.9" resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1" -which@1, which@^1.2.1, which@~1.2.2: +which@1, which@^1.2.1, which@~1.2.10: version "1.2.14" resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" dependencies: From 4b84709fbb96e7d1f9643b6a0e3ed045e7bcfc82 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Mon, 10 Jul 2017 22:08:34 +0100 Subject: [PATCH 16/38] removing completion sound (for now) in MedTD driver --- lib/drivers/medtronic/medtronicDriver.js | 3 ++- sounds/underwater.wav | Bin 209258 -> 0 bytes 2 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 sounds/underwater.wav diff --git a/lib/drivers/medtronic/medtronicDriver.js b/lib/drivers/medtronic/medtronicDriver.js index 1bbbbd4302..190fd3f9da 100644 --- a/lib/drivers/medtronic/medtronicDriver.js +++ b/lib/drivers/medtronic/medtronicDriver.js @@ -1586,10 +1586,11 @@ module.exports = function (config) { cleanup: function (progress, data, cb) { debug('in cleanup'); + /* TODO: put this back in when we have new sound/earcon if(isBrowser) { var snd = new Audio('../../../sounds/underwater.wav'); snd.play(); - } + }*/ if(isBrowser) { if(!data.disconnect){ diff --git a/sounds/underwater.wav b/sounds/underwater.wav deleted file mode 100644 index c6da5fbe90a9e80907c5b638c2abb8aaeb0a8cf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 209258 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 z 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

=PXEUlijNb#P&L$T{FeoyXY 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Ⓢ=)oq9AMFDgWQWX+zcmrJ!;6*T^&BNzrQY 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 Date: Mon, 10 Jul 2017 22:09:02 +0100 Subject: [PATCH 17/38] v0.307.0 --- manifest.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index 8f24559c85..f136159791 100644 --- a/manifest.json +++ b/manifest.json @@ -2,7 +2,7 @@ "manifest_version": 2, "name": "Tidepool Uploader", "short_name": "Uploader", - "version": "0.306.6", + "version": "0.307.0", "description": "The Tidepool Uploader helps you get your data from insulin pumps, CGMs and BG meters into Tidepool’s secure cloud platform.", "minimum_chrome_version": "38", "icons": { diff --git a/package.json b/package.json index 0af56077cd..a06b388e1f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "0.306.6", + "version": "0.307.0", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.js", From 15cc3fa1db4b5c9aa3df030cf21751791df26213 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 11 Jul 2017 15:05:29 +0100 Subject: [PATCH 18/38] remove all driver links as we're now automatically installing drivers with uploader --- app/actions/async.js | 30 ++--- app/components/UploadList.js | 20 +--- app/constants/otherConstants.js | 1 - app/reducers/devices.js | 14 --- docs/state/ExampleStateTree.md | 32 ----- docs/state/StateTreeGlossary.md | 2 +- styles/components/DeviceSelection.module.less | 8 -- test/app/actions/async.test.js | 109 ------------------ test/app/actions/sync.test.js | 1 - 9 files changed, 15 insertions(+), 202 deletions(-) diff --git a/app/actions/async.js b/app/actions/async.js index 3dc9d4ad98..d672670103 100644 --- a/app/actions/async.js +++ b/app/actions/async.js @@ -250,28 +250,14 @@ export function doDeviceUpload(driverId, opts = {}, utc) { device.detect(driverId, opts, (err, dev) => { if (err) { - if ((os === 'mac' && _.get(targetDevice, ['showDriverLink', os], false) === true) || - (os === 'win' && _.get(targetDevice, ['showDriverLink', os], false) === true)) { - let displayErr = new Error(); - let driverLinkErrProps = { - details: err.message, - utc: actionUtils.getUtc(utc), - code: 'E_DRIVER', - version: version - }; - displayErr.driverLink = urls.DRIVER_DOWNLOAD; - return dispatch(syncActions.uploadFailure(displayErr, driverLinkErrProps, targetDevice)); - } - else { - let displayErr = new Error(errorText.E_SERIAL_CONNECTION); - let deviceDetectErrProps = { - details: err.message, - utc: actionUtils.getUtc(utc), - code: 'E_SERIAL_CONNECTION', - version: version - }; - return dispatch(syncActions.uploadFailure(displayErr, deviceDetectErrProps, targetDevice)); - } + let displayErr = new Error(errorText.E_SERIAL_CONNECTION); + let deviceDetectErrProps = { + details: err.message, + utc: actionUtils.getUtc(utc), + code: 'E_SERIAL_CONNECTION', + version: version + }; + return dispatch(syncActions.uploadFailure(displayErr, deviceDetectErrProps, targetDevice)); } if (!dev && opts.filename == null) { diff --git a/app/components/UploadList.js b/app/components/UploadList.js index 4da20b2b4b..9201e0bb0f 100644 --- a/app/components/UploadList.js +++ b/app/components/UploadList.js @@ -106,20 +106,12 @@ export default class UploadList extends Component { } const errorDetails = upload.showErrorDetails ? (

{upload.error.debug}
) : null; - const errorMessage = upload.error.driverLink ? - ( -
- ) : - ( -
- {this.props.text.UPLOAD_FAILED} - {upload.error.message} -
- ); + const errorMessage = ( +
+ {this.props.text.UPLOAD_FAILED} + {upload.error.message} +
+ ); const showErrorsText = upload.showErrorDetails ? this.props.text.HIDE_ERROR : this.props.text.SHOW_ERROR; function makeToggleDetailsFn() { diff --git a/app/constants/otherConstants.js b/app/constants/otherConstants.js index 68c8a84e73..70aacae445 100644 --- a/app/constants/otherConstants.js +++ b/app/constants/otherConstants.js @@ -57,7 +57,6 @@ export const steps = { }; export const urls = { - DRIVER_DOWNLOAD: 'http://tidepool.org/downloads/', HOW_TO_UPDATE_KB_ARTICLE: 'http://support.tidepool.org/article/6-how-to-install-or-upgrade-the-tidepool-uploader-gen', HOW_TO_SHARE_DATA_KB_ARTICLE: 'http://support.tidepool.org/article/16-share-your-data' }; diff --git a/app/reducers/devices.js b/app/reducers/devices.js index 665da11ec5..3392982227 100644 --- a/app/reducers/devices.js +++ b/app/reducers/devices.js @@ -7,7 +7,6 @@ const devices = { name: 'Medtronic', // for the device selection list selectName: 'Medtronic (from CareLink)', - showDriverLink: {mac: false, win: false}, source: {type: 'carelink'}, enabled: {mac: true, win: true} }, @@ -22,7 +21,6 @@ const devices = { key: 'medtronic', name: 'Medtronic - 523, 723 or 530G', selectName: 'Medtronic direct from Bayer Contour Next Link', - showDriverLink: {mac: false, win: false}, source: {type: 'device', driverId: 'Medtronic'}, enabled: {mac: true, win: true} }, @@ -30,7 +28,6 @@ const devices = { instructions: 'Plug in PDM with mini-USB and choose .ibf file from PDM', key: 'omnipod', name: 'Insulet OmniPod', - showDriverLink: {mac: false, win: false}, source: {type: 'block', driverId: 'InsuletOmniPod', extension: '.ibf'}, enabled: {mac: true, win: true} }, @@ -38,7 +35,6 @@ const devices = { instructions: 'Plug in receiver with micro-USB', key: 'dexcom', name: 'Dexcom', - showDriverLink: {mac: true, win: true}, source: {type: 'device', driverId: 'Dexcom'}, enabled: {mac: true, win: true} }, @@ -46,7 +42,6 @@ const devices = { instructions: 'Plug in meter with cable', key: 'precisionxtra', name: 'Abbott Precision Xtra', - showDriverLink: {mac: false, win: true}, source: {type: 'device', driverId: 'AbbottPrecisionXtra'}, enabled: {mac: false, win: true} }, @@ -54,7 +49,6 @@ const devices = { instructions: 'Plug in pump with micro-USB', key: 'tandem', name: 'Tandem', - showDriverLink: {mac: false, win: true}, source: {type: 'device', driverId: 'Tandem'}, enabled: {mac: true, win: true} }, @@ -62,7 +56,6 @@ const devices = { instructions: 'Plug in meter with cable', key: 'abbottfreestylelite', name: 'Abbott FreeStyle Lite', - showDriverLink: {mac: false, win: true}, source: {type: 'device', driverId: 'AbbottFreeStyleLite'}, enabled: {mac: false, win: true} }, @@ -70,7 +63,6 @@ const devices = { instructions: 'Plug in meter with cable', key: 'abbottfreestylefreedomlite', name: 'Abbott FreeStyle Freedom Lite', - showDriverLink: {mac: false, win: true}, source: {type: 'device', driverId: 'AbbottFreeStyleFreedomLite'}, enabled: {mac: false, win: true} }, @@ -78,7 +70,6 @@ const devices = { instructions: 'Plug in meter with micro-USB', key: 'bayercontournext', name: 'Bayer Contour Next', - showDriverLink: {mac: false, win: false}, source: {type: 'device', driverId: 'BayerContourNext'}, enabled: {mac: true, win: true} }, @@ -86,7 +77,6 @@ const devices = { instructions: 'Plug meter into USB port', key: 'bayercontournextusb', name: 'Bayer Contour Next USB', - showDriverLink: {mac: false, win: false}, source: {type: 'device', driverId: 'BayerContourNextUsb'}, enabled: {mac: true, win: true} }, @@ -94,7 +84,6 @@ const devices = { instructions: 'Plug meter into USB port', key: 'bayercontourusb', name: 'Bayer Contour USB', - showDriverLink: {mac: false, win: false}, source: {type: 'device', driverId: 'BayerContourUsb'}, enabled: {mac: true, win: true} }, @@ -102,7 +91,6 @@ const devices = { instructions: 'Plug meter into USB port', key: 'bayercontournextlink', name: 'Bayer Contour Next Link', - showDriverLink: {mac: false, win: false}, source: {type: 'device', driverId: 'BayerContourNextLink'}, enabled: {mac: true, win: true} }, @@ -110,7 +98,6 @@ const devices = { instructions: 'Suspend and align back of pump with IR dongle front', key: 'animas', name: 'Animas', - showDriverLink: {mac: true, win: true}, source: {type: 'device', driverId: 'Animas'}, enabled: {mac: true, win: true} }, @@ -118,7 +105,6 @@ const devices = { instructions: 'Plug in meter with mini-USB', name: 'OneTouch VerioIQ', key: 'onetouchverioiq', - showDriverLink: {mac: true, win: true}, source: {type: 'device', driverId: 'OneTouchVerioIQ'}, enabled: {mac: true, win: true} } diff --git a/docs/state/ExampleStateTree.md b/docs/state/ExampleStateTree.md index 5f6fd0b210..4cc7e6a0c0 100644 --- a/docs/state/ExampleStateTree.md +++ b/docs/state/ExampleStateTree.md @@ -14,10 +14,6 @@ The JSON that follows on this page represents a snapshot of the Tidepool Uploade "key": "carelink", "name": "Medtronic", "selectName": "Medtronic (from CareLink)", - "showDriverLink": { - "mac": false, - "win": false - }, "source": { "type": "carelink" }, @@ -30,10 +26,6 @@ The JSON that follows on this page represents a snapshot of the Tidepool Uploade "instructions": "Choose .ibf file from PDM", "key": "omnipod", "name": "Insulet OmniPod", - "showDriverLink": { - "mac": false, - "win": false - }, "source": { "type": "block", "driverId": "InsuletOmniPod", @@ -48,10 +40,6 @@ The JSON that follows on this page represents a snapshot of the Tidepool Uploade "instructions": "Plug in receiver with micro-USB", "key": "dexcom", "name": "Dexcom", - "showDriverLink": { - "mac": true, - "win": true - }, "source": { "type": "device", "driverId": "Dexcom" @@ -65,10 +53,6 @@ The JSON that follows on this page represents a snapshot of the Tidepool Uploade "instructions": "Plug in pump with micro-USB", "key": "tandem", "name": "Tandem", - "showDriverLink": { - "mac": false, - "win": true - }, "source": { "type": "device", "driverId": "Tandem" @@ -82,10 +66,6 @@ The JSON that follows on this page represents a snapshot of the Tidepool Uploade "instructions": "Plug in meter with micro-USB", "key": "bayercontournext", "name": "Bayer Contour Next", - "showDriverLink": { - "mac": false, - "win": false - }, "source": { "type": "device", "driverId": "BayerContourNext" @@ -99,10 +79,6 @@ The JSON that follows on this page represents a snapshot of the Tidepool Uploade "instructions": "Plug meter into USB port", "key": "bayercontournextusb", "name": "Bayer Contour Next USB", - "showDriverLink": { - "mac": false, - "win": false - }, "source": { "type": "device", "driverId": "BayerContourNextUsb" @@ -116,10 +92,6 @@ The JSON that follows on this page represents a snapshot of the Tidepool Uploade "instructions": "Plug meter into USB port", "key": "bayercontourusb", "name": "Bayer Contour USB", - "showDriverLink": { - "mac": false, - "win": false - }, "source": { "type": "device", "driverId": "BayerContourUsb" @@ -133,10 +105,6 @@ The JSON that follows on this page represents a snapshot of the Tidepool Uploade "instructions": "Plug meter into USB port", "key": "bayercontournextlink", "name": "Bayer Contour Next Link", - "showDriverLink": { - "mac": false, - "win": false - }, "source": { "type": "device", "driverId": "BayerContourNextLink" diff --git a/docs/state/StateTreeGlossary.md b/docs/state/StateTreeGlossary.md index 03730f82b2..67d676c54c 100644 --- a/docs/state/StateTreeGlossary.md +++ b/docs/state/StateTreeGlossary.md @@ -118,7 +118,7 @@ The `viewDataLink` is built every time the `uploadTargetUser` is chosen or chang *The `devices` property on the state tree is an object keyed by the `id` of each device (or data source) supported by the Tidepool Uploader.* - `devices` *almost* does not belong in the state tree at all, because it is *almost* a constant. However, it is subject to filtering based on operating system; this filtering happens as part of the app initialization step when a user launches the Tidepool Uploader. The property `enabled` - itself an object with `mac` and `win` as its keys - encodes the devices Tidepool currently support on each platform. Similarly, the property `showDriverLink` encodes, for each device, whether the [Tidepool USB driver](http://tidepool.org/downloads/) is required in order to upload the device on each platform. + `devices` *almost* does not belong in the state tree at all, because it is *almost* a constant. However, it is subject to filtering based on operating system; this filtering happens as part of the app initialization step when a user launches the Tidepool Uploader. The property `enabled` - itself an object with `mac` and `win` as its keys - encodes the devices Tidepool currently support on each platform. The properties of each "device" in `devices` should be fairly self-explanatory. For example, the `instructions` property stores the text that appears in the UI under each device name to give the user some indication of how to proceed (e.g., what type of cable is required to connect a particular device). diff --git a/styles/components/DeviceSelection.module.less b/styles/components/DeviceSelection.module.less index 97093d977a..93e3f9913c 100644 --- a/styles/components/DeviceSelection.module.less +++ b/styles/components/DeviceSelection.module.less @@ -80,11 +80,3 @@ margin-top: -30px; margin-bottom: 13px; } - -.driverLink { - composes: link gray from '../core/typography.module.less'; - text-decoration: none; - :hover { - color: @purple-light; - } -} diff --git a/test/app/actions/async.test.js b/test/app/actions/async.test.js index 9ef5dca39c..01fb9a1621 100644 --- a/test/app/actions/async.test.js +++ b/test/app/actions/async.test.js @@ -714,107 +714,6 @@ describe('Asynchronous Actions', () => { }); }); - describe('doUpload [device, driver error]', () => { - it('should dispatch VERSION_CHECK_REQUEST, VERSION_CHECK_SUCCESS, UPLOAD_REQUEST, DEVICE_DETECT_REQUEST, UPLOAD_FAILURE actions', () => { - const userId = 'a1b2c3', deviceKey = 'a_pump'; - const time = '2016-01-01T12:05:00.123Z'; - const targetDevice = { - key: deviceKey, - name: 'Acme Insulin Pump', - showDriverLink: {mac: true}, - source: {type: 'device', driverId: 'AcmePump'} - }; - const initialState = { - devices: { - a_pump: targetDevice - }, - os: 'mac', - uploadsByUser: { - [userId]: { - a_cgm: {}, - a_pump: {history: [{start: time}]} - } - }, - targetDevices: { - [userId]: ['a_cgm', 'a_pump'] - }, - targetTimezones: { - [userId]: 'US/Mountain' - }, - uploadTargetDevice: deviceKey, - uploadTargetUser: userId, - version: '0.100.0', - working: {uploading: false} - }; - const errProps = { - utc: time, - version: initialState.version, - code: 'E_DRIVER' - }; - let err = new Error(`You may need to install the ${targetDevice.name} device driver.`); - err.driverLink = urls.DRIVER_DOWNLOAD; - err.code = errProps.code; - err.utc = errProps.utc; - err.version = errProps.version; - err.debug = `UTC Time: ${time} | Code: ${errProps.code} | Version: ${errProps.version}`; - __Rewire__('services', { - api: { - upload: { - getVersions: (cb) => cb(null, {uploaderMinimum: '0.99.0'}) - } - }, - device: { - detect: (foo, bar, cb) => cb('Error :(') - } - }); - const expectedActions = [ - { - type: actionTypes.VERSION_CHECK_REQUEST, - meta: {source: actionSources[actionTypes.VERSION_CHECK_REQUEST]} - }, - { - type: actionTypes.VERSION_CHECK_SUCCESS, - meta: {source: actionSources[actionTypes.VERSION_CHECK_SUCCESS]} - }, - { - type: actionTypes.UPLOAD_REQUEST, - payload: { userId, deviceKey, utc: time }, - meta: { - source: actionSources[actionTypes.UPLOAD_REQUEST], - metric: { - eventName: 'Upload Attempted', - properties: {type: targetDevice.source.type, source: targetDevice.source.driverId} - } - } - }, - { - type: actionTypes.DEVICE_DETECT_REQUEST, - meta: {source: actionSources[actionTypes.DEVICE_DETECT_REQUEST]} - }, - { - type: actionTypes.UPLOAD_FAILURE, - error: true, - payload: err, - meta: { - source: actionSources[actionTypes.UPLOAD_FAILURE], - metric: { - eventName: 'Upload Failed', - properties: { - type: targetDevice.source.type, - source: targetDevice.source.driverId, - error: err - } - } - } - } - ]; - const store = mockStore(initialState); - store.dispatch(asyncActions.doUpload(deviceKey, {}, time)); - const actions = store.getActions(); - expect(actions).to.deep.equal(expectedActions); - }); - }); - describe('doUpload [device, device detection error (serial)]', () => { it('should dispatch VERSION_CHECK_REQUEST, VERSION_CHECK_SUCCESS, UPLOAD_REQUEST, DEVICE_DETECT_REQUEST, UPLOAD_FAILURE actions', () => { const userId = 'a1b2c3', deviceKey = 'a_pump'; @@ -822,7 +721,6 @@ describe('Asynchronous Actions', () => { const targetDevice = { key: deviceKey, name: 'Acme Insulin Pump', - showDriverLink: {mac: false}, source: {type: 'device', driverId: 'AcmePump'} }; const initialState = { @@ -922,7 +820,6 @@ describe('Asynchronous Actions', () => { const targetDevice = { key: deviceKey, name: 'Acme Insulin Pump', - showDriverLink: {mac: false}, source: {type: 'device', driverId: 'AcmePump'} }; const initialState = { @@ -1022,7 +919,6 @@ describe('Asynchronous Actions', () => { const targetDevice = { key: deviceKey, name: 'Acme Insulin Pump', - showDriverLink: {mac: false}, source: {type: 'device', driverId: 'AcmePump'} }; const initialState = { @@ -1126,7 +1022,6 @@ describe('Asynchronous Actions', () => { const targetDevice = { key: deviceKey, name: 'Acme Insulin Pump', - showDriverLink: {mac: false}, source: {type: 'device', driverId: 'AcmePump'} }; const initialState = { @@ -1218,7 +1113,6 @@ describe('Asynchronous Actions', () => { const targetDevice = { key: deviceKey, name: 'CareLink', - showDriverLink: {mac: false}, source: {type: 'carelink'} }; const initialState = { @@ -1327,7 +1221,6 @@ describe('Asynchronous Actions', () => { const targetDevice = { key: deviceKey, name: 'CareLink', - showDriverLink: {mac: false}, source: {type: 'carelink'} }; const initialState = { @@ -1435,7 +1328,6 @@ describe('Asynchronous Actions', () => { const targetDevice = { key: deviceKey, name: 'Acme Insulin Pump', - showDriverLink: {mac: false}, source: {type: 'carelink'} }; const initialState = { @@ -1548,7 +1440,6 @@ describe('Asynchronous Actions', () => { const targetDevice = { key: deviceKey, name: 'Acme Insulin Pump', - showDriverLink: {mac: false}, source: {type: 'carelink'} }; const initialState = { diff --git a/test/app/actions/sync.test.js b/test/app/actions/sync.test.js index b38a36a5bf..4ca39cb9dd 100644 --- a/test/app/actions/sync.test.js +++ b/test/app/actions/sync.test.js @@ -675,7 +675,6 @@ describe('Synchronous Actions', () => { const device = { key: 'a_pump', name: 'Acme Pump', - showDriverLink: {mac: true, win: true}, source: {type: 'device', driverId: 'AcmePump'}, enabled: {mac: true, win: true} }; From 1dc28bc4a8f71430332cde7abc37686ec87b7469 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 11 Jul 2017 15:39:23 +0100 Subject: [PATCH 19/38] remove license file as it is not a EULA; already presented on signup and not on Mac --- resources/license.txt | 244 ------------------------------------------ 1 file changed, 244 deletions(-) delete mode 100755 resources/license.txt diff --git a/resources/license.txt b/resources/license.txt deleted file mode 100755 index bdbe001cc8..0000000000 --- a/resources/license.txt +++ /dev/null @@ -1,244 +0,0 @@ -Tidepool Terms of Use - -Effective Date: April 24, 2017, Version 2.0 - -These Terms of Use ("Terms") form a legally binding contract between you and Tidepool Project ("Tidepool," "us," or "we") governing your access to and use of our software applications, such as Tidepool for web, Tidepool for mobile, and the Tidepool Uploader, together with any other applications developed and/or distributed by Tidepool (the "Tidepool Apps"), including storage and retrieval of data by the Tidepool Apps on or through our hosted cloud platform (the "Tidepool Platform"), so please read them carefully before using any Tidepool Apps. We provide you with access to and use of the Tidepool Apps subject to your compliance with these Terms. By using the Tidepool Apps, you agree to be bound by these Terms, as well as our Privacy Policy, which is incorporated into these Terms. - -Those who use the Tidepool Apps to help manage their diabetes are referred to as "PwD Users" (for "Person with Diabetes" or the parent/guardian of one) herein. These Terms may include provisions that treat PwD Users differently from members of a PwD User's care team that the PwD User has granted access to ("Care Team Members"), from doctors, healthcare professionals, and other clinicians who may use Tidepool Apps to review data for people they provide care for ("Clinicians"), and from researchers who collect data from study participants for research purposes through the Tidepool Apps or Tidepool Platform ("Researchers"). PwD Users, Care Team Members, Clinicians and Researchers may collectively be referred to herein as "Users" (or, singularly, a "User"), and provisions that are not indicated as applying only to one of these groups apply to all. - -Some highlights of these Terms are as follows: - -PwD Users own their Information (as defined below) and decide who gets access to their Information. -You may only use the Tidepool Apps for lawful purposes. -You are granted a Creative Commons license to use certain aspects of the Tidepool Apps. The source code for the Tidepool Apps is available under a permissive open source license. Please see https://github.com/tidepool-org. -We care about protecting your privacy. Please review our Privacy Policy at https://tidepool.org/legal/privacy-policy-2-0. -Tidepool Apps are tools to assist in managing and making decisions related to diabetes care, but we cannot guarantee their accuracy or reliability for this purpose. -Tidepool Apps are not a replacement for the advice of healthcare professionals. -To learn more, please review the following: - -1. PwD User Information Ownership - -1.1 Your PwD User Rights - -1.2 License to Access and Use Information - -1.3 Information Security - -1.4 Control and Sharing - -2. Care Team Member, Researcher, and Clinician Accounts - -3. Acceptable Use of Tidepool Apps - -3.1 Use of Health Information - -3.2 Other Uses - -3.3 Responsible Disclosure Policy - -4. Content Licensing and Intellectual Property Rights - -4.1 Creative Commons License - -4.2 Trademarks and Trade Dress - -4.3 Your Information - -4.4 Hosted Software - -5. Availability of Tidepool Apps - -6. Linked Sites and Third Parties - -7. Consent to Communication - -8. Copyright Infringement - -9. Disclaimer of Warranties - -10. Limitation of Liability and Indemnity; One Year to Bring Claims - -11. Arbitration - -12. Changes to the Terms - -13. Changes to the Tidepool Apps - -14. General - -15. Contact Us - -1. PwD User Information Ownership -When a PwD User creates an account with Tidepool, or claims an account created on his or her behalf by a Clinician, etc., the PwD User is the legal owner of the data, notes, files, and other information stored and managed using the Tidepool Apps, including without limitation personally identifiable health information ("Information"). Care Team Members or Clinicians may provide Information to a PwD User's account with the PwD User's permission; this Information is owned by the PwD User. These Terms and our Privacy Policy shall govern the use of the Information. - -1.1 Your PwD User Rights - -A. As a PwD User, you always retain ownership of the Information in your account, and only you can grant and revoke permission to share it. - -B. Tidepool will never grant any third party access to your Information without your permission, except in limited circumstances (such as when specifically required by law) and only in accordance with our Privacy Policy. - -C. Tidepool, Care Team Members, Clinicians, Researchers, third-party applications, and third-party diabetes device makers are not granted any right to use or access your Information, except with your permission and in accordance with our Privacy Policy. - -D. You can export your Information at any time, and you can request that your Information be deleted at any time by requesting that Tidepool delete your account. But please note that Information that you have chosen to provide to Researchers, Clinicians, third-party applications, and third-party diabetes device makers may have been copied and/or retained by those third parties. - -E. A Clinician such as your doctor or other health care provider, or a Researcher conducting a study in which you participate, may establish a Tidepool account to store Information about you in Tidepool. That Clinician or Researcher may invite you to open a Tidepool account. If you accept that invitation, you will become a PwD User. You will have control over the account and the Information associated with that account, and these Terms of Use will apply to you. The Clinician or Researcher who invited you to open the account will be a member of your Care Team. You may remove the Clinician or Researcher from your Care Team at any time. - -If a Clinician or Researcher who uses Tidepool to store information about you does not invite you to open an account, or if you decide not to accept the Clinician's or Researcher's invitation, then you will not have control of the information in the account, and you will not be a PwD User with rights under these Terms of Use. - -F. Clinicians are solely responsible to you for the professional health care and any other services that they may provide to you. Tidepool is not responsible for the quality or availability of the services that a Clinician may or may not provide to you, or whether those services are provided in accordance with applicable laws. Tidepool does not select Clinicians or supervise, monitor, or control the services they provide, and is not responsible for your choice of any Clinician from whom you choose to receive professional health care or other services. - -G. Researchers are solely responsible to you for any responsibility owed to you in connection with any research study in which you participate. Tidepool is not responsible for quality or appropriateness of the methods or manner in which any research study is conducted, or whether research studies are conducted in accordance with applicable laws. Tidepool does not evaluate or endorse Researchers or the research studies they perform, and Tidepool does not supervise, monitor, or control those Researchers' conduct of those research studies. If you have agreed to participate in a research study, you will do so pursuant to the terms and conditions of any consent you have given to that Researcher. - -1.2 License to Access and Use Information - -A. If you choose to grant access to your Information to a Care Team Member, Tidepool, Researchers, Clinicians, third-party applications or third-party diabetes device makers, you hereby grant to such party a non-exclusive, limited right to access and use the applicable Information solely for the specified purpose, including any reuse or re-sharing permissions. - -B. To facilitate your use of the Tidepool Apps, you hereby grant to Tidepool a non-exclusive, royalty-free license to use, store, reproduce and display any Information you store or manage through the Tidepool Apps solely as reasonably necessary to operate the Tidepool Apps at your direction and on your behalf, and subject to these Terms and our Privacy Policy. - -1.3 Information Security - -The security and privacy of your Information is important. Tidepool uses reasonable administrative, physical and technical safeguards to protect the security, confidentiality and integrity of your Information. For example, data that you upload from your diabetes devices is transmitted and stored using industry-standard encryption, as is any personal information or metadata you share with Tidepool. All information and data is encrypted both at rest and during transport. TIDEPOOL SHALL NOT BE RESPONSIBLE OR LIABLE FOR UNAUTHORIZED ACCESS, HACKING, OR OTHER SECURITY INTRUSIONS OR FAILURE TO STORE OR THE THEFT, DELETION, CORRUPTION, DESTRUCTION, DAMAGE, OR LOSS OF ANY DATA OR INFORMATION. - -1.4 Control and Sharing - -As described in the Privacy Policy, PwD Users control the Information in their accounts and set permissions for sharing. Through features in the Tidepool Apps, you as a PwD User will always be able to view and change the access rights of your Care Team Members and change your sharing preferences such as sharing with Clinicians, Researchers, Tidepool, third-party applications and third-party device makers. - -2. Care Team Member, Researcher, and Clinician Accounts -Care Team Members, Clinicians, and Researchers can create accounts with Tidepool and become Users of Tidepool Apps. - -Clinicians and Researchers who create their own accounts control the Information in their accounts and can set or change permissions for sharing. Researchers may create accounts with Information for research purposes; the Researcher owns the Information in the Researcher's account. - -A Clinician, such as a doctor or other health care provider, or a Researcher conducting a study, may establish an account to store information about a patient or study participant in the Tidepool Apps and/or Tidepool Platform. That Clinician or Researcher may invite the patient or study participant to open a Tidepool account. If the individual accepts that invitation, he or she will become a PwD User and will have control of all the data associated with that account. The Clinician or Researcher who invited the PwD User to open the account will be a member of the PwD User's Care Team. The PwD User may remove the Clinician or Researcher from his or her Care Team at any time. - -3. Acceptable Use of Tidepool Apps -We trust you to use the Tidepool Apps responsibly, and you agree not to misuse them. You must use the Tidepool Apps only for lawful purposes, and you agree to comply with all applicable laws, rules, and regulations in using the Tidepool Apps. You must also respect the privacy and Information of others who use Tidepool Apps and comply with our Privacy Policy. - -3.1 Use of Health Information - -We endeavor to operate the Tidepool Apps so that everything we show you is accurate and complete. However, we cannot guarantee that the Tidepool Apps do not have errors or bugs. Even if there are no errors or bugs, it is possible to draw inappropriate conclusions from Information that you see. TIDEPOOL DOES NOT WARRANT AND SHALL NOT BE RESPONSIBLE OR LIABLE FOR THE ACCURACY OR RELIABILITY OF THE INFORMATION ON THE TIDEPOOL APPS. YOU ACCEPT FULL RESPONSIBILITY FOR ANY DECISIONS YOU MAKE REGARDING MEDICAL TREATMENT, THERAPY, OR OTHERWISE. - -The Tidepool Apps are informational and management aids only, designed to facilitate the interpretation and exchange of medical and other information, and are not offered or provided for the purpose of diagnosing, treating or prescribing for any illness or injury. Neither the Tidepool Apps nor any service provided by Tidepool is a substitute for the use of professional evaluation and decision-making by appropriately licensed and qualified physicians and other healthcare professionals in making diagnoses and/or treatment decisions. The Tidepool Apps and Tidepool's services manage and display medical information provided by Users, and Tidepool does not select and cannot assure the accuracy, completeness or currency of any such information. Tidepool does not endorse drugs or other products or services, diagnose any injury, illness, disease or other health condition, or recommend any treatment, therapy or health care provider. - -If you are a Clinician, you may be using our software to help your patients. For the reasons discussed above, you should not rely exclusively upon information you receive through use of the Tidepool Apps in any decision-making you make in connection with your diagnosis and treatment of any patient. You remain fully responsible to perform all of your professional and other duties to your patient in accordance with the applicable standards of care. You expressly acknowledge and agree that Tidepool is not responsible for the results of your professional medical decisions resulting from the use of Tidepool's Apps and Tidepool's services. You shall indemnify and hold Tidepool harmless from and against any loss whatsoever arising from any failure on your part to discharge your professional and/or other legal duty of care to your patient. - -If you are a PwD User using our software to help you manage your diabetes, do not make therapy changes or dosing decisions without applying common sense and/or consulting your healthcare professional. - -Tidepool does not assume any responsibility for any aspect of medical services or other health care provided or administered, or not provided or administered, with the aid of information the Tidepool Apps and/or Tidepool's services provide. - -If you notice problems or issues with your Information, please double-check it from its source. If you believe there are problems or inaccuracies in the display of your Information in the Tidepool Apps, please let us know by contacting us at support@tidepool.org. - -3.2 Other Uses - -In addition, here are things you cannot do or attempt to do with Tidepool Apps: - -Violate the terms and conditions of the Privacy Policy. -Violate the law or the privacy of others. -Provide trade secrets or material that is copyrighted or otherwise owned by a third party unless you have a valid license from the owner which permits you to post or provide it. -Provide material that infringes on any other intellectual property, privacy, personality or publicity right of another. -Provide material that promotes hate or violence, is pornographic or which would generally be considered obscene or indecent. -Impersonate, intimidate or harass another person. -Engage in or encourage conduct that would constitute a criminal offense, give rise to civil liability or otherwise violate any city, state, national or international law or regulation. -Transmit or transfer (by any means) information technology or software derived from the Tidepool Apps in violation of U.S. export control laws. -A Care Team Member is prohibited from copying, using, or disclosing, in whole or in part, to any other party any Information shared with the Care Team Member by a PwD User, except in accordance with these Terms. -In addition, unless you comply with our Responsible Disclosure Policy (described in Section 3.3 below), you are prohibited from violating or attempting to violate the security of the Tidepool Apps or Tidepool's other systems or network security, including, without limitation, the following: - -Accessing data and information not intended for your use of the Tidepool Apps. -Gaining unauthorized access to an account, server, or any other computer system. -Attempting to probe, scan or test the vulnerability of a system or network or to breach security or authentication measures. -Attempting to interfere with the function of the Tidepool Apps, or any Tidepool App host or network, including, but not limited to, via means of submitting a virus to any Tidepool App, overloading, denial of service attacks, "flooding", "mailbombing", "crashing", or sending unsolicited e-mail, including promotions and/or advertising of products or services. -Sending altered, deceptive or false source-identifying information, including "spoofing" or "phishing." -Unauthorized access of or tampering with Tidepool's systems or network security that does not comply with our Responsible Disclosure Policy may result in civil or criminal liability. - -3.3 Responsible Disclosure Policy - -If you believe you have found a security vulnerability in any of Tidepool's Apps, Tidepool's source code or Tidepool's other systems or network security, we encourage you to let us know right away by submitting a report to security@tidepool.org. We will investigate all legitimate reports and do our best to quickly fix the problem. - -If you give us reasonable time to respond to your report before making any information public, and make a good faith effort to avoid privacy violations, destruction of data, and interruption or degradation of our service during your research, we will not bring any lawsuit against you or ask law enforcement to investigate you. In addition, to show our appreciation, at our discretion, we may provide a monetary bounty for the reporting of certain security bugs. Bounties are awarded at Tidepool's sole discretion and are only paid to individuals. Only one bounty may be paid per issue reported. If we provide a bounty, the amount to be awarded will be awarded based on the bug's severity and creativity, and will be at Tidepool's sole discretion. - -4. Content Licensing and Intellectual Property Rights -4.1 Creative Commons License - -The Tidepool Apps, including all contents, such as text, images, audio, and user interface designs used to generate the applications (collectively, "Tidepool Content"), are generally made available for public sharing and reuse through the Creative Commons Attribution Share-Alike 3.0 Unported license ("Creative Commons License"), or any later version thereof. Some of the Tidepool Content may be acquired from sources that prohibit further use of their content without advance permission. Where possible, the Tidepool App will display a notice with the applicable license relevant to that content. You agree to abide by such licenses. Some Tidepool Content may indicate that the author considers his or her work proprietary and requires prior permission for any use of the work. In such cases, you should contact the author or author's agent for permission to use the content. The software source code for the Tidepool Apps is made available separately under an open source license. Please see https://github.com/tidepool-org for more information. - -4.2 Trademarks and Trade Dress - -The rights in the trademarks, logos, service marks, and trade dress (collectively "Trademarks") of Tidepool are not licensed under the Creative Commons License. If you wish to use any of our Trademarks, or if you have any other questions about complying with our licensing terms, you should email legal@tidepool.org. - -Some Tidepool Content may contain Trademarks of other parties. Except for a few limited circumstances, Trademarks cannot be used without advance written permission of the owner of the Trademark. - -4.3 Your Information - -We take the intellectual property rights of others seriously and ask you to do the same. You agree that you own or have the necessary rights in and to any and all Information you upload or post to the Tidepool Apps. Not owning or having the necessary rights is a violation of these Terms. - -4.4 Hosted Software - -We make our applications available both in hosted form - where we run it on Tidepool-managed servers - and also in source code form, where you (or someone else) can download the source code from GitHub (www.github.com/tidepool-org), build it, and run it locally or on your own servers. These Terms apply only to the hosted version of the Tidepool Apps, or to Tidepool-compiled, and installable versions of Tidepool Apps. - -5. Availability of Tidepool Apps -You must be 13 or older to register as a User of Tidepool Apps. If you are at least 13 but are under the age of 18, you may only register with and use Tidepool Apps with your parent's or legal guardian's consent. You agree to all of the terms and conditions of these Terms, and if you are between the ages of 13 and 18, you represent that you have obtained your parent's or legal guardian's consent and that your parent or legal guardian has agreed to these Terms. If you are a parent or legal guardian who has consented to the use of Tidepool Apps by a person between the ages of 13 and 18, you are fully responsible for that person's use of Tidepool Apps and agree to be bound by these Terms. If we discover that a person under 13 has registered as a User, we may delete the person's account. - -You understand that to register as a User of Tidepool Apps you must be in the United States. We make no claims that Tidepool Apps are accessible or appropriate outside of the United States. Access to Tidepool Apps may not be legal by certain persons or in certain countries. If you access Tidepool Apps from outside the United States, you do so on your own initiative and are responsible for compliance with local laws. - -6. Linked Sites and Third Parties -You may be able to link to third-party sites or connect to third-party applications from the Tidepool Apps, or connect to the Tidepool Platform from third-party applications, or you may choose to share your Information with third-party device makers or Researchers (collectively, "third parties"). Tidepool does not control third-party applications, third-party linked sites or third-party device makers in any way, and Tidepool is not responsible for the content, availability, advertising, products, information or additional links, use of information, security or privacy policies and practices, or materials of any such third parties. Links to third-party sites and the option to share your Information with third-party applications, sites and/or device makers does not imply Tidepool's endorsement of, or affiliation with, such third parties. In no event shall Tidepool be liable, directly or indirectly, to anyone for any loss or damage arising from or occasioned by the use of third-party sites, third-party applications or sharing with third-party device makers. - -7. Consent to Communication -You consent to receive electronically any communications related to your use of the Tidepool Apps. We may communicate with you by email, by posting notices in the Tidepool Apps, or by sending mobile- or web-based notifications. You agree that all agreements, notices, disclosures and other communications that are provided to you electronically satisfy any legal requirement that such communications be in writing. All notices from Tidepool intended for receipt by you shall be deemed delivered and effective when sent to the email address you provide us. - -If you provide us with a telephone number, you expressly agree that we, or our authorized agents, can use that number to contact your about your account. - -8. Copyright Infringement -If you believe that any content on any Tidepool Apps infringes upon any copyright which you own or control, you may send a written notice to Tidepool's Copyright Agent at legal@tidepool.org. - -The written notice must satisfy the requirements set forth in the Online Copyright Infringement Liability Limitation Act of the Digital Millennium Copyright Act (17 U.S.C. § 512). - -It is our policy in appropriate circumstances to disable and/or terminate the accounts of users who are repeat infringers. - -9. Disclaimer of Warranties -THE TIDEPOOL APPS, INCLUDING, WITHOUT LIMITATION, ALL CONTENT, FUNCTION, MATERIALS AND SERVICES, ARE PROVIDED "AS IS," WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTY FOR INFORMATION, DATA, DATA PROCESSING SERVICES OR UNINTERRUPTED ACCESS, ANY WARRANTIES CONCERNING THE AVAILABILITY, ACCURACY, COMPLETENESS, USEFULNESS, OR CONTENT OF INFORMATION, AND ANY WARRANTIES OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - -TIDEPOOL DOES NOT WARRANT THAT THE TIDEPOOL APPS OR THE FUNCTION, CONTENT OR SERVICES MADE AVAILABLE THEREBY WILL BE TIMELY, SECURE, FREE FROM HACKING OR OTHER SECURITY INTRUSION, UNINTERRUPTED OR ERROR FREE, OR THAT DEFECTS WILL BE CORRECTED. TIDEPOOL MAKES NO WARRANTY THAT THE TIDEPOOL APPS WILL MEET YOUR EXPECTATIONS OR REQUIREMENTS. NO ADVICE, RESULTS OR INFORMATION, OR MATERIALS WHETHER ORAL OR WRITTEN, OBTAINED BY YOU THROUGH THE TIDEPOOL APPS SHALL CREATE ANY WARRANTY NOT EXPRESSLY MADE HEREIN. IF YOU ARE DISSATISFIED WITH THE TIDEPOOL APPS, YOUR SOLE REMEDY IS TO DISCONTINUE USING THE TIDEPOOL APPS. - -Applicable law may not allow the exclusion of implied warranties, so some or all of these disclaimers may not apply to you. - -10. Limitation of Liability and Indemnity; One Year to Bring Claims -TO THE GREATEST EXTENT PERMITTED UNDER APPLICABLE LAW, IN NO EVENT SHALL TIDEPOOL, ITS AFFILIATES OR ANY OF THEIR RESPECTIVE DIRECTORS, OFFICERS, EMPLOYEES, AGENTS, PARTNERS, LICENSORS, CONTENT OR SERVICE PROVIDERS, OR SUCCESSORS BE LIABLE FOR ANY INDIRECT, SPECIAL, INCIDENTAL, CONSEQUENTIAL, EXEMPLARY OR PUNITIVE DAMAGES ARISING FROM OR DIRECTLY OR INDIRECTLY RELATED TO (i) YOUR USE OF, OR INABILITY TO USE, THE TIDEPOOL APPS, MATERIALS AND FUNCTIONS RELATED THERETO, (ii) UNAUTHORIZED ACCESS TO OR LOSS, CORRUPTION, OR ALTERATION OF DATA, TRANSMISSIONS, OR CONTENT, (iii) STATEMENTS OR CONDUCT OF ANY USER OR CARE TEAM MEMBER USING TIDEPOOL APPS, (iv) YOUR FAILURE TO PROTECT THE CONFIDENTIALITY OF YOUR DATA OR ANY PASSWORDS OR ACCESS RIGHTS TO YOUR ACCOUNT INFORMATION, (v) THE ACTS OR OMISSIONS OF ANY THIRD PARTY USING OR INTEGRATING WITH THE TIDEPOOL APPS, OR (vi) ANY OTHER MATTER RELATING TO THE TIDEPOOL APPS, INCLUDING, WITHOUT LIMITATION, LOSS OF REVENUE, ANTICIPATED PROFITS, GOODWILL, LOST BUSINESS, USE, DATA, SALES, COST OF SUBSTITUTE SERVICES, OR OTHER INTANGIBLE LOSSES, EVEN IF TIDEPOOL OR ITS REPRESENTATIVE HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS SHALL APPLY REGARDLESS OF WHETHER A CAUSE OF ACTION MAY BE IN CONTRACT, TORT (INCLUDING, BUT NOT LIMITED TO, NEGLIGENCE OR OTHERWISE BUT EXCLUDING GROSS NEGLIGENCE AND INTENTIONAL ACTS OF TIDEPOOL), STATUTE, OR ANY OTHER LEGAL THEORY, EITHER ARISING FROM THE TERMS, OR YOUR USE OF OR INABILITY TO USE THE TIDEPOOL APPS. Some jurisdictions do not allow the limitation or exclusion of certain liabilities, so some of the above limitations may not apply to you. The foregoing provision is enforceable in New Jersey. - -You agree to defend, indemnify, and hold harmless Tidepool, and all of its respective officers, directors, employees, owners, agents, information providers, licensors and licensees, from and against any and all liabilities, losses, damages, expenses, and costs (including reasonable attorney fees) incurred in connection with any third-party claim, complaint, suit or cause of action arising from your conduct in connection with accessing and/or using the Tidepool Apps or your breach of these Terms. This provision does not apply to acts of Tidepool. You shall cooperate with Tidepool in the defense of any such claim. Tidepool reserves the right, at its own expense, to assume the exclusive defense and control of any matter otherwise subject to indemnification by you hereunder. Some jurisdictions limit consumer indemnities, so some portions or all of this indemnity provision may not apply to you. The foregoing provision is enforceable in New Jersey. - -Regardless of any statute or law to the contrary, you agree that any claim or cause of action you may have with respect to the Tidepool Apps must be filed within one year after the claim or cause of action arose or be forever barred. - -11. Arbitration -Any controversy or claim arising out of or relating to these Terms, the breach thereof or its subject matter shall be settled by binding arbitration in accordance with the consumer commercial arbitration rules of the American Arbitration Association. The decision of the arbitrator shall be final and unappealable. The arbitration shall be conducted in San Francisco, California, and judgment on the arbitration award may be entered in any court having jurisdiction thereof. Notwithstanding anything to the contrary herein, Tidepool, any PwD User, any Care Team Member, any Clinician, any Researcher, or any other party to the arbitration may at any time seek injunctions or other forms of equitable relief from any court of competent jurisdiction. - -12. Changes to the Terms -We may modify, amend or change the terms, conditions or provisions of these Terms prospectively from time to time without prior notice to you, so please check them periodically. If a change, in our sole discretion, to these Terms is material, we will endeavor to notify you (for example, by email to the email address in your account). It is your responsibility to keep your email address current. We will post the new terms and indicate the revision date. By using Tidepool Apps after any changes to these Terms, you agree to be bound by those changes and the new terms. If you disagree with the new terms, your sole recourse is to stop using the Tidepool Apps. - -13. Changes to the Tidepool Apps -We reserve the right to modify, refine, add or remove features, impose limits on the service or size of storage available to you, or suspend the Tidepool Apps, with or without prior notice to you and without liability to anyone, including you or any third party. In the unlikely event of discontinuance, we will endeavor to notify you to allow you to export your Information. - -We may impose or you may experience limits on your use of the Tidepool Apps. If you disagree with any changes to the Tidepool Apps, you agree that your only recourse will be to stop using the Tidepool Apps. You may export your Information or request that you Information be deleted before doing so. Continuing to access the Tidepool Apps after any modifications will indicate that you agree with the changes and are satisfied with the Tidepool Apps as modified. - -14. General -Assignment. You may not assign any of your rights or obligations under these Terms without Tidepool's express written consent. These Terms inure to the benefit of Tidepool's successors and assigns. - -Cancellation and Termination. You can cancel your account, export your Information, or requested that your Information be deleted at any time. Tidepool may also suspend or terminate your account if you violate these Terms. In such situations, we may attempt to notify you so that you can export your Information, but we may immediately suspend or terminate your account in certain circumstances, such as causing harm to another User, disrupting others' use of the Tidepool Apps, or causing Tidepool potential legal liability. - -Entire Agreement. These Terms and the Privacy Policy, as each may be amended or modified by Tidepool in accordance with its terms from time to time, together constitute the entire agreement between you and Tidepool with respect to your access to and use of the Tidepool Apps, superseding and replacing any prior agreements and terms and conditions applicable to the Tidepool Apps. You may also be subject to additional terms and conditions that are applicable to certain parts of, or services offered on or through, the Tidepool Apps. If any incorporated agreements or policies conflict with these Terms, these Terms shall control. - -Survival. All provisions of these Terms that, by their nature, should survive any termination or expiration of these Terms shall do so. Any termination or expiration of these Terms shall not relieve you of any obligations that may have arisen or accrued prior to such termination or expiration or limit any liability you otherwise may have to Tidepool, including, without limitation, any indemnification obligations contained herein. - -Governing Law. These Terms and any dispute between you and Tidepool arising out of or relating to these Terms shall be governed by and interpreted in accordance with the laws of the State of California, without giving force to its conflict of laws provisions. - -Waiver and Severability. The failure of Tidepool to exercise or enforce any right or provision of these Terms shall not constitute a waiver of such right or provision. If any provision of these Terms is found by an arbitrator or court of competent jurisdiction to be invalid, the parties nevertheless agree that the arbitrator or court should endeavor to give effect to the parties' intentions as reflected in the provision, and the other provisions of these Terms remain in full force and effect. - -15. Contact Us -If you have any questions about these Terms, please contact us at legal@tidepool.org or by mail at: - -Tidepool Project - -Attn: Legal Department - -555 Bryant St., #429 - -Palo Alto, CA 94301 \ No newline at end of file From 4816af7014bf1a97e6c2529616b04899bfa28f48 Mon Sep 17 00:00:00 2001 From: Chris McGee Date: Tue, 11 Jul 2017 13:49:05 -0400 Subject: [PATCH 20/38] update platform-client to published release --- package.json | 2 +- yarn.lock | 56 ++++++++++++++++++---------------------------------- 2 files changed, 20 insertions(+), 38 deletions(-) diff --git a/package.json b/package.json index ccab7765fd..03956b01b7 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "source-map-support": "0.4.14", "stack-trace": "0.0.9", "sundial": "1.6.0", - "tidepool-platform-client": "tidepool-org/platform-client#krystophv/electron" + "tidepool-platform-client": "0.32.0" }, "browserslist": "electron 1.6", "build": { diff --git a/yarn.lock b/yarn.lock index 1bb70fe33b..272105f237 100644 --- a/yarn.lock +++ b/yarn.lock @@ -135,14 +135,14 @@ ansi-html@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz#813584021962a9e9e6fd039f940d12f56ca7859e" -ansi-regex@*, ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - ansi-regex@^0.2.0, ansi-regex@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-0.2.1.tgz#0d8e946967a3d8143f93e24e298525fc1b2235f9" +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + ansi-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" @@ -2575,7 +2575,7 @@ debug@2.6.7: dependencies: ms "2.0.0" -debuglog@*, debuglog@^1.0.1: +debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" @@ -4520,7 +4520,7 @@ import-lazy@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/import-lazy/-/import-lazy-2.1.0.tgz#05698e3d45c88e8d7e9d92cb0584e77f096f3e43" -imurmurhash@*, imurmurhash@^0.1.4: +imurmurhash@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" @@ -5228,10 +5228,6 @@ lodash._baseget@^3.0.0: version "3.7.2" resolved "https://registry.yarnpkg.com/lodash._baseget/-/lodash._baseget-3.7.2.tgz#1b6ae1d5facf3c25532350a13c1197cb8bb674f4" -lodash._baseindexof@*: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c" - lodash._basetostring@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" @@ -5254,25 +5250,11 @@ lodash._basevalues@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" -lodash._bindcallback@*: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" - -lodash._cacheindexof@*: - version "3.0.2" - resolved "https://registry.yarnpkg.com/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92" - -lodash._createcache@*: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093" - dependencies: - lodash._getnative "^3.0.0" - lodash._createset@~4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26" -lodash._getnative@*, lodash._getnative@^3.0.0: +lodash._getnative@^3.0.0: version "3.9.1" resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" @@ -5441,7 +5423,7 @@ lodash.rest@^4.0.0: version "4.0.5" resolved "https://registry.yarnpkg.com/lodash.rest/-/lodash.rest-4.0.5.tgz#954ef75049262038c96d1fc98b28fdaf9f0772aa" -lodash.restparam@*, lodash.restparam@^3.0.0: +lodash.restparam@^3.0.0: version "3.6.1" resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" @@ -7443,7 +7425,7 @@ readable-stream@~2.1.5: string_decoder "~0.10.x" util-deprecate "~1.0.1" -readdir-scoped-modules@*, readdir-scoped-modules@^1.0.0: +readdir-scoped-modules@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.0.2.tgz#9fafa37d286be5d92cbaebdee030dc9b5f406747" dependencies: @@ -8327,12 +8309,6 @@ stringstream@~0.0.4: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" -strip-ansi@*, strip-ansi@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" - dependencies: - ansi-regex "^3.0.0" - strip-ansi@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-0.3.0.tgz#25f48ea22ca79187f3174a4db8759347bb126220" @@ -8345,6 +8321,12 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1, strip-ansi@~3.0.1: dependencies: ansi-regex "^2.0.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -8564,9 +8546,9 @@ through@2, through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" -tidepool-platform-client@tidepool-org/platform-client#krystophv/electron: - version "0.28.0" - resolved "https://codeload.github.com/tidepool-org/platform-client/tar.gz/9c37c6f194a39940e96a7cd46df8f517f7a01975" +tidepool-platform-client@0.32.0: + version "0.32.0" + resolved "https://registry.yarnpkg.com/tidepool-platform-client/-/tidepool-platform-client-0.32.0.tgz#79f52f63c78105ac306f17b3b73084596f9fc319" dependencies: async "0.9.0" crypto "0.0.3" @@ -8910,7 +8892,7 @@ uuid@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" -validate-npm-package-license@*, validate-npm-package-license@^3.0.1, validate-npm-package-license@~3.0.1: +validate-npm-package-license@^3.0.1, validate-npm-package-license@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" dependencies: From 5e675748549fb4313b0c896b6ca6278f4f91397a Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 12 Jul 2017 13:44:22 +0100 Subject: [PATCH 21/38] use correct error response --- lib/core/api.js | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/core/api.js b/lib/core/api.js index 91cbdb5f43..4ef68ca82f 100644 --- a/lib/core/api.js +++ b/lib/core/api.js @@ -318,11 +318,12 @@ function buildError(error, datasetId) { err.name = 'API Error'; err.status = error.status; err.datasetId = datasetId; - var errText = JSON.parse(_.get(error, 'response.error.text', null)); - if (_.has(errText,'meta')) { - err.requestTrace = errText.meta.trace.request; - err.sessionTrace = errText.meta.trace.session; - err.sessionToken = md5(errText.meta.trace.token); + if (error.sessionToken) { + err.sessionToken = md5(error.sessionToken); + } + if (error.meta) { + err.requestTrace = error.meta.trace.request; + err.sessionTrace = error.meta.trace.session; } return err; } From f8a35546b8d6bf25cea6ab9121bd3a5dd119d90d Mon Sep 17 00:00:00 2001 From: Chris McGee Date: Fri, 14 Jul 2017 12:21:32 -0400 Subject: [PATCH 22/38] small spacing fix --- styles/core/scaffolding.less | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/styles/core/scaffolding.less b/styles/core/scaffolding.less index dd235a625f..7d0edc60f5 100644 --- a/styles/core/scaffolding.less +++ b/styles/core/scaffolding.less @@ -18,14 +18,19 @@ // Body reset // ==================================== +html { + height: 100%; +} + body { padding: 0; margin: 0; background-color: @body-bg; + height: 100%; } #app { - height: @app-height; + height: 100%; } // Inputs From 0d43a68943457a5d594920c4f6ccdf3a45628c3c Mon Sep 17 00:00:00 2001 From: Chris McGee Date: Wed, 19 Jul 2017 13:48:10 -0400 Subject: [PATCH 23/38] also comment out deleted audio file from driverManager --- lib/driverManager.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/driverManager.js b/lib/driverManager.js index ffd40b1688..369b7f59f9 100644 --- a/lib/driverManager.js +++ b/lib/driverManager.js @@ -162,10 +162,12 @@ module.exports = function (driverObjects, configs) { ], function(err, result) { result = result || {}; drvr.cleanup(stat.progressForStep(7), result, function() { + /* TODO: put this back in when we have new sound/earcon if(isBrowser) { var snd = new Audio('../sounds/underwater.wav'); snd.play(); } + */ cb(err, result); }); }); @@ -183,10 +185,12 @@ module.exports = function (driverObjects, configs) { ], function(err, result) { result = result || {}; drvr.cleanup(stat.progressForStep(7), result, function() { + /* TODO: put this back in when we have new sound/earcon if(isBrowser) { var snd = new Audio('../sounds/underwater.wav'); snd.play(); } + */ cb(err, result); }); }); From 936a6f765d3999b5ecfd83f04023ece3c5985799 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 25 Jul 2017 09:39:29 +0100 Subject: [PATCH 24/38] add FTDI cable support for Abbott meters --- manifest.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/manifest.json b/manifest.json index f136159791..54bfaef36c 100644 --- a/manifest.json +++ b/manifest.json @@ -111,19 +111,19 @@ }, { "deviceName": "FreeStyle Lite (with FTDI cable)", - "driverId": "AbbottFreeStyleLiteFTDI", + "driverId": "AbbottFreeStyleLite", "bitrate": 19200, "mode": "FTDI", - "vendorId": 403, - "productId": 6001 + "vendorId": 1027, + "productId": 24577 }, { "deviceName": "FreeStyle Freedom Lite (with FTDI cable)", - "driverId": "AbbottFreeStyleFreedomLiteFTDI", + "driverId": "AbbottFreeStyleFreedomLite", "bitrate": 19200, "mode": "FTDI", - "vendorId": 403, - "productId": 6001 + "vendorId": 1027, + "productId": 24577 }, { "deviceName": "BayerContourNext", From ff28eb88b5380ab9c7e8d6a73b11d84c350e0575 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 25 Jul 2017 09:59:21 +0100 Subject: [PATCH 25/38] skip non-glucose records for BCN meter --- lib/drivers/bayer/bayerContourNext.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/drivers/bayer/bayerContourNext.js b/lib/drivers/bayer/bayerContourNext.js index 9282e157f9..7922688f02 100644 --- a/lib/drivers/bayer/bayerContourNext.js +++ b/lib/drivers/bayer/bayerContourNext.js @@ -227,7 +227,10 @@ module.exports = function (config) { */ var parseDataRecord = function (data, callback){ // TODO - The NextLink 2.4 also includes seconds in its timestamp (14 digits) - var result = data.match(/^R\|(\d+)\|\^\^\^Glucose\|([0-9.]+)\|(\w+\/\w+).*\|{2}(.*)\|{2}(\d{12}).*/).slice(1,6); + var result = data.match(/^R\|(\d+)\|\^\^\^Glucose\|([0-9.]+)\|(\w+\/\w+).*\|{2}(.*)\|{2}(\d{12}).*/); + if (result != null) { + result = result.slice(1,6); + } callback(null, result); }; From 62dda052c017500f8ff1704c0ab99b2d7d080d30 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 25 Jul 2017 10:03:54 +0100 Subject: [PATCH 26/38] make BCN error message a little more user friendly --- lib/drivers/bayer/bayerContourNext.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/drivers/bayer/bayerContourNext.js b/lib/drivers/bayer/bayerContourNext.js index 7922688f02..e070e811d4 100644 --- a/lib/drivers/bayer/bayerContourNext.js +++ b/lib/drivers/bayer/bayerContourNext.js @@ -202,7 +202,7 @@ module.exports = function (config) { message[message.length-2] === ASCII_CONTROL.CR && message[message.length-1] === ASCII_CONTROL.LF ) && message[0] !== ASCII_CONTROL.EOT ) { - throw(new Error('Malformed ASTM Message.')); + throw(new Error('Meter not ready. Please retry.')); } var frameLength = message.length - 6; // Would normally be - 5, but we'll unpack the sequence number directly From 0bb9bb2a1beaee71a4a95b6673717a73dd3e6464 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 25 Jul 2017 12:33:05 +0100 Subject: [PATCH 27/38] improve error handling in Bayer driver to not crash renderer process --- lib/drivers/bayer/bayerContourNext.js | 64 +++++++++++++-------------- lib/hidDevice.js | 2 +- 2 files changed, 33 insertions(+), 33 deletions(-) diff --git a/lib/drivers/bayer/bayerContourNext.js b/lib/drivers/bayer/bayerContourNext.js index 9282e157f9..d8bb7a6d02 100644 --- a/lib/drivers/bayer/bayerContourNext.js +++ b/lib/drivers/bayer/bayerContourNext.js @@ -281,7 +281,7 @@ module.exports = function (config) { function (whilstCb) { bcnCommandResponse(cmd, function (err, record) { if (err) { - if (err.name === 'TIMEOUT') { + if (err.name === 'TIMEOUT' || err.name === 'TypeError') { return whilstCb(err, null); } else { retry++; @@ -374,48 +374,48 @@ module.exports = function (config) { async.doWhilst( function (callback) { hidDevice.receive(function(raw) { - var packet = new Uint8Array(raw); - message = extractPacketIntoMessage(packet.slice(MAGIC_HEADER.length)); + try { + var packet = new Uint8Array(raw); + message = extractPacketIntoMessage(packet.slice(MAGIC_HEADER.length)); - // Only process if we get data - if ( packet.length === 0 ) { - return callback(false); - } - - var packetHead = struct.unpack(packet, 0, '3Z2b', ['HEADER', 'SIZE', 'BYTE1']); - - if(packetHead['HEADER'] !== MAGIC_HEADER){ - debug('Invalid packet from Contour device'); - clearTimeout(abortTimer); - return callback(new Error('Invalid USB packet received.')); - } + // Only process if we get data + if ( packet.length === 0 ) { + return callback(null, false); + } - // The tail of the packet starts 6 from the end, but because we haven't stripped the - // MAGIC_HEADER and length byte from packet, we're using SIZE - 2 - var packetTail = struct.unpack(packet, parseInt(packetHead['SIZE']) - 2, '2b2Z2Z', ['CR', 'FRAME_TYPE', 'CHECKSUM', 'CRLF']); + var packetHead = struct.unpack(packet, 0, '3Z2b', ['HEADER', 'SIZE', 'BYTE1']); - // HID_PACKET_SIZE - 4, because we don't include the MAGIC_HEADER or the SIZE - if( packetHead['SIZE'] < ( HID_PACKET_SIZE - 4 ) || - packetHead['BYTE1'] == ASCII_CONTROL.EOT || - packetHead['BYTE1'] == ASCII_CONTROL.ENQ || - packetTail['FRAME_TYPE'] == ASCII_CONTROL.ETX || - packetTail['FRAME_TYPE'] == ASCII_CONTROL.ETB ) { + if(packetHead['HEADER'] !== MAGIC_HEADER){ + debug('Invalid packet from Contour device'); clearTimeout(abortTimer); - return callback(true); + return callback(new Error('Invalid USB packet received.')); + } + + // The tail of the packet starts 6 from the end, but because we haven't stripped the + // MAGIC_HEADER and length byte from packet, we're using SIZE - 2 + var packetTail = struct.unpack(packet, parseInt(packetHead['SIZE']) - 2, '2b2Z2Z', ['CR', 'FRAME_TYPE', 'CHECKSUM', 'CRLF']); + + // HID_PACKET_SIZE - 4, because we don't include the MAGIC_HEADER or the SIZE + if( packetHead['SIZE'] < ( HID_PACKET_SIZE - 4 ) || + packetHead['BYTE1'] == ASCII_CONTROL.EOT || + packetHead['BYTE1'] == ASCII_CONTROL.ENQ || + packetTail['FRAME_TYPE'] == ASCII_CONTROL.ETX || + packetTail['FRAME_TYPE'] == ASCII_CONTROL.ETB ) { + clearTimeout(abortTimer); + return callback(null, true); + } + return callback(null, false); + } catch (err) { + return callback(err); } - return callback(false); }); }, function (valid) { - if(valid instanceof Error) { - return cb(valid,null); - } return (valid !== true); }, - function () { - return cb(null, message); + function (err) { + return cb(err, message); }); - }; var processReadings = function(readings) { diff --git a/lib/hidDevice.js b/lib/hidDevice.js index ec8cc76308..bdaade990f 100644 --- a/lib/hidDevice.js +++ b/lib/hidDevice.js @@ -65,7 +65,7 @@ module.exports = function(config) { function receive(cb){ connection.read(function(err, data) { if(err) { - debug('Error:', err); + debug('HID Error:', err); } cb(data); }); From ab056f09980fecbb3ecff2c0e24cf0afe376379e Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 25 Jul 2017 17:29:08 +0100 Subject: [PATCH 28/38] make sure owner and permissions are correct for kernel extensions --- resources/pkg-scripts/postinstall | 3 +++ 1 file changed, 3 insertions(+) diff --git a/resources/pkg-scripts/postinstall b/resources/pkg-scripts/postinstall index 25fdbe0400..9a7372f203 100755 --- a/resources/pkg-scripts/postinstall +++ b/resources/pkg-scripts/postinstall @@ -10,12 +10,15 @@ sudo rm -rf /Library/Extensions/sweetspot.DexcomUSB.kext # install new extensions echo "Installing and loading new extensions..." sudo cp -R ./extensions/DexComUSB.kext /Library/Extensions/DexComUSB.kext +sudo chown -R root:wheel /Library/Extensions/DexcomUSB.kext sudo kextload /Library/Extensions/DexComUSB.kext/ sudo cp -R ./extensions/SiLabsUSBDRiver.kext /Library/Extensions/SiLabsUSBDRiver.kext +sudo chown -R root:wheel /Library/Extensions/SiLabsUSBDRiver.kext sudo kextload /Library/Extensions/SiLabsUSBDRiver.kext/ sudo cp -R ./extensions/ProlificUsbSerial.kext /Library/Extensions/ProlificUsbSerial.kext +sudo chown -R root:wheel /Library/Extensions/ProlificUsbSerial.kext sudo kextload /Library/Extensions/ProlificUsbSerial.kext/ file="/tmp/TidepoolUploader.cnt" From 7d8892337d41c21fc2c832bdce696c31b7fe6282 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Wed, 26 Jul 2017 10:09:26 +0100 Subject: [PATCH 29/38] fix case of SiLabs driver --- resources/pkg-scripts/postinstall | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/resources/pkg-scripts/postinstall b/resources/pkg-scripts/postinstall index 9a7372f203..4fab932b84 100755 --- a/resources/pkg-scripts/postinstall +++ b/resources/pkg-scripts/postinstall @@ -13,9 +13,9 @@ sudo cp -R ./extensions/DexComUSB.kext /Library/Extensions/DexComUSB.kext sudo chown -R root:wheel /Library/Extensions/DexcomUSB.kext sudo kextload /Library/Extensions/DexComUSB.kext/ -sudo cp -R ./extensions/SiLabsUSBDRiver.kext /Library/Extensions/SiLabsUSBDRiver.kext -sudo chown -R root:wheel /Library/Extensions/SiLabsUSBDRiver.kext -sudo kextload /Library/Extensions/SiLabsUSBDRiver.kext/ +sudo cp -R ./extensions/SiLabsUSBDriver.kext /Library/Extensions/SiLabsUSBDriver.kext +sudo chown -R root:wheel /Library/Extensions/SiLabsUSBDriver.kext +sudo kextload /Library/Extensions/SiLabsUSBDriver.kext/ sudo cp -R ./extensions/ProlificUsbSerial.kext /Library/Extensions/ProlificUsbSerial.kext sudo chown -R root:wheel /Library/Extensions/ProlificUsbSerial.kext From d3e4b7403fb612aa7410a27c6664b65fd97b5df4 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Fri, 28 Jul 2017 15:59:08 +0100 Subject: [PATCH 30/38] update lockfile --- yarn.lock | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/yarn.lock b/yarn.lock index c98434e389..837a7347a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5981,10 +5981,6 @@ node-pre-gyp@^0.6.36: tar "^2.2.1" tar-pack "^3.4.0" -node-uuid@1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.3.tgz#319bb7a56e7cb63f00b5c0cd7851cd4b4ddf1df9" - node-uuid@~1.4.7: version "1.4.8" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" @@ -8542,15 +8538,15 @@ through@2, through@^2.3.6: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" -tidepool-platform-client@0.32.0: - version "0.32.0" - resolved "https://registry.yarnpkg.com/tidepool-platform-client/-/tidepool-platform-client-0.32.0.tgz#79f52f63c78105ac306f17b3b73084596f9fc319" +tidepool-platform-client@0.33.0: + version "0.33.0" + resolved "https://registry.yarnpkg.com/tidepool-platform-client/-/tidepool-platform-client-0.33.0.tgz#2e784e147b18bc93e0a93581f333258bd4a34643" dependencies: async "0.9.0" crypto "0.0.3" lodash "3.3.1" - node-uuid "1.4.3" superagent "1.2.0" + uuid "3.1.0" time-stamp@^1.0.0: version "1.1.0" @@ -8888,10 +8884,6 @@ uuid@^2.0.1, uuid@^2.0.2, uuid@^2.0.3: version "2.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" -uuid@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" - validate-npm-package-license@^3.0.1, validate-npm-package-license@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" From 9b8dd8dbc82c8afcfc2f2cc0e90dca437291c0bc Mon Sep 17 00:00:00 2001 From: Chris McGee Date: Fri, 28 Jul 2017 17:33:11 -0400 Subject: [PATCH 31/38] unravel some of the update dialog logic and fix working reducer --- app/components/UpdateModal.js | 79 +++++++++++++++++++++-------------- app/package.json | 2 +- app/reducers/misc.js | 2 + package.json | 2 +- 4 files changed, 52 insertions(+), 33 deletions(-) diff --git a/app/components/UpdateModal.js b/app/components/UpdateModal.js index 9ece2347e9..2c152161dd 100644 --- a/app/components/UpdateModal.js +++ b/app/components/UpdateModal.js @@ -48,40 +48,57 @@ export class UpdateModal extends Component { sync } = this.props; - if ( checkingElectronUpdate || - ( - !(electronUpdateDownloaded && !electronUpdateAvailableDismissed) && - !(electronUpdateManualChecked && ( - !electronUpdateAvailableDismissed || - electronUpdateDownloaded - ) - ) - ) - ) { + let title, text, actions; + + if(electronUpdateAvailableDismissed){ return null; } - let title, text, actions; - - if(electronUpdateAvailable) { - title = 'Update Available!'; - text = 'After clicking Install, the uploader will restart to complete the installation.'; - actions = [ - , - - ]; - } else { - title = 'Uploader is up-to-date!'; - text = `You are running version ${config.version}, the most recent one.`; - actions = ( - - ); + if (electronUpdateManualChecked) { + if (checkingElectronUpdate){ + title = 'Checking for update...'; + } else { + if (electronUpdateAvailable) { + title = 'Update Available!'; + if (!electronUpdateDownloaded) { + text = 'Downloading update'; + } else { // available and downloaded + text = 'After clicking Install, the uploader will restart to complete the installation.'; + actions = [ + , + + ]; + } + } else { // no update available + title = 'Uploader is up-to-date!'; + text = `You are running version ${config.version}, the most recent one.`; + actions = ( + + ); + } + } + } + else { // automatic background check + if(electronUpdateAvailable && electronUpdateDownloaded){ + title = 'Update Available!'; + text = 'After clicking Install, the uploader will restart to complete the installation.'; + actions = [ + , + + ]; + } else { + return null; + } } return ( diff --git a/app/package.json b/app/package.json index ab665e4d3e..9756a4ed83 100755 --- a/app/package.json +++ b/app/package.json @@ -1,7 +1,7 @@ { "name": "tidepool-uploader", "productName": "tidepool-uploader", - "version": "0.310.0-alpha.11", + "version": "0.310.0-alpha.17", "description": "Tidepool Project Universal Uploader", "main": "./main.js", "author": { diff --git a/app/reducers/misc.js b/app/reducers/misc.js index 649c4ae247..ddd75c60ad 100644 --- a/app/reducers/misc.js +++ b/app/reducers/misc.js @@ -155,6 +155,8 @@ function uploading(state = false, action) { function checkingElectronUpdate(state = false, action) { switch (action.type) { case actionTypes.CHECKING_FOR_UPDATES: + case actionTypes.AUTO_UPDATE_CHECKING_FOR_UPDATES: + case actionTypes.MANUAL_UPDATE_CHECKING_FOR_UPDATES: return true; case actionTypes.UPDATE_AVAILABLE: case actionTypes.UPDATE_NOT_AVAILABLE: diff --git a/package.json b/package.json index f5e493ff6b..fbef575914 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tidepool-uploader", - "version": "0.310.0-alpha.11", + "version": "0.310.0-alpha.17", "description": "Tidepool Project Universal Uploader", "private": true, "main": "main.js", From 4da1539a7942dcc0ceaede76886009e30636ff57 Mon Sep 17 00:00:00 2001 From: Lennart Goedhart Date: Tue, 1 Aug 2017 15:17:22 +1000 Subject: [PATCH 32/38] Add a mechanism to create QA builds without requiring git tags. --- package.json | 16 +++++++++++----- scripts/prepare-qa-build.js | 16 ++++++++++++++++ yarn.lock | 12 ++++++++++-- 3 files changed, 37 insertions(+), 7 deletions(-) create mode 100644 scripts/prepare-qa-build.js diff --git a/package.json b/package.json index fbef575914..57084c37a5 100644 --- a/package.json +++ b/package.json @@ -19,14 +19,15 @@ "hot-server": "cross-env NODE_ENV=development node --max_old_space_size=2096 -r babel-register server.js", "build-main": "cross-env NODE_ENV=production node -r babel-register ./node_modules/webpack/bin/webpack --config webpack.config.electron.js --progress --profile --colors", "build-renderer": "cross-env NODE_ENV=production node -r babel-register ./node_modules/webpack/bin/webpack --config webpack.config.production.js --progress --profile --colors", - "build-main-dev": "cross-env BUILD=dev NODE_ENV=production node -r babel-register ./node_modules/webpack/bin/webpack --config webpack.config.electron.js --progress --profile --colors", - "build-renderer-dev": "cross-env BUILD=dev NODE_ENV=production node -r babel-register ./node_modules/webpack/bin/webpack --config webpack.config.production.js --progress --profile --colors", + "build-main-dev": "cross-env BUILD=dev DEBUG_ERROR=true NODE_ENV=production node -r babel-register ./node_modules/webpack/bin/webpack --config webpack.config.electron.js --progress --profile --colors", + "build-renderer-dev": "cross-env BUILD=dev DEBUG_ERROR=true NODE_ENV=production node -r babel-register ./node_modules/webpack/bin/webpack --config webpack.config.production.js --progress --profile --colors", "build": "npm run build-main && npm run build-renderer", "build-dev": "npm run build-main-dev && npm run build-renderer-dev", "start": "cross-env NODE_ENV=production electron ./app/", "start-hot": "cross-env HOT=1 NODE_ENV=development electron -r babel-register -r babel-polyfill ./app/main.development", "postinstall": "concurrently \"install-app-deps\" \"node node_modules/fbjs-scripts/node/check-dev-engines.js package.json\" && electron-rebuild --force --module-dir app", "dev": "npm run hot-server -- --start-hot", + "prepare-qa-build": "node scripts/prepare-qa-build.js", "package": "npm run build && build -p onTagOrDraft", "package-dev": "npm run build-dev && build -p onTagOrDraft --config.artifactName='${productName}-${version}-dev.${ext}' --config.nsis.artifactName='${productName}-Setup-${version}-dev.${ext}' --extraMetadata.name='tidepool-uploader-dev'", "package-win": "npm run build && build --win --x64", @@ -102,9 +103,12 @@ ], "extraResources": [ { - "from": "resources/${os}", - "to": "driver/", - "filter": ["**/*", "!*.md"] + "from": "resources/${os}", + "to": "driver/", + "filter": [ + "**/*", + "!*.md" + ] }, "sounds/" ], @@ -199,6 +203,7 @@ "fbjs-scripts": "0.7.1", "file-loader": "0.11.1", "flux-standard-action": "1.2.0", + "git-describe": "^4.0.2", "gitbook-cli": "2.3.0", "html-webpack-plugin": "2.28.0", "jsdom": "9.12.0", @@ -215,6 +220,7 @@ "redux-logger": "3.0.1", "redux-mock-store": "1.2.3", "salinity": "0.0.8", + "shelljs": "^0.7.8", "sinon": "2.1.0", "sinon-chai": "2.9.0", "spectron": "3.4.1", diff --git a/scripts/prepare-qa-build.js b/scripts/prepare-qa-build.js new file mode 100644 index 0000000000..6b7f5398ac --- /dev/null +++ b/scripts/prepare-qa-build.js @@ -0,0 +1,16 @@ +const shell = require('shelljs'); +const { + gitDescribeSync +} = require('git-describe'); + +const gitInfo = gitDescribeSync(); +if (gitInfo.dirty) { + console.log('Please start with a clean repo'); + shell.exit(1); +} + +const qaVersion = gitInfo.semverString.replace('+', '.'); + +for (const file of ['package.json', 'app/package.json']) { + shell.sed('-i', '"version":[ ]*".*",$', `"version": "${qaVersion}",`, file); +} diff --git a/yarn.lock b/yarn.lock index 837a7347a8..1c8368dadf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4038,6 +4038,14 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +git-describe@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/git-describe/-/git-describe-4.0.2.tgz#9ecc5e6df4658450c89ea35d10183c9f5f40dc73" + dependencies: + lodash "^4.16.6" + optionalDependencies: + semver "^5.3.0" + gitbook-cli@2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/gitbook-cli/-/gitbook-cli-2.3.0.tgz#01a360de71a48e53277ed2cb1abf6c60a0901576" @@ -5489,7 +5497,7 @@ lodash@4.5.1: version "4.5.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.5.1.tgz#80e8a074ca5f3893a6b1c10b2a636492d710c316" -lodash@^4.0.0, lodash@^4.14.0, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.0, lodash@^4.6.1, lodash@^4.8.0, lodash@~4.17.4: +lodash@^4.0.0, lodash@^4.14.0, lodash@^4.16.6, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.0, lodash@^4.6.1, lodash@^4.8.0, lodash@~4.17.4: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -7991,7 +7999,7 @@ shelljs@0.7.0: interpret "^1.0.0" rechoir "^0.6.2" -shelljs@^0.7.5: +shelljs@^0.7.5, shelljs@^0.7.8: version "0.7.8" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" dependencies: From e42d4d68b4fd07150ff439766bdbc22f4ccf5d59 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Tue, 1 Aug 2017 10:44:13 +0100 Subject: [PATCH 33/38] disable FTDI cable support for Abbott for now --- manifest.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/manifest.json b/manifest.json index 54bfaef36c..36d031338d 100644 --- a/manifest.json +++ b/manifest.json @@ -109,9 +109,10 @@ "vendorId": 6753, "productId": 13328 }, + { "deviceName": "FreeStyle Lite (with FTDI cable)", - "driverId": "AbbottFreeStyleLite", + "driverId": "AbbottFreeStyleLiteFTDI", "bitrate": 19200, "mode": "FTDI", "vendorId": 1027, @@ -119,7 +120,7 @@ }, { "deviceName": "FreeStyle Freedom Lite (with FTDI cable)", - "driverId": "AbbottFreeStyleFreedomLite", + "driverId": "AbbottFreeStyleFreedomLiteFTDI", "bitrate": 19200, "mode": "FTDI", "vendorId": 1027, From 53b7c392375895ce13d80c031271560a092a948e Mon Sep 17 00:00:00 2001 From: Lennart Goedhart Date: Wed, 2 Aug 2017 09:46:35 +1000 Subject: [PATCH 34/38] Use exact versions of npm modules Commit QA build version info --- package.json | 5 +++-- scripts/prepare-qa-build.js | 22 +++++++++++++++++++--- yarn.lock | 37 ++++++++++++++++++++++++++++++------- 3 files changed, 52 insertions(+), 12 deletions(-) diff --git a/package.json b/package.json index 57084c37a5..488f16061a 100644 --- a/package.json +++ b/package.json @@ -203,7 +203,7 @@ "fbjs-scripts": "0.7.1", "file-loader": "0.11.1", "flux-standard-action": "1.2.0", - "git-describe": "^4.0.2", + "git-describe": "4.0.2", "gitbook-cli": "2.3.0", "html-webpack-plugin": "2.28.0", "jsdom": "9.12.0", @@ -212,6 +212,7 @@ "less-loader": "2.2.3", "minimist": "1.2.0", "mocha": "3.2.0", + "nodegit": "0.18.3", "object-invariant-test-helper": "0.1.1", "open": "0.0.5", "proxyquire": "1.7.11", @@ -220,7 +221,7 @@ "redux-logger": "3.0.1", "redux-mock-store": "1.2.3", "salinity": "0.0.8", - "shelljs": "^0.7.8", + "shelljs": "0.7.8", "sinon": "2.1.0", "sinon-chai": "2.9.0", "spectron": "3.4.1", diff --git a/scripts/prepare-qa-build.js b/scripts/prepare-qa-build.js index 6b7f5398ac..938e38a582 100644 --- a/scripts/prepare-qa-build.js +++ b/scripts/prepare-qa-build.js @@ -1,4 +1,5 @@ const shell = require('shelljs'); +const nodegit = require('nodegit'); const { gitDescribeSync } = require('git-describe'); @@ -11,6 +12,21 @@ if (gitInfo.dirty) { const qaVersion = gitInfo.semverString.replace('+', '.'); -for (const file of ['package.json', 'app/package.json']) { - shell.sed('-i', '"version":[ ]*".*",$', `"version": "${qaVersion}",`, file); -} +(async() => { + const repo = await nodegit.Repository.open('.'); + const index = await repo.refreshIndex(); + + const defaultSig = nodegit.Signature.default(repo); + + for (const file of ['package.json', 'app/package.json']) { + shell.sed('-i', '"version":[ ]*".*",$', `"version": "${qaVersion}",`, file); + await index.addByPath(file); + } + + await index.write(); + const oid = await index.writeTree(); + const head = await nodegit.Reference.nameToId(repo, 'HEAD'); + const parent = await repo.getCommit(head); + const commitId = await repo.createCommit('HEAD', defaultSig, defaultSig, `Create QA build version ${qaVersion}`, oid, [parent]); + console.log(`Created QA build version '${qaVersion}' with commit ID '${commitId}'`); +})(); diff --git a/yarn.lock b/yarn.lock index 1c8368dadf..ca0b06d9be 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3851,7 +3851,7 @@ fs-extra@0.26.5: path-is-absolute "^1.0.0" rimraf "^2.2.8" -fs-extra@0.26.7: +fs-extra@0.26.7, fs-extra@~0.26.2: version "0.26.7" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-0.26.7.tgz#9ae1fdd94897798edab76d0918cf42d0c3184fa9" dependencies: @@ -4038,7 +4038,7 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" -git-describe@^4.0.2: +git-describe@4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/git-describe/-/git-describe-4.0.2.tgz#9ecc5e6df4658450c89ea35d10183c9f5f40dc73" dependencies: @@ -5497,7 +5497,7 @@ lodash@4.5.1: version "4.5.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.5.1.tgz#80e8a074ca5f3893a6b1c10b2a636492d710c316" -lodash@^4.0.0, lodash@^4.14.0, lodash@^4.16.6, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.0, lodash@^4.6.1, lodash@^4.8.0, lodash@~4.17.4: +lodash@^4.0.0, lodash@^4.13.1, lodash@^4.14.0, lodash@^4.16.6, lodash@^4.17.2, lodash@^4.17.3, lodash@^4.17.4, lodash@^4.2.0, lodash@^4.2.1, lodash@^4.3.0, lodash@^4.5.1, lodash@^4.6.0, lodash@^4.6.1, lodash@^4.8.0, lodash@~4.17.4: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -5833,7 +5833,7 @@ mz@^2.3.1: object-assign "^4.0.1" thenify-all "^1.0.0" -nan@^2.3.0: +nan@^2.2.0, nan@^2.3.0: version "2.6.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" @@ -5882,7 +5882,7 @@ node-forge@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-0.7.1.tgz#9da611ea08982f4b94206b3beb4cc9665f20c300" -node-gyp@^3.4.0, node-gyp@~3.6.0: +node-gyp@^3.4.0, node-gyp@^3.5.0, node-gyp@~3.6.0: version "3.6.2" resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-3.6.2.tgz#9bfbe54562286284838e750eac05295853fa1c60" dependencies: @@ -5975,7 +5975,7 @@ node-libs-browser@^1.0.0: util "^0.10.3" vm-browserify "0.0.4" -node-pre-gyp@^0.6.36: +node-pre-gyp@^0.6.36, node-pre-gyp@~0.6.32: version "0.6.36" resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786" dependencies: @@ -5993,6 +5993,23 @@ node-uuid@~1.4.7: version "1.4.8" resolved "https://registry.yarnpkg.com/node-uuid/-/node-uuid-1.4.8.tgz#b040eb0923968afabf8d32fb1f17f1167fdab907" +nodegit-promise@~4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/nodegit-promise/-/nodegit-promise-4.0.0.tgz#5722b184f2df7327161064a791d2e842c9167b34" + dependencies: + asap "~2.0.3" + +nodegit@0.18.3: + version "0.18.3" + resolved "https://registry.yarnpkg.com/nodegit/-/nodegit-0.18.3.tgz#305b6a305ea485fe5f1679fe37e6224a669ae9fc" + dependencies: + fs-extra "~0.26.2" + lodash "^4.13.1" + nan "^2.2.0" + node-gyp "^3.5.0" + node-pre-gyp "~0.6.32" + promisify-node "~0.3.0" + "nopt@2 || 3", nopt@^3.0.1, nopt@~3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" @@ -7044,6 +7061,12 @@ promise@^7.1.1: dependencies: asap "~2.0.3" +promisify-node@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/promisify-node/-/promisify-node-0.3.0.tgz#b4b55acf90faa7d2b8b90ca396899086c03060cf" + dependencies: + nodegit-promise "~4.0.0" + promzard@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/promzard/-/promzard-0.3.0.tgz#26a5d6ee8c7dee4cb12208305acfb93ba382a9ee" @@ -7999,7 +8022,7 @@ shelljs@0.7.0: interpret "^1.0.0" rechoir "^0.6.2" -shelljs@^0.7.5, shelljs@^0.7.8: +shelljs@0.7.8, shelljs@^0.7.5: version "0.7.8" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.8.tgz#decbcf874b0d1e5fb72e14b164a9683048e9acb3" dependencies: From 9670fb5a3353f70ef359011f2668486d12242b2d Mon Sep 17 00:00:00 2001 From: Lennart Goedhart Date: Fri, 4 Aug 2017 13:39:23 +1000 Subject: [PATCH 35/38] Run `prepare-qa-build` through `babel-register` to support `async/await` in Node 7.4.0. --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 488f16061a..7c954b722a 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,7 @@ "start-hot": "cross-env HOT=1 NODE_ENV=development electron -r babel-register -r babel-polyfill ./app/main.development", "postinstall": "concurrently \"install-app-deps\" \"node node_modules/fbjs-scripts/node/check-dev-engines.js package.json\" && electron-rebuild --force --module-dir app", "dev": "npm run hot-server -- --start-hot", - "prepare-qa-build": "node scripts/prepare-qa-build.js", + "prepare-qa-build": "node -r babel-register scripts/prepare-qa-build.js", "package": "npm run build && build -p onTagOrDraft", "package-dev": "npm run build-dev && build -p onTagOrDraft --config.artifactName='${productName}-${version}-dev.${ext}' --config.nsis.artifactName='${productName}-Setup-${version}-dev.${ext}' --extraMetadata.name='tidepool-uploader-dev'", "package-win": "npm run build && build --win --x64", From a18a9e15e8bf4e9d268f56069713729add1180c8 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Fri, 4 Aug 2017 15:42:30 +0100 Subject: [PATCH 36/38] first remove Prolific kernel extension --- .../Contents/Info.plist | 126 ------------------ .../Contents/MacOS/ProlificUsbSerial | Bin 82128 -> 0 bytes .../Contents/_CodeSignature/CodeResources | 105 --------------- 3 files changed, 231 deletions(-) delete mode 100755 resources/pkg-scripts/extensions/ProlificUsbSerial.kext/Contents/Info.plist delete mode 100755 resources/pkg-scripts/extensions/ProlificUsbSerial.kext/Contents/MacOS/ProlificUsbSerial delete mode 100755 resources/pkg-scripts/extensions/ProlificUsbSerial.kext/Contents/_CodeSignature/CodeResources diff --git a/resources/pkg-scripts/extensions/ProlificUsbSerial.kext/Contents/Info.plist b/resources/pkg-scripts/extensions/ProlificUsbSerial.kext/Contents/Info.plist deleted file mode 100755 index 18e2bb60c5..0000000000 --- a/resources/pkg-scripts/extensions/ProlificUsbSerial.kext/Contents/Info.plist +++ /dev/null @@ -1,126 +0,0 @@ - - - - - BuildMachineOSBuild - 13F1134 - CFBundleDevelopmentRegion - English - CFBundleExecutable - ProlificUsbSerial - CFBundleGetInfoString - ProlificUsbSerial v1.6.0, Copyright 2006 Prolific Technology Inc. - CFBundleIdentifier - com.prolific.driver.PL2303 - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - Mac OS X Driver for Prolific Universal USB-Serial Adapter - CFBundlePackageType - KEXT - CFBundleShortVersionString - 1.6.0 - CFBundleSignature - ???? - CFBundleVersion - 1.6.0 - DTCompiler - com.apple.compilers.llvm.clang.1_0 - DTPlatformBuild - 6A317 - DTPlatformVersion - GM - DTSDKBuild - 13F26 - DTSDKName - macosx10.9 - DTXcode - 0600 - DTXcodeBuild - 6A317 - IOKitPersonalities - - 067B_2303 - - CFBundleIdentifier - com.prolific.driver.PL2303 - IOClass - com_prolific_driver_PL2303 - IOProviderClass - IOUSBInterface - bConfigurationValue - 1 - bInterfaceNumber - 0 - idProduct - 8963 - idVendor - 1659 - - 067B_2304 - - CFBundleIdentifier - com.prolific.driver.PL2303 - IOClass - com_prolific_driver_PL2303 - IOProviderClass - IOUSBInterface - bConfigurationValue - 1 - bInterfaceNumber - 0 - idProduct - 8964 - idVendor - 1659 - - 067B_A100 - - CFBundleIdentifier - com.prolific.driver.PL2303 - IOClass - com_prolific_driver_PL2303 - IOProviderClass - IOUSBInterface - bConfigurationValue - 1 - bInterfaceNumber - 0 - idProduct - 41216 - idVendor - 1659 - - 067B_E1F1 - - CFBundleIdentifier - com.prolific.driver.PL2303 - IOClass - com_prolific_driver_PL2303 - IOProviderClass - IOUSBInterface - bConfigurationValue - 1 - bInterfaceNumber - 0 - idProduct - 57841 - idVendor - 1659 - - - OSBundleLibraries - - com.apple.iokit.IOSerialFamily - 1.0.4 - com.apple.iokit.IOUSBFamily - 1.8 - com.apple.kpi.iokit - 10.2.0 - com.apple.kpi.libkern - 10.2.0 - com.apple.kpi.mach - 10.2.0 - - - diff --git a/resources/pkg-scripts/extensions/ProlificUsbSerial.kext/Contents/MacOS/ProlificUsbSerial b/resources/pkg-scripts/extensions/ProlificUsbSerial.kext/Contents/MacOS/ProlificUsbSerial deleted file mode 100755 index ecf1ad4cab0992cbe2d1ee42178f586ec2c88a28..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 82128 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

l4+;12*x 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 f - - - - files - - files2 - - rules - - ^Resources/ - - ^Resources/.*\.lproj/ - - optional - - weight - 1000 - - ^Resources/.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^version.plist$ - - - rules2 - - .*\.dSYM($|/) - - weight - 11 - - ^(.*/)?\.DS_Store$ - - omit - - weight - 2000 - - ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ - - nested - - weight - 10 - - ^.* - - ^Info\.plist$ - - omit - - weight - 20 - - ^PkgInfo$ - - omit - - weight - 20 - - ^Resources/ - - weight - 20 - - ^Resources/.*\.lproj/ - - optional - - weight - 1000 - - ^Resources/.*\.lproj/locversion.plist$ - - omit - - weight - 1100 - - ^[^/]+$ - - nested - - weight - 10 - - ^embedded\.provisionprofile$ - - weight - 20 - - ^version\.plist$ - - weight - 20 - - - - From 544a8820d31e96951b9523e7f2ef3be6dca40cf8 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Fri, 4 Aug 2017 15:45:26 +0100 Subject: [PATCH 37/38] add latest version of Prolific kernel extension --- .../Contents/Info.plist | 126 ++++++++++++++++++ .../Contents/MacOS/ProlificUsbSerial | Bin 0 -> 82128 bytes .../Contents/_CodeSignature/CodeResources | 105 +++++++++++++++ 3 files changed, 231 insertions(+) create mode 100755 resources/pkg-scripts/extensions/ProlificUsbSerial.kext/Contents/Info.plist create mode 100755 resources/pkg-scripts/extensions/ProlificUsbSerial.kext/Contents/MacOS/ProlificUsbSerial create mode 100755 resources/pkg-scripts/extensions/ProlificUsbSerial.kext/Contents/_CodeSignature/CodeResources diff --git a/resources/pkg-scripts/extensions/ProlificUsbSerial.kext/Contents/Info.plist b/resources/pkg-scripts/extensions/ProlificUsbSerial.kext/Contents/Info.plist new file mode 100755 index 0000000000..18e2bb60c5 --- /dev/null +++ b/resources/pkg-scripts/extensions/ProlificUsbSerial.kext/Contents/Info.plist @@ -0,0 +1,126 @@ + + + + + BuildMachineOSBuild + 13F1134 + CFBundleDevelopmentRegion + English + CFBundleExecutable + ProlificUsbSerial + CFBundleGetInfoString + ProlificUsbSerial v1.6.0, Copyright 2006 Prolific Technology Inc. + CFBundleIdentifier + com.prolific.driver.PL2303 + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + Mac OS X Driver for Prolific Universal USB-Serial Adapter + CFBundlePackageType + KEXT + CFBundleShortVersionString + 1.6.0 + CFBundleSignature + ???? + CFBundleVersion + 1.6.0 + DTCompiler + com.apple.compilers.llvm.clang.1_0 + DTPlatformBuild + 6A317 + DTPlatformVersion + GM + DTSDKBuild + 13F26 + DTSDKName + macosx10.9 + DTXcode + 0600 + DTXcodeBuild + 6A317 + IOKitPersonalities + + 067B_2303 + + CFBundleIdentifier + com.prolific.driver.PL2303 + IOClass + com_prolific_driver_PL2303 + IOProviderClass + IOUSBInterface + bConfigurationValue + 1 + bInterfaceNumber + 0 + idProduct + 8963 + idVendor + 1659 + + 067B_2304 + + CFBundleIdentifier + com.prolific.driver.PL2303 + IOClass + com_prolific_driver_PL2303 + IOProviderClass + IOUSBInterface + bConfigurationValue + 1 + bInterfaceNumber + 0 + idProduct + 8964 + idVendor + 1659 + + 067B_A100 + + CFBundleIdentifier + com.prolific.driver.PL2303 + IOClass + com_prolific_driver_PL2303 + IOProviderClass + IOUSBInterface + bConfigurationValue + 1 + bInterfaceNumber + 0 + idProduct + 41216 + idVendor + 1659 + + 067B_E1F1 + + CFBundleIdentifier + com.prolific.driver.PL2303 + IOClass + com_prolific_driver_PL2303 + IOProviderClass + IOUSBInterface + bConfigurationValue + 1 + bInterfaceNumber + 0 + idProduct + 57841 + idVendor + 1659 + + + OSBundleLibraries + + com.apple.iokit.IOSerialFamily + 1.0.4 + com.apple.iokit.IOUSBFamily + 1.8 + com.apple.kpi.iokit + 10.2.0 + com.apple.kpi.libkern + 10.2.0 + com.apple.kpi.mach + 10.2.0 + + + diff --git a/resources/pkg-scripts/extensions/ProlificUsbSerial.kext/Contents/MacOS/ProlificUsbSerial b/resources/pkg-scripts/extensions/ProlificUsbSerial.kext/Contents/MacOS/ProlificUsbSerial new file mode 100755 index 0000000000000000000000000000000000000000..ecf1ad4cab0992cbe2d1ee42178f586ec2c88a28 GIT binary patch literal 82128 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

l4+;12*x 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 f + + + + files + + files2 + + rules + + ^Resources/ + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^version.plist$ + + + rules2 + + .*\.dSYM($|/) + + weight + 11 + + ^(.*/)?\.DS_Store$ + + omit + + weight + 2000 + + ^(Frameworks|SharedFrameworks|PlugIns|Plug-ins|XPCServices|Helpers|MacOS|Library/(Automator|Spotlight|LoginItems))/ + + nested + + weight + 10 + + ^.* + + ^Info\.plist$ + + omit + + weight + 20 + + ^PkgInfo$ + + omit + + weight + 20 + + ^Resources/ + + weight + 20 + + ^Resources/.*\.lproj/ + + optional + + weight + 1000 + + ^Resources/.*\.lproj/locversion.plist$ + + omit + + weight + 1100 + + ^[^/]+$ + + nested + + weight + 10 + + ^embedded\.provisionprofile$ + + weight + 20 + + ^version\.plist$ + + weight + 20 + + + + From 46d2d8af6acf87e368b10246e0d33d776fa1e369 Mon Sep 17 00:00:00 2001 From: Gerrit Niezen Date: Mon, 7 Aug 2017 10:07:35 +0100 Subject: [PATCH 38/38] remove existing kernel extensions before installation --- resources/pkg-scripts/postinstall | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/resources/pkg-scripts/postinstall b/resources/pkg-scripts/postinstall index 4fab932b84..5d5093839e 100755 --- a/resources/pkg-scripts/postinstall +++ b/resources/pkg-scripts/postinstall @@ -3,9 +3,15 @@ echo "Unloading and uninstalling old extensions..." # unload old extensions sudo kextunload /Library/Extensions/sweetspot.DexComUSB.kext +sudo kextunload /Library/Extensions/DexcomUSB.kext +sudo kextunload /Library/Extensions/SiLabsUSBDriver.kext +sudo kextunload /Library/Extensions/ProlificUsbSerial.kext # delete old extensions sudo rm -rf /Library/Extensions/sweetspot.DexcomUSB.kext +sudo rm -rf /Library/Extensions/DexcomUSB.kext +sudo rm -rf /Library/Extensions/SiLabsUSBDriver.kext +sudo rm -rf /Library/Extensions/ProlificUsbSerial.kext # install new extensions echo "Installing and loading new extensions..."