Skip to content

Commit

Permalink
Create files app (#239)
Browse files Browse the repository at this point in the history
  • Loading branch information
mcandeia authored Jan 11, 2024
1 parent 791bdb5 commit ff0124d
Show file tree
Hide file tree
Showing 32 changed files with 824 additions and 445 deletions.
96 changes: 96 additions & 0 deletions admin/actions/releases/fork.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
import { fjp } from "../../deps.ts";
import { storage } from "../../fsStorage.ts";
import { Acked, Commands, Events, State } from "../../types.ts";

export interface Props {
/** Environment name to connect to */
name: string;
}

const subscribers: WebSocket[] = [];

export const fetchState = async (): Promise<State> => ({
decofile: await storage.state({ forceFresh: true }),
});

const saveState = ({ decofile }: State): Promise<void> =>
storage.update(decofile);

// Apply patch and save state ATOMICALLY!
// This is easily done on play. On production, however, we probably
// need a distributed queue
let queue = Promise.resolve();
const patchState = (ops: fjp.Operation[]) => {
queue = queue.catch(() => null).then(async () =>
saveState(ops.reduce(fjp.applyReducer, await fetchState()))
);

return queue;
};

const action = (_props: Props, req: Request) => {
const { socket, response } = Deno.upgradeWebSocket(req);

const broadcast = (event: Acked<Events>) => {
const message = JSON.stringify(event);
subscribers.forEach((s) => s.send(message));
};
const send = (event: Acked<Events>) => socket.send(JSON.stringify(event));
const parse = (event: MessageEvent<string>): Acked<Commands> =>
JSON.parse(event.data);

const open = () => subscribers.push(socket);
const close = () => subscribers.splice(subscribers.indexOf(socket), 1);
const message = async (event: MessageEvent<string>) => {
const data = parse(event);

const { ack } = data;

if (data.type === "patch-state") {
try {
const { payload: operations } = data;

await patchState(operations);

// Broadcast changes
broadcast({
type: "state-patched",
payload: operations,
etag: await storage.revision(),
metadata: {}, // TODO: add metadata
ack,
});
} catch ({ name, operation }) {
console.error({ name, operation });
}
} else if (data.type === "fetch-state") {
send({
type: "state-fetched",
payload: await fetchState(),
etag: await storage.revision(),
ack,
});
} else {
console.error("UNKNOWN EVENT", event);
}
};

/**
* Handles the WebSocket connection on open event.
*/
socket.onopen = open;
/**
* Handles the WebSocket connection on close event.
*/
socket.onclose = close;

/**
* Handles the WebSocket connection on message event.
* @param {MessageEvent} event - The WebSocket message event.
*/
socket.onmessage = (e) => message(e).catch(() => {});

return response;
};

export default action;
2 changes: 1 addition & 1 deletion admin/deps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@ export type {
WebhookEventName,
} from "https://esm.sh/@octokit/webhooks-types@7.3.1";
export { App, Octokit } from "https://esm.sh/octokit@3.1.2?dts";

export { Webhooks } from "https://esm.sh/@octokit/webhooks@12.0.10";
export * as fjp from "https://esm.sh/fast-json-patch@3.1.1";
2 changes: 2 additions & 0 deletions admin/fsStorage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,3 +57,5 @@ export class FsBlockStorage implements BlockStore {
return this.readOnly.onChange(callback);
}
}

export const storage = new FsBlockStorage();
15 changes: 15 additions & 0 deletions admin/loaders/releases/get.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { fetchState } from "../../actions/releases/fork.ts";
import { State } from "../../types.ts";

interface Props {
name: string;
}

/** TODO(@gimenes): Implement fetching the state from the proper environment name */
const action = async (_props: Props): Promise<State["decofile"]> => {
const { decofile } = await fetchState();

return decofile;
};

export default action;
76 changes: 40 additions & 36 deletions admin/manifest.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,55 +2,59 @@
// This file SHOULD be checked into source version control.
// This file is automatically updated during development when running `dev.ts`.

