temporary fix to speed up textile

This commit is contained in:
Martina 2021-09-26 14:32:44 -07:00
parent 8207ba4bcc
commit 41a048c705
17 changed files with 127 additions and 55 deletions

View File

@ -222,3 +222,9 @@ export const grids = {
export const profileDefaultPicture =
"https://slate.textile.io/ipfs/bafkreick3nscgixwfpq736forz7kzxvvhuej6kszevpsgmcubyhsx2pf7i";
export const textile = {
threadName: "buckets",
mainBucket: "data",
dealsBucket: "stage-deal",
};

View File

@ -208,6 +208,10 @@ export const getRemainingTime = (seconds) => {
return `${value} ${unit} remaining`;
};
export const ipfsToCid = (ipfs) => {
return ipfs.replace("/ipfs/", "");
};
export const urlToCid = (url) => {
return url
.replace(`${Constants.gateways.ipfs}/`, "")

View File

@ -19,3 +19,9 @@ export const MIN_ARCHIVE_SIZE_BYTES = 104857600;
export const TOKEN_EXPIRATION_TIME = 2 * 60 * 60 * 1000;
export const userPreviewProperties = ["users.id", "users.data", "users.username"];
export const textile = {
threadName: "buckets",
mainBucket: "data",
dealsBucket: "stage-deal",
};

View File

@ -144,6 +144,9 @@ export const getById = async ({ id }) => {
return null;
}
delete user.password;
delete user.salt;
Data.createUsageStat({ id }); //NOTE(martina): to record the person's usage of Slate for analytics
// user.library = await Data.getFilesByUserId({ id, sanitize: true });
@ -155,7 +158,7 @@ export const getById = async ({ id }) => {
Data.getSubscriptionsByUserId({ ownerId: id }),
Data.getFollowingByUserId({ ownerId: id }),
Data.getFollowersByUserId({ userId: id }),
Utilities.getBucketAPIFromUserToken({ user }),
Utilities.getBucket({ user }),
])
).map((item) => item.value);
@ -322,7 +325,7 @@ export const getTextileById = async ({ id }) => {
}
// NOTE(jim): This bucket is purely for staging data for other deals.
const stagingData = await Utilities.getBucketAPIFromUserToken({
const stagingData = await Utilities.getBucket({
user,
bucketName: STAGING_DEAL_BUCKET,
encrypted: false,
@ -385,7 +388,7 @@ export const getTextileById = async ({ id }) => {
});
}
const b = await Utilities.getBucketAPIFromUserToken({
const b = await Utilities.getBucket({
user,
bucketName: "data",
encrypted: false,

View File

@ -201,6 +201,95 @@ export const getBucketAPIFromUserToken = async ({ user, bucketName, encrypted =
};
};
export const createBucket = async ({
bucketName = Constants.textile.mainBucket,
encrypted = false,
}) => {
try {
const identity = await PrivateKey.fromRandom();
const textileKey = identity.toString();
let buckets = await Buckets.withKeyInfo(TEXTILE_KEY_INFO);
const textileToken = await buckets.getToken(identity);
buckets.context.withToken(textileToken);
const client = new Client(buckets.context);
const newId = ThreadID.fromRandom();
await client.newDB(newId, Constants.textile.threadName);
const textileThreadID = newId.toString();
buckets.context.withThread(textileThreadID);
const created = await buckets.create(bucketName, { encrypted });
let ipfs = created.root.path;
const textileBucketCID = Strings.ipfsToCid(ipfs);
return {
textileKey,
// textileToken,
// textileThreadID,
// textileBucketCID,
buckets,
bucketKey: created.root.key,
bucketRoot: created.root,
bucketName,
};
} catch (e) {
Logging.error(e?.message);
}
};
//NOTE(martina): only use this for existing users. This grabs their bucket without checking for an existing bucket
export const getBucket = async ({ user, bucketName = Constants.textile.mainBucket }) => {
let updateUser = false;
let { textileKey, textileToken, textileThreadID, textileBucketCID } = user;
textileKey = user.data?.tokens?.api;
if (!textileKey) {
return await createBucket({ user, bucketName });
}
let buckets = await Buckets.withKeyInfo(TEXTILE_KEY_INFO);
if (!textileToken) {
const identity = PrivateKey.fromString(textileKey);
textileToken = await buckets.getToken(identity);
updateUser = true;
}
buckets.context.withToken(textileToken);
if (!textileThreadID) {
const client = new Client(buckets.context);
const res = await client.getThread("buckets");
textileThreadID = typeof res.id === "string" ? res.id : ThreadID.fromBytes(res.id).toString();
updateUser = true;
}
buckets.context.withThread(textileThreadID);
const roots = await buckets.list();
const existing = roots.find((bucket) => bucket.name === bucketName);
if (!existing) {
return { buckets: null, bucketKey: null, bucketRoot: null, bucketName };
}
if (!textileBucketCID) {
let ipfs = existing.path;
textileBucketCID = Strings.ipfsToCid(ipfs);
updateUser = true;
}
// if (updateUser) {
// Data.updateUserById({ id: user.id, textileToken, textileThreadID, textileBucketCID });
// }
return {
buckets,
bucketKey: existing.key,
bucketRoot: existing,
bucketName,
};
};
export const getFileName = (s) => {
let target = s;
if (target.endsWith("/")) {

View File

@ -20,7 +20,7 @@ export default async (req, res) => {
bucketName = req.body.data.bucketName;
}
const { buckets, bucketKey, bucketRoot } = await Utilities.getBucketAPIFromUserToken({
const { buckets, bucketKey, bucketRoot } = await Utilities.getBucket({
user,
bucketName,
});

View File

@ -13,7 +13,7 @@ export default async (req, res) => {
return res.status(500).send({ decorator: "SERVER_BUCKET_REMOVE_NO_CID", error: true });
}
const { buckets, bucketKey } = await Utilities.getBucketAPIFromUserToken({
const { buckets, bucketKey } = await Utilities.getBucket({
user,
bucketName: req.body.data.bucketName,
});

View File

@ -25,7 +25,7 @@ export default async (req, res) => {
return res.status(400).send({ decorator: "SERVER_REMOVE_DATA_NO_IDS", error: true });
}
const { buckets, bucketKey } = await Utilities.getBucketAPIFromUserToken({
const { buckets, bucketKey } = await Utilities.getBucket({
user,
});

View File

@ -9,7 +9,7 @@ export default async (req, res) => {
if (!userInfo) return;
const { id, user } = userInfo;
const { buckets, bucketKey } = await Utilities.getBucketAPIFromUserToken({
const { buckets, bucketKey } = await Utilities.getBucket({
user,
});

View File

@ -17,7 +17,7 @@ export default async (req, res) => {
let decorator = "SERVER_SAVE_COPY";
let { buckets, bucketKey, bucketRoot } = await Utilities.getBucketAPIFromUserToken({
let { buckets, bucketKey, bucketRoot } = await Utilities.getBucket({
user,
});

View File

@ -8,8 +8,6 @@ import * as Constants from "~/node_common/constants";
import JWT from "jsonwebtoken";
import { PrivateKey } from "@textile/hub";
export default async (req, res) => {
const { pin, username } = req.body.data;
@ -83,19 +81,9 @@ export default async (req, res) => {
return res.status(201).send({ decorator: "SERVER_CREATE_USER_USERNAME_TAKEN" });
}
// TODO(jim):
// Single Key Textile Auth.
const identity = await PrivateKey.fromRandom();
const api = identity.toString();
// TODO(jim):
// Don't do this once you refactor.
const { buckets, bucketKey, bucketName } = await Utilities.getBucketAPIFromUserToken({
user: {
username: newUsername,
data: { tokens: { api } },
},
});
const { buckets, bucketKey, bucketName, textileKey } = await Utilities.createBucket({});
if (!buckets) {
return res
@ -115,7 +103,7 @@ export default async (req, res) => {
allow_automatic_data_storage: true,
allow_encrypted_data_storage: true,
},
tokens: { api },
tokens: { api: textileKey },
twitter: {
username: twitterUser.screen_name,
verified: twitterUser.verified,

View File

@ -7,8 +7,6 @@ import * as SlateManager from "~/node_common/managers/slate";
import JWT from "jsonwebtoken";
import { PrivateKey } from "@textile/hub";
const COOKIE_NAME = "oauth_token";
export default async (req, res) => {
@ -64,20 +62,10 @@ export default async (req, res) => {
return res.status(201).send({ decorator: "SERVER_CREATE_USER_USERNAME_TAKEN" });
}
// TODO(jim):
// Single Key Textile Auth.
const identity = await PrivateKey.fromRandom();
const api = identity.toString();
const newUsername = username.toLowerCase();
const newEmail = email.toLowerCase();
const { buckets, bucketKey, bucketName } = await Utilities.getBucketAPIFromUserToken({
user: {
username: newUsername,
data: { tokens: { api } },
},
});
const { buckets, bucketKey, bucketName, textileKey } = await Utilities.createBucket({});
if (!buckets) {
return res
@ -97,7 +85,7 @@ export default async (req, res) => {
allow_automatic_data_storage: true,
allow_encrypted_data_storage: true,
},
tokens: { api },
tokens: { api: textileKey },
twitter: {
username: twitterUser.screen_name,
verified: twitterUser.verified,

View File

@ -9,8 +9,6 @@ import * as Monitor from "~/node_common/monitor";
import BCrypt from "bcrypt";
import { PrivateKey } from "@textile/hub";
export default async (req, res) => {
if (!Strings.isEmpty(Environment.ALLOWED_HOST) && req.headers.host !== Environment.ALLOWED_HOST) {
return res.status(403).send({ decorator: "SERVER_CREATE_USER_NOT_ALLOWED", error: true });
@ -54,22 +52,12 @@ export default async (req, res) => {
const salt = await BCrypt.genSalt(rounds);
const hash = await Utilities.encryptPassword(req.body.data.password, salt);
// TODO(jim):
// Single Key Textile Auth.
const identity = await PrivateKey.fromRandom();
const api = identity.toString();
// TODO(jim):
// Don't do this once you refactor.
const newUsername = req.body.data.username.toLowerCase();
const newEmail = verification.email;
const { buckets, bucketKey, bucketName } = await Utilities.getBucketAPIFromUserToken({
user: {
username: newUsername,
data: { tokens: { api } },
},
});
const { buckets, bucketKey, bucketName, textileKey } = await Utilities.createBucket({});
if (!buckets) {
return res
@ -90,7 +78,7 @@ export default async (req, res) => {
allow_automatic_data_storage: true,
allow_encrypted_data_storage: true,
},
tokens: { api },
tokens: { api: textileKey },
},
});

View File

@ -23,7 +23,7 @@ export default async (req, res) => {
// NOTE(martina): delete all of their public and private files.
await Data.deleteFilesByUserId({ ownerId: user.id });
const defaultData = await Utilities.getBucketAPIFromUserToken({ user });
const defaultData = await Utilities.getBucket({ user });
// NOTE(jim): delete every bucket
try {

View File

@ -57,7 +57,7 @@ export default async (req, res) => {
if (req.body.data.type === "SAVE_DEFAULT_ARCHIVE_CONFIG") {
let b;
try {
b = await Utilities.getBucketAPIFromUserToken({
b = await Utilities.getBucket({
user,
bucketName: "data",
});
@ -68,7 +68,7 @@ export default async (req, res) => {
user,
message: e.message,
code: e.code,
functionName: `Utilities.getBucketAPIFromUserToken`,
functionName: `Utilities.getBucket`,
});
return res.status(500).send({ decorator: "SERVER_NO_BUCKET_DATA", error: true });

View File

@ -12,7 +12,7 @@ export default async (req, res) => {
return res.status(403).send({ decorator: "SERVER_USER_NOT_FOUND", error: true });
}
let { buckets, bucketKey } = await Utilities.getBucketAPIFromUserToken({
let { buckets, bucketKey } = await Utilities.getBucket({
user,
});

View File

@ -35,7 +35,7 @@ const saveCopyReposts = async () => {
Logging.log(item);
// continue;
let user = { data: item.data };
let { buckets, bucketKey, bucketRoot } = await Utilities.getBucketAPIFromUserToken({
let { buckets, bucketKey, bucketRoot } = await Utilities.getBucket({
user,
});