Merge pull request #4735 from urbit/jo/gcp/conf

gcp: isConfigured doesn't touch store
This commit is contained in:
Jōshin 2021-04-06 22:18:57 -07:00 committed by GitHub
commit 8112c8a041
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 21 additions and 38 deletions

View File

@ -6,7 +6,6 @@
/- gcp, spider, settings
/+ strandio
=, strand=strand:spider
=, enjs:format
^- thread:spider
|^
|= *
@ -22,7 +21,7 @@
==
%- pure:m
!>
%+ frond %gcp-configured
^- json
b+has
::
++ has-settings

View File

@ -1,19 +1,16 @@
import BaseApi from './base';
import {StoreState} from '../store/type';
import {GcpToken} from '../types/gcp-state';
import type {StoreState} from '../store/type';
import type {GcpToken} from '../../types/gcp-state';
export default class GcpApi extends BaseApi<StoreState> {
isConfigured() {
return this.spider('noun', 'json', 'gcp-is-configured', {})
.then((data) => {
this.store.handleEvent({
data
});
});
// Does not touch the store; use the value manually.
async isConfigured(): Promise<boolean> {
return this.spider('noun', 'json', 'gcp-is-configured', {});
}
getToken() {
// Does not return the token; read it out of the store.
async getToken(): Promise<void> {
return this.spider('noun', 'gcp-token', 'gcp-get-token', {})
.then((token) => {
this.store.handleEvent({

View File

@ -26,7 +26,7 @@ class GcpUpload implements StorageUpload {
this.#accessKey = accessKey;
}
async promise(): UploadResult {
async promise(): Promise<UploadResult> {
const {Bucket, Key, ContentType, Body} = this.#params;
const urlParams = {
uploadType: 'media',

View File

@ -5,9 +5,8 @@
// 1. call configure with a GlobalApi and GlobalStore.
// 2. call start() to start the token refresh loop.
//
// If the ship does not have GCP storage configured, we don't try to get
// a token, but we keep checking at regular intervals to see if it gets
// configured. If GCP storage is configured, we try to invoke the GCP
// If the ship does not have GCP storage configured, we don't try to
// get a token. If GCP storage is configured, we try to invoke the GCP
// get-token thread on the ship until it gives us an access token. Once
// we have a token, we refresh it every hour or so according to its
// intrinsic expiry.
@ -25,7 +24,7 @@ class GcpManager {
}
#running = false;
#timeoutId: number | null = null;
#timeoutId: ReturnType<typeof setTimeout> | null = null;
start() {
if (this.#running) {
@ -61,19 +60,17 @@ class GcpManager {
}
#consecutiveFailures: number = 0;
private isConfigured() {
return useStorageState.getState().gcp.configured;
}
#configured: boolean = false;
private refreshLoop() {
if (!this.isConfigured()) {
this.#api.gcp.isConfigured()
.then(() => {
if (this.isConfigured() === undefined) {
if (!this.#configured) {
this.#api!.gcp.isConfigured()
.then((configured) => {
if (configured === undefined) {
throw new Error("can't check whether GCP is configured?");
}
if (this.isConfigured()) {
this.#configured = configured;
if (this.#configured) {
this.refreshLoop();
} else {
console.log('GcpManager: GCP storage not configured; stopping.');
@ -86,7 +83,7 @@ class GcpManager {
});
return;
}
this.#api.gcp.getToken()
this.#api!.gcp.getToken()
.then(() => {
const token = useStorageState.getState().gcp.token;
if (token) {

View File

@ -7,20 +7,11 @@ import { reduceState } from '../state/base';
export default class GcpReducer {
reduce(json: Cage) {
reduceState<StorageState, any>(useStorageState, json, [
reduceConfigured,
reduceToken
]);
}
}
const reduceConfigured = (json, state: StorageState): StorageState => {
let data = json['gcp-configured'];
if (data !== undefined) {
state.gcp.configured = data;
}
return state;
}
const reduceToken = (json: Cage, state: StorageState): StorageState => {
let data = json['gcp-token'];
if (data) {

View File

@ -4,6 +4,5 @@ export interface GcpToken {
};
export interface GcpState {
configured?: boolean;
token?: GcpToken
};