import * as $$$0 from "./loaders/deploy.ts";
import * as $$$1 from "./loaders/releases/blocks.ts";
import * as $$$2 from "./loaders/state.ts";
import * as $$$3 from "./loaders/blocks/revision.ts";
import * as $$$4 from "./loaders/blocks/published.ts";
import * as $$$5 from "./loaders/blocks/latest.ts";
import * as $$$6 from "./loaders/blocks/listRevisions.ts";
import * as $$$0 from "./loaders/blocks/revision.ts";
import * as $$$1 from "./loaders/blocks/published.ts";
import * as $$$2 from "./loaders/blocks/latest.ts";
import * as $$$3 from "./loaders/blocks/listRevisions.ts";
import * as $$$4 from "./loaders/state.ts";
import * as $$$5 from "./loaders/releases/get.ts";
import * as $$$6 from "./loaders/releases/blocks.ts";
import * as $$$7 from "./loaders/platforms/forSite.ts";
import * as $$$8 from "./loaders/pages/list.ts";
import * as $$$$$$$$$0 from "./actions/github/setStatus.ts";
import * as $$$$$$$$$1 from "./actions/github/webhooks/broker.ts";
import * as $$$8 from "./loaders/deploy.ts";
import * as $$$9 from "./loaders/pages/list.ts";
import * as $$$$$$$$$0 from "./actions/blocks/publish.ts";
import * as $$$$$$$$$1 from "./actions/blocks/restore.ts";
import * as $$$$$$$$$2 from "./actions/blocks/safeDelete.ts";
import * as $$$$$$$$$3 from "./actions/blocks/newRevision.ts";
import * as $$$$$$$$$4 from "./actions/blocks/delete.ts";
import * as $$$$$$$$$5 from "./actions/blocks/publish.ts";
import * as $$$$$$$$$6 from "./actions/blocks/restore.ts";
import * as $$$$$$$$$7 from "./actions/pages/delete.ts";
import * as $$$$$$$$$8 from "./actions/pages/new.ts";
import * as $$$$$$$$$9 from "./actions/pages/publish.ts";
import * as $$$$$$$$$10 from "./actions/sites/unlinkRepo.ts";
import * as $$$$$$$$$11 from "./actions/sites/newDomain.ts";
import * as $$$$$$$$$12 from "./actions/sites/linkRepo.ts";
import * as $$$$$$$$$5 from "./actions/releases/fork.ts";
import * as $$$$$$$$$6 from "./actions/sites/linkRepo.ts";
import * as $$$$$$$$$7 from "./actions/sites/newDomain.ts";
import * as $$$$$$$$$8 from "./actions/sites/unlinkRepo.ts";
import * as $$$$$$$$$9 from "./actions/github/setStatus.ts";
import * as $$$$$$$$$10 from "./actions/github/webhooks/broker.ts";
import * as $$$$$$$$$11 from "./actions/pages/publish.ts";
import * as $$$$$$$$$12 from "./actions/pages/new.ts";
import * as $$$$$$$$$13 from "./actions/pages/delete.ts";

