@cripty2001/utils 0.0.62 → 0.0.64

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,4 @@
1
+ import { Whispr } from "@cripty2001/whispr";
1
2
  import { AppserverData } from "./common";
2
3
  export type { AppserverData };
3
4
  export declare class ClientError extends Error {
@@ -14,8 +15,10 @@ export declare class ClientValidationError extends ClientError {
14
15
  }
15
16
  export declare class Client {
16
17
  private url;
17
- constructor(url: string);
18
18
  private authToken;
19
+ loggedIn: Whispr<boolean>;
20
+ private constructor();
21
+ private static create;
19
22
  setAuthToken(token: string | null): void;
20
23
  exec<I extends AppserverData, O extends AppserverData>(action: string, input: I): Promise<O>;
21
24
  }
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Client = exports.ClientValidationError = exports.ClientServerError = exports.ClientError = void 0;
4
+ const whispr_1 = require("@cripty2001/whispr");
4
5
  const msgpack_1 = require("@msgpack/msgpack");
5
6
  class ClientError extends Error {
6
7
  constructor(message) {
@@ -28,12 +29,18 @@ class ClientValidationError extends ClientError {
28
29
  exports.ClientValidationError = ClientValidationError;
29
30
  class Client {
30
31
  url;
32
+ authToken;
33
+ loggedIn;
31
34
  constructor(url) {
32
35
  this.url = url;
36
+ [this.authToken, this.setAuthToken] = whispr_1.Whispr.create(null);
37
+ this.loggedIn = whispr_1.Whispr.from({ authToken: this.authToken }, ({ authToken }) => authToken !== null);
38
+ }
39
+ static create(url) {
40
+ return new Client(url);
33
41
  }
34
- authToken = null;
35
42
  setAuthToken(token) {
36
- this.authToken = token;
43
+ this.setAuthToken(token ?? null);
37
44
  }
38
45
  async exec(action, input) {
39
46
  const res = await fetch(`${this.url}/exec/${action}`, {
@@ -49,7 +56,7 @@ class Client {
49
56
  switch (res.status) {
50
57
  case 401:
51
58
  case 403:
52
- this.authToken = null;
59
+ this.setAuthToken(null);
53
60
  throw new ClientError("Permission denied");
54
61
  case 200:
55
62
  responseData = decoded;
@@ -1,7 +1,7 @@
1
1
  import { Static, TSchema } from '@sinclair/typebox';
2
2
  import { AppserverData } from './common';
3
3
  export type { AppserverData };
4
- export { Type, Static, TSchema } from '@sinclair/typebox';
4
+ export { Static, TSchema, Type } from '@sinclair/typebox';
5
5
  export { Value } from '@sinclair/typebox/value';
6
6
  export type AppserverHandler<I extends AppserverData, U extends AppserverData, O extends AppserverData> = (input: I, user: U | null) => Promise<O> | O;
7
7
  export type AppserverUsergetter<U extends AppserverData> = (token: string) => Promise<U | null>;
@@ -38,6 +38,7 @@ export declare class Appserver<U extends AppserverData> {
38
38
  private getMetrics;
39
39
  private registered;
40
40
  constructor(port: number, parseUser: AppserverUsergetter<U>, getMetrics: () => Record<string, number>);
41
+ private registerAuth;
41
42
  private handleMetricsRequest;
42
43
  private parseInput;
43
44
  /**
@@ -48,4 +49,5 @@ export declare class Appserver<U extends AppserverData> {
48
49
  * @param handler business logic returning serializable data
49
50
  */
50
51
  register<ISchema extends TSchema, O extends AppserverData, I extends Static<ISchema> & AppserverData = Static<ISchema> & AppserverData>(action: string, inputSchema: ISchema, auth: boolean, handler: AppserverHandler<I, U, O>): void;
52
+ private unsafeRegister;
51
53
  }
@@ -4,12 +4,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Appserver = exports.AppserverHandledError = exports.AppserverAuthError = exports.Value = exports.Type = void 0;
7
- const express_1 = __importDefault(require("express"));
8
- const value_1 = require("@sinclair/typebox/value");
9
7
  const msgpack_1 = require("@msgpack/msgpack");
8
+ const typebox_1 = require("@sinclair/typebox");
9
+ const value_1 = require("@sinclair/typebox/value");
10
+ const express_1 = __importDefault(require("express"));
10
11
  // Helpful for avoiding sinclair version mismatch between this and the actual user of the package
11
- var typebox_1 = require("@sinclair/typebox");
12
- Object.defineProperty(exports, "Type", { enumerable: true, get: function () { return typebox_1.Type; } });
12
+ var typebox_2 = require("@sinclair/typebox");
13
+ Object.defineProperty(exports, "Type", { enumerable: true, get: function () { return typebox_2.Type; } });
13
14
  var value_2 = require("@sinclair/typebox/value");
14
15
  Object.defineProperty(exports, "Value", { enumerable: true, get: function () { return value_2.Value; } });
15
16
  (0, msgpack_1.encode)({}); // Fixes issue with msgpack not being included in build
@@ -64,6 +65,15 @@ class Appserver {
64
65
  this.app.get('/metrics', async (req, res) => {
65
66
  await this.handleMetricsRequest(req, res);
66
67
  });
68
+ this.registerAuth(this.app);
69
+ }
70
+ registerAuth(app) {
71
+ this.unsafeRegister('/auth/whoami', typebox_1.Type.Object({}), false, async (input, user) => {
72
+ return {
73
+ user: Object.fromEntries(Object.entries(user ?? {})
74
+ .filter(([key]) => !key.startsWith('_')))
75
+ };
76
+ });
67
77
  }
68
78
  async handleMetricsRequest(req, res) {
69
79
  try {
@@ -119,10 +129,13 @@ class Appserver {
119
129
  * @param handler business logic returning serializable data
120
130
  */
121
131
  register(action, inputSchema, auth, handler) {
132
+ this.unsafeRegister(`/exec/${action}`, inputSchema, auth, handler);
133
+ }
134
+ unsafeRegister(action, inputSchema, auth, handler) {
122
135
  if (this.registered.has(action))
123
136
  throw new Error(`Action ${action} is already registered`);
124
137
  this.registered.add(action);
125
- this.app.post(`/exec/${action}`, express_1.default.raw({ type: 'application/vnd.msgpack' }), async (req, res) => {
138
+ this.app.post(action, express_1.default.raw({ type: 'application/vnd.msgpack' }), async (req, res) => {
126
139
  const { status, data } = await (async () => {
127
140
  try {
128
141
  const { data: unsafeData, user } = await this.parseInput(req);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cripty2001/utils",
3
- "version": "0.0.62",
3
+ "version": "0.0.64",
4
4
  "description": "Internal Set of utils. If you need them use them, otherwise go to the next package ;)",
5
5
  "homepage": "https://github.com/cripty2001/utils#readme",
6
6
  "bugs": {