implement proxy

pull/4/head
SiRanWeb 2022-11-07 19:45:34 +03:00
rodzic b806943b70
commit dda8be976d
34 zmienionych plików z 165 dodań i 139 usunięć

Wyświetl plik

@ -7,8 +7,8 @@
"scripts": {
"tsc": "tsc -p ./tsconfig.json",
"tsc:watch": "tsc -w -p ./tsconfig.json",
"start": "node --es-module-specifier-resolution=node build/index.js",
"start:dev": "nodemon --es-module-specifier-resolution=node build/index.js"
"start": "node --es-module-specifier-resolution=node dist/index.js",
"start:dev": "nodemon --es-module-specifier-resolution=node dist/index.js"
},
"files": [
"dist"

Wyświetl plik

@ -39,6 +39,7 @@ export enum ASModelType {
Question = 'Question',
Tombstone = 'Tombstone',
Profile = 'Profile',
Actor = 'Actor',
Link = 'Link',
Mention = 'Mention',
Collection = 'Collection',
@ -146,4 +147,14 @@ export type OauthAuthorizationEndpointValue = string;
export type OauthTokenEndpointValue = string;
export type ProvideClientKeyValue = string;
export type SignClientKeyValue = string;
export type SharedInboxValue = string;
export type SharedInboxValue = string;
export interface WithContext {
/**
* JSON-LD uses the special @context property to define the processing context.
* The value of the @context property is defined by the [JSON-LD] specification.
*
* {@link https://www.w3.org/TR/activitystreams-core/#jsonld Docs}
*/
'@context'?: ContextValue | ContextValue[];
}

Wyświetl plik

@ -1,5 +1,7 @@
export type Modify<T, R> = Omit<T, keyof R> & R;
export const hasKey = <T extends object>(obj: T, k: keyof any): k is keyof T => k in obj;
export const cloneObjDeep = <T>(obj: T): T => {
const duplicateObj = {} as T;
for (const key in obj) {

Wyświetl plik

@ -1 +0,0 @@

Wyświetl plik

@ -11,10 +11,10 @@ import {ASModelType} from "../../common/types";
* {@link https://www.w3.org/ns/activitystreams#Activity Docs}
*/
export class Activity extends APBase<ActivityFields>{
constructor(fields: ActivityFields) {
super({
static create(fields: ActivityFields) {
return APBase._create<ActivityFields>({
type: ASModelType.Activity,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -13,10 +13,10 @@ import {ActorFields} from "./Actor.types";
* {@link https://www.w3.org/TR/activitypub/#actors Docs}
*/
export class Actor extends APBase<ActorFields>{
constructor(fields: ActorFields) {
super({
type: ASModelType.Profile,
...fields
})
static create(fields: ActorFields) {
return APBase._create<ActorFields>({
type: ASModelType.Actor,
...fields,
});
}
}

Wyświetl plik

@ -1,31 +1,43 @@
import { contexts } from "../../common/constants";
import { ContextValue } from "../../common/types";
import { cloneObjDeep } from "../../common/utils";
import {cloneObjDeep, hasKey} from "../../common/utils";
import { WithContext } from "../../common/types";
interface ContextField {
'@context'?: ContextValue | ContextValue[];
}
export class APBase<T> {
public fields: T & ContextField;
export class APBase<T extends WithContext> {
public fields: T;
constructor(fields: T & ContextField) {
const obj = cloneObjDeep<T & ContextField>(fields);
this.fields = {
...obj,
} as T & ContextField;
}
private parseValue(value: any): any {
return value instanceof APBase ? value.toPlain() : value;
}
public withContext(context?: ContextValue): this {
this.fields = {
['@context']: context || contexts.activityStreamsV2,
...this.fields
protected constructor(fields: T) {
// TODO move ordering to toPlain
const obj = cloneObjDeep<T>(fields);
if ('@context' in obj) {
this.fields = {
'@context': obj['@context'],
} as T;
delete obj["@context"];
} else {
this.fields = {} as T;
}
return this;
this.fields = {
...this.fields,
...obj
};
}
protected static _create<T extends WithContext>(fields: T) {
const data = new APBase<T>(fields);
return new Proxy(data, {
get(target: APBase<T>, p: keyof APBase<T> & keyof T) {
return hasKey(target, p) ? target[p] : target.fields[p];
},
set(target: APBase<T>, p: keyof APBase<T> & keyof T, newValue: any): boolean {
target.fields[p] = newValue;
return true;
}
}) as APBase<T> & T & WithContext;
}
protected parseValue(value: any): any {
return value instanceof APBase ? value.toPlain() : value;
}
public toPlain(): Record<string, any> {

Wyświetl plik

@ -8,10 +8,10 @@ import {APEventFields} from "./APEvent.types";
* {@link https://www.w3.org/ns/activitystreams#Event Docs}
*/
export class APEvent extends APBase<APEventFields>{
constructor(fields: APEventFields) {
super({
static create(fields: APEventFields) {
return APBase._create<APEventFields>({
type: ASModelType.Event,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -10,10 +10,10 @@ import {ASModelType} from "../../common/types";
* {@link https://www.w3.org/ns/activitystreams#Object Docs}
*/
export class APObject extends APBase<APObjectFields>{
constructor(fields: APObjectFields) {
super({
static create(fields: APObjectFields) {
return APBase._create<APObjectFields>({
type: ASModelType.Object,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -28,10 +28,10 @@ import {
SummaryValue,
SummaryMapValue,
UpdatedValue,
DurationValue, SourceValue, LikesValue, SharesValue,
DurationValue, SourceValue, LikesValue, SharesValue, ContextValue, WithContext,
} from "../../common/types";
export interface APObjectFields {
export interface APObjectFields extends WithContext {
/**
* Provides the globally unique identifier for
* an {@link https://www.w3.org/TR/activitystreams-vocabulary/#dfn-object Object}

Wyświetl plik

@ -8,10 +8,10 @@ import {ApplicationFields} from "./Application.types";
* {@link https://www.w3.org/ns/activitystreams#Application Docs}
*/
export class Application extends APBase<ApplicationFields>{
constructor(fields: ApplicationFields) {
super({
static create(fields: ApplicationFields) {
return APBase._create<ApplicationFields>({
type: ASModelType.Application,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -8,10 +8,10 @@ import {ArticleFields} from "./Article.types";
* {@link https://www.w3.org/ns/activitystreams#Article Docs}
*/
export class Article extends APBase<ArticleFields>{
constructor(fields: ArticleFields) {
super({
static create(fields: ArticleFields) {
return APBase._create<ArticleFields>({
type: ASModelType.Article,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -8,10 +8,10 @@ import {AudioFields} from "./Audio.types";
* {@link https://www.w3.org/ns/activitystreams#Audio Docs}
*/
export class Audio extends APBase<AudioFields>{
constructor(fields: AudioFields) {
super({
static create(fields: AudioFields) {
return APBase._create<AudioFields>({
type: ASModelType.Audio,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -9,10 +9,10 @@ import {CollectionFields} from "./Collection.types";
* {@link https://www.w3.org/ns/activitystreams#Collection Docs}
*/
export class Collection extends APBase<CollectionFields>{
constructor(fields: CollectionFields) {
super({
static create(fields: CollectionFields) {
return APBase._create<CollectionFields>({
type: ASModelType.Collection,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -8,10 +8,10 @@ import {CollectionPageFields} from "./CollectionPage.types";
* {@link https://www.w3.org/ns/activitystreams#CollectionPage Docs}
*/
export class CollectionPage extends APBase<CollectionPageFields>{
constructor(fields: CollectionPageFields) {
super({
static create(fields: CollectionPageFields) {
return APBase._create<CollectionPageFields>({
type: ASModelType.CollectionPage,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -8,10 +8,10 @@ import {DocumentFields} from "./Document.types";
* {@link https://www.w3.org/ns/activitystreams#Document Docs}
*/
export class Document extends APBase<DocumentFields>{
constructor(fields: DocumentFields) {
super({
static create(fields: DocumentFields) {
return APBase._create<DocumentFields>({
type: ASModelType.Document,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -8,10 +8,10 @@ import {GroupFields} from "./Group.types";
* {@link https://www.w3.org/ns/activitystreams#Group Docs}
*/
export class Group extends APBase<GroupFields>{
constructor(fields: GroupFields) {
super({
static create(fields: GroupFields) {
return APBase._create<GroupFields>({
type: ASModelType.Group,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -8,10 +8,10 @@ import {ImageFields} from "./Image.types";
* {@link https://www.w3.org/ns/activitystreams#Image Docs}
*/
export class Image extends APBase<ImageFields>{
constructor(fields: ImageFields) {
super({
static create(fields: ImageFields) {
return APBase._create<ImageFields>({
type: ASModelType.Image,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -10,10 +10,10 @@ import {ASModelType} from "../../common/types";
* {@link https://www.w3.org/ns/activitystreams#IntransitiveActivity Docs}
*/
export class IntransitiveActivity extends APBase<IntransitiveActivityFields>{
constructor(fields: IntransitiveActivityFields) {
super({
static create(fields: IntransitiveActivityFields) {
return APBase._create<IntransitiveActivityFields>({
type: ASModelType.Activity,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -13,10 +13,10 @@ import {ASModelType} from "../../common/types";
* {@link https://www.w3.org/ns/activitystreams#Link Docs}
*/
export class Link extends APBase<LinkFields>{
constructor(fields: LinkFields) {
super({
static create(fields: LinkFields) {
return APBase._create<LinkFields>({
type: ASModelType.Link,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -9,6 +9,7 @@ import {
} from "../../common/types";
export interface LinkFields {
'@context': never;
/**
* Identifies the {@link https://www.w3.org/TR/activitystreams-vocabulary/#dfn-object Object}

Wyświetl plik

@ -1,16 +1,17 @@
import {APBase} from "../apBase/APBase.model";
import {MentionFields} from "./Mention.types";
import {ASModelType} from "../../common/types";
/**
* A specialized Link that represents an @mention.
*
* {@link https://www.w3.org/ns/activitystreams#Mention Docs}
*/
export class Mention extends APBase<MentionFields>{
constructor(fields: MentionFields) {
super({
static create(fields: MentionFields) {
return APBase._create<MentionFields>({
type: ASModelType.Mention,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -8,10 +8,10 @@ import {NoteFields} from "./Note.types";
* {@link https://www.w3.org/ns/activitystreams#Note Docs}
*/
export class Note extends APBase<NoteFields>{
constructor(fields: NoteFields) {
super({
static create(fields: NoteFields) {
return APBase._create<NoteFields>({
type: ASModelType.Note,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -9,10 +9,10 @@ import {OrderedCollectionFields} from "./OrderedCollection.types";
* {@link https://www.w3.org/ns/activitystreams#OrderedCollection Docs}
*/
export class OrderedCollection extends APBase<OrderedCollectionFields>{
constructor(fields: OrderedCollectionFields) {
super({
static create(fields: OrderedCollectionFields) {
return APBase._create<OrderedCollectionFields>({
type: ASModelType.OrderedCollection,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -8,10 +8,10 @@ import {OrderedCollectionPageFields} from "./OrderedCollectionPage.types";
* {@link https://www.w3.org/ns/activitystreams#OrderedCollectionPage Docs}
*/
export class OrderedCollectionPage extends APBase<OrderedCollectionPageFields>{
constructor(fields: OrderedCollectionPageFields) {
super({
static create(fields: OrderedCollectionPageFields) {
return APBase._create<OrderedCollectionPageFields>({
type: ASModelType.OrderedCollectionPage,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -8,10 +8,10 @@ import {OrganizationFields} from "./Organization.types";
* {@link https://www.w3.org/ns/activitystreams#Organization Docs}
*/
export class Organization extends APBase<OrganizationFields>{
constructor(fields: OrganizationFields) {
super({
static create(fields: OrganizationFields) {
return APBase._create<OrganizationFields>({
type: ASModelType.Organization,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -8,10 +8,10 @@ import {PageFields} from "./Page.types";
* {@link https://www.w3.org/ns/activitystreams#Page Docs}
*/
export class Page extends APBase<PageFields>{
constructor(fields: PageFields) {
super({
static create(fields: PageFields) {
return APBase._create<PageFields>({
type: ASModelType.Page,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -10,10 +10,10 @@ import {PlaceFields} from "./Place.types";
* {@link https://www.w3.org/ns/activitystreams#Place Docs}
*/
export class Place extends APBase<PlaceFields>{
constructor(fields: PlaceFields) {
super({
static create(fields: PlaceFields) {
return APBase._create<PlaceFields>({
type: ASModelType.Place,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -10,10 +10,10 @@ import {ProfileFields} from "./Profile.types";
* {@link https://www.w3.org/ns/activitystreams#Profile Docs}
*/
export class Profile extends APBase<ProfileFields>{
constructor(fields: ProfileFields) {
super({
static create(fields: ProfileFields) {
return APBase._create<ProfileFields>({
type: ASModelType.Profile,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -14,10 +14,10 @@ import {QuestionFields} from "./Question.types";
* {@link https://www.w3.org/ns/activitystreams#Question Docs}
*/
export class Question extends APBase<QuestionFields>{
constructor(fields: QuestionFields) {
super({
static create(fields: QuestionFields) {
return APBase._create<QuestionFields>({
type: ASModelType.Question,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -11,10 +11,10 @@ import {RelationshipFields} from "./Relationship.types";
* {@link https://www.w3.org/ns/activitystreams#Relationship Docs}
*/
export class Relationship extends APBase<RelationshipFields>{
constructor(fields: RelationshipFields) {
super({
static create(fields: RelationshipFields) {
return APBase._create<RelationshipFields>({
type: ASModelType.Relationship,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -8,10 +8,10 @@ import {ServiceFields} from "./Service.types";
* {@link https://www.w3.org/ns/activitystreams#Service Docs}
*/
export class Service extends APBase<ServiceFields>{
constructor(fields: ServiceFields) {
super({
static create(fields: ServiceFields) {
return APBase._create<ServiceFields>({
type: ASModelType.Service,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -10,10 +10,10 @@ import {TombstoneFields} from "./Tombstone.types";
* {@link https://www.w3.org/ns/activitystreams#Tombstone Docs}
*/
export class Tombstone extends APBase<TombstoneFields>{
constructor(fields: TombstoneFields) {
super({
static create(fields: TombstoneFields) {
return APBase._create<TombstoneFields>({
type: ASModelType.Tombstone,
...fields
})
...fields,
});
}
}

Wyświetl plik

@ -8,10 +8,10 @@ import {VideoFields} from "./Video.types";
* {@link https://www.w3.org/ns/activitystreams#Video Docs}
*/
export class Video extends APBase<VideoFields>{
constructor(fields: VideoFields) {
super({
static create(fields: VideoFields) {
return APBase._create<VideoFields>({
type: ASModelType.Video,
...fields
})
...fields,
});
}
}