const manifest = {
"loaders": {
"deco-sites/admin/loaders/blocks/latest.ts": $$$5,
"deco-sites/admin/loaders/blocks/listRevisions.ts": $$$6,
"deco-sites/admin/loaders/blocks/published.ts": $$$4,
"deco-sites/admin/loaders/blocks/revision.ts": $$$3,
"deco-sites/admin/loaders/deploy.ts": $$$0,
"deco-sites/admin/loaders/pages/list.ts": $$$8,
"deco-sites/admin/loaders/blocks/latest.ts": $$$2,
"deco-sites/admin/loaders/blocks/listRevisions.ts": $$$3,
"deco-sites/admin/loaders/blocks/published.ts": $$$1,
"deco-sites/admin/loaders/blocks/revision.ts": $$$0,
"deco-sites/admin/loaders/deploy.ts": $$$8,
"deco-sites/admin/loaders/pages/list.ts": $$$9,
"deco-sites/admin/loaders/platforms/forSite.ts": $$$7,
"deco-sites/admin/loaders/releases/blocks.ts": $$$1,
"deco-sites/admin/loaders/state.ts": $$$2,
"deco-sites/admin/loaders/releases/blocks.ts": $$$6,
"deco-sites/admin/loaders/releases/get.ts": $$$5,
"deco-sites/admin/loaders/state.ts": $$$4,
},
"actions": {
"deco-sites/admin/actions/blocks/delete.ts": $$$$$$$$$4,
"deco-sites/admin/actions/blocks/newRevision.ts": $$$$$$$$$3,
"deco-sites/admin/actions/blocks/publish.ts": $$$$$$$$$5,
"deco-sites/admin/actions/blocks/restore.ts": $$$$$$$$$6,
"deco-sites/admin/actions/blocks/publish.ts": $$$$$$$$$0,
"deco-sites/admin/actions/blocks/restore.ts": $$$$$$$$$1,
"deco-sites/admin/actions/blocks/safeDelete.ts": $$$$$$$$$2,
"deco-sites/admin/actions/github/setStatus.ts": $$$$$$$$$0,
"deco-sites/admin/actions/github/webhooks/broker.ts": $$$$$$$$$1,
"deco-sites/admin/actions/pages/delete.ts": $$$$$$$$$7,
"deco-sites/admin/actions/pages/new.ts": $$$$$$$$$8,
"deco-sites/admin/actions/pages/publish.ts": $$$$$$$$$9,
"deco-sites/admin/actions/sites/linkRepo.ts": $$$$$$$$$12,
"deco-sites/admin/actions/sites/newDomain.ts": $$$$$$$$$11,
"deco-sites/admin/actions/sites/unlinkRepo.ts": $$$$$$$$$10,
"deco-sites/admin/actions/github/setStatus.ts": $$$$$$$$$9,
"deco-sites/admin/actions/github/webhooks/broker.ts": $$$$$$$$$10,
"deco-sites/admin/actions/pages/delete.ts": $$$$$$$$$13,
"deco-sites/admin/actions/pages/new.ts": $$$$$$$$$12,
"deco-sites/admin/actions/pages/publish.ts": $$$$$$$$$11,
"deco-sites/admin/actions/releases/fork.ts": $$$$$$$$$5,
"deco-sites/admin/actions/sites/linkRepo.ts": $$$$$$$$$6,
"deco-sites/admin/actions/sites/newDomain.ts": $$$$$$$$$7,
"deco-sites/admin/actions/sites/unlinkRepo.ts": $$$$$$$$$8,
},
"name": "deco-sites/admin",
"baseUrl": import.meta.url,
Expand Down
4 changes: 2 additions & 2 deletions admin/mod.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import {
WebhookEventName,
Webhooks,
} from "./deps.ts";
import { FsBlockStorage } from "./fsStorage.ts";
import { storage } from "./fsStorage.ts";
import { prEventHandler } from "./github/pr.ts";
import { pushEventHandler } from "./github/push.ts";
import { State as Resolvables } from "./loaders/state.ts";
Expand Down Expand Up @@ -108,7 +108,7 @@ export default function App(
pushEventHandler as GithubEventListener,
prEventHandler as GithubEventListener,
],
storage: new FsBlockStorage(),
storage,
octokit: new Octokit({
auth: githubAPIToken,
}),
Expand Down
35 changes: 35 additions & 0 deletions admin/types.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,41 @@
import { type Resolvable } from "deco/engine/core/resolver.ts";
import { type fjp } from "./deps.ts";

export interface Pagination<T> {
data: T[];
page: number;
pageSize: number;
total: number;
}

export interface PatchState {
type: "patch-state";
payload: fjp.Operation[];
}

export interface FetchState {
type: "fetch-state";
}

export interface StatePatched {
type: "state-patched";
payload: fjp.Operation[];
etag: string;
// Maybe add data and user info in here
metadata?: unknown;
}

export interface StateFetched {
type: "state-fetched";
payload: State;
etag: string;
}

export type Acked<T> = T & { ack: string };

export interface State {
decofile: Record<string, Resolvable>;
}

export type Commands = PatchState | FetchState;
export type Events = StatePatched | StateFetched;
8 changes: 4 additions & 4 deletions algolia/manifest.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
// This file is automatically updated during development when running `dev.ts`.

import * as $$$0 from "./loaders/product/listingPage.ts";
import * as $$$1 from "./loaders/product/suggestions.ts";
import * as $$$2 from "./loaders/product/list.ts";
import * as $$$1 from "./loaders/product/list.ts";
import * as $$$2 from "./loaders/product/suggestions.ts";
import * as $$$$$$0 from "./sections/Analytics/Algolia.tsx";
import * as $$$$$$$$$0 from "./actions/setup.ts";
import * as $$$$$$$$$1 from "./actions/index/product.ts";
Expand All @@ -13,9 +13,9 @@ import * as $$$$$$$$$$0 from "./workflows/index/product.ts";

const manifest = {
"loaders": {
"algolia/loaders/product/list.ts": $$$2,
"algolia/loaders/product/list.ts": $$$1,
"algolia/loaders/product/listingPage.ts": $$$0,
"algolia/loaders/product/suggestions.ts": $$$1,
"algolia/loaders/product/suggestions.ts": $$$2,
},
"sections": {
"algolia/sections/Analytics/Algolia.tsx": $$$$$$0,
Expand Down
4 changes: 2 additions & 2 deletions analytics/loaders/DecoAnalyticsScript.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
import { AppContext } from "../mod.ts";
import { getFlagsFromCookies } from "../../utils/cookie.ts";
import { Script } from "../../website/types.ts";
import { AppContext } from "../mod.ts";
import {
defaultExclusionPropsAndHashScript,
exclusionPropsAndHashScript,
} from "../scripts/plausible_scripts.ts";
import { getFlagsFromCookies } from "../../utils/cookie.ts";

export type Props = {
defer?: boolean;
Expand Down
16 changes: 8 additions & 8 deletions commerce/manifest.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
// This file SHOULD be checked into source version control.
// This file is automatically updated during development when running `dev.ts`.

import * as $$$0 from "./loaders/product/extensions/detailsPage.ts";
import * as $$$1 from "./loaders/product/extensions/listingPage.ts";
import * as $$$2 from "./loaders/product/extensions/suggestions.ts";
import * as $$$3 from "./loaders/product/extensions/list.ts";
import * as $$$0 from "./loaders/product/extensions/listingPage.ts";
import * as $$$1 from "./loaders/product/extensions/detailsPage.ts";
import * as $$$2 from "./loaders/product/extensions/list.ts";
import * as $$$3 from "./loaders/product/extensions/suggestions.ts";
import * as $$$4 from "./loaders/product/productListingPage.ts";
import * as $$$5 from "./loaders/product/products.ts";
import * as $$$6 from "./loaders/extensions/productDetailsPage.ts";
Expand All @@ -21,10 +21,10 @@ const manifest = {
"commerce/loaders/extensions/productListingPage.ts": $$$7,
"commerce/loaders/extensions/products.ts": $$$8,
"commerce/loaders/navbar.ts": $$$9,
"commerce/loaders/product/extensions/detailsPage.ts": $$$0,
"commerce/loaders/product/extensions/list.ts": $$$3,
"commerce/loaders/product/extensions/listingPage.ts": $$$1,
"commerce/loaders/product/extensions/suggestions.ts": $$$2,
"commerce/loaders/product/extensions/detailsPage.ts": $$$1,
"commerce/loaders/product/extensions/list.ts": $$$2,
"commerce/loaders/product/extensions/listingPage.ts": $$$0,
"commerce/loaders/product/extensions/suggestions.ts": $$$3,
"commerce/loaders/product/productListingPage.ts": $$$4,
"commerce/loaders/product/products.ts": $$$5,
},
Expand Down
8 changes: 4 additions & 4 deletions compat/$live/manifest.gen.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import * as $$$1 from "./loaders/secret.ts";
import * as $$$$0 from "./handlers/router.ts";
import * as $$$$1 from "./handlers/devPage.ts";
import * as $$$$$$0 from "./sections/Slot.tsx";
import * as $$$$$$1 from "./sections/PageInclude.tsx";
import * as $$$$$$2 from "./sections/EmptySection.tsx";
import * as $$$$$$1 from "./sections/EmptySection.tsx";
import * as $$$$$$2 from "./sections/PageInclude.tsx";

const manifest = {
"loaders": {
Expand All @@ -20,8 +20,8 @@ const manifest = {
"$live/handlers/router.ts": $$$$0,
},
"sections": {
"$live/sections/EmptySection.tsx": $$$$$$2,
"$live/sections/PageInclude.tsx": $$$$$$1,
"$live/sections/EmptySection.tsx": $$$$$$1,
"$live/sections/PageInclude.tsx": $$$$$$2,
"$live/sections/Slot.tsx": $$$$$$0,
},
"name": "$live",
Expand Down
Loading

0 comments on commit ff0124d

Please sign in to comment.